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