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
),
40 PepperMediaDeviceManager::~PepperMediaDeviceManager() {
41 DCHECK(enumerate_callbacks_
.empty());
42 DCHECK(open_callbacks_
.empty());
45 int PepperMediaDeviceManager::EnumerateDevices(
46 PP_DeviceType_Dev type
,
47 const GURL
& document_url
,
48 const EnumerateDevicesCallback
& callback
) {
49 enumerate_callbacks_
[next_id_
] = callback
;
50 int request_id
= next_id_
++;
52 #if defined(ENABLE_WEBRTC)
53 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices(
56 PepperMediaDeviceManager::FromPepperDeviceType(type
),
57 document_url
.GetOrigin());
59 base::MessageLoop::current()->PostTask(
61 base::Bind(&PepperMediaDeviceManager::OnDevicesEnumerated
,
64 StreamDeviceInfoArray()));
70 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id
) {
71 enumerate_callbacks_
.erase(request_id
);
73 #if defined(ENABLE_WEBRTC)
74 // Need to post task since this function might be called inside the callback
75 // of EnumerateDevices.
76 base::MessageLoop::current()->PostTask(
78 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices
,
79 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(),
85 int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type
,
86 const std::string
& device_id
,
87 const GURL
& document_url
,
88 const OpenDeviceCallback
& callback
) {
89 open_callbacks_
[next_id_
] = callback
;
90 int request_id
= next_id_
++;
92 #if defined(ENABLE_WEBRTC)
93 GetRenderViewImpl()->media_stream_dispatcher()->OpenDevice(
97 PepperMediaDeviceManager::FromPepperDeviceType(type
),
98 document_url
.GetOrigin());
100 base::MessageLoop::current()->PostTask(
102 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed
,
110 void PepperMediaDeviceManager::CancelOpenDevice(int request_id
) {
111 open_callbacks_
.erase(request_id
);
113 #if defined(ENABLE_WEBRTC)
114 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice(request_id
,
119 void PepperMediaDeviceManager::CloseDevice(const std::string
& label
) {
120 #if defined(ENABLE_WEBRTC)
121 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label
);
125 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type
,
126 const std::string
& label
) {
127 #if defined(ENABLE_WEBRTC)
129 case PP_DEVICETYPE_DEV_AUDIOCAPTURE
:
130 return GetRenderViewImpl()->media_stream_dispatcher()->audio_session_id(
132 case PP_DEVICETYPE_DEV_VIDEOCAPTURE
:
133 return GetRenderViewImpl()->media_stream_dispatcher()->video_session_id(
144 void PepperMediaDeviceManager::OnStreamGenerated(
146 const std::string
& label
,
147 const StreamDeviceInfoArray
& audio_device_array
,
148 const StreamDeviceInfoArray
& video_device_array
) {}
150 void PepperMediaDeviceManager::OnStreamGenerationFailed(
152 content::MediaStreamRequestResult result
) {}
154 void PepperMediaDeviceManager::OnDeviceStopped(
155 const std::string
& label
,
156 const StreamDeviceInfo
& device_info
) {}
158 void PepperMediaDeviceManager::OnDevicesEnumerated(
160 const StreamDeviceInfoArray
& device_array
) {
161 EnumerateCallbackMap::iterator iter
= enumerate_callbacks_
.find(request_id
);
162 if (iter
== enumerate_callbacks_
.end()) {
163 // This might be enumerated result sent before StopEnumerateDevices is
164 // called since EnumerateDevices is persistent request.
168 EnumerateDevicesCallback callback
= iter
->second
;
170 std::vector
<ppapi::DeviceRefData
> devices
;
171 devices
.reserve(device_array
.size());
172 for (StreamDeviceInfoArray::const_iterator info
= device_array
.begin();
173 info
!= device_array
.end();
175 devices
.push_back(FromStreamDeviceInfo(*info
));
177 callback
.Run(request_id
, devices
);
180 void PepperMediaDeviceManager::OnDeviceOpened(
182 const std::string
& label
,
183 const StreamDeviceInfo
& device_info
) {
184 NotifyDeviceOpened(request_id
, true, label
);
187 void PepperMediaDeviceManager::OnDeviceOpenFailed(int request_id
) {
188 NotifyDeviceOpened(request_id
, false, std::string());
192 MediaStreamType
PepperMediaDeviceManager::FromPepperDeviceType(
193 PP_DeviceType_Dev type
) {
195 case PP_DEVICETYPE_DEV_INVALID
:
196 return MEDIA_NO_SERVICE
;
197 case PP_DEVICETYPE_DEV_AUDIOCAPTURE
:
198 return MEDIA_DEVICE_AUDIO_CAPTURE
;
199 case PP_DEVICETYPE_DEV_VIDEOCAPTURE
:
200 return MEDIA_DEVICE_VIDEO_CAPTURE
;
203 return MEDIA_NO_SERVICE
;
208 PP_DeviceType_Dev
PepperMediaDeviceManager::FromMediaStreamType(
209 MediaStreamType type
) {
211 case MEDIA_NO_SERVICE
:
212 return PP_DEVICETYPE_DEV_INVALID
;
213 case MEDIA_DEVICE_AUDIO_CAPTURE
:
214 return PP_DEVICETYPE_DEV_AUDIOCAPTURE
;
215 case MEDIA_DEVICE_VIDEO_CAPTURE
:
216 return PP_DEVICETYPE_DEV_VIDEOCAPTURE
;
219 return PP_DEVICETYPE_DEV_INVALID
;
223 void PepperMediaDeviceManager::NotifyDeviceOpened(int request_id
,
225 const std::string
& label
) {
226 OpenCallbackMap::iterator iter
= open_callbacks_
.find(request_id
);
227 if (iter
== open_callbacks_
.end()) {
228 // The callback may have been unregistered.
232 OpenDeviceCallback callback
= iter
->second
;
233 open_callbacks_
.erase(iter
);
235 callback
.Run(request_id
, succeeded
, label
);
238 RenderViewImpl
* PepperMediaDeviceManager::GetRenderViewImpl() {
239 return static_cast<RenderViewImpl
*>(render_view());
242 } // namespace content