| 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() {
|
|
|