AVRecorder - , - IO .
"" . , RMS , RMS (, 300 , VU).
. dBFS 10 * log10f (sqrt (sum/num_samples)), sqrt 20 * log10f (sum/num_samples).
, , .
, OpenAL , , , - https://ccrma.stanford.edu/~jos/resample/Theory_Ideal_Bandlimited_Interpolation.html
. . , ;)
:
class VUMeter
{
protected:
float _sampleRate;
float _integrationTime;
int _integrationBufferLength;
float *_integrationBuffer;
float *_integrationBufferEnd;
float *_cursor;
float _sum;
public:
VUMeter()
: _sampleRate(48000.0f)
, _integrationTime(0.3f)
, _sum(0.)
{
_integrationBufferLength = (int) (_integrationTime * _sampleRate);
_integrationBuffer = new float[_integrationBufferLength + 1];
bzero(_integrationBuffer, _integrationBufferLength);
_integrationBufferEnd = _integrationBuffer + _integrationBufferLength;
_cursor = _integrationBuffer;
}
~VUMeter()
{
delete _integrationBuffer;
}
float getRms(float *audio, int samples)
{
for (int i = 0; i < samples; ++i)
{
float s = audio[i];
_sum -= *_cursor;
double square = s * s;
*_cursor = square;
_sum += square;
++_cursor;
if (_cursor == _integrationBufferEnd)
_cursor = _integrationBuffer;
}
return 20 * log10f(_sum / _integrationBufferLength);
}
};