| Index: Source/modules/webaudio/PeriodicWave.cpp
|
| diff --git a/Source/modules/webaudio/WaveTable.cpp b/Source/modules/webaudio/PeriodicWave.cpp
|
| similarity index 78%
|
| rename from Source/modules/webaudio/WaveTable.cpp
|
| rename to Source/modules/webaudio/PeriodicWave.cpp
|
| index cd322bb94e5aa747bc592629592485bed7f54cfb..336532a564a7fe95ee4557147df2d080dd8353fe 100644
|
| --- a/Source/modules/webaudio/WaveTable.cpp
|
| +++ b/Source/modules/webaudio/PeriodicWave.cpp
|
| @@ -30,76 +30,76 @@
|
|
|
| #if ENABLE(WEB_AUDIO)
|
|
|
| -#include "modules/webaudio/WaveTable.h"
|
| +#include "modules/webaudio/PeriodicWave.h"
|
|
|
| #include "core/platform/audio/FFTFrame.h"
|
| #include "core/platform/audio/VectorMath.h"
|
| #include "modules/webaudio/OscillatorNode.h"
|
| -#include <algorithm>
|
| #include "wtf/OwnPtr.h"
|
| +#include <algorithm>
|
|
|
| -const unsigned WaveTableSize = 4096; // This must be a power of two.
|
| -const unsigned NumberOfRanges = 36; // There should be 3 * log2(WaveTableSize) 1/3 octave ranges.
|
| +const unsigned PeriodicWaveSize = 4096; // This must be a power of two.
|
| +const unsigned NumberOfRanges = 36; // There should be 3 * log2(PeriodicWaveSize) 1/3 octave ranges.
|
| const float CentsPerRange = 1200 / 3; // 1/3 Octave.
|
|
|
| namespace WebCore {
|
| -
|
| +
|
| using namespace VectorMath;
|
|
|
| -PassRefPtr<WaveTable> WaveTable::create(float sampleRate, Float32Array* real, Float32Array* imag)
|
| +PassRefPtr<PeriodicWave> PeriodicWave::create(float sampleRate, Float32Array* real, Float32Array* imag)
|
| {
|
| bool isGood = real && imag && real->length() == imag->length();
|
| ASSERT(isGood);
|
| if (isGood) {
|
| - RefPtr<WaveTable> waveTable = adoptRef(new WaveTable(sampleRate));
|
| + RefPtr<PeriodicWave> periodicWave = adoptRef(new PeriodicWave(sampleRate));
|
| size_t numberOfComponents = real->length();
|
| - waveTable->createBandLimitedTables(real->data(), imag->data(), numberOfComponents);
|
| - return waveTable;
|
| + periodicWave->createBandLimitedTables(real->data(), imag->data(), numberOfComponents);
|
| + return periodicWave;
|
| }
|
| return 0;
|
| }
|
|
|
| -PassRefPtr<WaveTable> WaveTable::createSine(float sampleRate)
|
| +PassRefPtr<PeriodicWave> PeriodicWave::createSine(float sampleRate)
|
| {
|
| - RefPtr<WaveTable> waveTable = adoptRef(new WaveTable(sampleRate));
|
| - waveTable->generateBasicWaveform(OscillatorNode::SINE);
|
| - return waveTable;
|
| + RefPtr<PeriodicWave> periodicWave = adoptRef(new PeriodicWave(sampleRate));
|
| + periodicWave->generateBasicWaveform(OscillatorNode::SINE);
|
| + return periodicWave;
|
| }
|
|
|
| -PassRefPtr<WaveTable> WaveTable::createSquare(float sampleRate)
|
| +PassRefPtr<PeriodicWave> PeriodicWave::createSquare(float sampleRate)
|
| {
|
| - RefPtr<WaveTable> waveTable = adoptRef(new WaveTable(sampleRate));
|
| - waveTable->generateBasicWaveform(OscillatorNode::SQUARE);
|
| - return waveTable;
|
| + RefPtr<PeriodicWave> periodicWave = adoptRef(new PeriodicWave(sampleRate));
|
| + periodicWave->generateBasicWaveform(OscillatorNode::SQUARE);
|
| + return periodicWave;
|
| }
|
|
|
| -PassRefPtr<WaveTable> WaveTable::createSawtooth(float sampleRate)
|
| +PassRefPtr<PeriodicWave> PeriodicWave::createSawtooth(float sampleRate)
|
| {
|
| - RefPtr<WaveTable> waveTable = adoptRef(new WaveTable(sampleRate));
|
| - waveTable->generateBasicWaveform(OscillatorNode::SAWTOOTH);
|
| - return waveTable;
|
| + RefPtr<PeriodicWave> periodicWave = adoptRef(new PeriodicWave(sampleRate));
|
| + periodicWave->generateBasicWaveform(OscillatorNode::SAWTOOTH);
|
| + return periodicWave;
|
| }
|
|
|
| -PassRefPtr<WaveTable> WaveTable::createTriangle(float sampleRate)
|
| +PassRefPtr<PeriodicWave> PeriodicWave::createTriangle(float sampleRate)
|
| {
|
| - RefPtr<WaveTable> waveTable = adoptRef(new WaveTable(sampleRate));
|
| - waveTable->generateBasicWaveform(OscillatorNode::TRIANGLE);
|
| - return waveTable;
|
| + RefPtr<PeriodicWave> periodicWave = adoptRef(new PeriodicWave(sampleRate));
|
| + periodicWave->generateBasicWaveform(OscillatorNode::TRIANGLE);
|
| + return periodicWave;
|
| }
|
|
|
| -WaveTable::WaveTable(float sampleRate)
|
| +PeriodicWave::PeriodicWave(float sampleRate)
|
| : m_sampleRate(sampleRate)
|
| - , m_waveTableSize(WaveTableSize)
|
| + , m_periodicWaveSize(PeriodicWaveSize)
|
| , m_numberOfRanges(NumberOfRanges)
|
| , m_centsPerRange(CentsPerRange)
|
| {
|
| ScriptWrappable::init(this);
|
| float nyquist = 0.5 * m_sampleRate;
|
| m_lowestFundamentalFrequency = nyquist / maxNumberOfPartials();
|
| - m_rateScale = m_waveTableSize / m_sampleRate;
|
| + m_rateScale = m_periodicWaveSize / m_sampleRate;
|
| }
|
|
|
| -void WaveTable::waveDataForFundamentalFrequency(float fundamentalFrequency, float* &lowerWaveData, float* &higherWaveData, float& tableInterpolationFactor)
|
| +void PeriodicWave::waveDataForFundamentalFrequency(float fundamentalFrequency, float* &lowerWaveData, float* &higherWaveData, float& tableInterpolationFactor)
|
| {
|
| // Negative frequencies are allowed, in which case we alias to the positive frequency.
|
| fundamentalFrequency = fabsf(fundamentalFrequency);
|
| @@ -122,17 +122,17 @@ void WaveTable::waveDataForFundamentalFrequency(float fundamentalFrequency, floa
|
|
|
| lowerWaveData = m_bandLimitedTables[rangeIndex2]->data();
|
| higherWaveData = m_bandLimitedTables[rangeIndex1]->data();
|
| -
|
| +
|
| // Ranges from 0 -> 1 to interpolate between lower -> higher.
|
| tableInterpolationFactor = pitchRange - rangeIndex1;
|
| }
|
|
|
| -unsigned WaveTable::maxNumberOfPartials() const
|
| +unsigned PeriodicWave::maxNumberOfPartials() const
|
| {
|
| - return m_waveTableSize / 2;
|
| + return m_periodicWaveSize / 2;
|
| }
|
|
|
| -unsigned WaveTable::numberOfPartialsForRange(unsigned rangeIndex) const
|
| +unsigned PeriodicWave::numberOfPartialsForRange(unsigned rangeIndex) const
|
| {
|
| // Number of cents below nyquist where we cull partials.
|
| float centsToCull = rangeIndex * m_centsPerRange;
|
| @@ -146,17 +146,17 @@ unsigned WaveTable::numberOfPartialsForRange(unsigned rangeIndex) const
|
| return numberOfPartials;
|
| }
|
|
|
| -// Convert into time-domain wave tables.
|
| +// 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 WaveTable::createBandLimitedTables(const float* realData, const float* imagData, unsigned numberOfComponents)
|
| +void PeriodicWave::createBandLimitedTables(const float* realData, const float* imagData, unsigned numberOfComponents)
|
| {
|
| float normalizationScale = 1;
|
|
|
| - unsigned fftSize = m_waveTableSize;
|
| + unsigned fftSize = m_periodicWaveSize;
|
| unsigned halfSize = fftSize / 2;
|
| unsigned i;
|
| -
|
| +
|
| numberOfComponents = std::min(numberOfComponents, halfSize);
|
|
|
| m_bandLimitedTables.reserveCapacity(m_numberOfRanges);
|
| @@ -177,7 +177,7 @@ void WaveTable::createBandLimitedTables(const float* realData, const float* imag
|
| realP[i] = 0;
|
| imagP[i] = 0;
|
| }
|
| -
|
| +
|
| // Generate complex conjugate because of the way the inverse FFT is defined.
|
| float minusOne = -1;
|
| vsmul(imagP, 1, &minusOne, imagP, 1, halfSize);
|
| @@ -199,7 +199,7 @@ void WaveTable::createBandLimitedTables(const float* realData, const float* imag
|
| realP[0] = 0;
|
|
|
| // Create the band-limited table.
|
| - OwnPtr<AudioFloatArray> table = adoptPtr(new AudioFloatArray(m_waveTableSize));
|
| + OwnPtr<AudioFloatArray> table = adoptPtr(new AudioFloatArray(m_periodicWaveSize));
|
| m_bandLimitedTables.append(table.release());
|
|
|
| // Apply an inverse FFT to generate the time-domain table data.
|
| @@ -209,20 +209,20 @@ void WaveTable::createBandLimitedTables(const float* realData, const float* imag
|
| // For the first range (which has the highest power), calculate its peak value then compute normalization scale.
|
| if (!rangeIndex) {
|
| float maxValue;
|
| - vmaxmgv(data, 1, &maxValue, m_waveTableSize);
|
| + vmaxmgv(data, 1, &maxValue, m_periodicWaveSize);
|
|
|
| if (maxValue)
|
| normalizationScale = 1.0f / maxValue;
|
| }
|
|
|
| // Apply normalization scale.
|
| - vsmul(data, 1, &normalizationScale, data, 1, m_waveTableSize);
|
| + vsmul(data, 1, &normalizationScale, data, 1, m_periodicWaveSize);
|
| }
|
| }
|
|
|
| -void WaveTable::generateBasicWaveform(int shape)
|
| +void PeriodicWave::generateBasicWaveform(int shape)
|
| {
|
| - unsigned fftSize = waveTableSize();
|
| + unsigned fftSize = periodicWaveSize();
|
| unsigned halfSize = fftSize / 2;
|
|
|
| AudioFloatArray real(halfSize);
|
|
|