| Index: media/audio/virtual_audio_output_stream.cc
 | 
| diff --git a/media/audio/virtual_audio_output_stream.cc b/media/audio/virtual_audio_output_stream.cc
 | 
| index 43c449bc74b3d140c1431411d20adad681e1b949..43b83cf2be888ba6414667e599a11badea38f06d 100644
 | 
| --- a/media/audio/virtual_audio_output_stream.cc
 | 
| +++ b/media/audio/virtual_audio_output_stream.cc
 | 
| @@ -4,20 +4,22 @@
 | 
|  
 | 
|  #include "media/audio/virtual_audio_output_stream.h"
 | 
|  
 | 
| -#include "base/message_loop/message_loop_proxy.h"
 | 
| +#include "base/logging.h"
 | 
|  #include "media/audio/virtual_audio_input_stream.h"
 | 
|  
 | 
|  namespace media {
 | 
|  
 | 
|  VirtualAudioOutputStream::VirtualAudioOutputStream(
 | 
| -    const AudioParameters& params, base::MessageLoopProxy* message_loop,
 | 
| -    VirtualAudioInputStream* target, const AfterCloseCallback& after_close_cb)
 | 
| -    : params_(params), message_loop_(message_loop),
 | 
| -      target_input_stream_(target), after_close_cb_(after_close_cb),
 | 
| -      callback_(NULL), volume_(1.0f) {
 | 
| +    const AudioParameters& params, VirtualAudioInputStream* target,
 | 
| +    const AfterCloseCallback& after_close_cb)
 | 
| +    : params_(params), target_input_stream_(target),
 | 
| +      after_close_cb_(after_close_cb), callback_(NULL), volume_(1.0f) {
 | 
|    DCHECK(params_.IsValid());
 | 
| -  DCHECK(message_loop_);
 | 
|    DCHECK(target);
 | 
| +
 | 
| +  // VAOS can be constructed on any thread, but will DCHECK that all
 | 
| +  // AudioOutputStream methods are called from the same thread.
 | 
| +  thread_checker_.DetachFromThread();
 | 
|  }
 | 
|  
 | 
|  VirtualAudioOutputStream::~VirtualAudioOutputStream() {
 | 
| @@ -25,27 +27,27 @@ VirtualAudioOutputStream::~VirtualAudioOutputStream() {
 | 
|  }
 | 
|  
 | 
|  bool VirtualAudioOutputStream::Open() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
|  void VirtualAudioOutputStream::Start(AudioSourceCallback* callback)  {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    DCHECK(!callback_);
 | 
|    callback_ = callback;
 | 
|    target_input_stream_->AddOutputStream(this, params_);
 | 
|  }
 | 
|  
 | 
|  void VirtualAudioOutputStream::Stop() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    if (callback_) {
 | 
| -    callback_ = NULL;
 | 
|      target_input_stream_->RemoveOutputStream(this, params_);
 | 
| +    callback_ = NULL;
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  void VirtualAudioOutputStream::Close() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    Stop();
 | 
|  
 | 
| @@ -60,18 +62,19 @@ void VirtualAudioOutputStream::Close() {
 | 
|  }
 | 
|  
 | 
|  void VirtualAudioOutputStream::SetVolume(double volume) {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    volume_ = volume;
 | 
|  }
 | 
|  
 | 
|  void VirtualAudioOutputStream::GetVolume(double* volume) {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    *volume = volume_;
 | 
|  }
 | 
|  
 | 
|  double VirtualAudioOutputStream::ProvideInput(AudioBus* audio_bus,
 | 
|                                                base::TimeDelta buffer_delay) {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  // Note: This method may be invoked on any one thread, depending on the
 | 
| +  // platform.
 | 
|    DCHECK(callback_);
 | 
|  
 | 
|    const int frames = callback_->OnMoreData(audio_bus, AudioBuffersState());
 | 
| 
 |