use crate::{math::Float, Frame, Seek, Signal};
pub struct Reinhard<T>(T);
impl<T> Reinhard<T> {
pub fn new(signal: T) -> Self {
Self(signal)
}
}
impl<T: Signal> Signal for Reinhard<T>
where
T::Frame: Frame,
{
type Frame = T::Frame;
fn sample(&mut self, interval: f32, out: &mut [T::Frame]) {
self.0.sample(interval, out);
for x in out {
for channel in x.channels_mut() {
*channel /= 1.0 + channel.abs();
}
}
}
fn is_finished(&self) -> bool {
self.0.is_finished()
}
}
impl<T> Seek for Reinhard<T>
where
T: Signal + Seek,
T::Frame: Frame,
{
fn seek(&mut self, seconds: f32) {
self.0.seek(seconds);
}
}