| Index: media/audio/audio_manager_base.cc | 
| diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc | 
| index 3a27de162be17887ee0ca68cc338a41e702dda27..86a3db0f611c58bb2339c52ef92c0cd362fae8ed 100644 | 
| --- a/media/audio/audio_manager_base.cc | 
| +++ b/media/audio/audio_manager_base.cc | 
| @@ -5,6 +5,7 @@ | 
| #include "media/audio/audio_manager_base.h" | 
|  | 
| #include "base/bind.h" | 
| +#include "base/bind_helpers.h" | 
| #include "base/command_line.h" | 
| #include "base/message_loop_proxy.h" | 
| #include "base/threading/thread.h" | 
| @@ -122,8 +123,10 @@ AudioOutputStream* AudioManagerBase::MakeAudioOutputStream( | 
| NOTIMPLEMENTED(); | 
| return NULL; | 
| #else | 
| -    stream = VirtualAudioOutputStream::MakeStream(this, params, message_loop_, | 
| -        virtual_audio_input_stream_); | 
| +    stream = new VirtualAudioOutputStream( | 
| +        params, message_loop_, virtual_audio_input_stream_, | 
| +        base::Bind(&AudioManagerBase::ReleaseVirtualOutputStream, | 
| +                   base::Unretained(this))); | 
| #endif | 
| } else if (audio_output_disabled) { | 
| stream = FakeAudioOutputStream::MakeFakeStream(this, params); | 
| @@ -168,8 +171,10 @@ AudioInputStream* AudioManagerBase::MakeAudioInputStream( | 
| // TODO(justinlin): Currently, audio mirroring will only work for the first | 
| // request. Subsequent requests will not get audio. | 
| if (!virtual_audio_input_stream_) { | 
| -      virtual_audio_input_stream_ = | 
| -          VirtualAudioInputStream::MakeStream(this, params, message_loop_); | 
| +      virtual_audio_input_stream_ = new VirtualAudioInputStream( | 
| +          params, message_loop_, | 
| +          base::Bind(&AudioManagerBase::ReleaseVirtualInputStream, | 
| +                     base::Unretained(this))); | 
| stream = virtual_audio_input_stream_; | 
| DVLOG(1) << "Virtual audio input stream created."; | 
|  | 
| @@ -294,27 +299,36 @@ void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) { | 
| // TODO(xians) : Have a clearer destruction path for the AudioOutputStream. | 
| // For example, pass the ownership to AudioManager so it can delete the | 
| // streams. | 
| -  num_output_streams_--; | 
| +  --num_output_streams_; | 
| delete stream; | 
| } | 
|  | 
| void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) { | 
| DCHECK(stream); | 
| // TODO(xians) : Have a clearer destruction path for the AudioInputStream. | 
| +  --num_input_streams_; | 
| +  delete stream; | 
| +} | 
|  | 
| -  if (virtual_audio_input_stream_ == stream) { | 
| -    DVLOG(1) << "Virtual audio input stream stopping."; | 
| -    virtual_audio_input_stream_->Stop(); | 
| -    virtual_audio_input_stream_ = NULL; | 
| +void AudioManagerBase::ReleaseVirtualInputStream( | 
| +    VirtualAudioInputStream* stream) { | 
| +  DCHECK_EQ(virtual_audio_input_stream_, stream); | 
|  | 
| -    // Make all VirtualAudioOutputStreams unregister from the | 
| -    // VirtualAudioInputStream and recreate themselves as regular audio streams | 
| -    // to return sound to hardware. | 
| -    NotifyAllOutputDeviceChangeListeners(); | 
| -  } | 
| +  virtual_audio_input_stream_ = NULL; | 
|  | 
| -  num_input_streams_--; | 
| -  delete stream; | 
| +  // Notify listeners to re-create output streams.  This will cause all | 
| +  // outstanding VirtualAudioOutputStreams pointing at the | 
| +  // VirtualAudioInputStream to be closed and destroyed.  Once this has | 
| +  // happened, there will be no other references to the input stream, and it | 
| +  // will then be safe to delete it. | 
| +  NotifyAllOutputDeviceChangeListeners(); | 
| + | 
| +  ReleaseInputStream(stream); | 
| +} | 
| + | 
| +void AudioManagerBase::ReleaseVirtualOutputStream( | 
| +    VirtualAudioOutputStream* stream) { | 
| +  ReleaseOutputStream(stream); | 
| } | 
|  | 
| void AudioManagerBase::IncreaseActiveInputStreamCount() { | 
|  |