use crate::backend::BackendType;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde-config", derive(serde::Serialize, serde::Deserialize))]
pub struct AudioConfig {
pub sample_rate: u32,
pub buffer_size: u32,
pub input_channels: u32,
pub output_channels: u32,
pub target_latency_ms: u32,
pub input_device: Option<String>,
pub output_device: Option<String>,
pub backend_type: BackendType,
}
impl Default for AudioConfig {
fn default() -> Self {
Self {
sample_rate: 48000,
buffer_size: 256,
input_channels: 2,
output_channels: 2,
target_latency_ms: 10,
input_device: None,
output_device: None,
backend_type: BackendType::Cpal,
}
}
}
impl AudioConfig {
pub fn new() -> Self {
Self::default()
}
pub fn with_sample_rate(mut self, sample_rate: u32) -> Self {
self.sample_rate = sample_rate;
self
}
pub fn with_buffer_size(mut self, buffer_size: u32) -> Self {
self.buffer_size = buffer_size;
self
}
pub fn with_channels(mut self, channels: u32) -> Self {
self.input_channels = channels;
self.output_channels = channels;
self
}
pub fn with_input_channels(mut self, channels: u32) -> Self {
self.input_channels = channels;
self
}
pub fn with_output_channels(mut self, channels: u32) -> Self {
self.output_channels = channels;
self
}
pub fn with_input_device(mut self, device: impl Into<String>) -> Self {
self.input_device = Some(device.into());
self
}
pub fn with_output_device(mut self, device: impl Into<String>) -> Self {
self.output_device = Some(device.into());
self
}
pub fn with_backend(mut self, backend: BackendType) -> Self {
self.backend_type = backend;
self
}
pub fn latency_seconds(&self) -> f64 {
self.buffer_size as f64 / self.sample_rate as f64
}
pub fn latency_ms(&self) -> f64 {
self.latency_seconds() * 1000.0
}
}