waycap_rs/encoders/
audio.rs1use 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}