diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-07 21:32:31 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-07 21:32:31 +0000 |
commit | 8cf0758dc5b5863bf1fef28e0ca748aabe074c17 (patch) | |
tree | ab61d069f29a508c41ac90a8326b1d7a8be66bc4 /media/audio/win | |
parent | 110f48f0a6c0cc8af1d449119be2f540d81f75f5 (diff) | |
download | chromium_src-8cf0758dc5b5863bf1fef28e0ca748aabe074c17.zip chromium_src-8cf0758dc5b5863bf1fef28e0ca748aabe074c17.tar.gz chromium_src-8cf0758dc5b5863bf1fef28e0ca748aabe074c17.tar.bz2 |
Fix some threading issues and some refactoring in AudioRendererHost
1. AudioRendererHost should not wait on IO thread.
Calling AudioOutputStream::Start requests some
audio packets by calling IPCAudioSource::OnMoreData,
resulting in a deadlock. I implemented a prefetching
logic to solve this problem, source has to know
how many internal buffers the implementation of
AudioOutputStream is using and prepare the
same amount of packets before calling
AudioOutputStream::Start.
2. When IPCAudioSource::OnMoreData is waiting for
packet to arrive, calling AudioOutputStream::Stop
will result in a deadlock since it expects
OnMoreData to return. Should wake up all waiting
threads before calling AudioOutputStream::Stop.
3. Did some refactoring and move the message handlers
completely into AudioRendererHost, it was clumsy
to call to AudioRendererHost from ResourceMessageFilter.
Also moved all logics of using shared memory for
packet passing, prefetching to IPCAudioSource.
AudioRendererHost is now merely a container that
manages and delegates calls to IPCAudioSource. This
refactoring is helpful because the next step is to
implement standalone IPC channel for audio.
Review URL: http://codereview.chromium.org/57023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13288 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/win')
-rw-r--r-- | media/audio/win/audio_output_win.cc | 4 | ||||
-rw-r--r-- | media/audio/win/waveout_output_win.cc | 4 | ||||
-rw-r--r-- | media/audio/win/waveout_output_win.h | 1 |
3 files changed, 9 insertions, 0 deletions
diff --git a/media/audio/win/audio_output_win.cc b/media/audio/win/audio_output_win.cc index 880555b..5990e27 100644 --- a/media/audio/win/audio_output_win.cc +++ b/media/audio/win/audio_output_win.cc @@ -61,6 +61,10 @@ class AudioOutputStreamMockWin : public AudioOutputStream { *right_level = right_volume_; } + virtual size_t GetNumBuffers() { + return 1; + } + virtual void Close() { callback_->OnClose(this); callback_ = NULL; diff --git a/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc index 95f70ab..59efa4e 100644 --- a/media/audio/win/waveout_output_win.cc +++ b/media/audio/win/waveout_output_win.cc @@ -193,6 +193,10 @@ void PCMWaveOutAudioOutputStream::GetVolume(double* left_level, return; } +size_t PCMWaveOutAudioOutputStream::GetNumBuffers() { + return kNumBuffers; +} + void PCMWaveOutAudioOutputStream::HandleError(MMRESULT error) { DLOG(WARNING) << "PCMWaveOutAudio error " << error; callback_->OnError(this, error); diff --git a/media/audio/win/waveout_output_win.h b/media/audio/win/waveout_output_win.h index 1c8ffa6..8b90e69 100644 --- a/media/audio/win/waveout_output_win.h +++ b/media/audio/win/waveout_output_win.h @@ -40,6 +40,7 @@ class PCMWaveOutAudioOutputStream : public AudioOutputStream { virtual void Stop(); virtual void SetVolume(double left_level, double right_level); virtual void GetVolume(double* left_level, double* right_level); + virtual size_t GetNumBuffers(); // Sends a buffer to the audio driver for playback. void QueueNextPacket(WAVEHDR* buffer); |