diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-28 00:18:38 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-28 00:18:38 +0000 |
commit | 7ee0860469bdfaa6662f6a6cb0298519bd0d9918 (patch) | |
tree | 5f95fcbe50b846d8b18a1538f616fb37b49b8935 | |
parent | b28bdd2b44770d34aed29327d4d079a85a2c9fca (diff) | |
download | chromium_src-7ee0860469bdfaa6662f6a6cb0298519bd0d9918.zip chromium_src-7ee0860469bdfaa6662f6a6cb0298519bd0d9918.tar.gz chromium_src-7ee0860469bdfaa6662f6a6cb0298519bd0d9918.tar.bz2 |
Refactor VirtualAudioInputStream to use FakeAudioConsumer.
We have too many different audio timing implementations, I've already
merged FakeAudioOutputStream and NullAudioSink to use FakeAudioConsumer,
time to bind the last one.
BUG=none
TEST=media_unittests.
Review URL: https://codereview.chromium.org/13093009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191073 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/audio/virtual_audio_input_stream.cc | 46 | ||||
-rw-r--r-- | media/audio/virtual_audio_input_stream.h | 13 |
2 files changed, 18 insertions, 41 deletions
diff --git a/media/audio/virtual_audio_input_stream.cc b/media/audio/virtual_audio_input_stream.cc index 31daef7..aa1c265 100644 --- a/media/audio/virtual_audio_input_stream.cc +++ b/media/audio/virtual_audio_input_stream.cc @@ -8,7 +8,6 @@ #include <utility> #include "base/bind.h" -#include "base/message_loop.h" #include "base/message_loop_proxy.h" #include "media/audio/virtual_audio_output_stream.h" @@ -55,22 +54,20 @@ VirtualAudioInputStream::VirtualAudioInputStream( : message_loop_(message_loop), after_close_cb_(after_close_cb), callback_(NULL), - buffer_duration_(base::TimeDelta::FromMicroseconds( - params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / - static_cast<float>(params.sample_rate()))), buffer_(new uint8[params.GetBytesPerBuffer()]), params_(params), - audio_bus_(AudioBus::Create(params_)), mixer_(params_, params_, false), - num_attached_output_streams_(0) { + num_attached_output_streams_(0), + fake_consumer_(message_loop_, params_) { DCHECK(params_.IsValid()); DCHECK(message_loop_); } VirtualAudioInputStream::~VirtualAudioInputStream() { for (AudioConvertersMap::iterator it = converters_.begin(); - it != converters_.end(); ++it) + it != converters_.end(); ++it) { delete it->second; + } DCHECK_EQ(0, num_attached_output_streams_); } @@ -84,15 +81,13 @@ bool VirtualAudioInputStream::Open() { void VirtualAudioInputStream::Start(AudioInputCallback* callback) { DCHECK(message_loop_->BelongsToCurrentThread()); callback_ = callback; - next_read_time_ = base::Time::Now(); - on_more_data_cb_.Reset(base::Bind(&VirtualAudioInputStream::ReadAudio, - base::Unretained(this))); - message_loop_->PostTask(FROM_HERE, on_more_data_cb_.callback()); + fake_consumer_.Start(base::Bind( + &VirtualAudioInputStream::ReadAudio, base::Unretained(this))); } void VirtualAudioInputStream::Stop() { DCHECK(message_loop_->BelongsToCurrentThread()); - on_more_data_cb_.Cancel(); + fake_consumer_.Stop(); } void VirtualAudioInputStream::AddOutputStream( @@ -124,43 +119,26 @@ void VirtualAudioInputStream::RemoveOutputStream( DCHECK_LE(0, num_attached_output_streams_); } -void VirtualAudioInputStream::ReadAudio() { +void VirtualAudioInputStream::ReadAudio(AudioBus* audio_bus) { DCHECK(message_loop_->BelongsToCurrentThread()); DCHECK(callback_); - mixer_.Convert(audio_bus_.get()); - audio_bus_->ToInterleaved(params_.frames_per_buffer(), - params_.bits_per_sample() / 8, - buffer_.get()); + mixer_.Convert(audio_bus); + audio_bus->ToInterleaved(params_.frames_per_buffer(), + params_.bits_per_sample() / 8, + buffer_.get()); callback_->OnData(this, buffer_.get(), params_.GetBytesPerBuffer(), params_.GetBytesPerBuffer(), 1.0); - - // Need to account for time spent here due to renderer side mixing as well as - // the imprecision of PostDelayedTask. - next_read_time_ += buffer_duration_; - base::Time now = base::Time::Now(); - base::TimeDelta delay = next_read_time_ - now; - if (delay < base::TimeDelta()) { - // Reset the next read time if we end up getting too far behind. We'll just - // slow down playback to avoid using up all the CPU. - delay = buffer_duration_; - next_read_time_ = now + buffer_duration_; - } - - message_loop_->PostDelayedTask(FROM_HERE, - on_more_data_cb_.callback(), - delay); } void VirtualAudioInputStream::Close() { DCHECK(message_loop_->BelongsToCurrentThread()); if (callback_) { - DCHECK(on_more_data_cb_.IsCancelled()); callback_->OnClose(this); callback_ = NULL; } diff --git a/media/audio/virtual_audio_input_stream.h b/media/audio/virtual_audio_input_stream.h index 339e633..72ca86c 100644 --- a/media/audio/virtual_audio_input_stream.h +++ b/media/audio/virtual_audio_input_stream.h @@ -8,11 +8,11 @@ #include <map> #include <set> -#include "base/cancelable_callback.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "media/audio/audio_io.h" #include "media/audio/audio_parameters.h" +#include "media/audio/fake_audio_consumer.h" #include "media/base/audio_converter.h" namespace base { @@ -72,7 +72,7 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { // When Start() is called on this class, we continuously schedule this // callback to render audio using any attached VirtualAudioOutputStreams until // Stop() is called. - void ReadAudio(); + void ReadAudio(AudioBus* audio_bus); const scoped_refptr<base::MessageLoopProxy> message_loop_; @@ -81,12 +81,8 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { AudioInputCallback* callback_; // Non-const for testing. - base::TimeDelta buffer_duration_; - base::Time next_read_time_; - scoped_array<uint8> buffer_; + scoped_ptr<uint8[]> buffer_; AudioParameters params_; - scoped_ptr<AudioBus> audio_bus_; - base::CancelableClosure on_more_data_cb_; // AudioConverters associated with the attached VirtualAudioOutputStreams, // partitioned by common AudioParameters. @@ -99,6 +95,9 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { // Number of currently attached VirtualAudioOutputStreams. int num_attached_output_streams_; + // Handles callback timing for consumption of audio data. + FakeAudioConsumer fake_consumer_; + DISALLOW_COPY_AND_ASSIGN(VirtualAudioInputStream); }; |