1use crate::core::{
2 ActiveRecording, AudioFrame, AudioProfile, AudioResult, AudioSpec, CaptureDiagnostics,
3 DelayEffectConfig, InputDeviceInfo, NativeCaptureConfig, ProcessorOverrideMode,
4};
5use crate::types::{AudioBlock, ProcessContext, ProcessorInfo};
6use std::collections::BTreeMap;
7
8#[allow(dead_code)]
9pub trait AudioProcessor: Send {
10 fn name(&self) -> &'static str;
11 fn prepare(&mut self, spec: AudioSpec) -> AudioResult<()>;
12 fn process(&mut self, frame: &mut AudioFrame) -> AudioResult<()>;
13
14 fn prepare_with_context(&mut self, ctx: &ProcessContext) -> AudioResult<ProcessorInfo> {
15 self.prepare(ctx.spec)?;
16 Ok(ProcessorInfo {
17 latency_samples: self.latency_samples(),
18 })
19 }
20
21 fn process_block(&mut self, block: &mut AudioBlock, _ctx: &ProcessContext) -> AudioResult<()> {
22 let mut frame = AudioFrame {
23 samples: std::mem::take(&mut block.samples),
24 spec: block.spec,
25 };
26 self.process(&mut frame)?;
27 block.samples = frame.samples;
28 Ok(())
29 }
30
31 fn reset(&mut self) {}
32
33 fn latency_samples(&self) -> usize {
34 0
35 }
36
37 fn diagnostics_notes(&self) -> Vec<String> {
38 Vec::new()
39 }
40}
41
42pub trait AudioSink: Send {
43 fn write_frame(&mut self, frame: &AudioFrame) -> AudioResult<()>;
44 fn finalize(&mut self) -> AudioResult<()>;
45}
46
47pub trait MetricsCollector: Send {
48 fn observe(&mut self, frame: &AudioFrame);
49 fn apply(&self, diagnostics: &mut CaptureDiagnostics);
50}
51
52pub trait CaptureBackend: Send + Sync {
53 fn start(&self, config: NativeCaptureConfig) -> AudioResult<Box<dyn ActiveRecording>>;
54}
55
56#[derive(Debug, Clone)]
57pub struct ProcessorBuildRequest {
58 pub profile: AudioProfile,
59 pub gain_db: f32,
60 pub limiter_threshold: f32,
61 pub high_pass_hz: f32,
62 pub noise_suppression_amount: f32,
63 pub noise_calibration_ms: u32,
64 pub delay_effect: Option<DelayEffectConfig>,
65 pub stage_overrides: BTreeMap<String, ProcessorOverrideMode>,
66}
67
68pub trait ProcessorFactory: Send + Sync {
69 fn build_processors(
70 &self,
71 request: ProcessorBuildRequest,
72 ) -> AudioResult<Vec<Box<dyn AudioProcessor>>>;
73}
74
75#[allow(dead_code)]
76pub trait DeviceEnumerator: Send + Sync {
77 fn list_input_devices(&self) -> AudioResult<Vec<InputDeviceInfo>>;
78 fn set_default_input_device(&self, device_id: &str) -> AudioResult<()>;
79}