diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp b/chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp index d470a267079..b768a243917 100644 --- a/chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp +++ b/chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp @@ -30,7 +30,6 @@ #include "platform/audio/AudioBus.h" #include "platform/audio/AudioUtilities.h" -#include "platform/audio/FFTFrame.h" #include "platform/audio/VectorMath.h" #include <algorithm> @@ -67,13 +66,6 @@ RealtimeAnalyser::RealtimeAnalyser() m_analysisFrame = adoptPtr(new FFTFrame(DefaultFFTSize)); } -void RealtimeAnalyser::reset() -{ - m_writeIndex = 0; - m_inputBuffer.zero(); - m_magnitudeBuffer.zero(); -} - bool RealtimeAnalyser::setFftSize(size_t size) { ASSERT(isMainThread()); @@ -145,7 +137,7 @@ void applyWindow(float* p, size_t n) for (unsigned i = 0; i < n; ++i) { double x = static_cast<double>(i) / static_cast<double>(n); - double window = a0 - a1 * cos(2 * piDouble * x) + a2 * cos(4 * piDouble * x); + double window = a0 - a1 * cos(twoPiDouble * x) + a2 * cos(twoPiDouble * 2.0 * x); p[i] *= float(window); } } @@ -185,7 +177,7 @@ void RealtimeAnalyser::doFFTAnalysis() imagP[0] = 0; // Normalize so than an input sine wave at 0dBfs registers as 0dBfs (undo FFT scaling factor). - const double magnitudeScale = 1.0 / DefaultFFTSize; + const double magnitudeScale = 1.0 / fftSize; // A value of 0 does no averaging with the previous result. Larger values produce slower, but smoother changes. double k = m_smoothingTimeConstant; @@ -264,6 +256,35 @@ void RealtimeAnalyser::getByteFrequencyData(Uint8Array* destinationArray) } } +void RealtimeAnalyser::getFloatTimeDomainData(Float32Array* destinationArray) +{ + ASSERT(isMainThread()); + + if (!destinationArray) + return; + + unsigned fftSize = this->fftSize(); + size_t len = min(fftSize, destinationArray->length()); + if (len > 0) { + bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_inputBuffer.size() > fftSize; + ASSERT(isInputBufferGood); + if (!isInputBufferGood) + return; + + float* inputBuffer = m_inputBuffer.data(); + float* destination = destinationArray->data(); + + unsigned writeIndex = m_writeIndex; + + for (unsigned i = 0; i < len; ++i) { + // Buffer access is protected due to modulo operation. + float value = inputBuffer[(i + writeIndex - fftSize + InputBufferSize) % InputBufferSize]; + + destination[i] = value; + } + } +} + void RealtimeAnalyser::getByteTimeDomainData(Uint8Array* destinationArray) { ASSERT(isMainThread()); |