summaryrefslogtreecommitdiff
path: root/indra/llaudio/llwindgen.h
diff options
context:
space:
mode:
authorAndrey Lihatskiy <alihatskiy@productengine.com>2024-04-29 07:43:28 +0300
committerAndrey Lihatskiy <alihatskiy@productengine.com>2024-04-29 07:56:09 +0300
commit1b68f71348ecf3983b76b40d7940da8377f049b7 (patch)
tree2974eddaef130a067c26033d60a59fc790365b3d /indra/llaudio/llwindgen.h
parentaf4ea94efc1999f3b19fd8d643d0331f0b77e265 (diff)
#824 Process source files in bulk: replace tabs with spaces, convert CRLF to LF, and trim trailing whitespaces as needed
Diffstat (limited to 'indra/llaudio/llwindgen.h')
-rw-r--r--indra/llaudio/llwindgen.h268
1 files changed, 134 insertions, 134 deletions
diff --git a/indra/llaudio/llwindgen.h b/indra/llaudio/llwindgen.h
index ec58f76f5f..57a14d902d 100644
--- a/indra/llaudio/llwindgen.h
+++ b/indra/llaudio/llwindgen.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file windgen.h
* @brief Templated wind noise generation
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -33,137 +33,137 @@ template <class MIXBUFFERFORMAT_T>
class LLWindGen
{
public:
- LLWindGen(const U32 sample_rate = 44100) :
- mTargetGain(0.f),
- mTargetFreq(100.f),
- mTargetPanGainR(0.5f),
- mInputSamplingRate(sample_rate),
- mSubSamples(2),
- mFilterBandWidth(50.f),
- mBuf0(0.0f),
- mBuf1(0.0f),
- mBuf2(0.0f),
- mY0(0.0f),
- mY1(0.0f),
- mCurrentGain(0.f),
- mCurrentFreq(100.f),
- mCurrentPanGainR(0.5f),
- mLastSample(0.f)
- {
- mSamplePeriod = (F32)mSubSamples / (F32)mInputSamplingRate;
- mB2 = expf(-F_TWO_PI * mFilterBandWidth * mSamplePeriod);
- }
-
- const U32 getInputSamplingRate() { return mInputSamplingRate; }
- const F32 getNextSample();
- const F32 getClampedSample(bool clamp, F32 sample);
-
- // newbuffer = the buffer passed from the previous DSP unit.
- // numsamples = length in samples-per-channel at this mix time.
- // NOTE: generates L/R interleaved stereo
- MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples)
- {
- MIXBUFFERFORMAT_T *cursamplep = newbuffer;
-
- // Filter coefficients
- F32 a0 = 0.0f, b1 = 0.0f;
-
- // No need to clip at normal volumes
- bool clip = mCurrentGain > 2.0f;
-
- bool interp_freq = false;
-
- //if the frequency isn't changing much, we don't need to interpolate in the inner loop
- if (llabs(mTargetFreq - mCurrentFreq) < (mCurrentFreq * 0.112))
- {
- // calculate resonant filter coefficients
- mCurrentFreq = mTargetFreq;
- b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
- a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
- }
- else
- {
- interp_freq = true;
- }
-
- while (numsamples)
- {
- F32 next_sample;
-
- // Start with white noise
- // This expression is fragile, rearrange it and it will break!
- next_sample = getNextSample();
-
- // Apply a pinking filter
- // Magic numbers taken from PKE method at http://www.firstpr.com.au/dsp/pink-noise/
- mBuf0 = mBuf0 * 0.99765f + next_sample * 0.0990460f;
- mBuf1 = mBuf1 * 0.96300f + next_sample * 0.2965164f;
- mBuf2 = mBuf2 * 0.57000f + next_sample * 1.0526913f;
-
- next_sample = mBuf0 + mBuf1 + mBuf2 + next_sample * 0.1848f;
-
- if (interp_freq)
- {
- // calculate and interpolate resonant filter coefficients
- mCurrentFreq = (0.999f * mCurrentFreq) + (0.001f * mTargetFreq);
- b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
- a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
- }
-
- // Apply a resonant low-pass filter on the pink noise
- next_sample = a0 * next_sample - b1 * mY0 - mB2 * mY1;
- mY1 = mY0;
- mY0 = next_sample;
-
- mCurrentGain = (0.999f * mCurrentGain) + (0.001f * mTargetGain);
- mCurrentPanGainR = (0.999f * mCurrentPanGainR) + (0.001f * mTargetPanGainR);
-
- // For a 3dB pan law use:
- // next_sample *= mCurrentGain * ((mCurrentPanGainR*(mCurrentPanGainR-1)*1.652+1.413);
- next_sample *= mCurrentGain;
-
- // delta is used to interpolate between synthesized samples
- F32 delta = (next_sample - mLastSample) / (F32)mSubSamples;
-
- // Fill the audio buffer, clipping if necessary
- for (U8 i=mSubSamples; i && numsamples; --i, --numsamples)
- {
- mLastSample = mLastSample + delta;
- MIXBUFFERFORMAT_T sample_right = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample * mCurrentPanGainR);
- MIXBUFFERFORMAT_T sample_left = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample - (F32)sample_right);
-
- *cursamplep = sample_left;
- ++cursamplep;
- *cursamplep = sample_right;
- ++cursamplep;
- }
- }
-
- return newbuffer;
- }
-
+ LLWindGen(const U32 sample_rate = 44100) :
+ mTargetGain(0.f),
+ mTargetFreq(100.f),
+ mTargetPanGainR(0.5f),
+ mInputSamplingRate(sample_rate),
+ mSubSamples(2),
+ mFilterBandWidth(50.f),
+ mBuf0(0.0f),
+ mBuf1(0.0f),
+ mBuf2(0.0f),
+ mY0(0.0f),
+ mY1(0.0f),
+ mCurrentGain(0.f),
+ mCurrentFreq(100.f),
+ mCurrentPanGainR(0.5f),
+ mLastSample(0.f)
+ {
+ mSamplePeriod = (F32)mSubSamples / (F32)mInputSamplingRate;
+ mB2 = expf(-F_TWO_PI * mFilterBandWidth * mSamplePeriod);
+ }
+
+ const U32 getInputSamplingRate() { return mInputSamplingRate; }
+ const F32 getNextSample();
+ const F32 getClampedSample(bool clamp, F32 sample);
+
+ // newbuffer = the buffer passed from the previous DSP unit.
+ // numsamples = length in samples-per-channel at this mix time.
+ // NOTE: generates L/R interleaved stereo
+ MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples)
+ {
+ MIXBUFFERFORMAT_T *cursamplep = newbuffer;
+
+ // Filter coefficients
+ F32 a0 = 0.0f, b1 = 0.0f;
+
+ // No need to clip at normal volumes
+ bool clip = mCurrentGain > 2.0f;
+
+ bool interp_freq = false;
+
+ //if the frequency isn't changing much, we don't need to interpolate in the inner loop
+ if (llabs(mTargetFreq - mCurrentFreq) < (mCurrentFreq * 0.112))
+ {
+ // calculate resonant filter coefficients
+ mCurrentFreq = mTargetFreq;
+ b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
+ a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
+ }
+ else
+ {
+ interp_freq = true;
+ }
+
+ while (numsamples)
+ {
+ F32 next_sample;
+
+ // Start with white noise
+ // This expression is fragile, rearrange it and it will break!
+ next_sample = getNextSample();
+
+ // Apply a pinking filter
+ // Magic numbers taken from PKE method at http://www.firstpr.com.au/dsp/pink-noise/
+ mBuf0 = mBuf0 * 0.99765f + next_sample * 0.0990460f;
+ mBuf1 = mBuf1 * 0.96300f + next_sample * 0.2965164f;
+ mBuf2 = mBuf2 * 0.57000f + next_sample * 1.0526913f;
+
+ next_sample = mBuf0 + mBuf1 + mBuf2 + next_sample * 0.1848f;
+
+ if (interp_freq)
+ {
+ // calculate and interpolate resonant filter coefficients
+ mCurrentFreq = (0.999f * mCurrentFreq) + (0.001f * mTargetFreq);
+ b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
+ a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
+ }
+
+ // Apply a resonant low-pass filter on the pink noise
+ next_sample = a0 * next_sample - b1 * mY0 - mB2 * mY1;
+ mY1 = mY0;
+ mY0 = next_sample;
+
+ mCurrentGain = (0.999f * mCurrentGain) + (0.001f * mTargetGain);
+ mCurrentPanGainR = (0.999f * mCurrentPanGainR) + (0.001f * mTargetPanGainR);
+
+ // For a 3dB pan law use:
+ // next_sample *= mCurrentGain * ((mCurrentPanGainR*(mCurrentPanGainR-1)*1.652+1.413);
+ next_sample *= mCurrentGain;
+
+ // delta is used to interpolate between synthesized samples
+ F32 delta = (next_sample - mLastSample) / (F32)mSubSamples;
+
+ // Fill the audio buffer, clipping if necessary
+ for (U8 i=mSubSamples; i && numsamples; --i, --numsamples)
+ {
+ mLastSample = mLastSample + delta;
+ MIXBUFFERFORMAT_T sample_right = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample * mCurrentPanGainR);
+ MIXBUFFERFORMAT_T sample_left = (MIXBUFFERFORMAT_T)getClampedSample(clip, mLastSample - (F32)sample_right);
+
+ *cursamplep = sample_left;
+ ++cursamplep;
+ *cursamplep = sample_right;
+ ++cursamplep;
+ }
+ }
+
+ return newbuffer;
+ }
+
public:
- F32 mTargetGain;
- F32 mTargetFreq;
- F32 mTargetPanGainR;
-
+ F32 mTargetGain;
+ F32 mTargetFreq;
+ F32 mTargetPanGainR;
+
private:
- U32 mInputSamplingRate;
- U8 mSubSamples;
- F32 mSamplePeriod;
- F32 mFilterBandWidth;
- F32 mB2;
-
- F32 mBuf0;
- F32 mBuf1;
- F32 mBuf2;
- F32 mY0;
- F32 mY1;
-
- F32 mCurrentGain;
- F32 mCurrentFreq;
- F32 mCurrentPanGainR;
- F32 mLastSample;
+ U32 mInputSamplingRate;
+ U8 mSubSamples;
+ F32 mSamplePeriod;
+ F32 mFilterBandWidth;
+ F32 mB2;
+
+ F32 mBuf0;
+ F32 mBuf1;
+ F32 mBuf2;
+ F32 mY0;
+ F32 mY1;
+
+ F32 mCurrentGain;
+ F32 mCurrentFreq;
+ F32 mCurrentPanGainR;
+ F32 mLastSample;
};
template<class T> inline const F32 LLWindGen<T>::getNextSample() { return (F32)rand() * (1.0f / (F32)(RAND_MAX / (U16_MAX / 8))) + (F32)(S16_MIN / 8); }