1 extern crate sdl2;
2 extern crate rand;
3 
4 use sdl2::audio::{AudioCallback, AudioSpecDesired};
5 use std::time::Duration;
6 
7 struct MyCallback {
8     volume: f32
9 }
10 impl AudioCallback for MyCallback {
11     type Channel = f32;
12 
callback(&mut self, out: &mut [f32])13     fn callback(&mut self, out: &mut [f32]) {
14         use self::rand::{Rng, thread_rng};
15         let mut rng = thread_rng();
16 
17         // Generate white noise
18         for x in out.iter_mut() {
19             *x = (rng.gen_range(0.0, 2.0) - 1.0) * self.volume;
20         }
21     }
22 }
23 
main() -> Result<(), String>24 fn main() -> Result<(), String> {
25     let sdl_context = sdl2::init()?;
26     let audio_subsystem = sdl_context.audio()?;
27 
28     let desired_spec = AudioSpecDesired {
29         freq: Some(44_100),
30         channels: Some(1),  // mono
31         samples: None,      // default sample size
32     };
33 
34     // None: use default device
35     let mut device = audio_subsystem.open_playback(None, &desired_spec, |spec| {
36         // Show obtained AudioSpec
37         println!("{:?}", spec);
38 
39         MyCallback { volume: 0.5 }
40     })?;
41 
42     // Start playback
43     device.resume();
44 
45     // Play for 1 second
46     std::thread::sleep(Duration::from_millis(1_000));
47 
48     {
49         // Acquire a lock. This lets us read and modify callback data.
50         let mut lock = device.lock();
51         (*lock).volume = 0.25;
52         // Lock guard is dropped here
53     }
54 
55     // Play for another second
56     std::thread::sleep(Duration::from_millis(1_000));
57 
58     // Device is automatically closed when dropped
59 
60     Ok(())
61 }
62