extern crate easyjack as jack;
extern crate nix;
use nix::sys::signal;
use std::sync::atomic;
use std::thread;
use std::time::Duration;
static RUNNING: atomic::AtomicBool = atomic::ATOMIC_BOOL_INIT;
type InputPort = jack::InputPortHandle<jack::DefaultAudioSample>;
type OutputPort = jack::OutputPortHandle<jack::DefaultAudioSample>;
struct Connector {
inputs: Vec<InputPort>,
outputs: Vec<OutputPort>,
}
impl Connector {
pub fn new(inputs: Vec<InputPort>, outputs: Vec<OutputPort>) -> Self {
assert_eq!(inputs.len(), outputs.len());
Connector {
inputs: inputs,
outputs: outputs
}
}
}
impl jack::ProcessHandler for Connector {
fn process(&mut self, ctx: &jack::CallbackContext, nframes: jack::NumFrames) -> i32 {
for index in 0..self.inputs.len() {
let i = self.inputs[index].get_read_buffer(nframes, ctx);
let o = self.outputs[index].get_write_buffer(nframes, ctx);
o.clone_from_slice(i);
}
0
}
}
extern "C" fn handle_sigint(_: i32) {
RUNNING.store(false, atomic::Ordering::SeqCst);
}
fn main() {
let action = signal::SigAction::new(
signal::SigHandler::Handler(handle_sigint),
signal::SaFlags::empty(),
signal::SigSet::empty());
unsafe { signal::sigaction(signal::Signal::SIGINT, &action) }.unwrap();
RUNNING.store(true, atomic::Ordering::SeqCst);
let mut jack_client =
jack::Client::open("testclient", jack::options::NO_START_SERVER).unwrap().0;
println!("client created named: {}", jack_client.get_name());
let input1 = jack_client.register_input_audio_port("input1").unwrap();
let input2 = jack_client.register_input_audio_port("input2").unwrap();
let output1 = jack_client.register_output_audio_port("output1").unwrap();
let output2 = jack_client.register_output_audio_port("output2").unwrap();
let handler = Connector::new(vec![input1, input2], vec![output1, output2]);
jack_client.set_process_handler(handler).unwrap();
jack_client.activate().unwrap();
while RUNNING.load(atomic::Ordering::SeqCst) {
thread::sleep(Duration::from_millis(1000));
}
println!("tearing down");
jack_client.close().unwrap();
}