You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
62 lines
1.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef VOICE_GAIN_H |
|
#define VOICE_GAIN_H |
|
#pragma once |
|
|
|
|
|
// ----------------------------------------------------------------------- // |
|
// CAutoGain is fed samples and figures out a gain to apply to blocks of samples. |
|
|
|
// Right now, this class applies gain one block behind. The assumption is that the blocks are |
|
// small enough that gain settings for one block will usually be right for the next block. |
|
|
|
// The ideal way to implement this class would be to have a delay the size of a block |
|
// so it can apply the right gain to the actual block it was calculated for. |
|
// ----------------------------------------------------------------------- // |
|
class CAutoGain |
|
{ |
|
public: |
|
|
|
CAutoGain(); |
|
|
|
// maxGain and avgToMaxVal are used to derive the gain amount for each block of samples. |
|
// All samples are scaled by scale. |
|
void Reset(int blockSize, float maxGain, float avgToMaxVal, float scale); |
|
|
|
// Process the specified samples and apply gain to them. |
|
void ProcessSamples( |
|
short *pSamples, |
|
int nSamples); |
|
|
|
private: |
|
|
|
enum {AG_FIX_SHIFT=7}; |
|
typedef long AGFixed; |
|
|
|
// Parameters affecting the algorithm. |
|
int m_BlockSize; // Derive gain from blocks of this size. |
|
float m_MaxGain; |
|
float m_AvgToMaxVal; |
|
|
|
// These are calculated as samples are passed in. |
|
int m_CurBlockOffset; |
|
int m_CurTotal; // Total of sample values in current block. |
|
int m_CurMax; // Highest (absolute) sample value. |
|
|
|
float m_Scale; // All samples are scaled by this amount. |
|
|
|
float m_CurrentGain; // Gain at sample 0 in this block. |
|
float m_NextGain; // Gain at the last sample in this block. |
|
|
|
AGFixed m_FixedCurrentGain; // Fixed-point m_CurrentGain. |
|
AGFixed m_GainMultiplier; // (m_NextGain - m_CurrentGain) / (m_BlockSize - 1). |
|
}; |
|
|
|
|
|
#endif // VOICE_GAIN_H
|
|
|