| 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 7bfedbe0b1b9f2a46b6c85d4afaa09ec19be91e5..db4c8b2cc9a016be3fa4e516175edb83966d166c 100644
|
| --- a/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| +++ b/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp
|
| @@ -87,7 +87,8 @@ PeriodicWave* PeriodicWave::createTriangle(float sampleRate)
|
| }
|
|
|
| PeriodicWave::PeriodicWave(float sampleRate)
|
| - : m_sampleRate(sampleRate)
|
| + : m_v8ExternalMemory(0)
|
| + , m_sampleRate(sampleRate)
|
| , m_centsPerRange(CentsPerRange)
|
| {
|
| float nyquist = 0.5 * m_sampleRate;
|
| @@ -98,6 +99,11 @@ PeriodicWave::PeriodicWave(float sampleRate)
|
| m_numberOfRanges = 0.5 + kNumberOfOctaveBands * log2f(periodicWaveSize());
|
| }
|
|
|
| +PeriodicWave::~PeriodicWave()
|
| +{
|
| + adjustV8ExternalMemory(-static_cast<int64_t>(m_v8ExternalMemory));
|
| +}
|
| +
|
| unsigned PeriodicWave::periodicWaveSize() const
|
| {
|
| // Choose an appropriate wave size for the given sample rate. This allows us to use shorter
|
| @@ -162,6 +168,13 @@ unsigned PeriodicWave::numberOfPartialsForRange(unsigned rangeIndex) const
|
| return numberOfPartials;
|
| }
|
|
|
| +// 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.
|
| @@ -208,7 +221,9 @@ void PeriodicWave::createBandLimitedTables(const float* realData, const float* i
|
| imagP[0] = 0;
|
|
|
| // Create the band-limited table.
|
| - OwnPtr<AudioFloatArray> table = adoptPtr(new AudioFloatArray(periodicWaveSize()));
|
| + unsigned waveSize = periodicWaveSize();
|
| + OwnPtr<AudioFloatArray> table = adoptPtr(new AudioFloatArray(waveSize));
|
| + adjustV8ExternalMemory(waveSize * sizeof(float));
|
| m_bandLimitedTables.append(table.release());
|
|
|
| // Apply an inverse FFT to generate the time-domain table data.
|
|
|