| 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..1d1202d1aea55915263e376cccccde43854e3190 100644
|
| --- a/content/renderer/media/audio_message_filter.cc
|
| +++ b/content/renderer/media/audio_message_filter.cc
|
| @@ -12,60 +12,90 @@
|
|
|
| namespace content {
|
|
|
| -AudioMessageFilter* AudioMessageFilter::filter_ = NULL;
|
| -
|
| -// static
|
| -AudioMessageFilter* AudioMessageFilter::Get() {
|
| - return filter_;
|
| -}
|
| +namespace {
|
| +const int kStreamIDNotSet = -1;
|
| +}
|
| +
|
| +class AudioMessageFilter::AudioOutputIPCImpl
|
| + : public NON_EXPORTED_BASE(media::AudioOutputIPC) {
|
| + public:
|
| + AudioOutputIPCImpl(const scoped_refptr<AudioMessageFilter>& filter,
|
| + 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 scoped_refptr<AudioMessageFilter> filter_;
|
| + const int render_view_id_;
|
| + int stream_id_;
|
| +};
|
|
|
| AudioMessageFilter::AudioMessageFilter(
|
| const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
|
| : channel_(NULL),
|
| audio_hardware_config_(NULL),
|
| - io_message_loop_(io_message_loop) {
|
| - DCHECK(!filter_);
|
| - filter_ = this;
|
| -}
|
| + io_message_loop_(io_message_loop) {}
|
|
|
| -int AudioMessageFilter::AddDelegate(media::AudioOutputIPCDelegate* delegate) {
|
| - DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| - return delegates_.Add(delegate);
|
| -}
|
| +AudioMessageFilter::AudioOutputIPCImpl::AudioOutputIPCImpl(
|
| + const scoped_refptr<AudioMessageFilter>& filter, int render_view_id)
|
| + : filter_(filter),
|
| + 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_GT(render_view_id, 0);
|
| + return scoped_ptr<media::AudioOutputIPC>(
|
| + new AudioOutputIPCImpl(this, 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(filter_->io_message_loop_->BelongsToCurrentThread());
|
| + DCHECK(delegate);
|
| + DCHECK_EQ(stream_id_, kStreamIDNotSet);
|
| + stream_id_ = filter_->delegates_.Add(delegate);
|
| + 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(stream_id_, kStreamIDNotSet);
|
| + 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(stream_id_, kStreamIDNotSet);
|
| + 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(stream_id_, kStreamIDNotSet);
|
| + filter_->Send(new AudioHostMsg_FlushStream(stream_id_));
|
| }
|
|
|
| -void AudioMessageFilter::CloseStream(int stream_id) {
|
| - Send(new AudioHostMsg_CloseStream(stream_id));
|
| +void AudioMessageFilter::AudioOutputIPCImpl::CloseStream() {
|
| + DCHECK(filter_->io_message_loop_->BelongsToCurrentThread());
|
| + DCHECK_NE(stream_id_, kStreamIDNotSet);
|
| + filter_->Send(new AudioHostMsg_CloseStream(stream_id_));
|
| + 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(stream_id_, kStreamIDNotSet);
|
| + filter_->Send(new AudioHostMsg_SetVolume(stream_id_, volume));
|
| }
|
|
|
| void AudioMessageFilter::Send(IPC::Message* message) {
|
| @@ -118,8 +148,9 @@ void AudioMessageFilter::OnChannelClosing() {
|
| }
|
|
|
| AudioMessageFilter::~AudioMessageFilter() {
|
| - DCHECK_EQ(filter_, this);
|
| - filter_ = NULL;
|
| + // Safe on any thread since a ref-count of zero implies no concurrent access
|
| + // is possible:
|
| + CHECK(delegates_.IsEmpty());
|
| }
|
|
|
| void AudioMessageFilter::OnStreamCreated(
|
|
|