diff options
author | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-18 02:11:55 +0000 |
---|---|---|
committer | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-18 02:11:55 +0000 |
commit | 12c34cb59c9199f7dc4b3b9f511673fd96ec89b5 (patch) | |
tree | 22807bc61b27ef595cc789ff95d4a4689f52e932 /media/audio | |
parent | a851997cc96f907741f395ac124caee2453ec963 (diff) | |
download | chromium_src-12c34cb59c9199f7dc4b3b9f511673fd96ec89b5.zip chromium_src-12c34cb59c9199f7dc4b3b9f511673fd96ec89b5.tar.gz chromium_src-12c34cb59c9199f7dc4b3b9f511673fd96ec89b5.tar.bz2 |
Fix VirtualAudioInputStream callback timing issues.
- While mirroring is activated, the VirtualAudioInputStream drives the audio, so we need to account
for the time spent in AudioConverters as well as imprecisions from PostDelayedTask when scheduling callbacks to not slow video playback down.
- Need to use microseconds for the buffer size because for 44.1kHz, we are asked to use a 440 frame buffer.
BUG=168532
Review URL: https://codereview.chromium.org/11889041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177570 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/virtual_audio_input_stream.cc | 19 | ||||
-rw-r--r-- | media/audio/virtual_audio_input_stream.h | 3 |
2 files changed, 18 insertions, 4 deletions
diff --git a/media/audio/virtual_audio_input_stream.cc b/media/audio/virtual_audio_input_stream.cc index 4f2f9bd..705271c 100644 --- a/media/audio/virtual_audio_input_stream.cc +++ b/media/audio/virtual_audio_input_stream.cc @@ -59,8 +59,8 @@ VirtualAudioInputStream::VirtualAudioInputStream( : audio_manager_(manager), message_loop_(message_loop), callback_(NULL), - buffer_duration_ms_(base::TimeDelta::FromMilliseconds( - params.frames_per_buffer() * base::Time::kMillisecondsPerSecond / + 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), @@ -85,6 +85,7 @@ 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))); audio_manager_->GetMessageLoop()->PostTask(FROM_HERE, @@ -139,9 +140,21 @@ void VirtualAudioInputStream::ReadAudio() { 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; + } + message_loop_->PostDelayedTask(FROM_HERE, on_more_data_cb_.callback(), - buffer_duration_ms_); + delay); } void VirtualAudioInputStream::Close() { diff --git a/media/audio/virtual_audio_input_stream.h b/media/audio/virtual_audio_input_stream.h index fcb87a4..e30f1a4 100644 --- a/media/audio/virtual_audio_input_stream.h +++ b/media/audio/virtual_audio_input_stream.h @@ -76,7 +76,8 @@ class MEDIA_EXPORT VirtualAudioInputStream : public AudioInputStream { AudioInputCallback* callback_; // Non-const for testing. - base::TimeDelta buffer_duration_ms_; + base::TimeDelta buffer_duration_; + base::Time next_read_time_; scoped_array<uint8> buffer_; AudioParameters params_; scoped_ptr<AudioBus> audio_bus_; |