diff --git a/gui/src/effects.rs b/gui/src/effects.rs index e85c945..9f6c821 100644 --- a/gui/src/effects.rs +++ b/gui/src/effects.rs @@ -74,6 +74,7 @@ fn with_denoising_model( pub struct AudioProcessor { denoise: bool, spawn: imp::SpawnHandle, + buffer: Vec, } impl AudioProcessor { @@ -81,6 +82,7 @@ impl AudioProcessor { AudioProcessor { denoise: false, spawn: imp::SpawnHandle::current(), + buffer: Vec::new(), } } @@ -88,30 +90,45 @@ impl AudioProcessor { AudioProcessor { denoise: true, spawn: imp::SpawnHandle::current(), + buffer: Vec::new(), } } } impl AudioProcessor { pub fn process(&mut self, audio: &[f32], output: &mut Vec) { - let mut finished = false; + let mut include_raw = true; if self.denoise { with_denoising_model(&self.spawn, |df| { - let start = output.len(); - output.extend(std::iter::repeat_n(0f32, audio.len())); - finished = true; - let output = &mut output[start..]; - df.process( - slice_as_arrayview(audio, &[audio.len()]) - .into_shape((1, audio.len())) - .unwrap(), - mut_slice_as_arrayviewmut(output, &[output.len()]) - .into_shape((1, output.len())) - .unwrap(), - ); + include_raw = false; + + self.buffer.extend_from_slice(audio); + output.reserve(audio.len()); + + let hop = df.hop_size; + let mut i = 0; + while self.buffer[i..].len() >= hop { + let audio = &self.buffer[i..][..hop]; + i += audio.len(); + + let j = output.len(); + output.extend(std::iter::repeat_n(0f32, audio.len())); + let output = &mut output[j..]; + + df.process( + slice_as_arrayview(audio, &[audio.len()]) + .into_shape((1, audio.len())) + .unwrap(), + mut_slice_as_arrayviewmut(output, &[output.len()]) + .into_shape((1, output.len())) + .unwrap(), + ); + } + self.buffer.splice(..i, []); }); } - if !finished { + + if include_raw { output.extend_from_slice(audio); } }