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

Unified Diff: content/browser/media/capture/audio_mirroring_manager.cc

Issue 1897953003: Unmute Tab Audio For Desktop Share (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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/media/capture/audio_mirroring_manager.cc
diff --git a/content/browser/media/capture/audio_mirroring_manager.cc b/content/browser/media/capture/audio_mirroring_manager.cc
index f8b8b3a5b183e9d1b1ff07dd6728279b368d0c88..1c2445daaf45126f90b1bcbee3476baff2cdbfef 100644
--- a/content/browser/media/capture/audio_mirroring_manager.cc
+++ b/content/browser/media/capture/audio_mirroring_manager.cc
@@ -81,9 +81,23 @@ void AudioMirroringManager::StartMirroring(MirroringDestination* destination) {
sessions_.push_back(destination);
}
+ std::set<SourceFrameRef> candidates;
+ if (destination->IsDuplication()) {
miu 2016/04/21 00:15:24 See comment I made in the .h file about the IsDupl
qiangchen 2016/04/28 00:00:56 Done.
+ for (StreamRoutes::const_iterator it = routes_.begin(); it != routes_.end();
+ ++it) {
+ candidates.insert(it->source_render_frame);
+ }
+ if (!candidates.empty()) {
+ destination->QueryForMatches(
+ candidates,
+ base::Bind(&AudioMirroringManager::UpdateRoutesToDupDestination,
+ base::Unretained(this), destination, false));
+ }
+ return;
+ }
+
// Query the MirroringDestination to see which of the audio streams should be
// diverted.
- std::set<SourceFrameRef> candidates;
for (StreamRoutes::const_iterator it = routes_.begin(); it != routes_.end();
++it) {
if (!it->destination || it->destination == destination)
@@ -102,18 +116,24 @@ void AudioMirroringManager::StartMirroring(MirroringDestination* destination) {
void AudioMirroringManager::StopMirroring(MirroringDestination* destination) {
DCHECK(thread_checker_.CalledOnValidThread());
- // Stop diverting each audio stream in the mirroring session being stopped.
- // Each stopped stream becomes a candidate to be diverted to another
- // destination.
- std::set<SourceFrameRef> redivert_candidates;
- for (StreamRoutes::iterator it = routes_.begin(); it != routes_.end(); ++it) {
- if (it->destination == destination) {
- ChangeRoute(&(*it), NULL);
- redivert_candidates.insert(it->source_render_frame);
+ if (destination->IsDuplication()) {
+ std::set<SourceFrameRef> matches;
+ UpdateRoutesToDupDestination(destination, false, matches);
+ } else {
+ // Stop diverting each audio stream in the mirroring session being stopped.
+ // Each stopped stream becomes a candidate to be diverted to another
+ // destination.
+ std::set<SourceFrameRef> redivert_candidates;
+ for (StreamRoutes::iterator it = routes_.begin(); it != routes_.end();
+ ++it) {
+ if (it->destination == destination) {
+ ChangeRoute(&(*it), NULL);
+ redivert_candidates.insert(it->source_render_frame);
+ }
}
+ if (!redivert_candidates.empty())
+ InitiateQueriesToFindNewDestination(destination, redivert_candidates);
}
- if (!redivert_candidates.empty())
- InitiateQueriesToFindNewDestination(destination, redivert_candidates);
// Remove the entry from the set of active mirroring sessions.
const Destinations::iterator dest_it =
@@ -132,7 +152,15 @@ void AudioMirroringManager::InitiateQueriesToFindNewDestination(
for (Destinations::const_iterator it = sessions_.begin();
it != sessions_.end(); ++it) {
- if (*it != old_destination) {
+ if (*it == old_destination)
+ continue;
+
+ if ((*it)->IsDuplication()) {
+ (*it)->QueryForMatches(
+ candidates,
+ base::Bind(&AudioMirroringManager::UpdateRoutesToDupDestination,
+ base::Unretained(this), *it, true));
+ } else {
(*it)->QueryForMatches(
candidates,
base::Bind(&AudioMirroringManager::UpdateRoutesToDestination,
@@ -177,6 +205,33 @@ void AudioMirroringManager::UpdateRoutesToDestination(
InitiateQueriesToFindNewDestination(destination, redivert_candidates);
}
+void AudioMirroringManager::UpdateRoutesToDupDestination(
+ MirroringDestination* destination,
+ bool add_only,
+ const std::set<SourceFrameRef>& matches) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (std::find(sessions_.begin(), sessions_.end(), destination) ==
+ sessions_.end()) {
+ return; // Query result callback invoked after StopMirroring().
+ }
+
+ for (StreamRoutes::iterator it = routes_.begin(); it != routes_.end(); ++it) {
+ if (matches.find(it->source_render_frame) != matches.end()) {
+ if (it->dup_destinations.count(destination) == 0) {
+ it->dup_destinations[destination] =
+ destination->AddPushInput(it->diverter->GetAudioParameters());
+ it->diverter->StartDuplicating(it->dup_destinations[destination]);
+ }
+
+ } else if (!add_only) {
+ if (it->dup_destinations.count(destination) > 0) {
+ it->diverter->StopDuplicating(it->dup_destinations[destination]);
+ it->dup_destinations.erase(destination);
+ }
+ }
+ }
+}
+
// static
void AudioMirroringManager::ChangeRoute(
StreamRoutingState* route, MirroringDestination* new_destination) {

Powered by Google App Engine
This is Rietveld 408576698