surge-qfunit 0.2.11-alpha.0

surge synthesizer -- quad filter unit used for voice processing
crate::ix!();

pub type WaveshaperQFPtr 
= fn(&mut WaveshaperState, input: __m128, drive: __m128) -> __m128;

pub type FilterUnitQFPtr 
= fn(&mut QuadFilterUnitState, __m128) -> __m128;

pub struct FbqGlobal {
    pub fu1ptr:   Option<FilterUnitQFPtr>,
    pub fu2ptr:   Option<FilterUnitQFPtr>,
    pub wsptr:    Option<WaveshaperQFPtr>,
}

pub type FBQFPtr = dyn Fn(
    &mut WaveshaperState,
    &mut QuadFilterChainState, 
    &mut FbqGlobal, 
    *mut f32, *mut f32);


#[allow(unused_variables)]
pub fn get_quad_filter_waveshaper_ptr(ty: WaveshapeType) -> WaveshaperQFPtr {
    todo!();
    /*
    match ty {
        WaveshapeType::Off => {
            panic!("logic bug");
        },
        WaveshapeType::SoftTanh => {
            WaveshaperState::tanh
        },
        WaveshapeType::Hard => {
            WaveshaperState::clip
        },
        WaveshapeType::Asymmetric => {
            WaveshaperState::asym_sse2
        },
        WaveshapeType::Sine => {
            WaveshaperState::sine_sse2
        },
        WaveshapeType::Digital => {
            WaveshaperState::digi_sse2
        },
    }
    */
}

#[allow(unused_variables)]
pub fn get_quad_filter_ptr(ty: FilterType, subty: Option<FilterSubType>) -> FilterUnitQFPtr {
    todo!();
    /*
    match ty {

        FilterType::Off => {
            panic!("logic bug");//TODO: can we eliminate this branch?
        },

        FilterType::MoogLadder => { QuadFilterUnitState::lp_moog_quad },

        FilterType::Notch => {
            QuadFilterUnitState::iir_12_b_quad
        },

        /*
        FilterType::Comb => {
            QuadFilterUnitState::COMB_quad_SSE2
        },
        */

        FilterType::SampleAndHold => {
            QuadFilterUnitState::SNH_quad
        },
        FilterType::DiodeLadder => {
            QuadFilterUnitState::diode_ladder
        },
        FilterType::K35Highpass => {
            QuadFilterUnitState::k35_hp
        },
        FilterType::K35Lowpass => {
            QuadFilterUnitState::k35_lp
        },
        FilterType::Obxd2Pole => {
            QuadFilterUnitState::obxd_2pole
        },
        FilterType::Obxd4Pole => {
            QuadFilterUnitState::obxd_4pole
        },
        FilterType::VintageLadderRungeKutta => {
            QuadFilterUnitState::vintage_ladder_rk
        },
        FilterType::VintageLadderHuovilainen => {
            QuadFilterUnitState::vintage_ladder_hv
        },
        FilterType::NonlinearFeedback => {
            QuadFilterUnitState::nonlinear_feedback
        },
        FilterType::NonlinearStates => {
            QuadFilterUnitState::nonlinear_states
        },
    }
    */
}