summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-28 00:18:38 +0000
committerdalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-28 00:18:38 +0000
commit7ee0860469bdfaa6662f6a6cb0298519bd0d9918 (patch)
tree5f95fcbe50b846d8b18a1538f616fb37b49b8935
parentb28bdd2b44770d34aed29327d4d079a85a2c9fca (diff)
downloadchromium_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.cc46
-rw-r--r--media/audio/virtual_audio_input_stream.h13
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);
};