lasprs 0.14.2

Library for Acoustic Signal Processing (Rust edition, with optional Python bindings via pyo3)
//! Implementation of Audio Eq Cookbook filter types and generator code to
//! transform them into biquad filters.
mod graphic;
mod parametric;

pub use graphic::*;
pub use parametric::*;

use super::Biquad;
use super::Result;
use crate::{
    filter::{Filter, StandardFilterDescriptor},
    *,
};
use serde::{Deserialize, Serialize};

/// Anything that is able to generate a filter,
pub trait FilterGenerator {
    /// Generate filter from descriptor.
    ///
    /// # Args
    /// - `fs`: Sampling frequency in Hz.
    fn genFilter(&self, fs: StrictlyPositive) -> Result<Filter>;
}

/// Equalizer used for the output stream. Basically is a collection of
/// descriptors for filters.
#[cfg_attr(
    feature = "python-bindings",
    gen_stub_pyclass_complex_enum,
    pyclass(from_py_object)
)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Equalizer {
    /// Graphic equalizer, with knobs for every band. Octave band wide configuration
    Graphic {
        /// Configuration for the graphic equalizer.
        config: GraphicEqualizer,
    },
    /// Parametric equalizer, where filter stages are cascaded.
    Parametric {
        /// Configuration for the parametric equalizer.
        config: ParametricEqualizer,
    },
}
impl Default for Equalizer {
    fn default() -> Self {
        Equalizer::Parametric {
            config: ParametricEqualizer::default(),
        }
    }
}

impl FilterGenerator for Equalizer {
    /// Generate a filter.
    ///
    /// # Args
    /// - `fs`: Sampling frequency in Hz.
    fn genFilter(&self, fs: StrictlyPositive) -> Result<Filter> {
        match self {
            Equalizer::Graphic { config } => config.genFilter(fs),
            Equalizer::Parametric { config } => config.genFilter(fs),
        }
    }
}