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 aacc6678d02065331eb2e061133646be8183e9e2..c379bbdb5d75bf7257af52a960ad3fab4edb08d3 100644 |
--- a/media/audio/virtual_audio_output_stream.cc |
+++ b/media/audio/virtual_audio_output_stream.cc |
@@ -4,30 +4,24 @@ |
#include "media/audio/virtual_audio_output_stream.h" |
-#include "base/message_loop.h" |
-#include "media/audio/audio_manager_base.h" |
+#include "base/message_loop_proxy.h" |
#include "media/audio/virtual_audio_input_stream.h" |
namespace media { |
-// static |
-VirtualAudioOutputStream* VirtualAudioOutputStream::MakeStream( |
- AudioManagerBase* manager, const AudioParameters& params, |
- base::MessageLoopProxy* message_loop, VirtualAudioInputStream* target) { |
- return new VirtualAudioOutputStream(manager, params, message_loop, target); |
-} |
- |
VirtualAudioOutputStream::VirtualAudioOutputStream( |
- AudioManagerBase* manager, const AudioParameters& params, |
- base::MessageLoopProxy* message_loop, VirtualAudioInputStream* target) |
- : audio_manager_(manager), message_loop_(message_loop), callback_(NULL), |
- params_(params), target_input_stream_(target), volume_(1.0f), |
- attached_(false) { |
+ 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) { |
+ DCHECK(params_.IsValid()); |
+ DCHECK(message_loop_); |
+ DCHECK(target); |
} |
VirtualAudioOutputStream::~VirtualAudioOutputStream() { |
DCHECK(!callback_); |
- DCHECK(!attached_); |
} |
bool VirtualAudioOutputStream::Open() { |
@@ -37,30 +31,41 @@ bool VirtualAudioOutputStream::Open() { |
void VirtualAudioOutputStream::Start(AudioSourceCallback* callback) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK(!attached_); |
+ DCHECK(!callback_); |
callback_ = callback; |
target_input_stream_->AddOutputStream(this, params_); |
- attached_ = true; |
} |
void VirtualAudioOutputStream::Stop() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK(attached_); |
- callback_ = NULL; |
- target_input_stream_->RemoveOutputStream(this, params_); |
- attached_ = false; |
+ if (callback_) { |
+ callback_ = NULL; |
+ target_input_stream_->RemoveOutputStream(this, params_); |
+ } |
} |
void VirtualAudioOutputStream::Close() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
- audio_manager_->ReleaseOutputStream(this); |
+ |
+ Stop(); |
+ |
+ // If a non-null AfterCloseCallback was provided to the constructor, invoke it |
+ // here. The callback is moved to a stack-local first since |this| could be |
+ // destroyed during Run(). |
+ if (!after_close_cb_.is_null()) { |
+ const AfterCloseCallback cb = after_close_cb_; |
+ after_close_cb_.Reset(); |
+ cb.Run(this); |
+ } |
} |
void VirtualAudioOutputStream::SetVolume(double volume) { |
+ DCHECK(message_loop_->BelongsToCurrentThread()); |
volume_ = volume; |
} |
void VirtualAudioOutputStream::GetVolume(double* volume) { |
+ DCHECK(message_loop_->BelongsToCurrentThread()); |
*volume = volume_; |
} |