summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp41
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());