devicemanager.h revision 28e20752806a492f5a6a5d343c02f9556f39b1cd
11b268ca467c924004286c97bac133db489cf43d0Ben Murdoch/* 21b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * libjingle 31b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * Copyright 2004 Google Inc. 41b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 51b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * Redistribution and use in source and binary forms, with or without 61b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * modification, are permitted provided that the following conditions are met: 71b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 81b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 1. Redistributions of source code must retain the above copyright notice, 91b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * this list of conditions and the following disclaimer. 101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * this list of conditions and the following disclaimer in the documentation 121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * and/or other materials provided with the distribution. 131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 3. The name of the author may not be used to endorse or promote products 141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * derived from this software without specific prior written permission. 151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * 161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch */ 271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#ifndef TALK_MEDIA_DEVICES_DEVICEMANAGER_H_ 291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#define TALK_MEDIA_DEVICES_DEVICEMANAGER_H_ 301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include <map> 321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include <string> 331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include <vector> 341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include "talk/base/scoped_ptr.h" 361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include "talk/base/sigslot.h" 371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include "talk/base/stringencode.h" 381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include "talk/base/window.h" 391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch#include "talk/media/base/videocommon.h" 401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 411b268ca467c924004286c97bac133db489cf43d0Ben Murdochnamespace talk_base { 421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 431b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass DesktopDescription; 441b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass WindowDescription; 451b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass WindowPicker; 461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 481b268ca467c924004286c97bac133db489cf43d0Ben Murdochnamespace cricket { 491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 501b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass VideoCapturer; 511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Used to represent an audio or video capture or render device. 531b268ca467c924004286c97bac133db489cf43d0Ben Murdochstruct Device { 541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Device() {} 551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Device(const std::string& first, int second) 561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch : name(first), 571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch id(talk_base::ToString(second)) { 581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Device(const std::string& first, const std::string& second) 601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch : name(first), id(second) {} 611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch std::string name; 631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch std::string id; 641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 661b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass VideoCapturerFactory { 671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch public: 681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch VideoCapturerFactory() {} 691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual ~VideoCapturerFactory() {} 701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual VideoCapturer* Create(const Device& device) = 0; 721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// DeviceManagerInterface - interface to manage the audio and 751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// video devices on the system. 761b268ca467c924004286c97bac133db489cf43d0Ben Murdochclass DeviceManagerInterface { 771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch public: 781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual ~DeviceManagerInterface() { } 791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Initialization 811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool Init() = 0; 821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual void Terminate() = 0; 831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Capabilities 851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual int GetCapabilities() = 0; 861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Device enumeration 881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetAudioInputDevices(std::vector<Device>* devices) = 0; 891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetAudioOutputDevices(std::vector<Device>* devices) = 0; 901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetAudioInputDevice(const std::string& name, Device* out) = 0; 921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetAudioOutputDevice(const std::string& name, Device* out) = 0; 931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetVideoCaptureDevices(std::vector<Device>* devs) = 0; 951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch virtual bool GetVideoCaptureDevice(const std::string& name, Device* out) = 0; 96 97 // Caps the capture format according to max format for capturers created 98 // by CreateVideoCapturer(). See ConstrainSupportedFormats() in 99 // videocapturer.h for more detail. 100 // Note that once a VideoCapturer has been created, calling this API will 101 // not affect it. 102 virtual void SetVideoCaptureDeviceMaxFormat( 103 const std::string& usb_id, 104 const VideoFormat& max_format) = 0; 105 virtual void ClearVideoCaptureDeviceMaxFormat(const std::string& usb_id) = 0; 106 107 // Device creation 108 virtual VideoCapturer* CreateVideoCapturer(const Device& device) const = 0; 109 110 virtual bool GetWindows( 111 std::vector<talk_base::WindowDescription>* descriptions) = 0; 112 virtual VideoCapturer* CreateWindowCapturer(talk_base::WindowId window) = 0; 113 114 virtual bool GetDesktops( 115 std::vector<talk_base::DesktopDescription>* descriptions) = 0; 116 virtual VideoCapturer* CreateDesktopCapturer( 117 talk_base::DesktopId desktop) = 0; 118 119 sigslot::signal0<> SignalDevicesChange; 120 121 static const char kDefaultDeviceName[]; 122}; 123 124class DeviceWatcher { 125 public: 126 explicit DeviceWatcher(DeviceManagerInterface* dm) {} 127 virtual ~DeviceWatcher() {} 128 virtual bool Start() { return true; } 129 virtual void Stop() {} 130}; 131 132class DeviceManagerFactory { 133 public: 134 static DeviceManagerInterface* Create(); 135 136 private: 137 DeviceManagerFactory() {} 138}; 139 140class DeviceManager : public DeviceManagerInterface { 141 public: 142 DeviceManager(); 143 virtual ~DeviceManager(); 144 145 void set_device_video_capturer_factory( 146 VideoCapturerFactory* device_video_capturer_factory) { 147 device_video_capturer_factory_.reset(device_video_capturer_factory); 148 } 149 150 // Initialization 151 virtual bool Init(); 152 virtual void Terminate(); 153 154 // Capabilities 155 virtual int GetCapabilities(); 156 157 // Device enumeration 158 virtual bool GetAudioInputDevices(std::vector<Device>* devices); 159 virtual bool GetAudioOutputDevices(std::vector<Device>* devices); 160 161 virtual bool GetAudioInputDevice(const std::string& name, Device* out); 162 virtual bool GetAudioOutputDevice(const std::string& name, Device* out); 163 164 virtual bool GetVideoCaptureDevices(std::vector<Device>* devs); 165 virtual bool GetVideoCaptureDevice(const std::string& name, Device* out); 166 167 virtual void SetVideoCaptureDeviceMaxFormat(const std::string& usb_id, 168 const VideoFormat& max_format); 169 virtual void ClearVideoCaptureDeviceMaxFormat(const std::string& usb_id); 170 171 virtual VideoCapturer* CreateVideoCapturer(const Device& device) const; 172 173 virtual bool GetWindows( 174 std::vector<talk_base::WindowDescription>* descriptions); 175 virtual VideoCapturer* CreateWindowCapturer(talk_base::WindowId window); 176 177 virtual bool GetDesktops( 178 std::vector<talk_base::DesktopDescription>* descriptions); 179 virtual VideoCapturer* CreateDesktopCapturer(talk_base::DesktopId desktop); 180 181 // The exclusion_list MUST be a NULL terminated list. 182 static bool FilterDevices(std::vector<Device>* devices, 183 const char* const exclusion_list[]); 184 bool initialized() const { return initialized_; } 185 186 protected: 187 virtual bool GetAudioDevices(bool input, std::vector<Device>* devs); 188 virtual bool GetAudioDevice(bool is_input, const std::string& name, 189 Device* out); 190 virtual bool GetDefaultVideoCaptureDevice(Device* device); 191 bool IsInWhitelist(const std::string& key, VideoFormat* video_format) const; 192 virtual bool GetMaxFormat(const Device& device, 193 VideoFormat* video_format) const; 194 195 void set_initialized(bool initialized) { initialized_ = initialized; } 196 197 void set_watcher(DeviceWatcher* watcher) { watcher_.reset(watcher); } 198 DeviceWatcher* watcher() { return watcher_.get(); } 199 200 private: 201 // The exclusion_list MUST be a NULL terminated list. 202 static bool ShouldDeviceBeIgnored(const std::string& device_name, 203 const char* const exclusion_list[]); 204 205 bool initialized_; 206 talk_base::scoped_ptr<VideoCapturerFactory> device_video_capturer_factory_; 207 std::map<std::string, VideoFormat> max_formats_; 208 talk_base::scoped_ptr<DeviceWatcher> watcher_; 209 talk_base::scoped_ptr<talk_base::WindowPicker> window_picker_; 210}; 211 212} // namespace cricket 213 214#endif // TALK_MEDIA_DEVICES_DEVICEMANAGER_H_ 215