// PCMVolumeMaximizer.h: interface for the PCMVolumeMaximizer class. // ////////////////////////////////////////////////////////////////////// #ifndef AFX_PCMVOLUMEMAXIMIZER_H__9754890C_0316_417C_8C4A_7C6E36ACF745__INCLUDED_ #define AFX_PCMVOLUMEMAXIMIZER_H__9754890C_0316_417C_8C4A_7C6E36ACF745__INCLUDED_ #define NUM_BINS 256 #include "AudioTransformer.h" class AverageCalculator { public: AverageCalculator(Tracer *tracer) { Reset(); this->tracer = tracer; calculationInterval = 100; } virtual ~AverageCalculator() {} int Reset() { runningTotal = 0; runningIntervalCount = 0; return 0;} int SetCalculationInterval(int interval) { Reset(); if (interval > 0) calculationInterval = interval; return calculationInterval; } int TakeNextValue(double value) { runningTotal += value; if (++runningIntervalCount >= calculationInterval) { tracer->tracef(ARB, "AverageCalculator : average over last %d samples was %f\n", runningIntervalCount, runningTotal/runningIntervalCount); Reset(); } return 0; } private: int calculationInterval; double runningTotal; int runningIntervalCount; Tracer *tracer; }; class PCMVolumeMaximizer : public AudioTransformer { public: PCMVolumeMaximizer(); virtual ~PCMVolumeMaximizer(); int TransformStarted(); int SetMaximizePercentile(double percentile); int SetMaximumAmplification(unsigned int amplification); // multiplied by 100. so value of 100 = amplification of 1.0. value of 420 = amplification of 4.2 int SetTraceLevel(); protected: int TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample); private: double maximizePercentile; unsigned int maximumAmplification; int bins[NUM_BINS]; AverageCalculator averageVolumeCalculator; }; #endif // !defined(AFX_PCMVOLUMEMAXIMIZER_H__9754890C_0316_417C_8C4A_7C6E36ACF745__INCLUDED_)