use crossbeam_channel::bounded;
use std::io;
use std::str::FromStr;
fn main() {
let (client, _status) =
jack::Client::new("rust_jack_sine", jack::ClientOptions::NO_START_SERVER).unwrap();
let mut out_port = client
.register_port("sine_out", jack::AudioOut::default())
.unwrap();
let mut frequency = 220.0;
let sample_rate = client.sample_rate();
let frame_t = 1.0 / sample_rate as f64;
let mut time = 0.0;
let (tx, rx) = bounded(1_000_000);
let process = jack::ClosureProcessHandler::new(
move |_: &jack::Client, ps: &jack::ProcessScope| -> jack::Control {
let out = out_port.as_mut_slice(ps);
while let Ok(f) = rx.try_recv() {
time = 0.0;
frequency = f;
}
for v in out.iter_mut() {
let x = frequency * time * 2.0 * std::f64::consts::PI;
let y = x.sin();
*v = y as f32;
time += frame_t;
}
jack::Control::Continue
},
);
let active_client = client.activate_async((), process).unwrap();
active_client
.as_client()
.connect_ports_by_name("rust_jack_sine:sine_out", "system:playback_1")
.unwrap();
active_client
.as_client()
.connect_ports_by_name("rust_jack_sine:sine_out", "system:playback_2")
.unwrap();
println!("Enter an integer value to change the frequency of the sine wave.");
while let Some(f) = read_freq() {
tx.send(f).unwrap();
}
active_client.deactivate().unwrap();
}
fn read_freq() -> Option<f64> {
let mut user_input = String::new();
match io::stdin().read_line(&mut user_input) {
Ok(_) => u16::from_str(user_input.trim()).ok().map(|n| n as f64),
Err(_) => None,
}
}