use audio_processor_testing_helpers::relative_path;
use audio_processor_traits::{AudioBuffer, AudioContext, AudioProcessor};
use cpal::traits::{DeviceTrait, HostTrait};
use cpal::{BufferSize, SampleRate, StreamConfig};
fn main() {
wisual_logger::init_from_env();
let args: Vec<String> = std::env::args().collect();
let file_path = args
.get(1)
.cloned()
.unwrap_or(relative_path!("../../../../input-files/bass.wav"));
let mut processor = audio_processor_file::AudioFileProcessor::from_path(
audio_garbage_collector::handle(),
Default::default(),
&file_path,
)
.unwrap();
let mut context = AudioContext::default();
processor.prepare(&mut context);
run_audio(processor);
}
fn run_audio(mut processor: impl AudioProcessor<SampleType = f32> + Send + 'static) {
let host = cpal::default_host();
let output_device = host.default_output_device().unwrap();
let mut context = AudioContext::default();
let mut buffer = AudioBuffer::empty();
buffer.resize(2, 1024);
let _handle = output_device
.build_output_stream(
&StreamConfig {
buffer_size: BufferSize::Default,
channels: 2,
sample_rate: SampleRate(44100),
},
move |data, _info| {
buffer.resize(2, data.len() / 2);
buffer.copy_from_interleaved(data);
processor.process(&mut context, &mut buffer);
},
|err| log::error!("CPAL stream error: {}", err),
None,
)
.unwrap();
std::thread::park();
}