AsyncAudioCompressor.h
Go to the documentation of this file.00001
00027 #ifndef ASYNC_AUDIO_COMPRESSOR_INCLUDED
00028 #define ASYNC_AUDIO_COMPRESSOR_INCLUDED
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <cmath>
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include <AsyncAudioProcessor.h>
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 namespace Async
00073 {
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 class EnvelopeDetector
00107 {
00108 public:
00109 EnvelopeDetector( double ms = 1.0, double sampleRate = INTERNAL_SAMPLE_RATE )
00110 : sampleRate_( sampleRate ), ms_( ms ), coef_( 0.0 )
00111 {
00112 setCoef();
00113 }
00114
00115 virtual ~EnvelopeDetector() {}
00116
00117
00118 virtual void setTc( double ms )
00119 {
00120 ms_ = ms;
00121 setCoef();
00122 }
00123
00124 virtual double getTc( void ) { return ms_; }
00125
00126
00127 virtual void setSampleRate( double sampleRate )
00128 {
00129 sampleRate_ = sampleRate;
00130 setCoef();
00131 }
00132
00133 virtual double getSampleRate( void ) { return sampleRate_; }
00134
00135
00136 inline void run( double in, double &state )
00137 {
00138 state = in + coef_ * ( state - in );
00139 }
00140
00141 private:
00142 double sampleRate_;
00143 double ms_;
00144 double coef_;
00145
00146 void setCoef( void )
00147 {
00148 coef_ = exp( -1.0 / ( 0.001 * ms_ * sampleRate_ ) );
00149 }
00150
00151 };
00152
00153
00154
00155
00156
00169 class AudioCompressor : public AudioProcessor
00170 {
00171 public:
00175 AudioCompressor(void);
00176
00180 ~AudioCompressor(void);
00181
00189 void setThreshold(double thresh_db) { threshdB_ = thresh_db; }
00190
00195 void setRatio(double ratio) { ratio_ = ratio; }
00196
00201 void setAttack(double attack_ms) { att_.setTc(attack_ms);}
00202
00207 void setDecay(double decay_ms) { rel_.setTc(decay_ms); }
00208
00217 void setOutputGain(float gain);
00218
00222 void reset(void);
00223
00224
00225 protected:
00226 virtual void processSamples(float *dest, const float *src, int count);
00227
00228
00229 private:
00230
00231 double threshdB_;
00232 double ratio_;
00233 double output_gain;
00234
00235
00236 EnvelopeDetector att_;
00237 EnvelopeDetector rel_;
00238
00239
00240 double envdB_;
00241
00242 AudioCompressor(const AudioCompressor&);
00243 AudioCompressor& operator=(const AudioCompressor&);
00244
00245 };
00246
00247
00248 }
00249
00250 #endif
00251
00252
00253
00254
00255
00256
00257