1use crate::backend::BackendType;
4
5#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde-config", derive(serde::Serialize, serde::Deserialize))]
8pub struct AudioConfig {
9 pub sample_rate: u32,
11
12 pub buffer_size: u32,
14
15 pub input_channels: u32,
17
18 pub output_channels: u32,
20
21 pub target_latency_ms: u32,
23
24 pub input_device: Option<String>,
26
27 pub output_device: Option<String>,
29
30 pub backend_type: BackendType,
32}
33
34impl Default for AudioConfig {
35 fn default() -> Self {
36 Self {
37 sample_rate: 48000,
38 buffer_size: 256,
39 input_channels: 2,
40 output_channels: 2,
41 target_latency_ms: 10,
42 input_device: None,
43 output_device: None,
44 backend_type: BackendType::Cpal,
45 }
46 }
47}
48
49impl AudioConfig {
50 pub fn new() -> Self {
52 Self::default()
53 }
54
55 pub fn with_sample_rate(mut self, sample_rate: u32) -> Self {
57 self.sample_rate = sample_rate;
58 self
59 }
60
61 pub fn with_buffer_size(mut self, buffer_size: u32) -> Self {
63 self.buffer_size = buffer_size;
64 self
65 }
66
67 pub fn with_channels(mut self, channels: u32) -> Self {
69 self.input_channels = channels;
70 self.output_channels = channels;
71 self
72 }
73
74 pub fn with_input_device(mut self, device: impl Into<String>) -> Self {
76 self.input_device = Some(device.into());
77 self
78 }
79
80 pub fn with_output_device(mut self, device: impl Into<String>) -> Self {
82 self.output_device = Some(device.into());
83 self
84 }
85
86 pub fn with_backend(mut self, backend: BackendType) -> Self {
88 self.backend_type = backend;
89 self
90 }
91
92 pub fn latency_seconds(&self) -> f64 {
94 self.buffer_size as f64 / self.sample_rate as f64
95 }
96
97 pub fn latency_ms(&self) -> f64 {
99 self.latency_seconds() * 1000.0
100 }
101}