Index: third_party/WebKit/Source/platform/audio/AudioDestination.cpp |
diff --git a/third_party/WebKit/Source/platform/audio/AudioDestination.cpp b/third_party/WebKit/Source/platform/audio/AudioDestination.cpp |
index dcf0ea5841cdf4175ca5d5f325d1167cf89065de..e4110bfe751bbc6c5cb4c8d7a251d9996aae0783 100644 |
--- a/third_party/WebKit/Source/platform/audio/AudioDestination.cpp |
+++ b/third_party/WebKit/Source/platform/audio/AudioDestination.cpp |
@@ -29,8 +29,8 @@ |
#include "platform/audio/AudioDestination.h" |
#include "platform/Histogram.h" |
-#include "platform/audio/AudioPullFIFO.h" |
#include "platform/audio/AudioUtilities.h" |
+#include "platform/audio/PushPullFIFO.h" |
#include "platform/weborigin/SecurityOrigin.h" |
#include "public/platform/Platform.h" |
#include "public/platform/WebSecurityOrigin.h" |
@@ -67,6 +67,8 @@ AudioDestination::AudioDestination(AudioIOCallback& callback, |
m_outputBus(AudioBus::create(numberOfOutputChannels, |
AudioUtilities::kRenderQuantumFrames, |
false)), |
+ m_renderBus(AudioBus::create(numberOfOutputChannels, |
+ AudioUtilities::kRenderQuantumFrames)), |
m_framesElapsed(0) { |
// Calculate the optimum buffer size first. |
if (calculateBufferSize()) { |
@@ -80,9 +82,8 @@ AudioDestination::AudioDestination(AudioIOCallback& callback, |
DCHECK(m_webAudioDevice); |
// Create a FIFO. |
- m_fifo = WTF::wrapUnique( |
- new AudioPullFIFO(*this, numberOfOutputChannels, kFIFOSize, |
- AudioUtilities::kRenderQuantumFrames)); |
+ m_fifo = |
+ WTF::wrapUnique(new PushPullFIFO(numberOfOutputChannels, kFIFOSize)); |
} else { |
NOTREACHED(); |
} |
@@ -98,11 +99,10 @@ void AudioDestination::render(const WebVector<float*>& destinationData, |
double delayTimestamp, |
size_t priorFramesSkipped) { |
DCHECK_EQ(destinationData.size(), m_numberOfOutputChannels); |
- if (destinationData.size() != m_numberOfOutputChannels) |
- return; |
- |
DCHECK_EQ(numberOfFrames, m_callbackBufferSize); |
- if (numberOfFrames != m_callbackBufferSize) |
+ |
+ if (destinationData.size() != m_numberOfOutputChannels || |
Raymond Toy
2017/01/06 22:22:03
Should there be a DCHECK for this case?
hongchan
2017/01/09 21:53:15
It's there; line 101.
Raymond Toy
2017/01/09 22:46:02
Oops. Sorry, I missed that.
|
+ numberOfFrames != m_callbackBufferSize) |
return; |
m_framesElapsed -= std::min(m_framesElapsed, priorFramesSkipped); |
@@ -116,32 +116,35 @@ void AudioDestination::render(const WebVector<float*>& destinationData, |
// FIFO. |
for (unsigned i = 0; i < m_numberOfOutputChannels; ++i) |
m_outputBus->setChannelMemory(i, destinationData[i], numberOfFrames); |
- m_fifo->consume(m_outputBus.get(), numberOfFrames); |
- m_framesElapsed += numberOfFrames; |
-} |
- |
-void AudioDestination::provideInput(AudioBus* outputBus, |
- size_t framesToProcess) { |
- AudioIOPosition outputPosition = m_outputPosition; |
- |
- // If platform buffer is more than two times longer than |framesToProcess| |
- // we do not want output position to get stuck so we promote it |
- // using the elapsed time from the moment it was initially obtained. |
- if (m_callbackBufferSize > framesToProcess * 2) { |
- double delta = (base::TimeTicks::Now() - m_outputPositionReceivedTimestamp) |
- .InSecondsF(); |
- outputPosition.position += delta; |
- outputPosition.timestamp += delta; |
+ size_t framesToPull = numberOfFrames - m_fifo->numberOfFrames(); |
+ while (framesToPull > 0) { |
+ // If platform buffer is more than two times longer than |framesToProcess| |
+ // we do not want output position to get stuck so we promote it |
+ // using the elapsed time from the moment it was initially obtained. |
+ if (m_callbackBufferSize > AudioUtilities::kRenderQuantumFrames * 2) { |
+ double delta = |
+ (base::TimeTicks::Now() - m_outputPositionReceivedTimestamp) |
+ .InSecondsF(); |
+ m_outputPosition.position += delta; |
+ m_outputPosition.timestamp += delta; |
+ } |
+ |
+ // Some implementations give only rough estimation of |delay| so |
+ // we might have negative estimation |outputPosition| value. |
+ if (m_outputPosition.position < 0.0) |
+ m_outputPosition.position = 0.0; |
+ |
+ m_callback.render(nullptr, m_renderBus.get(), |
+ AudioUtilities::kRenderQuantumFrames, m_outputPosition); |
+ m_fifo->push(m_renderBus.get()); |
+ |
+ framesToPull -= AudioUtilities::kRenderQuantumFrames; |
} |
- // Some implementations give only rough estimation of |delay| so |
- // we might have negative estimation |outputPosition| value. |
- if (outputPosition.position < 0.0) |
- outputPosition.position = 0.0; |
+ m_fifo->pull(m_outputBus.get(), numberOfFrames); |
- // To fill the FIFO, start the render call chain of the destination node. |
- m_callback.render(nullptr, outputBus, framesToProcess, outputPosition); |
+ m_framesElapsed += numberOfFrames; |
} |
void AudioDestination::start() { |