sawtooth/
sawtooth.rs

1extern crate sqa_jack;
2
3use sqa_jack::{JackPort, JackConnection, JackCallbackContext, JackControl, JackHandler, JackResult, PORT_IS_OUTPUT, PORT_IS_INPUT, PORT_IS_PHYSICAL};
4use std::thread;
5struct Sawtooth {
6    out1: JackPort,
7    out2: JackPort,
8    left_saw: f32,
9    right_saw: f32
10}
11impl JackHandler for Sawtooth {
12    fn process(&mut self, ctx: &JackCallbackContext) -> JackControl {
13        let out1 = ctx.get_port_buffer(&self.out1).unwrap();
14        let out2 = ctx.get_port_buffer(&self.out2).unwrap();
15        for (out1, out2) in out1.iter_mut().zip(out2.iter_mut()) {
16            *out1 = self.left_saw * 0.2;
17            *out2 = self.right_saw * 0.2;
18            self.left_saw += 0.01;
19            if self.left_saw >= 1.0 { self.left_saw -= 2.0; }
20            self.right_saw += 0.03;
21            if self.right_saw >= 1.0 { self.right_saw -= 2.0; }
22        }
23        JackControl::Continue
24    }
25}
26fn run() -> JackResult<()> {
27    let mut conn = JackConnection::connect("Very Annoying Sawtooth Generator", None)?;
28    let out1 = conn.register_port("output_1", PORT_IS_OUTPUT)?;
29    let out2 = conn.register_port("output_2", PORT_IS_OUTPUT)?;
30    let data = Sawtooth {
31        out1: out1,
32        out2: out2,
33        left_saw: 0.0,
34        right_saw: 0.0
35    };
36    conn.set_handler(data)?;
37    let mut conn = match conn.activate() {
38        Ok(nc) => nc,
39        Err((_, err)) => return Err(err)
40    };
41    let ports = conn.get_ports(None, None, Some(PORT_IS_INPUT | PORT_IS_PHYSICAL))?;
42    if ports.len() >= 2 {
43        conn.connect_ports(&out1, &ports[0])?;
44        conn.connect_ports(&out2, &ports[1])?;
45    }
46    thread::sleep(::std::time::Duration::new(5, 0));
47    Ok(())
48}
49fn main() {
50    println!("ADVANCE WARNING: The noise generated by this example can be loud and annoying");
51    thread::sleep(::std::time::Duration::new(2, 0));
52    println!("{:?}", run());
53}