use std::sync::mpsc::Sender;
use cpal::{traits::DeviceTrait, StreamConfig};
use ringbuf::Producer;
use crate::standalone_cpal::error::AudioThreadError;
pub fn build_input_stream<Device: DeviceTrait>(
input_device: Device,
input_config: StreamConfig,
mut producer: Producer<f32>,
errors_tx: Sender<AudioThreadError>,
) -> Result<Device::Stream, AudioThreadError> {
let input_stream = input_device
.build_input_stream(
&input_config,
move |data: &[f32], _input_info: &cpal::InputCallbackInfo| {
input_stream_callback(&mut producer, data)
},
move |err| {
log::error!("Input error: {:?}", err);
let _ = errors_tx.send(AudioThreadError::InputStreamError(err));
},
None,
)
.map_err(AudioThreadError::BuildInputStreamError)?;
Ok(input_stream)
}
fn input_stream_callback(producer: &mut Producer<f32>, data: &[f32]) {
for sample in data {
while producer.push(*sample).is_err() {}
}
}