| Index: media/audio/virtual_audio_input_stream.cc
|
| diff --git a/media/audio/virtual_audio_input_stream.cc b/media/audio/virtual_audio_input_stream.cc
|
| index 4f2f9bd04fb84a4619766597777c75665b5641c6..73aeeb7dfe4413c992e7c46c3c976bcd6fb12d06 100644
|
| --- a/media/audio/virtual_audio_input_stream.cc
|
| +++ b/media/audio/virtual_audio_input_stream.cc
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/message_loop.h"
|
| +#include "base/message_loop_proxy.h"
|
| #include "media/audio/virtual_audio_output_stream.h"
|
|
|
| namespace media {
|
| @@ -47,26 +48,22 @@ class LoopbackAudioConverter : public AudioConverter::InputCallback {
|
| DISALLOW_COPY_AND_ASSIGN(LoopbackAudioConverter);
|
| };
|
|
|
| -VirtualAudioInputStream* VirtualAudioInputStream::MakeStream(
|
| - AudioManagerBase* manager, const AudioParameters& params,
|
| - base::MessageLoopProxy* message_loop) {
|
| - return new VirtualAudioInputStream(manager, params, message_loop);
|
| -}
|
| -
|
| VirtualAudioInputStream::VirtualAudioInputStream(
|
| - AudioManagerBase* manager, const AudioParameters& params,
|
| - base::MessageLoopProxy* message_loop)
|
| - : audio_manager_(manager),
|
| - message_loop_(message_loop),
|
| + const AudioParameters& params, base::MessageLoopProxy* message_loop,
|
| + const AfterCloseCallback& after_close_cb)
|
| + : message_loop_(message_loop),
|
| + after_close_cb_(after_close_cb),
|
| callback_(NULL),
|
| - buffer_duration_ms_(base::TimeDelta::FromMilliseconds(
|
| - params.frames_per_buffer() * base::Time::kMillisecondsPerSecond /
|
| - static_cast<float>(params.sample_rate()))),
|
| + buffer_duration_(base::TimeDelta::FromMicroseconds(
|
| + params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond /
|
| + params.sample_rate())),
|
| buffer_(new uint8[params.GetBytesPerBuffer()]),
|
| params_(params),
|
| audio_bus_(AudioBus::Create(params_)),
|
| mixer_(params_, params_, false),
|
| - num_attached_outputs_streams_(0) {
|
| + num_attached_output_streams_(0) {
|
| + DCHECK(params_.IsValid());
|
| + DCHECK(message_loop_);
|
| }
|
|
|
| VirtualAudioInputStream::~VirtualAudioInputStream() {
|
| @@ -74,10 +71,11 @@ VirtualAudioInputStream::~VirtualAudioInputStream() {
|
| it != converters_.end(); ++it)
|
| delete it->second;
|
|
|
| - DCHECK_EQ(0, num_attached_outputs_streams_);
|
| + DCHECK_EQ(0, num_attached_output_streams_);
|
| }
|
|
|
| bool VirtualAudioInputStream::Open() {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| memset(buffer_.get(), 0, params_.GetBytesPerBuffer());
|
| return true;
|
| }
|
| @@ -87,8 +85,7 @@ void VirtualAudioInputStream::Start(AudioInputCallback* callback) {
|
| callback_ = callback;
|
| on_more_data_cb_.Reset(base::Bind(&VirtualAudioInputStream::ReadAudio,
|
| base::Unretained(this)));
|
| - audio_manager_->GetMessageLoop()->PostTask(FROM_HERE,
|
| - on_more_data_cb_.callback());
|
| + message_loop_->PostTask(FROM_HERE, on_more_data_cb_.callback());
|
| }
|
|
|
| void VirtualAudioInputStream::Stop() {
|
| @@ -111,7 +108,7 @@ void VirtualAudioInputStream::AddOutputStream(
|
| mixer_.AddInput(converter->second);
|
| }
|
| converter->second->AddInput(stream);
|
| - ++num_attached_outputs_streams_;
|
| + ++num_attached_output_streams_;
|
| }
|
|
|
| void VirtualAudioInputStream::RemoveOutputStream(
|
| @@ -121,7 +118,8 @@ void VirtualAudioInputStream::RemoveOutputStream(
|
| DCHECK(converters_.find(output_params) != converters_.end());
|
| converters_[output_params]->RemoveInput(stream);
|
|
|
| - --num_attached_outputs_streams_;
|
| + --num_attached_output_streams_;
|
| + DCHECK_LE(0, num_attached_output_streams_);
|
| }
|
|
|
| void VirtualAudioInputStream::ReadAudio() {
|
| @@ -141,17 +139,26 @@ void VirtualAudioInputStream::ReadAudio() {
|
|
|
| message_loop_->PostDelayedTask(FROM_HERE,
|
| on_more_data_cb_.callback(),
|
| - buffer_duration_ms_);
|
| + buffer_duration_);
|
| }
|
|
|
| void VirtualAudioInputStream::Close() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| +
|
| if (callback_) {
|
| DCHECK(on_more_data_cb_.IsCancelled());
|
| callback_->OnClose(this);
|
| callback_ = NULL;
|
| }
|
| - audio_manager_->ReleaseInputStream(this);
|
| +
|
| + // 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);
|
| + }
|
| }
|
|
|
| double VirtualAudioInputStream::GetMaxVolume() {
|
|
|