Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Unified Diff: content/browser/renderer_host/media/audio_renderer_host.cc

Issue 11413078: Tab Audio Capture: Browser-side connect/disconnect functionality. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added guard against reentrancy in AudioMirroringManager methods. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..084dfe2931f733eb4946c55be55d92cf9609b157 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,16 @@ 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_);
}
AudioRendererHost::~AudioRendererHost() {
@@ -281,10 +293,26 @@ void AudioRendererHost::OnCreateStream(
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.
Chris Rogers 2013/01/09 21:18:44 comment is obvious - adds little value
miu 2013/01/10 21:23:26 Done.
+
+ 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);
Chris Rogers 2013/01/09 21:18:44 We certainly don't have to do this now, but struct
miu 2013/01/10 21:23:26 Agreed. There's also other clean-up and even bug
}
void AudioRendererHost::OnPlayStream(int stream_id) {
@@ -376,6 +404,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;

Powered by Google App Engine
This is Rietveld 408576698