| Index: third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp b/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| index 64d0c621c00ad39b9b27689ec27f421edaca5df6..a2fe54e560cd8b7c9f177ca45dd851529d9c6d89 100644
|
| --- a/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| +++ b/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| @@ -41,11 +41,12 @@
|
|
|
| namespace blink {
|
|
|
| -// The number of bands per octave. Each octave will have this many entries in the wave tables.
|
| +// The number of bands per octave. Each octave will have this many entries in
|
| +// the wave tables.
|
| const unsigned kNumberOfOctaveBands = 3;
|
|
|
| -// The max length of a periodic wave. This must be a power of two greater than or equal to 2048 and
|
| -// must be supported by the FFT routines.
|
| +// The max length of a periodic wave. This must be a power of two greater than
|
| +// or equal to 2048 and must be supported by the FFT routines.
|
| const unsigned kMaxPeriodicWaveSize = 16384;
|
|
|
| const float CentsPerRange = 1200 / kNumberOfOctaveBands;
|
| @@ -156,8 +157,8 @@ PeriodicWave::PeriodicWave(float sampleRate)
|
| float nyquist = 0.5 * m_sampleRate;
|
| m_lowestFundamentalFrequency = nyquist / maxNumberOfPartials();
|
| m_rateScale = periodicWaveSize() / m_sampleRate;
|
| - // Compute the number of ranges needed to cover the entire frequency range, assuming
|
| - // kNumberOfOctaveBands per octave.
|
| + // Compute the number of ranges needed to cover the entire frequency range,
|
| + // assuming kNumberOfOctaveBands per octave.
|
| m_numberOfRanges = 0.5 + kNumberOfOctaveBands * log2f(periodicWaveSize());
|
| }
|
|
|
| @@ -166,10 +167,10 @@ PeriodicWave::~PeriodicWave() {
|
| }
|
|
|
| unsigned PeriodicWave::periodicWaveSize() const {
|
| - // Choose an appropriate wave size for the given sample rate. This allows us to use shorter
|
| - // FFTs when possible to limit the complexity. The breakpoints here are somewhat arbitrary, but
|
| - // we want sample rates around 44.1 kHz or so to have a size of 4096 to preserve backward
|
| - // compatibility.
|
| + // Choose an appropriate wave size for the given sample rate. This allows us
|
| + // to use shorter FFTs when possible to limit the complexity. The breakpoints
|
| + // here are somewhat arbitrary, but we want sample rates around 44.1 kHz or so
|
| + // to have a size of 4096 to preserve backward compatibility.
|
| if (m_sampleRate <= 24000) {
|
| return 2048;
|
| }
|
| @@ -190,7 +191,8 @@ void PeriodicWave::waveDataForFundamentalFrequency(
|
| float*& lowerWaveData,
|
| float*& higherWaveData,
|
| float& tableInterpolationFactor) {
|
| - // Negative frequencies are allowed, in which case we alias to the positive frequency.
|
| + // Negative frequencies are allowed, in which case we alias to the positive
|
| + // frequency.
|
| fundamentalFrequency = fabsf(fundamentalFrequency);
|
|
|
| // Calculate the pitch range.
|
| @@ -199,15 +201,17 @@ void PeriodicWave::waveDataForFundamentalFrequency(
|
| : 0.5;
|
| float centsAboveLowestFrequency = log2f(ratio) * 1200;
|
|
|
| - // Add one to round-up to the next range just in time to truncate partials before aliasing occurs.
|
| + // Add one to round-up to the next range just in time to truncate partials
|
| + // before aliasing occurs.
|
| float pitchRange = 1 + centsAboveLowestFrequency / m_centsPerRange;
|
|
|
| pitchRange = std::max(pitchRange, 0.0f);
|
| pitchRange = std::min(pitchRange, static_cast<float>(numberOfRanges() - 1));
|
|
|
| - // The words "lower" and "higher" refer to the table data having the lower and higher numbers of partials.
|
| - // It's a little confusing since the range index gets larger the more partials we cull out.
|
| - // So the lower table data will have a larger range index.
|
| + // The words "lower" and "higher" refer to the table data having the lower and
|
| + // higher numbers of partials. It's a little confusing since the range index
|
| + // gets larger the more partials we cull out. So the lower table data will
|
| + // have a larger range index.
|
| unsigned rangeIndex1 = static_cast<unsigned>(pitchRange);
|
| unsigned rangeIndex2 =
|
| rangeIndex1 < numberOfRanges() - 1 ? rangeIndex1 + 1 : rangeIndex1;
|
| @@ -232,20 +236,22 @@ unsigned PeriodicWave::numberOfPartialsForRange(unsigned rangeIndex) const {
|
| return numberOfPartials;
|
| }
|
|
|
| -// Tell V8 about the memory we're using so it can properly schedule garbage collects.
|
| +// Tell V8 about the memory we're using so it can properly schedule garbage
|
| +// collects.
|
| void PeriodicWave::adjustV8ExternalMemory(int delta) {
|
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(delta);
|
| m_v8ExternalMemory += delta;
|
| }
|
|
|
| -// Convert into time-domain wave buffers.
|
| -// One table is created for each range for non-aliasing playback at different playback rates.
|
| -// Thus, higher ranges have more high-frequency partials culled out.
|
| +// Convert into time-domain wave buffers. One table is created for each range
|
| +// for non-aliasing playback at different playback rates. Thus, higher ranges
|
| +// have more high-frequency partials culled out.
|
| void PeriodicWave::createBandLimitedTables(const float* realData,
|
| const float* imagData,
|
| unsigned numberOfComponents,
|
| bool disableNormalization) {
|
| - // TODO(rtoy): Figure out why this needs to be 0.5 when normalization is disabled.
|
| + // TODO(rtoy): Figure out why this needs to be 0.5 when normalization is
|
| + // disabled.
|
| float normalizationScale = 0.5;
|
|
|
| unsigned fftSize = periodicWaveSize();
|
| @@ -262,20 +268,22 @@ void PeriodicWave::createBandLimitedTables(const float* realData,
|
| float* realP = frame.realData();
|
| float* imagP = frame.imagData();
|
|
|
| - // Copy from loaded frequency data and generate the complex conjugate because of the way the
|
| - // inverse FFT is defined versus the values in the arrays. Need to scale the data by
|
| - // fftSize to remove the scaling that the inverse IFFT would do.
|
| + // Copy from loaded frequency data and generate the complex conjugate
|
| + // because of the way the inverse FFT is defined versus the values in the
|
| + // arrays. Need to scale the data by fftSize to remove the scaling that the
|
| + // inverse IFFT would do.
|
| float scale = fftSize;
|
| vsmul(realData, 1, &scale, realP, 1, numberOfComponents);
|
| scale = -scale;
|
| vsmul(imagData, 1, &scale, imagP, 1, numberOfComponents);
|
|
|
| - // Find the starting bin where we should start culling. We need to clear out the highest
|
| - // frequencies to band-limit the waveform.
|
| + // Find the starting bin where we should start culling. We need to clear
|
| + // out the highest frequencies to band-limit the waveform.
|
| unsigned numberOfPartials = numberOfPartialsForRange(rangeIndex);
|
|
|
| - // If fewer components were provided than 1/2 FFT size, then clear the remaining bins.
|
| - // We also need to cull the aliasing partials for this pitch range.
|
| + // If fewer components were provided than 1/2 FFT size, then clear the
|
| + // remaining bins. We also need to cull the aliasing partials for this
|
| + // pitch range.
|
| for (i = std::min(numberOfComponents, numberOfPartials + 1); i < halfSize;
|
| ++i) {
|
| realP[i] = 0;
|
| @@ -297,7 +305,8 @@ void PeriodicWave::createBandLimitedTables(const float* realData,
|
| float* data = m_bandLimitedTables[rangeIndex]->data();
|
| frame.doInverseFFT(data);
|
|
|
| - // For the first range (which has the highest power), calculate its peak value then compute normalization scale.
|
| + // For the first range (which has the highest power), calculate its peak
|
| + // value then compute normalization scale.
|
| if (!disableNormalization) {
|
| if (!rangeIndex) {
|
| float maxValue;
|
| @@ -329,8 +338,8 @@ void PeriodicWave::generateBasicWaveform(int shape) {
|
| for (unsigned n = 1; n < halfSize; ++n) {
|
| float piFactor = 2 / (n * piFloat);
|
|
|
| - // All waveforms are odd functions with a positive slope at time 0. Hence the coefficients
|
| - // for cos() are always 0.
|
| + // All waveforms are odd functions with a positive slope at time 0. Hence
|
| + // the coefficients for cos() are always 0.
|
|
|
| // Fourier coefficients according to standard definition:
|
| // b = 1/pi*integrate(f(x)*sin(n*x), x, -pi, pi)
|
| @@ -339,16 +348,17 @@ void PeriodicWave::generateBasicWaveform(int shape) {
|
|
|
| float b; // Coefficient for sin().
|
|
|
| - // Calculate Fourier coefficients depending on the shape. Note that the overall scaling
|
| - // (magnitude) of the waveforms is normalized in createBandLimitedTables().
|
| + // Calculate Fourier coefficients depending on the shape. Note that the
|
| + // overall scaling (magnitude) of the waveforms is normalized in
|
| + // createBandLimitedTables().
|
| switch (shape) {
|
| case OscillatorHandler::SINE:
|
| // Standard sine wave function.
|
| b = (n == 1) ? 1 : 0;
|
| break;
|
| case OscillatorHandler::SQUARE:
|
| - // Square-shaped waveform with the first half its maximum value and the second half its
|
| - // minimum value.
|
| + // Square-shaped waveform with the first half its maximum value and the
|
| + // second half its minimum value.
|
| //
|
| // See http://mathworld.wolfram.com/FourierSeriesSquareWave.html
|
| //
|
| @@ -358,16 +368,16 @@ void PeriodicWave::generateBasicWaveform(int shape) {
|
| b = (n & 1) ? 2 * piFactor : 0;
|
| break;
|
| case OscillatorHandler::SAWTOOTH:
|
| - // Sawtooth-shaped waveform with the first half ramping from zero to maximum and the
|
| - // second half from minimum to zero.
|
| + // Sawtooth-shaped waveform with the first half ramping from zero to
|
| + // maximum and the second half from minimum to zero.
|
| //
|
| // b[n] = -2*(-1)^n/pi/n
|
| // = (2/(n*pi))*(-1)^(n+1)
|
| b = piFactor * ((n & 1) ? 1 : -1);
|
| break;
|
| case OscillatorHandler::TRIANGLE:
|
| - // Triangle-shaped waveform going from 0 at time 0 to 1 at time pi/2 and back to 0 at
|
| - // time pi.
|
| + // Triangle-shaped waveform going from 0 at time 0 to 1 at time pi/2 and
|
| + // back to 0 at time pi.
|
| //
|
| // See http://mathworld.wolfram.com/FourierSeriesTriangleWave.html
|
| //
|
|
|