// Reverb model declaration
//
// Google Summer of Code 2007
//
// Authors: Biodun Osunkunle <biodun@videolan.org>
//
// Mentor : Jean-Baptiste Kempf <jb@videolan.org>
//
// Original written by Jezar at Dreampoint, June 2000

#ifndef _revmodel_
#define _revmodel_

#include "comb.hpp"
#include "allpass.hpp"
#include "tuning.h"

class revmodel
{
public:
            revmodel();
    void    mute();
    void    processreplace(float *inputL, float *outputL, long numsamples, int skip);
    void    processmix(float *inputL, float *outputL, long numsamples, int skip);
    void    setroomsize(float value);
    void    setdamp(float value);
    void    setwet(float value);
    void    setdry(float value);
    void    setwidth(float value);
    void    setmode(float value);
private:
    void    update();
private:
    float   gain;
    float   roomsize,roomsize1;
    float   damp,damp1;
    float   wet,wet1,wet2;
    float   dry;
    float   width;
    float   mode;

// The following are all declared inline
// to remove the need for dynamic allocation
// with its subsequent error-checking messiness

    // Comb filters
    comb    combL[numcombs];
    comb    combR[numcombs];

    // Allpass filters
    allpass allpassL[numallpasses];
    allpass allpassR[numallpasses];

    // Buffers for the combs
    float   bufcombL1[combtuningL1];
    float   bufcombR1[combtuningR1];
    float   bufcombL2[combtuningL2];
    float   bufcombR2[combtuningR2];
    float   bufcombL3[combtuningL3];
    float   bufcombR3[combtuningR3];
    float   bufcombL4[combtuningL4];
    float   bufcombR4[combtuningR4];
    float   bufcombL5[combtuningL5];
    float   bufcombR5[combtuningR5];
    float   bufcombL6[combtuningL6];
    float   bufcombR6[combtuningR6];
    float   bufcombL7[combtuningL7];
    float   bufcombR7[combtuningR7];
    float   bufcombL8[combtuningL8];
    float   bufcombR8[combtuningR8];

    // Buffers for the allpasses
    float   bufallpassL1[allpasstuningL1];
    float   bufallpassR1[allpasstuningR1];
    float   bufallpassL2[allpasstuningL2];
    float   bufallpassR2[allpasstuningR2];
    float   bufallpassL3[allpasstuningL3];
    float   bufallpassR3[allpasstuningR3];
    float   bufallpassL4[allpasstuningL4];
    float   bufallpassR4[allpasstuningR4];
};

#endif//_revmodel_

//ends
