use kithara_decode::PcmChunk;
use kithara_stream::Timeline;
use crate::{pipeline::track_fsm, traits::AudioEffect};
mod kithara {
pub(crate) use kithara_test_macros::mock;
}
#[kithara::mock(api = MockAudioWorkerSource, type Chunk = PcmChunk;)]
pub trait AudioWorkerSource: Send + 'static {
type Chunk: Send + 'static;
fn step_track(&mut self) -> track_fsm::TrackStep<Self::Chunk>;
fn timeline(&self) -> &Timeline;
}
pub(crate) fn apply_effects(
effects: &mut [Box<dyn AudioEffect>],
mut chunk: PcmChunk,
) -> Option<PcmChunk> {
for effect in &mut *effects {
chunk = effect.process(chunk)?;
}
Some(chunk)
}
pub(crate) fn flush_effects(effects: &mut [Box<dyn AudioEffect>]) -> Option<PcmChunk> {
let mut chunk: Option<PcmChunk> = None;
for effect in &mut *effects {
chunk = match chunk.take() {
Some(input) => effect.process(input),
None => effect.flush(),
};
}
chunk
}
pub(crate) fn reset_effects(effects: &mut [Box<dyn AudioEffect>]) {
for effect in &mut *effects {
effect.reset();
}
}