waycap_rs/encoders/
audio.rs

1use crossbeam::channel::Receiver;
2
3use crate::types::{
4    audio_frame::{EncodedAudioFrame, RawAudioFrame},
5    error::Result,
6};
7
8const MIN_RMS: f32 = 0.01;
9
10pub trait AudioEncoder: Send {
11    fn new() -> Result<Self>
12    where
13        Self: Sized;
14    fn process(&mut self, raw_frame: RawAudioFrame) -> Result<()>;
15    fn drain(&mut self) -> Result<()>;
16    fn reset(&mut self) -> Result<()>;
17    fn get_encoder(&self) -> &Option<ffmpeg_next::codec::encoder::Audio>;
18    fn get_encoded_recv(&mut self) -> Option<Receiver<EncodedAudioFrame>>;
19    fn drop_encoder(&mut self);
20}
21
22pub fn boost_with_rms(samples: &mut [f32]) -> Result<()> {
23    let sum_sqrs = samples.iter().map(|&s| s * s).sum::<f32>();
24    let rms = (sum_sqrs / samples.len() as f32).sqrt();
25
26    let gain = if rms > 0.0 && rms < MIN_RMS {
27        MIN_RMS / rms
28    } else {
29        1.0
30    };
31
32    let gain = gain.min(5.0);
33    for sample in samples.iter_mut() {
34        *sample *= gain;
35    }
36    Ok(())
37}