Chromium Code Reviews| Index: content/renderer/media/audio_message_filter.cc |
| diff --git a/content/renderer/media/audio_message_filter.cc b/content/renderer/media/audio_message_filter.cc |
| index 377c770aa125514e2aa36c464c586309cb41868e..fb59476378d4854e63bbea3e9087e41029cea1e9 100644 |
| --- a/content/renderer/media/audio_message_filter.cc |
| +++ b/content/renderer/media/audio_message_filter.cc |
| @@ -12,11 +12,37 @@ |
| namespace content { |
| -AudioMessageFilter* AudioMessageFilter::filter_ = NULL; |
| +namespace { |
| +const int kStreamIDNotSet = -1; |
| + |
| +// The singleton instance of AudioMessageFilter. Set/unset by the ctor/dtor. |
| +AudioMessageFilter* g_filter = NULL; |
|
DaleCurtis
2013/03/05 23:29:54
Same comments as the input message filter.
miu
2013/03/06 22:36:52
Done.
|
| +} |
| + |
| +class AudioMessageFilter::AudioOutputIPCImpl |
| + : public NON_EXPORTED_BASE(media::AudioOutputIPC) { |
| + public: |
| + explicit AudioOutputIPCImpl(int render_view_id); |
| + virtual ~AudioOutputIPCImpl(); |
| + |
| + // media::AudioOutputIPC implementation. |
| + virtual void CreateStream(media::AudioOutputIPCDelegate* delegate, |
| + const media::AudioParameters& params) OVERRIDE; |
| + virtual void PlayStream() OVERRIDE; |
| + virtual void PauseStream() OVERRIDE; |
| + virtual void FlushStream() OVERRIDE; |
| + virtual void CloseStream() OVERRIDE; |
| + virtual void SetVolume(double volume) OVERRIDE; |
| + |
| + private: |
| + const int render_view_id_; |
| + int stream_id_; |
| +}; |
| + |
| // static |
| AudioMessageFilter* AudioMessageFilter::Get() { |
| - return filter_; |
| + return g_filter; |
| } |
| AudioMessageFilter::AudioMessageFilter( |
| @@ -24,48 +50,59 @@ AudioMessageFilter::AudioMessageFilter( |
| : channel_(NULL), |
| audio_hardware_config_(NULL), |
| io_message_loop_(io_message_loop) { |
| - DCHECK(!filter_); |
| - filter_ = this; |
| + DCHECK(!g_filter); |
| + g_filter = this; |
| } |
| -int AudioMessageFilter::AddDelegate(media::AudioOutputIPCDelegate* delegate) { |
| - DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| - return delegates_.Add(delegate); |
| -} |
| +AudioMessageFilter::AudioOutputIPCImpl::AudioOutputIPCImpl(int render_view_id) |
| + : render_view_id_(render_view_id), stream_id_(kStreamIDNotSet) {} |
| -void AudioMessageFilter::RemoveDelegate(int id) { |
| - DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| - delegates_.Remove(id); |
| -} |
| +AudioMessageFilter::AudioOutputIPCImpl::~AudioOutputIPCImpl() {} |
| -void AudioMessageFilter::CreateStream(int stream_id, |
| - const media::AudioParameters& params) { |
| - Send(new AudioHostMsg_CreateStream(stream_id, params)); |
| +scoped_ptr<media::AudioOutputIPC> AudioMessageFilter::CreateAudioOutputIPC( |
| + int render_view_id) { |
| + DCHECK_LT(0, render_view_id); |
| + return scoped_ptr<media::AudioOutputIPC>( |
| + new AudioOutputIPCImpl(render_view_id)); |
| } |
| -void AudioMessageFilter::AssociateStreamWithProducer(int stream_id, |
| - int render_view_id) { |
| - Send(new AudioHostMsg_AssociateStreamWithProducer(stream_id, render_view_id)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::CreateStream( |
| + media::AudioOutputIPCDelegate* delegate, |
| + const media::AudioParameters& params) { |
| + DCHECK(g_filter->io_message_loop_->BelongsToCurrentThread()); |
| + DCHECK(delegate); |
| + DCHECK_EQ(kStreamIDNotSet, stream_id_); |
| + stream_id_ = g_filter->delegates_.Add(delegate); |
| + g_filter->Send(new AudioHostMsg_CreateStream( |
| + stream_id_, render_view_id_, params)); |
| } |
| -void AudioMessageFilter::PlayStream(int stream_id) { |
| - Send(new AudioHostMsg_PlayStream(stream_id)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::PlayStream() { |
| + DCHECK_NE(kStreamIDNotSet, stream_id_); |
| + g_filter->Send(new AudioHostMsg_PlayStream(stream_id_)); |
| } |
| -void AudioMessageFilter::PauseStream(int stream_id) { |
| - Send(new AudioHostMsg_PauseStream(stream_id)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::PauseStream() { |
| + DCHECK_NE(kStreamIDNotSet, stream_id_); |
| + g_filter->Send(new AudioHostMsg_PauseStream(stream_id_)); |
| } |
| -void AudioMessageFilter::FlushStream(int stream_id) { |
| - Send(new AudioHostMsg_FlushStream(stream_id)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::FlushStream() { |
| + DCHECK_NE(kStreamIDNotSet, stream_id_); |
| + g_filter->Send(new AudioHostMsg_FlushStream(stream_id_)); |
| } |
| -void AudioMessageFilter::CloseStream(int stream_id) { |
| - Send(new AudioHostMsg_CloseStream(stream_id)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::CloseStream() { |
| + DCHECK(g_filter->io_message_loop_->BelongsToCurrentThread()); |
| + DCHECK_NE(kStreamIDNotSet, stream_id_); |
| + g_filter->Send(new AudioHostMsg_CloseStream(stream_id_)); |
| + g_filter->delegates_.Remove(stream_id_); |
| + stream_id_ = kStreamIDNotSet; |
| } |
| -void AudioMessageFilter::SetVolume(int stream_id, double volume) { |
| - Send(new AudioHostMsg_SetVolume(stream_id, volume)); |
| +void AudioMessageFilter::AudioOutputIPCImpl::SetVolume(double volume) { |
| + DCHECK_NE(kStreamIDNotSet, stream_id_); |
| + g_filter->Send(new AudioHostMsg_SetVolume(stream_id_, volume)); |
| } |
| void AudioMessageFilter::Send(IPC::Message* message) { |
| @@ -118,8 +155,9 @@ void AudioMessageFilter::OnChannelClosing() { |
| } |
| AudioMessageFilter::~AudioMessageFilter() { |
| - DCHECK_EQ(filter_, this); |
| - filter_ = NULL; |
| + CHECK(delegates_.IsEmpty()); |
| + DCHECK_EQ(g_filter, this); |
| + g_filter = NULL; |
| } |
| void AudioMessageFilter::OnStreamCreated( |