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

Side by Side Diff: content/browser/renderer_host/media/audio_mirroring_manager.cc

Issue 11413078: Tab Audio Capture: Browser-side connect/disconnect functionality. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: AudioSourceDiverter now in its own file. Other tweaks, per Dale's comments. 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/media/audio_mirroring_manager.h"
6
7 #include "content/public/browser/browser_thread.h"
8
9 namespace content {
10
11 AudioMirroringManager::AudioMirroringManager() {}
12
13 AudioMirroringManager::~AudioMirroringManager() {
14 DCHECK(diverters_.empty());
15 DCHECK(sessions_.empty());
16 }
17
18 void AudioMirroringManager::AddDiverter(
19 int render_process_id, int render_view_id, Diverter* diverter) {
20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
21 DCHECK(diverter);
22
23 // DCHECK(diverter not already in diverters_ under any key)
24 #ifndef NDEBUG
25 for (DiverterMap::const_iterator it = diverters_.begin();
26 it != diverters_.end(); ++it) {
27 DCHECK_NE(diverter, it->second);
28 }
29 #endif
30
31 // Add the diverter to the set of active diverters.
32 const Target target(render_process_id, render_view_id);
33 diverters_.insert(std::make_pair(target, diverter));
34
35 // If a mirroring session is active, start diverting the audio stream
36 // immediately.
37 SessionMap::iterator session_it = sessions_.find(target);
38 if (session_it != sessions_.end()) {
39 diverter->StartDiverting(
40 session_it->second->AddInput(diverter->GetAudioParameters()));
41 }
42 }
43
44 void AudioMirroringManager::RemoveDiverter(
45 int render_process_id, int render_view_id, Diverter* diverter) {
46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
47
48 // Stop diverting the audio stream if a mirroring session is active.
49 const Target target(render_process_id, render_view_id);
50 SessionMap::iterator session_it = sessions_.find(target);
51 if (session_it != sessions_.end())
52 diverter->StopDiverting();
53
54 // Remove the diverter from the set of active diverters.
55 for (DiverterMap::iterator it = diverters_.lower_bound(target);
56 it != diverters_.end() && it->first == target; ++it) {
57 if (it->second == diverter) {
58 diverters_.erase(it);
59 break;
60 }
61 }
62 }
63
64 void AudioMirroringManager::StartMirroring(
65 int render_process_id, int render_view_id,
66 MirroringDestination* destination) {
67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
68 DCHECK(destination);
69
70 // Insert an entry into the set of active mirroring sessions. If a mirroring
71 // session is already active for |render_process_id| + |render_view_id|,
72 // replace the entry.
73 const Target target(render_process_id, render_view_id);
74 SessionMap::iterator session_it = sessions_.find(target);
75 MirroringDestination* old_destination;
76 if (session_it == sessions_.end()) {
77 old_destination = NULL;
78 sessions_.insert(std::make_pair(target, destination));
79
80 DVLOG(1) << "Start mirroring render_process_id:render_view_id="
81 << render_process_id << ':' << render_view_id
82 << " --> MirroringDestination@" << destination;
83 } else {
84 old_destination = session_it->second;
85 session_it->second = destination;
86
87 DVLOG(1) << "Switch mirroring of render_process_id:render_view_id="
88 << render_process_id << ':' << render_view_id
89 << " MirroringDestination@" << old_destination
90 << " --> MirroringDestination@" << destination;
91 }
92
93 // Divert audio streams coming from |target| to |destination|. If streams
94 // were already diverted to the |old_destination|, remove them.
95 for (DiverterMap::iterator it = diverters_.lower_bound(target);
96 it != diverters_.end() && it->first == target; ++it) {
97 Diverter* const diverter = it->second;
98 if (old_destination)
99 diverter->StopDiverting();
100 diverter->StartDiverting(
darin (slow to review) 2013/01/09 05:06:53 What happens if a Diverter calls Add/RemoveDiverte
miu 2013/01/09 07:21:49 Added a comment in the header file to warn about t
101 destination->AddInput(diverter->GetAudioParameters()));
102 }
103 }
104
105 void AudioMirroringManager::StopMirroring(
106 int render_process_id, int render_view_id,
107 MirroringDestination* destination) {
108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
109
110 // Stop mirroring if there is an active session *and* the destination
111 // matches.
112 const Target target(render_process_id, render_view_id);
113 SessionMap::iterator session_it = sessions_.find(target);
114 if (session_it == sessions_.end() || destination != session_it->second)
115 return;
116
117 DVLOG(1) << "Stop mirroring render_process_id:render_view_id="
118 << render_process_id << ':' << render_view_id
119 << " --> MirroringDestination@" << destination;
120
121 // Stop diverting each audio stream in the mirroring session being stopped.
122 for (DiverterMap::iterator it = diverters_.lower_bound(target);
123 it != diverters_.end() && it->first == target; ++it) {
124 it->second->StopDiverting();
125 }
126
127 // Remove the entry from the set of active mirroring sessions.
128 sessions_.erase(session_it);
129 }
130
131 AudioMirroringManager::MirroringDestination::~MirroringDestination() {}
132
133 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698