pub fn create_duplex_stream<InputDevice: AudioInputDevice, OutputDevice: AudioOutputDevice, Callback: AudioDuplexCallback>(
input_device: InputDevice,
output_device: OutputDevice,
callback: Callback,
config: DuplexStreamConfig,
) -> Result<DuplexStreamHandle<InputDevice::StreamHandle<InputProxy>, OutputDevice::StreamHandle<DuplexCallback<Callback>>>, DuplexCallbackError<InputDevice::Error, OutputDevice::Error>>
Expand description
Creates a duplex audio stream that handles both input and output simultaneously.
This function sets up a full-duplex audio stream by creating separate input and output streams and connecting them through a ring buffer. The input stream captures audio data and stores it in the buffer, while the output stream retrieves and processes this data before playback.
§Arguments
input_device
- The audio input device to capture audio frominput_config
- Configuration parameters for the input streamoutput_device
- The audio output device to play audio throughoutput_config
- Configuration parameters for the output streamcallback
- The callback implementation that processes audio data
§Returns
A Result containing either:
- A
DuplexStreamHandle
that can be used to manage the duplex stream - A
DuplexCallbackError
if stream creation fails
§Example
use interflow::duplex::AudioDuplexCallback;
use interflow::prelude::*;
struct MyCallback;
impl MyCallback {
pub fn new() -> Self {
Self
}
}
impl AudioDuplexCallback for MyCallback {
fn on_audio_data(&mut self, context: AudioCallbackContext, input: AudioInput<f32>, output: AudioOutput<f32>) {
// Implementation left as exercise to the reader
}
}
let input_device = default_input_device();
let output_device = default_output_device();
let input_config = input_device.default_input_config().unwrap();
let output_config = output_device.default_output_config().unwrap();
let callback = MyCallback::new();
let duplex_stream = create_duplex_stream(
input_device,
output_device,
callback,
DuplexStreamConfig::new(input_config, output_config),
).expect("Failed to create duplex stream");