| Index: content/browser/renderer_host/media/audio_renderer_host.cc
|
| diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc
|
| index ac9b2c6fcfd5f1b0910aeb479b81860c21d4a0e4..8fb5e68d8f9bb30f1eb51685c779a51798009607 100644
|
| --- a/content/browser/renderer_host/media/audio_renderer_host.cc
|
| +++ b/content/browser/renderer_host/media/audio_renderer_host.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/process.h"
|
| #include "base/shared_memory.h"
|
| #include "content/browser/browser_main_loop.h"
|
| +#include "content/browser/renderer_host/media/audio_mirroring_manager.h"
|
| #include "content/browser/renderer_host/media/audio_sync_reader.h"
|
| #include "content/common/media/audio_messages.h"
|
| #include "content/public/browser/media_observer.h"
|
| @@ -30,6 +31,9 @@ struct AudioRendererHost::AudioEntry {
|
| // The audio stream ID.
|
| int stream_id;
|
|
|
| + // The routing ID of the source render view.
|
| + int render_view_id;
|
| +
|
| // Shared memory for transmission of the audio data.
|
| base::SharedMemory shared_memory;
|
|
|
| @@ -43,6 +47,7 @@ struct AudioRendererHost::AudioEntry {
|
|
|
| AudioRendererHost::AudioEntry::AudioEntry()
|
| : stream_id(0),
|
| + render_view_id(MSG_ROUTING_NONE),
|
| pending_close(false) {
|
| }
|
|
|
| @@ -51,9 +56,17 @@ AudioRendererHost::AudioEntry::~AudioEntry() {}
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // AudioRendererHost implementations.
|
| AudioRendererHost::AudioRendererHost(
|
| - media::AudioManager* audio_manager, MediaObserver* media_observer)
|
| - : audio_manager_(audio_manager),
|
| + int render_process_id,
|
| + media::AudioManager* audio_manager,
|
| + AudioMirroringManager* mirroring_manager,
|
| + MediaObserver* media_observer)
|
| + : render_process_id_(render_process_id),
|
| + audio_manager_(audio_manager),
|
| + mirroring_manager_(mirroring_manager),
|
| media_observer_(media_observer) {
|
| + DCHECK(audio_manager_);
|
| + DCHECK(mirroring_manager_);
|
| + DCHECK(media_observer_);
|
| }
|
|
|
| AudioRendererHost::~AudioRendererHost() {
|
| @@ -265,7 +278,6 @@ void AudioRendererHost::OnCreateStream(
|
| entry->reader.reset(reader.release());
|
| entry->controller = media::AudioOutputController::Create(
|
| audio_manager_, this, audio_params, entry->reader.get());
|
| -
|
| if (!entry->controller) {
|
| SendErrorMessage(stream_id);
|
| return;
|
| @@ -275,16 +287,31 @@ void AudioRendererHost::OnCreateStream(
|
| // to the map.
|
| entry->stream_id = stream_id;
|
| audio_entries_.insert(std::make_pair(stream_id, entry.release()));
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamStatus(this, stream_id, "created");
|
| + media_observer_->OnSetAudioStreamStatus(this, stream_id, "created");
|
| }
|
|
|
| void AudioRendererHost::OnAssociateStreamWithProducer(int stream_id,
|
| int render_view_id) {
|
| - // TODO(miu): Will use render_view_id in upcoming change.
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| DVLOG(1) << "AudioRendererHost@" << this
|
| << "::OnAssociateStreamWithProducer(stream_id=" << stream_id
|
| << ", render_view_id=" << render_view_id << ")";
|
| +
|
| + AudioEntry* const entry = LookupById(stream_id);
|
| + if (!entry) {
|
| + SendErrorMessage(stream_id);
|
| + return;
|
| + }
|
| +
|
| + if (entry->render_view_id == render_view_id)
|
| + return; // No change.
|
| +
|
| + mirroring_manager_->RemoveDiverter(
|
| + render_process_id_, entry->render_view_id, entry->controller);
|
| + entry->render_view_id = render_view_id;
|
| + mirroring_manager_->AddDiverter(
|
| + render_process_id_, entry->render_view_id, entry->controller);
|
| }
|
|
|
| void AudioRendererHost::OnPlayStream(int stream_id) {
|
| @@ -297,8 +324,7 @@ void AudioRendererHost::OnPlayStream(int stream_id) {
|
| }
|
|
|
| entry->controller->Play();
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamPlaying(this, stream_id, true);
|
| + media_observer_->OnSetAudioStreamPlaying(this, stream_id, true);
|
| }
|
|
|
| void AudioRendererHost::OnPauseStream(int stream_id) {
|
| @@ -311,8 +337,7 @@ void AudioRendererHost::OnPauseStream(int stream_id) {
|
| }
|
|
|
| entry->controller->Pause();
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamPlaying(this, stream_id, false);
|
| + media_observer_->OnSetAudioStreamPlaying(this, stream_id, false);
|
| }
|
|
|
| void AudioRendererHost::OnFlushStream(int stream_id) {
|
| @@ -325,15 +350,13 @@ void AudioRendererHost::OnFlushStream(int stream_id) {
|
| }
|
|
|
| entry->controller->Flush();
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamStatus(this, stream_id, "flushed");
|
| + media_observer_->OnSetAudioStreamStatus(this, stream_id, "flushed");
|
| }
|
|
|
| void AudioRendererHost::OnCloseStream(int stream_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamStatus(this, stream_id, "closed");
|
| + media_observer_->OnSetAudioStreamStatus(this, stream_id, "closed");
|
|
|
| AudioEntry* entry = LookupById(stream_id);
|
|
|
| @@ -354,8 +377,7 @@ void AudioRendererHost::OnSetVolume(int stream_id, double volume) {
|
| if (volume < 0 || volume > 1.0)
|
| return;
|
| entry->controller->SetVolume(volume);
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamVolume(this, stream_id, volume);
|
| + media_observer_->OnSetAudioStreamVolume(this, stream_id, volume);
|
| }
|
|
|
| void AudioRendererHost::SendErrorMessage(int32 stream_id) {
|
| @@ -376,6 +398,8 @@ void AudioRendererHost::CloseAndDeleteStream(AudioEntry* entry) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| if (!entry->pending_close) {
|
| + mirroring_manager_->RemoveDiverter(
|
| + render_process_id_, entry->render_view_id, entry->controller);
|
| entry->controller->Close(
|
| base::Bind(&AudioRendererHost::DeleteEntry, this, entry));
|
| entry->pending_close = true;
|
| @@ -392,8 +416,7 @@ void AudioRendererHost::DeleteEntry(AudioEntry* entry) {
|
| audio_entries_.erase(entry->stream_id);
|
|
|
| // Notify the media observer.
|
| - if (media_observer_)
|
| - media_observer_->OnDeleteAudioStream(this, entry->stream_id);
|
| + media_observer_->OnDeleteAudioStream(this, entry->stream_id);
|
| }
|
|
|
| void AudioRendererHost::DeleteEntryOnError(AudioEntry* entry) {
|
| @@ -403,8 +426,7 @@ void AudioRendererHost::DeleteEntryOnError(AudioEntry* entry) {
|
| // |entry| is destroyed in DeleteEntry().
|
| SendErrorMessage(entry->stream_id);
|
|
|
| - if (media_observer_)
|
| - media_observer_->OnSetAudioStreamStatus(this, entry->stream_id, "error");
|
| + media_observer_->OnSetAudioStreamStatus(this, entry->stream_id, "error");
|
| CloseAndDeleteStream(entry);
|
| }
|
|
|
|
|