Fix audio mirroring glitching on platforms with small buffer sizes by blocking...

Fix audio mirroring glitching on platforms with small buffer sizes by blocking while waiting for more data in VAOS::ProvideInput.

BUG=168006
TEST=Tested using --force-audio-mirroring that audio is no longer garbled on mac


Review URL: https://chromiumcodereview.appspot.com/12079086

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180043 0039d316-1c4b-4281-b951-d872f2087c98
parent 410fc563
...@@ -282,7 +282,6 @@ int AudioOutputController::OnMoreIOData(AudioBus* source, ...@@ -282,7 +282,6 @@ int AudioOutputController::OnMoreIOData(AudioBus* source,
} }
void AudioOutputController::WaitTillDataReady() { void AudioOutputController::WaitTillDataReady() {
#if defined(OS_WIN) || defined(OS_MACOSX)
base::Time start = base::Time::Now(); base::Time start = base::Time::Now();
// Wait for up to 1.5 seconds for DataReady(). 1.5 seconds was chosen because // Wait for up to 1.5 seconds for DataReady(). 1.5 seconds was chosen because
// it's larger than the playback time of the WaveOut buffer size using the // it's larger than the playback time of the WaveOut buffer size using the
...@@ -293,10 +292,6 @@ void AudioOutputController::WaitTillDataReady() { ...@@ -293,10 +292,6 @@ void AudioOutputController::WaitTillDataReady() {
((base::Time::Now() - start) < max_wait)) { ((base::Time::Now() - start) < max_wait)) {
base::PlatformThread::YieldCurrentThread(); base::PlatformThread::YieldCurrentThread();
} }
#else
// WaitTillDataReady() is deprecated and should not be used.
CHECK(false);
#endif
} }
void AudioOutputController::OnError(AudioOutputStream* stream, int code) { void AudioOutputController::OnError(AudioOutputStream* stream, int code) {
......
...@@ -141,6 +141,8 @@ class MEDIA_EXPORT AudioOutputController ...@@ -141,6 +141,8 @@ class MEDIA_EXPORT AudioOutputController
AudioBus* dest, AudioBus* dest,
AudioBuffersState buffers_state) OVERRIDE; AudioBuffersState buffers_state) OVERRIDE;
virtual void OnError(AudioOutputStream* stream, int code) OVERRIDE; virtual void OnError(AudioOutputStream* stream, int code) OVERRIDE;
// Deprecated: Currently only used for starting audio playback and for audio
// mirroring.
virtual void WaitTillDataReady() OVERRIDE; virtual void WaitTillDataReady() OVERRIDE;
// AudioDeviceListener implementation. When called AudioOutputController will // AudioDeviceListener implementation. When called AudioOutputController will
......
...@@ -74,7 +74,11 @@ double VirtualAudioOutputStream::ProvideInput(AudioBus* audio_bus, ...@@ -74,7 +74,11 @@ double VirtualAudioOutputStream::ProvideInput(AudioBus* audio_bus,
DCHECK(message_loop_->BelongsToCurrentThread()); DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(callback_); DCHECK(callback_);
int frames = callback_->OnMoreData(audio_bus, AudioBuffersState()); // A VirtualAudioInputStream with a larger buffer size may be calling this
// multiple times without waiting, so we need to block and ensure the data is
// ready to prevent glitching.
callback_->WaitTillDataReady();
const int frames = callback_->OnMoreData(audio_bus, AudioBuffersState());
if (frames < audio_bus->frames()) if (frames < audio_bus->frames())
audio_bus->ZeroFramesPartial(frames, audio_bus->frames() - frames); audio_bus->ZeroFramesPartial(frames, audio_bus->frames() - frames);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment