1 #ifndef INCLUDED_AUDIOFX_COMPRESSOR_H 2 #define INCLUDED_AUDIOFX_COMPRESSOR_H 3 4 #include <vector> 5 #include "audiofx_amplitude.h" 6 7 /** 8 * C++ version of John Dyson's advanced compressor design. 9 * @author Kai Vehmanen 10 */ 11 class ADVANCED_COMPRESSOR : public EFFECT_AMPLITUDE { 12 13 SAMPLE_ITERATOR_INTERLEAVED iter; 14 15 public: 16 17 static const int NFILT = 12; 18 static const int NEFILT = 17; 19 20 public: 21 ADVANCED_COMPRESSOR(void)22 ADVANCED_COMPRESSOR (void) 23 : rlevelsqn(ADVANCED_COMPRESSOR::NFILT), 24 rlevelsqe(ADVANCED_COMPRESSOR::NEFILT) { 25 init_values(); 26 // map_parameters(); 27 } 28 29 virtual ~ADVANCED_COMPRESSOR (void); 30 name(void)31 virtual std::string name(void) const { return("Advanced compressor"); } parameter_names(void)32 virtual std::string parameter_names(void) const { return("peak-limit-%,release-time-sec,fast-crate,overall-crate"); } 33 34 virtual void set_parameter(int param, parameter_t value); 35 virtual parameter_t get_parameter(int param) const; 36 37 virtual void init(SAMPLE_BUFFER *insample); 38 virtual void process(void); output_channels(int i_channels)39 virtual int output_channels(int i_channels) const { return(2); } 40 clone(void)41 ADVANCED_COMPRESSOR* clone(void) const { return new ADVANCED_COMPRESSOR(*this); } new_expr(void)42 ADVANCED_COMPRESSOR* new_expr(void) const { return new ADVANCED_COMPRESSOR(); } 43 ADVANCED_COMPRESSOR (double peak_limit, double release_time, double cfrate, double crate); 44 45 private: 46 47 double rlevelsq0, rlevelsq1; 48 double rlevelsq0filter, rlevelsq1filter; 49 std::vector<double> rlevelsqn; // [NFILT]; 50 double rlevelsqefilter; 51 std::vector<double> rlevelsqe; // [NEFILT]; 52 double rlevelsq0ffilter; 53 int ndelay; /* delay for rlevelsq0ffilter delay */ 54 int ndelayptr; /* ptr for the input */ 55 std::vector<double> rightdelay; 56 std::vector<double> leftdelay; 57 /* Simple gain running average */ 58 double rgain; 59 double rgainfilter; 60 double lastrgain; 61 /* Max fast agc gain, slow agc gain */ 62 double maxfastgain, maxslowgain; 63 /* Fast gain compression ratio */ 64 /* Note that .5 is 2:1, 1.0 is infinity (hard) */ 65 double fastgaincompressionratio; 66 double compressionratio; 67 /* Max level, target level, floor level */ 68 double maxlevel, targetlevel, floorlevel; 69 /* Gainriding gain */ 70 double rmastergain0filter; 71 double rmastergain0; 72 /* Peak limit gain */ 73 double rpeakgain0, rpeakgain1, rpeakgainfilter; 74 int peaklimitdelay, rpeaklimitdelay; 75 /* Running total gain */ 76 double totalgain; 77 /* Idle gain */ 78 double npeakgain; 79 /* Compress enabled */ 80 int compress; 81 82 double level, levelsq0, levelsq1, levelsqe; 83 double gain, qgain, tgain; 84 double newright, newleft; 85 double efilt; 86 double fastgain, slowgain, tslowgain; 87 double leveldelta; 88 double right, left, rightd, leftd; 89 int delayed; 90 double nrgain, nlgain, ngain, ngsq; 91 double sqrtrpeakgain; 92 int i; 93 int skipmode; 94 95 double extra_maxlevel; 96 int parm; 97 double maxgain, mingain; 98 int ch; 99 double fratio; 100 double ratio; 101 double releasetime; 102 double peakpercent; 103 104 double tnrgain; 105 106 void init_values(void); 107 double hardlimit(double value, double knee, double limit); 108 109 }; 110 111 #endif 112