Skip to main content

rill_io/
config.rs

1//! Конфигурация аудиоустройства
2
3use crate::backend::BackendType;
4
5/// Конфигурация аудиоустройства
6#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde-config", derive(serde::Serialize, serde::Deserialize))]
8pub struct AudioConfig {
9    /// Частота дискретизации (Гц)
10    pub sample_rate: u32,
11
12    /// Размер буфера (в семплах)
13    pub buffer_size: u32,
14
15    /// Количество входных каналов
16    pub input_channels: u32,
17
18    /// Количество выходных каналов
19    pub output_channels: u32,
20
21    /// Желаемая задержка (мс)
22    pub target_latency_ms: u32,
23
24    /// Имя входного устройства (если None - используется дефолтное)
25    pub input_device: Option<String>,
26
27    /// Имя выходного устройства (если None - используется дефолтное)
28    pub output_device: Option<String>,
29
30    /// Тип бэкенда
31    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    /// Создать новую конфигурацию
51    pub fn new() -> Self {
52        Self::default()
53    }
54
55    /// Установить частоту дискретизации
56    pub fn with_sample_rate(mut self, sample_rate: u32) -> Self {
57        self.sample_rate = sample_rate;
58        self
59    }
60
61    /// Установить размер буфера
62    pub fn with_buffer_size(mut self, buffer_size: u32) -> Self {
63        self.buffer_size = buffer_size;
64        self
65    }
66
67    /// Установить количество каналов (одинаково для входа и выхода)
68    pub fn with_channels(mut self, channels: u32) -> Self {
69        self.input_channels = channels;
70        self.output_channels = channels;
71        self
72    }
73
74    /// Установить входное устройство
75    pub fn with_input_device(mut self, device: impl Into<String>) -> Self {
76        self.input_device = Some(device.into());
77        self
78    }
79
80    /// Установить выходное устройство
81    pub fn with_output_device(mut self, device: impl Into<String>) -> Self {
82        self.output_device = Some(device.into());
83        self
84    }
85
86    /// Установить тип бэкенда
87    pub fn with_backend(mut self, backend: BackendType) -> Self {
88        self.backend_type = backend;
89        self
90    }
91
92    /// Рассчитать реальную задержку в секундах
93    pub fn latency_seconds(&self) -> f64 {
94        self.buffer_size as f64 / self.sample_rate as f64
95    }
96
97    /// Рассчитать реальную задержку в миллисекундах
98    pub fn latency_ms(&self) -> f64 {
99        self.latency_seconds() * 1000.0
100    }
101}