use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
use libpd_rs::convenience::PdGlobal;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let host = cpal::default_host();
let device = host.default_output_device().unwrap();
let config = device.default_output_config()?;
let sample_rate = config.sample_rate().0 as i32;
let output_channels = config.channels() as i32;
let mut pd = PdGlobal::init_and_configure(0, output_channels, sample_rate)?;
pd.eval_patch(
r#"
#N canvas 577 549 158 168 12;
#X obj 23 116 dac~;
#X obj 23 17 osc~ 440;
#X obj 23 66 *~ 0.1;
#X obj 81 67 *~ 0.1;
#X connect 1 0 2 0;
#X connect 1 0 3 0;
#X connect 2 0 0 0;
#X connect 3 0 0 1;
"#,
)?;
let output_stream = device.build_output_stream(
&config.into(),
move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
let ticks = libpd_rs::convenience::calculate_ticks(output_channels, data.len() as i32);
libpd_rs::process::process_float(ticks, &[], data);
},
|err| eprintln!("an error occurred on stream: {}", err),
)?;
pd.activate_audio(true)?;
output_stream.play()?;
std::thread::sleep(std::time::Duration::from_secs(5));
pd.activate_audio(false)?;
output_stream.pause()?;
pd.close_patch()?;
Ok(())
}