1 extern crate sdl2; 2 3 use sdl2::audio::AudioSpecDesired; 4 5 use std::time::Duration; 6 gen_wave(bytes_to_write: i32) -> Vec<i16>7fn gen_wave(bytes_to_write: i32) -> Vec<i16> { 8 // Generate a square wave 9 let tone_volume = 1_000i16; 10 let period = 48_000 / 256; 11 let sample_count = bytes_to_write; 12 let mut result = Vec::new(); 13 14 for x in 0..sample_count { 15 result.push( 16 if (x / period) % 2 == 0 { 17 tone_volume 18 } 19 else { 20 -tone_volume 21 } 22 ); 23 } 24 result 25 } 26 main() -> Result<(), String>27fn main() -> Result<(), String> { 28 let sdl_context = sdl2::init()?; 29 let audio_subsystem = sdl_context.audio()?; 30 31 let desired_spec = AudioSpecDesired { 32 freq: Some(48_000), 33 channels: Some(2), 34 // mono - 35 samples: Some(4) 36 // default sample size 37 }; 38 39 let device = audio_subsystem.open_queue::<i16, _>(None, &desired_spec)?; 40 41 let target_bytes = 48_000 * 4; 42 let wave = gen_wave(target_bytes); 43 device.queue(&wave); 44 // Start playback 45 device.resume(); 46 47 // Play for 2 seconds 48 std::thread::sleep(Duration::from_millis(2_000)); 49 50 // Device is automatically closed when dropped 51 52 Ok(()) 53 } 54