summaryrefslogtreecommitdiff
path: root/engine/audio/private/voice_gain.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/voice_gain.h')
-rw-r--r--engine/audio/private/voice_gain.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/engine/audio/private/voice_gain.h b/engine/audio/private/voice_gain.h
new file mode 100644
index 0000000..cd614e0
--- /dev/null
+++ b/engine/audio/private/voice_gain.h
@@ -0,0 +1,62 @@
+//========= 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