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>7 fn 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>27 fn 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