Chromium Code Reviews| Index: third_party/WebKit/Source/platform/audio/PushPullFIFO.h |
| diff --git a/third_party/WebKit/Source/platform/audio/PushPullFIFO.h b/third_party/WebKit/Source/platform/audio/PushPullFIFO.h |
| index 2341372f35ab452fb8814dc22208ff3c24e9cd87..ca8f96d0c8a8e7a5eb6fb7232f58935925b22bf4 100644 |
| --- a/third_party/WebKit/Source/platform/audio/PushPullFIFO.h |
| +++ b/third_party/WebKit/Source/platform/audio/PushPullFIFO.h |
| @@ -8,6 +8,7 @@ |
| #include "platform/audio/AudioBus.h" |
| #include "public/platform/WebCommon.h" |
| #include "wtf/Allocator.h" |
| +#include "wtf/ThreadingPrimitives.h" |
| namespace blink { |
| @@ -26,6 +27,14 @@ struct PushPullFIFOStateForTest { |
| // Blink-WebAudio and the renderer. The renderer's hardware callback buffer size |
| // varies on the platform, but the WebAudio always renders 128 frames (render |
| // quantum, RQ) thus FIFO is needed to handle the general case. |
| +// |
| +// Note that this object is concurrently accessed by two threads; WebAudio |
| +// rendering thread (WebThread) in Blink and the audio device thread |
| +// (AudioDeviceThread) from the media renderer. The push/pull operations touch |
| +// most of variables in the class (m_indexWrite, m_indexRead, m_framesAvailable, |
| +// and m_fifoBus) so the thread safety must be handled with care. |
| +// |
| +// TODO(hongchan): add a unit test for multi-thread access. |
| class BLINK_PLATFORM_EXPORT PushPullFIFO { |
| USING_FAST_MALLOC(PushPullFIFO); |
| WTF_MAKE_NONCOPYABLE(PushPullFIFO); |
| @@ -38,7 +47,7 @@ class BLINK_PLATFORM_EXPORT PushPullFIFO { |
| explicit PushPullFIFO(unsigned numberOfChannels, size_t fifoLength); |
| ~PushPullFIFO(); |
| - // Pushes the rendered frames by WebAudio engine. |
| + // Pushes the rendered frames by WebAudio rendering thread. |
| // - The |inputBus| length is 128 frames (1 render quantum), fixed. |
| // - In case of overflow (FIFO full while push), the existing frames in FIFO |
| // will be overwritten and |indexRead| will be forcibly moved to |
| @@ -55,16 +64,20 @@ class BLINK_PLATFORM_EXPORT PushPullFIFO { |
| // the request from the consumer without causing error, but with a glitch. |
| void pull(AudioBus* outputBus, size_t framesRequested); |
| - size_t framesAvailable() const { return m_framesAvailable; } |
| + size_t framesAvailable() const; |
| size_t length() const { return m_fifoLength; } |
| unsigned numberOfChannels() const { return m_fifoBus->numberOfChannels(); } |
| - AudioBus* bus() const { return m_fifoBus.get(); } |
| + AudioBus* getFIFOBusForTest() const; |
| // For unit test. Get the current configuration that consists of FIFO length, |
| // number of channels, read/write index position and under/overflow count. |
| const PushPullFIFOStateForTest getStateForTest() const; |
| private: |
| + // This lock protects all members in this class from being accessed by two |
|
o1ka
2017/03/30 13:17:05
This is technically not quite correct: see length(
hongchan
2017/03/30 18:36:00
Done.
|
| + // threads simultaneously. |
| + mutable Mutex m_threadMutex; |
|
o1ka
2017/03/30 13:17:05
I'm not sure if this rename is useful.
hongchan
2017/03/30 18:36:00
Done.
|
| + |
| // The size of the FIFO. |
| const size_t m_fifoLength = 0; |