ghy
Alejandro Acuña
2025-03-12 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 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<std::pair<AudioSample *, AudioSource *> > &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_)