Skip to main content

zk_audio/
contracts.rs

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}