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

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: Addressed tommi's comments (dependency injection for testing AudioMirroringManager). Created 8 years 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 83b5f2510baaa405905af5e07c561e76283b9ade..74cfb14e1a293a71b952f9a73247a4451d71854a 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"
@@ -20,16 +21,55 @@ using media::AudioBus;
namespace content {
+namespace {
+
+// Simple wrapper around a media::AudioOutputController to implement the
+// AudioMirroringManager::Diverter interface.
+class ControllerDiverter : public AudioMirroringManager::Diverter {
DaleCurtis 2013/01/02 21:56:44 ISTM that you could just have AudioOutputControlle
miu 2013/01/03 22:30:42 Done. I had thought about this, but I quickly dis
+ public:
+ void SetController(media::AudioOutputController* controller);
+
+ // AudioMirroringManager::Diverter implementation.
+ virtual const media::AudioParameters& GetAudioParameters() OVERRIDE;
+ virtual void StartDiverting(media::AudioOutputStream* stream) OVERRIDE;
+ virtual void StopDiverting() OVERRIDE;
+
+ private:
+ media::AudioOutputController* controller_; // Not owned.
+};
DaleCurtis 2013/01/02 21:56:44 Disallow copy and assign? Why not make provide con
miu 2013/01/03 22:30:42 No longer applicable.
+
+void ControllerDiverter::SetController(media::AudioOutputController* ctlr) {
+ controller_ = ctlr;
DaleCurtis 2013/01/02 21:56:44 DCHECK(ctlr) for haystack hunts.
miu 2013/01/03 22:30:42 No longer applicable.
+}
+
+const media::AudioParameters& ControllerDiverter::GetAudioParameters() {
+ return controller_->params();
+}
+
+void ControllerDiverter::StartDiverting(media::AudioOutputStream* stream) {
+ controller_->StartDiverting(stream);
+}
+
+void ControllerDiverter::StopDiverting() {
+ controller_->StopDiverting();
+}
+
+} // namespace
+
struct AudioRendererHost::AudioEntry {
AudioEntry();
~AudioEntry();
// The AudioOutputController that manages the audio stream.
scoped_refptr<media::AudioOutputController> controller;
+ ControllerDiverter diverter;
// 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 +83,7 @@ struct AudioRendererHost::AudioEntry {
AudioRendererHost::AudioEntry::AudioEntry()
: stream_id(0),
+ render_view_id(MSG_ROUTING_NONE),
pending_close(false) {
}
@@ -51,8 +92,13 @@ 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) {
}
@@ -269,12 +315,13 @@ 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;
}
+ entry->diverter.SetController(entry->controller);
+
// If we have created the controller successfully, create an entry and add it
// to the map.
entry->stream_id = stream_id;
@@ -285,10 +332,30 @@ 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.
+
+ if (mirroring_manager_) {
DaleCurtis 2013/01/02 21:56:44 Mirroring manager should always be present since
miu 2013/01/03 22:30:42 Done. And fixed things so MediaObserver must neve
+ mirroring_manager_->RemoveDiverter(
+ render_process_id_, entry->render_view_id, &entry->diverter);
+ }
+ entry->render_view_id = render_view_id;
+ if (mirroring_manager_) {
+ mirroring_manager_->AddDiverter(
+ render_process_id_, entry->render_view_id, &entry->diverter);
+ }
}
void AudioRendererHost::OnPlayStream(int stream_id) {
@@ -380,6 +447,10 @@ void AudioRendererHost::CloseAndDeleteStream(AudioEntry* entry) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!entry->pending_close) {
+ if (mirroring_manager_) {
DaleCurtis 2013/01/02 21:56:44 Ditto.
miu 2013/01/03 22:30:42 Done.
+ mirroring_manager_->RemoveDiverter(
+ render_process_id_, entry->render_view_id, &entry->diverter);
+ }
entry->controller->Close(
base::Bind(&AudioRendererHost::DeleteEntry, this, entry));
entry->pending_close = true;

Powered by Google App Engine
This is Rietveld 408576698