15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dispatcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_messages.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/render_thread_impl.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/audio/audio_parameters.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace { 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool RemoveStreamDeviceFromArray(const StreamDeviceInfo device_info, 208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StreamDeviceInfoArray* array) { 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (StreamDeviceInfoArray::iterator device_it = array->begin(); 228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_it != array->end(); ++device_it) { 238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (StreamDeviceInfo::IsEqual(*device_it, device_info)) { 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) array->erase(device_it); 258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace 328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// A request is identified by pair (request_id, handler), or ipc_request. 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// There could be multiple clients making requests and each has its own 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// request_id sequence. 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The ipc_request is garanteed to be unique when it's created in 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// MediaStreamDispatcher. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MediaStreamDispatcher::Request { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ipc_request) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : handler(handler), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id(request_id), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_request(ipc_request) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool IsThisRequest( 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int request_id1, 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) { 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return (request_id1 == request_id && handler1.get() == handler.get()); 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ipc_request; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MediaStreamDispatcher::Stream { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stream() {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Stream() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray audio_array; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfoArray video_array; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMediaStreamDispatcher::MediaStreamDispatcher(RenderFrame* render_frame) 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : RenderFrameObserver(render_frame), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_ipc_id_(0) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaStreamDispatcher::~MediaStreamDispatcher() {} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::GenerateStream( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamOptions& components, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& security_origin) { 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Send(new MediaStreamHostMsg_GenerateStream( 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch routing_id(), next_ipc_id_++, components, security_origin, 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebUserGestureIndicator::isProcessingUserGesture())); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MediaStreamDispatcher::CancelGenerateStream( 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int request_id, 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", {request_id = " << request_id << "}"; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestList::iterator it = requests_.begin(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it != requests_.end(); ++it) { 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (it->IsThisRequest(request_id, event_handler)) { 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int ipc_request = it->ipc_request; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.erase(it); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(), 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ipc_request)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void MediaStreamDispatcher::StopStreamDevice( 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const StreamDeviceInfo& device_info) { 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::StopStreamDevice" 1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) << ", {device_id = " << device_info.device.id << "}"; 1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Remove |device_info| from all streams in |label_stream_map_|. 1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool device_found = false; 1118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LabelStreamMap::iterator stream_it = label_stream_map_.begin(); 1128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) while (stream_it != label_stream_map_.end()) { 1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StreamDeviceInfoArray& audio_array = stream_it->second.audio_array; 1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StreamDeviceInfoArray& video_array = stream_it->second.video_array; 1158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (RemoveStreamDeviceFromArray(device_info, &audio_array) || 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RemoveStreamDeviceFromArray(device_info, &video_array)) { 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_found = true; 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (audio_array.empty() && video_array.empty()) { 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) label_stream_map_.erase(stream_it++); 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) continue; 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++stream_it; 1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(device_found); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaStreamHostMsg_StopStreamDevice(routing_id(), 1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_info.device.id)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::EnumerateDevices( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaStreamType type, 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& security_origin) { 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) type == MEDIA_DEVICE_VIDEO_CAPTURE || 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) type == MEDIA_DEVICE_AUDIO_OUTPUT); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::EnumerateDevices(" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request_id << ")"; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++it) { 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!it->IsThisRequest(request_id, event_handler)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new MediaStreamHostMsg_EnumerateDevices(routing_id(), 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_ipc_id_++, 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) type, 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) security_origin)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::StopEnumerateDevices( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::StopEnumerateDevices(" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request_id << ")"; 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++it) { 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (it->IsThisRequest(request_id, event_handler)) { 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new MediaStreamHostMsg_CancelEnumerateDevices(routing_id(), 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) it->ipc_request)); 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) requests_.erase(it); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::OpenDevice( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_id, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaStreamType type, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& security_origin) { 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")"; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaStreamHostMsg_OpenDevice(routing_id(), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_ipc_id_++, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_id, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) security_origin)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MediaStreamDispatcher::CancelOpenDevice( 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int request_id, 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CancelGenerateStream(request_id, event_handler); 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::CloseDevice(const std::string& label) { 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!label.empty()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::CloseDevice" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", {label = " << label << "}"; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LabelStreamMap::iterator it = label_stream_map_.find(label); 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (it == label_stream_map_.end()) 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) label_stream_map_.erase(it); 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MediaStreamDispatcher::OnDestruct() { 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Do not self-destruct. UserMediaClientImpl owns |this|. 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MediaStreamDispatcher::Send(IPC::Message* message) { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!RenderThread::Get()) { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete message; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return RenderThread::Get()->Send(message); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcher, message) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStreamGenerated) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerationFailed, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStreamGenerationFailed) 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceStopped, 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnDeviceStopped) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesEnumerated, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDevicesEnumerated) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpened, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDeviceOpened) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpenFailed, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDeviceOpenFailed) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::OnStreamGenerated( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& label, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamDeviceInfoArray& audio_array, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamDeviceInfoArray& video_array) { 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != requests_.end(); ++it) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request& request = *it; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.ipc_request == request_id) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stream new_stream; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.handler = request.handler; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.audio_array = audio_array; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.video_array = video_array; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_stream_map_[label] = new_stream; 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (request.handler.get()) { 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request.handler->OnStreamGenerated( 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request.request_id, label, audio_array, video_array); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerated(" 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request.request_id << ", " << label << ")"; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.erase(it); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MediaStreamDispatcher::OnStreamGenerationFailed( 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int request_id, 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::MediaStreamRequestResult result) { 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != requests_.end(); ++it) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request& request = *it; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.ipc_request == request_id) { 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (request.handler.get()) { 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.handler->OnStreamGenerationFailed(request.request_id, result); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerationFailed(" 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request.request_id << ")\n"; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.erase(it); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MediaStreamDispatcher::OnDeviceStopped( 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& label, 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const StreamDeviceInfo& device_info) { 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OnDeviceStopped(" 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << "{label = " << label << "})" 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << ", {device_id = " << device_info.device.id << "})"; 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LabelStreamMap::iterator it = label_stream_map_.find(label); 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (it == label_stream_map_.end()) { 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This can happen if a user happen stop a the device from JS at the same 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // time as the underlying media device is unplugged from the system. 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Stream* stream = &it->second; 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsAudioInputMediaType(device_info.device.type)) 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RemoveStreamDeviceFromArray(device_info, &stream->audio_array); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RemoveStreamDeviceFromArray(device_info, &stream->video_array); 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (stream->handler.get()) 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream->handler->OnDeviceStopped(label, device_info); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (stream->audio_array.empty() && stream->video_array.empty()) 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) label_stream_map_.erase(it); 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::OnDevicesEnumerated( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamDeviceInfoArray& device_array) { 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(request_id, 0); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++it) { 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it->ipc_request == request_id && it->handler.get()) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->handler->OnDevicesEnumerated(it->request_id, device_array); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::OnDeviceOpened( 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& label, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamDeviceInfo& device_info) { 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != requests_.end(); ++it) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request& request = *it; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.ipc_request == request_id) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stream new_stream; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.handler = request.handler; 34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsAudioInputMediaType(device_info.device.type)) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.audio_array.push_back(device_info); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (IsVideoMediaType(device_info.device.type)) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_stream.video_array.push_back(device_info); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_stream_map_[label] = new_stream; 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (request.handler.get()) { 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request.handler->OnDeviceOpened(request.request_id, label, device_info); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpened(" 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request.request_id << ", " << label << ")"; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.erase(it); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaStreamDispatcher::OnDeviceOpenFailed(int request_id) { 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RequestList::iterator it = requests_.begin(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != requests_.end(); ++it) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Request& request = *it; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.ipc_request == request_id) { 368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (request.handler.get()) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.handler->OnDeviceOpenFailed(request.request_id); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpenFailed(" 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << request.request_id << ")\n"; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests_.erase(it); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MediaStreamDispatcher::audio_session_id(const std::string& label, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LabelStreamMap::iterator it = label_stream_map_.find(label); 3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (it == label_stream_map_.end() || 3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) it->second.audio_array.size() <= static_cast<size_t>(index)) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return StreamDeviceInfo::kNoId; 3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second.audio_array[index].session_id; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MediaStreamDispatcher::IsStream(const std::string& label) { 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return label_stream_map_.find(label) != label_stream_map_.end(); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MediaStreamDispatcher::video_session_id(const std::string& label, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LabelStreamMap::iterator it = label_stream_map_.find(label); 3998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (it == label_stream_map_.end() || 4008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) it->second.video_array.size() <= static_cast<size_t>(index)) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return StreamDeviceInfo::kNoId; 4028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second.video_array[index].session_id; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MediaStreamDispatcher::IsAudioDuckingActive() const { 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LabelStreamMap::const_iterator stream_it = label_stream_map_.begin(); 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (stream_it != label_stream_map_.end()) { 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const StreamDeviceInfoArray& audio_array = stream_it->second.audio_array; 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_it != audio_array.end(); ++device_it) { 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (device_it->device.input.effects & media::AudioParameters::DUCKING) 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++stream_it; 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 422