Skip to main content

rill_io/
backend.rs

1//! Трейт аудио бэкенда и связанные типы
2
3use crate::config::AudioConfig;
4use crate::error::IoResult;
5use std::fmt::Debug;
6use std::time::Duration;
7
8/// Тип бэкенда
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde-config", derive(serde::Serialize, serde::Deserialize))]
11pub enum BackendType {
12    /// CPAL (кросс-платформенный)
13    Cpal,
14    /// ALSA (Linux)
15    Alsa,
16    /// PipeWire (Linux)
17    PipeWire,
18    /// JACK (Linux/macOS)
19    Jack,
20    /// Null (тестирование)
21    Null,
22}
23
24impl BackendType {
25    /// Получить имя бэкенда
26    pub fn name(&self) -> &'static str {
27        match self {
28            BackendType::Cpal => "CPAL",
29            BackendType::Alsa => "ALSA",
30            BackendType::PipeWire => "PipeWire",
31            BackendType::Jack => "JACK",
32            BackendType::Null => "Null",
33        }
34    }
35
36    /// Доступен ли бэкенд на текущей платформе
37    pub fn is_available(&self) -> bool {
38        match self {
39            BackendType::Cpal => true,
40            BackendType::Alsa => cfg!(target_os = "linux"),
41            BackendType::PipeWire => cfg!(target_os = "linux"),
42            BackendType::Jack => cfg!(any(target_os = "linux", target_os = "macos")),
43            BackendType::Null => true,
44        }
45    }
46}
47
48/// Трейт аудио бэкенда
49pub trait AudioBackend: Send + Sync + Debug {
50    /// Получить тип бэкенда
51    fn backend_type(&self) -> BackendType;
52
53    /// Получить конфигурацию
54    fn config(&self) -> &AudioConfig;
55
56    /// Получить мутабельную конфигурацию
57    fn config_mut(&mut self) -> &mut AudioConfig;
58
59    /// Инициализировать бэкенд
60    fn init(&mut self) -> IoResult<()>;
61
62    /// Запустить обработку
63    fn start(&mut self) -> IoResult<()>;
64
65    /// Остановить обработку
66    fn stop(&mut self) -> IoResult<()>;
67
68    /// Прочитать данные из входного потока
69    fn read(&mut self, buffer: &mut [f32]) -> IoResult<usize>;
70
71    /// Записать данные в выходной поток
72    fn write(&mut self, buffer: &[f32]) -> IoResult<usize>;
73
74    /// Количество пропущенных семплов (xruns)
75    fn xruns(&self) -> u32;
76
77    /// Текущая задержка
78    fn latency(&self) -> Duration;
79
80    /// Получить список доступных входных устройств
81    fn list_input_devices(&self) -> Vec<String>;
82
83    /// Получить список доступных выходных устройств
84    fn list_output_devices(&self) -> Vec<String>;
85}
86
87// Blanket impl so that `Box<dyn AudioBackend>` satisfies `B: AudioBackend`.
88impl<T: AudioBackend + ?Sized> AudioBackend for Box<T> {
89    fn backend_type(&self) -> BackendType {
90        (**self).backend_type()
91    }
92
93    fn config(&self) -> &AudioConfig {
94        (**self).config()
95    }
96
97    fn config_mut(&mut self) -> &mut AudioConfig {
98        (**self).config_mut()
99    }
100
101    fn init(&mut self) -> IoResult<()> {
102        (**self).init()
103    }
104
105    fn start(&mut self) -> IoResult<()> {
106        (**self).start()
107    }
108
109    fn stop(&mut self) -> IoResult<()> {
110        (**self).stop()
111    }
112
113    fn read(&mut self, buffer: &mut [f32]) -> IoResult<usize> {
114        (**self).read(buffer)
115    }
116
117    fn write(&mut self, buffer: &[f32]) -> IoResult<usize> {
118        (**self).write(buffer)
119    }
120
121    fn xruns(&self) -> u32 {
122        (**self).xruns()
123    }
124
125    fn latency(&self) -> Duration {
126        (**self).latency()
127    }
128
129    fn list_input_devices(&self) -> Vec<String> {
130        (**self).list_input_devices()
131    }
132
133    fn list_output_devices(&self) -> Vec<String> {
134        (**self).list_output_devices()
135    }
136}
137
138/// Информация об устройстве
139#[derive(Debug, Clone)]
140pub struct DeviceInfo {
141    /// Имя устройства
142    pub name: String,
143    /// Тип бэкенда
144    pub backend: BackendType,
145    /// Является ли устройством по умолчанию
146    pub is_default: bool,
147    /// Максимальное количество входных каналов
148    pub max_input_channels: u32,
149    /// Максимальное количество выходных каналов
150    pub max_output_channels: u32,
151    /// Поддерживаемые частоты дискретизации
152    pub supported_sample_rates: Vec<u32>,
153    /// Поддерживаемые размеры буфера
154    pub supported_buffer_sizes: Vec<u32>,
155}