Index: media/audio/virtual_audio_input_stream.h |
diff --git a/media/audio/virtual_audio_input_stream.h b/media/audio/virtual_audio_input_stream.h |
index 72ca86c2c39613de7d0b1c9f35b5070c881ba047..53a10738732d8aee6d5a602afa96b0d527aa76c9 100644 |
--- a/media/audio/virtual_audio_input_stream.h |
+++ b/media/audio/virtual_audio_input_stream.h |
@@ -10,6 +10,8 @@ |
#include "base/gtest_prod_util.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/synchronization/lock.h" |
+#include "base/threading/thread_checker.h" |
#include "media/audio/audio_io.h" |
#include "media/audio/audio_parameters.h" |
#include "media/audio/fake_audio_consumer.h" |
@@ -34,10 +36,12 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { |
AfterCloseCallback; |
// Construct a target for audio loopback which mixes multiple data streams |
- // into a single stream having the given |params|. |
+ // into a single stream having the given |params|. |worker_loop| is the loop |
+ // on which AudioInputCallback methods are called and may or may not be the |
+ // single thread that invokes the AudioInputStream methods. |
VirtualAudioInputStream( |
const AudioParameters& params, |
- const scoped_refptr<base::MessageLoopProxy>& message_loop, |
+ const scoped_refptr<base::MessageLoopProxy>& worker_loop, |
const AfterCloseCallback& after_close_cb); |
virtual ~VirtualAudioInputStream(); |
@@ -69,12 +73,12 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { |
typedef std::map<AudioParameters, LoopbackAudioConverter*> AudioConvertersMap; |
- // When Start() is called on this class, we continuously schedule this |
- // callback to render audio using any attached VirtualAudioOutputStreams until |
- // Stop() is called. |
- void ReadAudio(AudioBus* audio_bus); |
+ // Pulls audio data from all attached VirtualAudioOutputStreams, mixes and |
+ // converts the streams into one, and pushes the result to |callback_|. |
+ // Invoked on the worker thread. |
+ void PumpAudio(AudioBus* audio_bus); |
- const scoped_refptr<base::MessageLoopProxy> message_loop_; |
+ const scoped_refptr<base::MessageLoopProxy> worker_loop_; |
AfterCloseCallback after_close_cb_; |
@@ -84,6 +88,10 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { |
scoped_ptr<uint8[]> buffer_; |
AudioParameters params_; |
+ // Guards concurrent access to the converter network: converters_, mixer_, and |
+ // num_attached_output_streams_. |
+ base::Lock converter_network_lock_; |
+ |
// AudioConverters associated with the attached VirtualAudioOutputStreams, |
// partitioned by common AudioParameters. |
AudioConvertersMap converters_; |
@@ -98,6 +106,8 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { |
// Handles callback timing for consumption of audio data. |
FakeAudioConsumer fake_consumer_; |
+ base::ThreadChecker thread_checker_; |
+ |
DISALLOW_COPY_AND_ASSIGN(VirtualAudioInputStream); |
}; |