playback_sine/
playback_sine.rs

1use rtaudio::{Api, Buffers, DeviceParams, SampleFormat, StreamInfo, StreamOptions, StreamStatus};
2
3const AMPLITUDE: f32 = 0.5;
4const FREQ_HZ: f32 = 440.0;
5
6fn main() {
7    let host = rtaudio::Host::new(Api::Unspecified).unwrap();
8    dbg!(host.api());
9
10    let out_device = host.default_output_device().unwrap();
11
12    let mut stream_handle = host
13        .open_stream(
14            Some(DeviceParams {
15                device_id: out_device.id,
16                num_channels: 2,
17                first_channel: 0,
18            }),
19            None,
20            SampleFormat::Float32,
21            out_device.preferred_sample_rate,
22            256,
23            StreamOptions::default(),
24            |error| eprintln!("{}", error),
25        )
26        .unwrap();
27    dbg!(stream_handle.info());
28
29    let mut phasor = 0.0;
30    let phasor_inc = FREQ_HZ / stream_handle.info().sample_rate as f32;
31
32    stream_handle
33        .start(
34            move |buffers: Buffers<'_>, _info: &StreamInfo, _status: StreamStatus| {
35                if let Buffers::Float32 { output, input: _ } = buffers {
36                    // By default, buffers are interleaved.
37                    for frame in output.chunks_mut(2) {
38                        // Generate a sine wave at 440 Hz at 50% volume.
39                        let val = (phasor * std::f32::consts::TAU).sin() * AMPLITUDE;
40                        phasor = (phasor + phasor_inc).fract();
41
42                        frame[0] = val;
43                        frame[1] = val;
44                    }
45                }
46            },
47        )
48        .unwrap();
49
50    // Wait 3 seconds before closing.
51    std::thread::sleep(std::time::Duration::from_millis(3000));
52}