15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2008 Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector>
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/window.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/windowpicker.h"
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakevideocapturer.h"
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/mediacommon.h"
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/devices/devicemanager.h"
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket {
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass FakeDeviceManager : public DeviceManagerInterface {
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  FakeDeviceManager() {}
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool Init() {
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void Terminate() {
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual int GetCapabilities() {
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::vector<Device> devices;
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int caps = VIDEO_RECV;
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!input_devices_.empty()) {
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      caps |= AUDIO_SEND;
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!output_devices_.empty()) {
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      caps |= AUDIO_RECV;
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!vidcap_devices_.empty()) {
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      caps |= VIDEO_SEND;
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return caps;
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetAudioInputDevices(std::vector<Device>* devs) {
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *devs = input_devices_;
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetAudioOutputDevices(std::vector<Device>* devs) {
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *devs = output_devices_;
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetAudioInputDevice(const std::string& name, Device* out) {
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return GetAudioDevice(true, name, out);
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetAudioOutputDevice(const std::string& name, Device* out) {
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return GetAudioDevice(false, name, out);
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetVideoCaptureDevices(std::vector<Device>* devs) {
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *devs = vidcap_devices_;
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetVideoCaptureDeviceMaxFormat(const std::string& usb_id,
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                              const VideoFormat& max_format) {
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    max_formats_[usb_id] = max_format;
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool IsMaxFormatForDevice(const std::string& usb_id,
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                            const VideoFormat& max_format) const {
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::map<std::string, VideoFormat>::const_iterator found =
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        max_formats_.find(usb_id);
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return (found != max_formats_.end()) ?
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        max_format == found->second :
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        false;
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void ClearVideoCaptureDeviceMaxFormat(const std::string& usb_id) {
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    max_formats_.erase(usb_id);
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual VideoCapturer* CreateVideoCapturer(const Device& device) const {
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return new FakeVideoCapturer();
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetWindows(
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      std::vector<talk_base::WindowDescription>* descriptions) {
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    descriptions->clear();
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const uint32_t id = 1u;  // Note that 0 is not a valid ID.
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const talk_base::WindowId window_id =
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        talk_base::WindowId::Cast(id);
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::string title = "FakeWindow";
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    talk_base::WindowDescription window_description(window_id, title);
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    descriptions->push_back(window_description);
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual VideoCapturer* CreateWindowCapturer(talk_base::WindowId window) {
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!window.IsValid()) {
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return NULL;
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return new FakeVideoCapturer;
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetDesktops(
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      std::vector<talk_base::DesktopDescription>* descriptions) {
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    descriptions->clear();
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const int id = 0;
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const int valid_index = 0;
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const talk_base::DesktopId desktop_id =
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        talk_base::DesktopId::Cast(id, valid_index);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::string title = "FakeDesktop";
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    talk_base::DesktopDescription desktop_description(desktop_id, title);
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    descriptions->push_back(desktop_description);
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual VideoCapturer* CreateDesktopCapturer(talk_base::DesktopId desktop) {
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!desktop.IsValid()) {
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return NULL;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return new FakeVideoCapturer;
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetDefaultVideoCaptureDevice(Device* device) {
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (vidcap_devices_.empty()) {
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return false;
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *device = vidcap_devices_[0];
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef OSX
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool QtKitToSgDevice(const std::string& qtkit_name, Device* out) {
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    out->name = qtkit_name;
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    out->id = "sg:" + qtkit_name;
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetAudioInputDevices(const std::vector<std::string>& devices) {
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    input_devices_.clear();
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < devices.size(); ++i) {
155b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org      input_devices_.push_back(Device(devices[i],
156b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org                                      static_cast<int>(i)));
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    SignalDevicesChange();
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetAudioOutputDevices(const std::vector<std::string>& devices) {
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    output_devices_.clear();
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < devices.size(); ++i) {
163b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org      output_devices_.push_back(Device(devices[i],
164b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org                                       static_cast<int>(i)));
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    SignalDevicesChange();
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetVideoCaptureDevices(const std::vector<std::string>& devices) {
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    vidcap_devices_.clear();
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < devices.size(); ++i) {
171b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org      vidcap_devices_.push_back(Device(devices[i],
172b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org                                       static_cast<int>(i)));
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    SignalDevicesChange();
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetVideoCaptureDevice(const std::string& name,
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                     Device* out) {
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (vidcap_devices_.empty())
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return false;
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // If the name is empty, return the default device.
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (name.empty() || name == kDefaultDeviceName) {
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      *out = vidcap_devices_[0];
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return FindDeviceByName(vidcap_devices_, name, out);
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool GetAudioDevice(bool is_input, const std::string& name,
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      Device* out) {
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // If the name is empty, return the default device.
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (name.empty() || name == kDefaultDeviceName) {
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      *out = Device(name, -1);
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return FindDeviceByName((is_input ? input_devices_ : output_devices_),
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                            name, out);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool FindDeviceByName(const std::vector<Device>& devices,
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               const std::string& name,
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               Device* out) {
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (std::vector<Device>::const_iterator it = devices.begin();
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org         it != devices.end(); ++it) {
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (name == it->name) {
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        *out = *it;
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        return true;
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<Device> input_devices_;
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<Device> output_devices_;
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<Device> vidcap_devices_;
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::map<std::string, VideoFormat> max_formats_;
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace cricket
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
223