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); |
} |