use crate::core::{
ActiveRecording, AudioFrame, AudioProfile, AudioResult, AudioSpec, CaptureDiagnostics,
DelayEffectConfig, InputDeviceInfo, NativeCaptureConfig, ProcessorOverrideMode,
};
use crate::types::{AudioBlock, ProcessContext, ProcessorInfo};
use std::collections::BTreeMap;
#[allow(dead_code)]
pub trait AudioProcessor: Send {
fn name(&self) -> &'static str;
fn prepare(&mut self, spec: AudioSpec) -> AudioResult<()>;
fn process(&mut self, frame: &mut AudioFrame) -> AudioResult<()>;
fn prepare_with_context(&mut self, ctx: &ProcessContext) -> AudioResult<ProcessorInfo> {
self.prepare(ctx.spec)?;
Ok(ProcessorInfo {
latency_samples: self.latency_samples(),
})
}
fn process_block(&mut self, block: &mut AudioBlock, _ctx: &ProcessContext) -> AudioResult<()> {
let mut frame = AudioFrame {
samples: std::mem::take(&mut block.samples),
spec: block.spec,
};
self.process(&mut frame)?;
block.samples = frame.samples;
Ok(())
}
fn reset(&mut self) {}
fn latency_samples(&self) -> usize {
0
}
fn diagnostics_notes(&self) -> Vec<String> {
Vec::new()
}
}
pub trait AudioSink: Send {
fn write_frame(&mut self, frame: &AudioFrame) -> AudioResult<()>;
fn finalize(&mut self) -> AudioResult<()>;
}
pub trait MetricsCollector: Send {
fn observe(&mut self, frame: &AudioFrame);
fn apply(&self, diagnostics: &mut CaptureDiagnostics);
}
pub trait CaptureBackend: Send + Sync {
fn start(&self, config: NativeCaptureConfig) -> AudioResult<Box<dyn ActiveRecording>>;
}
#[derive(Debug, Clone)]
pub struct ProcessorBuildRequest {
pub profile: AudioProfile,
pub gain_db: f32,
pub limiter_threshold: f32,
pub high_pass_hz: f32,
pub noise_suppression_amount: f32,
pub noise_calibration_ms: u32,
pub delay_effect: Option<DelayEffectConfig>,
pub stage_overrides: BTreeMap<String, ProcessorOverrideMode>,
}
pub trait ProcessorFactory: Send + Sync {
fn build_processors(
&self,
request: ProcessorBuildRequest,
) -> AudioResult<Vec<Box<dyn AudioProcessor>>>;
}
#[allow(dead_code)]
pub trait DeviceEnumerator: Send + Sync {
fn list_input_devices(&self) -> AudioResult<Vec<InputDeviceInfo>>;
fn set_default_input_device(&self, device_id: &str) -> AudioResult<()>;
}