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