Index: third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp |
diff --git a/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp b/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp |
index 412f643b22b2901f44408f3ae01d8c4e89dbdfa1..5fc5317c66147ba17d8346a37f0e91cb81cfdb04 100644 |
--- a/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp |
+++ b/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp |
@@ -44,13 +44,16 @@ using namespace VectorMath; |
const int InputBufferSize = 8 * 16384; |
-// We only process the leading portion of the impulse response in the real-time thread. We don't exceed this length. |
-// It turns out then, that the background thread has about 278msec of scheduling slop. |
-// Empirically, this has been found to be a good compromise between giving enough time for scheduling slop, |
-// while still minimizing the amount of processing done in the primary (high-priority) thread. |
-// This was found to be a good value on Mac OS X, and may work well on other platforms as well, assuming |
-// the very rough scheduling latencies are similar on these time-scales. Of course, this code may need to be |
-// tuned for individual platforms if this assumption is found to be incorrect. |
+// We only process the leading portion of the impulse response in the real-time |
+// thread. We don't exceed this length. It turns out then, that the |
+// background thread has about 278msec of scheduling slop. Empirically, this |
+// has been found to be a good compromise between giving enough time for |
+// scheduling slop, while still minimizing the amount of processing done in the |
+// primary (high-priority) thread. This was found to be a good value on Mac OS |
+// X, and may work well on other platforms as well, assuming the very rough |
+// scheduling latencies are similar on these time-scales. Of course, this code |
+// may need to be tuned for individual platforms if this assumption is found to |
+// be incorrect. |
const size_t RealtimeFrameLimit = 8192 + 4096; // ~278msec @ 44.1KHz |
const size_t MinFFTSize = 128; |
@@ -64,21 +67,22 @@ ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, |
: m_impulseResponseLength(impulseResponse->length()), |
m_accumulationBuffer(impulseResponse->length() + renderSliceSize), |
m_inputBuffer(InputBufferSize), |
- m_minFFTSize( |
- MinFFTSize) // First stage will have this size - successive stages will double in size each time |
- , |
- m_maxFFTSize(maxFFTSize) // until we hit m_maxFFTSize |
+ m_minFFTSize(MinFFTSize), // First stage will have this size - successive |
+ // stages will double in size each time |
dcheng
2016/10/03 01:21:04
Nit: MIght be more readable if comments aren't at
Nico
2016/10/03 02:15:24
I think this is pretty good as-is.
|
+ m_maxFFTSize(maxFFTSize) // until we hit m_maxFFTSize |
{ |
// If we are using background threads then don't exceed this FFT size for the |
- // stages which run in the real-time thread. This avoids having only one or two |
- // large stages (size 16384 or so) at the end which take a lot of time every several |
- // processing slices. This way we amortize the cost over more processing slices. |
+ // stages which run in the real-time thread. This avoids having only one or |
+ // two large stages (size 16384 or so) at the end which take a lot of time |
+ // every several processing slices. This way we amortize the cost over more |
+ // processing slices. |
m_maxRealtimeFFTSize = MaxRealtimeFFTSize; |
const float* response = impulseResponse->data(); |
size_t totalResponseLength = impulseResponse->length(); |
- // The total latency is zero because the direct-convolution is used in the leading portion. |
+ // The total latency is zero because the direct-convolution is used in the |
+ // leading portion. |
size_t reverbTotalLatency = 0; |
size_t stageOffset = 0; |
@@ -87,12 +91,14 @@ ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, |
while (stageOffset < totalResponseLength) { |
size_t stageSize = fftSize / 2; |
- // For the last stage, it's possible that stageOffset is such that we're straddling the end |
- // of the impulse response buffer (if we use stageSize), so reduce the last stage's length... |
+ // For the last stage, it's possible that stageOffset is such that we're |
+ // straddling the end of the impulse response buffer (if we use stageSize), |
+ // so reduce the last stage's length... |
if (stageSize + stageOffset > totalResponseLength) |
stageSize = totalResponseLength - stageOffset; |
- // This "staggers" the time when each FFT happens so they don't all happen at the same time |
+ // This "staggers" the time when each FFT happens so they don't all happen |
+ // at the same time |
int renderPhase = convolverRenderPhase + i * renderSliceSize; |
bool useDirectConvolver = !stageOffset; |
@@ -128,7 +134,8 @@ ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, |
} |
// Start up background thread |
- // FIXME: would be better to up the thread priority here. It doesn't need to be real-time, but higher than the default... |
+ // FIXME: would be better to up the thread priority here. It doesn't need to |
+ // be real-time, but higher than the default... |
if (useBackgroundThreads && m_backgroundStages.size() > 0) |
m_backgroundThread = wrapUnique(Platform::current()->createThread( |
"Reverb convolution background thread")); |
@@ -140,16 +147,19 @@ ReverbConvolver::~ReverbConvolver() { |
} |
void ReverbConvolver::processInBackground() { |
- // Process all of the stages until their read indices reach the input buffer's write index |
+ // Process all of the stages until their read indices reach the input buffer's |
+ // write index |
int writeIndex = m_inputBuffer.writeIndex(); |
- // Even though it doesn't seem like every stage needs to maintain its own version of readIndex |
- // we do this in case we want to run in more than one background thread. |
+ // Even though it doesn't seem like every stage needs to maintain its own |
+ // version of readIndex we do this in case we want to run in more than one |
+ // background thread. |
int readIndex; |
while ((readIndex = m_backgroundStages[0]->inputReadIndex()) != |
writeIndex) { // FIXME: do better to detect buffer overrun... |
- // The ReverbConvolverStages need to process in amounts which evenly divide half the FFT size |
+ // The ReverbConvolverStages need to process in amounts which evenly divide |
+ // half the FFT size |
const int SliceSize = MinFFTSize / 2; |
// Accumulate contributions from each stage |
@@ -185,7 +195,8 @@ void ReverbConvolver::process(const AudioChannel* sourceChannel, |
// Finally read from accumulation buffer |
m_accumulationBuffer.readAndClear(destination, framesToProcess); |
- // Now that we've buffered more input, post another task to the background thread. |
+ // Now that we've buffered more input, post another task to the background |
+ // thread. |
if (m_backgroundThread) |
m_backgroundThread->getWebTaskRunner()->postTask( |
BLINK_FROM_HERE, crossThreadBind(&ReverbConvolver::processInBackground, |