1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/renderer/pepper/pepper_media_device_manager.h"
7 #include "base/logging.h"
8 #include "content/renderer/media/media_stream_dispatcher.h"
9 #include "content/renderer/render_view_impl.h"
10 #include "ppapi/shared_impl/ppb_device_ref_shared.h"
16 ppapi::DeviceRefData FromStreamDeviceInfo(const StreamDeviceInfo& info) {
17 ppapi::DeviceRefData data;
18 data.id = info.device.id;
19 data.name = info.device.name;
20 data.type = PepperMediaDeviceManager::FromMediaStreamType(info.device.type);
26 PepperMediaDeviceManager* PepperMediaDeviceManager::GetForRenderView(
27 RenderView* render_view) {
28 PepperMediaDeviceManager* handler =
29 PepperMediaDeviceManager::Get(render_view);
31 handler = new PepperMediaDeviceManager(render_view);
35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view)
36 : RenderViewObserver(render_view),
37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view),
41 PepperMediaDeviceManager::~PepperMediaDeviceManager() {
42 DCHECK(enumerate_callbacks_.empty());
43 DCHECK(open_callbacks_.empty());
46 int PepperMediaDeviceManager::EnumerateDevices(
47 PP_DeviceType_Dev type,
48 const GURL& document_url,
49 const EnumerateDevicesCallback& callback) {
50 enumerate_callbacks_[next_id_] = callback;
51 int request_id = next_id_++;
53 #if defined(ENABLE_WEBRTC)
54 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices(
55 request_id, AsWeakPtr(),
56 PepperMediaDeviceManager::FromPepperDeviceType(type),
57 document_url.GetOrigin());
59 base::MessageLoop::current()->PostTask(
62 &PepperMediaDeviceManager::OnDevicesEnumerated,
65 StreamDeviceInfoArray()));
71 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) {
72 enumerate_callbacks_.erase(request_id);
74 #if defined(ENABLE_WEBRTC)
75 // Need to post task since this function might be called inside the callback
76 // of EnumerateDevices.
77 base::MessageLoop::current()->PostTask(
79 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices,
80 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(),
86 int PepperMediaDeviceManager::OpenDevice(
87 PP_DeviceType_Dev type,
88 const std::string& device_id,
89 const GURL& document_url,
90 const OpenDeviceCallback& callback) {
91 open_callbacks_[next_id_] = callback;
92 int request_id = next_id_++;
94 #if defined(ENABLE_WEBRTC)
95 GetRenderViewImpl()->media_stream_dispatcher()->
100 PepperMediaDeviceManager::FromPepperDeviceType(type),
101 document_url.GetOrigin());
103 base::MessageLoop::current()->PostTask(
105 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed,
113 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) {
114 open_callbacks_.erase(request_id);
116 #if defined(ENABLE_WEBRTC)
117 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice(
118 request_id, AsWeakPtr());
122 void PepperMediaDeviceManager::CloseDevice(const std::string& label) {
123 #if defined(ENABLE_WEBRTC)
124 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label);
128 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type,
129 const std::string& label) {
130 #if defined(ENABLE_WEBRTC)
132 case PP_DEVICETYPE_DEV_AUDIOCAPTURE:
133 return GetRenderViewImpl()->media_stream_dispatcher()->audio_session_id(
135 case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
136 return GetRenderViewImpl()->media_stream_dispatcher()->video_session_id(
147 void PepperMediaDeviceManager::OnStreamGenerated(
149 const std::string& label,
150 const StreamDeviceInfoArray& audio_device_array,
151 const StreamDeviceInfoArray& video_device_array) {
154 void PepperMediaDeviceManager::OnStreamGenerationFailed(int request_id) {
157 void PepperMediaDeviceManager::OnDeviceStopped(
158 const std::string& label,
159 const StreamDeviceInfo& device_info) {
162 void PepperMediaDeviceManager::OnDevicesEnumerated(
164 const StreamDeviceInfoArray& device_array) {
165 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id);
166 if (iter == enumerate_callbacks_.end()) {
167 // This might be enumerated result sent before StopEnumerateDevices is
168 // called since EnumerateDevices is persistent request.
172 EnumerateDevicesCallback callback = iter->second;
174 std::vector<ppapi::DeviceRefData> devices;
175 devices.reserve(device_array.size());
176 for (StreamDeviceInfoArray::const_iterator info =
177 device_array.begin(); info != device_array.end(); ++info) {
178 devices.push_back(FromStreamDeviceInfo(*info));
180 callback.Run(request_id, devices);
183 void PepperMediaDeviceManager::OnDeviceOpened(
185 const std::string& label,
186 const StreamDeviceInfo& device_info) {
187 NotifyDeviceOpened(request_id, true, label);
190 void PepperMediaDeviceManager::OnDeviceOpenFailed(int request_id) {
191 NotifyDeviceOpened(request_id, false, std::string());
195 MediaStreamType PepperMediaDeviceManager::FromPepperDeviceType(
196 PP_DeviceType_Dev type) {
198 case PP_DEVICETYPE_DEV_INVALID:
199 return MEDIA_NO_SERVICE;
200 case PP_DEVICETYPE_DEV_AUDIOCAPTURE:
201 return MEDIA_DEVICE_AUDIO_CAPTURE;
202 case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
203 return MEDIA_DEVICE_VIDEO_CAPTURE;
206 return MEDIA_NO_SERVICE;
211 PP_DeviceType_Dev PepperMediaDeviceManager::FromMediaStreamType(
212 MediaStreamType type) {
214 case MEDIA_NO_SERVICE:
215 return PP_DEVICETYPE_DEV_INVALID;
216 case MEDIA_DEVICE_AUDIO_CAPTURE:
217 return PP_DEVICETYPE_DEV_AUDIOCAPTURE;
218 case MEDIA_DEVICE_VIDEO_CAPTURE:
219 return PP_DEVICETYPE_DEV_VIDEOCAPTURE;
222 return PP_DEVICETYPE_DEV_INVALID;
226 void PepperMediaDeviceManager::NotifyDeviceOpened(
229 const std::string& label) {
230 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id);
231 if (iter == open_callbacks_.end()) {
232 // The callback may have been unregistered.
236 OpenDeviceCallback callback = iter->second;
237 open_callbacks_.erase(iter);
239 callback.Run(request_id, succeeded, label);
242 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() {
243 return static_cast<RenderViewImpl*>(render_view());
246 } // namespace content