#[cfg(feature = "input")]
mod input;
#[cfg(feature = "output")]
mod output;
use self::cpal::{traits::DeviceTrait, *};
#[cfg(feature = "output")]
use crate::Frame;
#[cfg(feature = "input")]
pub use input::*;
#[cfg(feature = "output")]
pub use output::*;
pub mod cpal {
pub use ::cpal::*;
}
#[derive(Debug, thiserror::Error)]
pub enum BuildSystemAudioError {
#[error("{0}")]
Stream(#[from] BuildStreamError),
#[error("{0}")]
Play(#[from] PlayStreamError),
#[error("{0}")]
SupportedConfigs(#[from] SupportedStreamConfigsError),
#[error("{0}")]
DefaultConfig(#[from] DefaultStreamConfigError),
#[error("No device available")]
NoDevice,
#[error("Unsupported sample format")]
UnsupportedSampleFormat,
}
pub type BuildSystemAudioResult<T> = Result<T, BuildSystemAudioError>;
#[derive(Default)]
pub struct DeviceIoBuilder {
pub device: Option<Device>,
pub config: Option<SupportedStreamConfig>,
}
impl DeviceIoBuilder {
#[cfg(feature = "input")]
pub fn default_input() -> Self {
let device = default_input_device();
let config = device
.as_ref()
.and_then(|device| device.default_input_config().ok());
DeviceIoBuilder { device, config }
}
#[cfg(feature = "output")]
pub fn default_output() -> Self {
let device = default_output_device();
let config = device
.as_ref()
.and_then(|device| device.default_output_config().ok());
DeviceIoBuilder { device, config }
}
pub fn device(self, device: Device) -> Self {
DeviceIoBuilder {
device: Some(device),
..self
}
}
pub fn config(self, config: SupportedStreamConfig) -> Self {
DeviceIoBuilder {
config: Some(config),
..self
}
}
#[cfg(feature = "input")]
pub fn build_input(self) -> BuildSystemAudioResult<InputDeviceSource> {
InputDeviceSource::from_builder(self)
}
#[cfg(feature = "output")]
pub fn build_output<F>(self) -> BuildSystemAudioResult<OutputDeviceMixer<F>>
where
F: Frame + Send + 'static,
{
OutputDeviceMixer::from_builder(self)
}
}