sine/
sine.rs

1extern crate alto;
2
3use std::sync::Arc;
4use alto::*;
5
6
7fn main() {
8	let alto = if let Ok(alto) = Alto::load_default() {
9		alto
10	} else {
11		println!("No OpenAL implementation present!");
12		return;
13	};
14
15	println!("Using output: {:?}", alto.default_output().unwrap());
16	let dev = alto.open(None).unwrap();
17	let ctx = dev.new_context(None).unwrap();
18
19	let mut slot = if dev.is_extension_present(alto::ext::Alc::Efx) {
20		println!("Using EFX reverb");
21		if let Ok(slot) = (|| -> AltoResult<_> {
22			let mut slot = ctx.new_aux_effect_slot()?;
23			let mut reverb: efx::EaxReverbEffect = ctx.new_effect()?;
24			reverb.set_preset(&efx::REVERB_PRESET_GENERIC)?;
25			slot.set_effect(&reverb)?;
26			Ok(slot)
27		})() {
28			Some(slot)
29		} else {
30			println!("Broken router detected; disabling EFX");
31			None
32		}
33	} else {
34		println!("EFX not present");
35		None
36	};
37
38	{
39		let buf = ctx.new_buffer(SinWave::new(44_000 / 440, 0.25).render().take(44_000 / 440).collect::<Vec<_>>(), 44_000).unwrap();
40		let buf = Arc::new(buf);
41
42		let mut src = ctx.new_static_source().unwrap();
43		src.set_buffer(buf).unwrap();
44		src.set_looping(true);
45		if let Some(ref mut slot) = slot {
46			src.set_aux_send(0, slot).unwrap();
47		}
48
49		println!("Playing static 440hz sine wave...");
50		src.play();
51
52		std::thread::sleep(std::time::Duration::new(2, 0));
53	}
54
55	std::thread::sleep(std::time::Duration::new(1, 0));
56
57	{
58		let mut wave = SinWave::new(44_000 / 220, 0.25);
59
60		let mut src = ctx.new_streaming_source().unwrap();
61		if let Some(ref mut slot) = slot {
62			src.set_aux_send(0, slot).unwrap();
63		}
64		for _ in 0 .. 5 {
65			let buf = ctx.new_buffer(wave.render().take(44_000 / 10).collect::<Vec<_>>(), 44_000).unwrap();
66			src.queue_buffer(buf).unwrap();
67		}
68
69		println!("Playing streaming 220hz sine wave...");
70		src.play();
71
72		for _ in 0 .. 15 {
73			while src.buffers_processed() == 0 { }
74
75			let mut buf = src.unqueue_buffer().unwrap();
76			buf.set_data(wave.render().take(44_000 / 10).collect::<Vec<_>>(), 44_000).unwrap();
77			src.queue_buffer(buf).unwrap();
78		}
79
80		while src.buffers_processed() < 5 { }
81	}
82
83	std::thread::sleep(std::time::Duration::new(1, 0));
84}
85
86
87struct SinWave {
88	len: i32,
89	vol: f32,
90	cursor: i32,
91}
92
93struct SinWaveRenderer<'w>(&'w mut SinWave);
94
95
96impl SinWave {
97	pub fn new(len: i32, vol: f32) -> SinWave {
98		SinWave{len: len, vol: vol, cursor: 0}
99	}
100
101
102	pub fn render(&mut self) -> SinWaveRenderer {
103		SinWaveRenderer(self)
104	}
105}
106
107
108impl<'w> Iterator for SinWaveRenderer<'w> {
109	type Item = Mono<i16>;
110
111	fn next(&mut self) -> Option<Mono<i16>> {
112		let cursor = self.0.cursor;
113		self.0.cursor += 1;
114		if self.0.cursor == self.0.len { self.0.cursor = 0 }
115
116		Some(Mono{center: ((cursor as f32 / self.0.len as f32 * 2.0 * std::f32::consts::PI).sin() * self.0.vol * std::i16::MAX as f32) as i16})
117	}
118}