| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/pepper/pepper_media_device_manager.h" | 5 #include "content/renderer/pepper/pepper_media_device_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "content/renderer/media/media_stream_dispatcher.h" | 8 #include "content/renderer/media/media_stream_dispatcher.h" |
| 9 #include "content/renderer/render_view_impl.h" | 9 #include "content/renderer/render_view_impl.h" |
| 10 #include "ppapi/shared_impl/ppb_device_ref_shared.h" | 10 #include "ppapi/shared_impl/ppb_device_ref_shared.h" |
| 11 | 11 |
| 12 namespace content { | 12 namespace content { |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 ppapi::DeviceRefData FromStreamDeviceInfo(const StreamDeviceInfo& info) { | 16 ppapi::DeviceRefData FromStreamDeviceInfo(const StreamDeviceInfo& info) { |
| 17 ppapi::DeviceRefData data; | 17 ppapi::DeviceRefData data; |
| 18 data.id = info.device.id; | 18 data.id = info.device.id; |
| 19 data.name = info.device.name; | 19 data.name = info.device.name; |
| 20 data.type = PepperMediaDeviceManager::FromMediaStreamType(info.device.type); | 20 data.type = PepperMediaDeviceManager::FromMediaStreamType(info.device.type); |
| 21 return data; | 21 return data; |
| 22 } | 22 } |
| 23 | 23 |
| 24 } // namespace | 24 } // namespace |
| 25 | 25 |
| 26 PepperMediaDeviceManager* PepperMediaDeviceManager::GetForRenderView( | 26 PepperMediaDeviceManager* PepperMediaDeviceManager::GetForRenderView( |
| 27 RenderView* render_view) { | 27 RenderView* render_view) { |
| 28 PepperMediaDeviceManager* handler = | 28 PepperMediaDeviceManager* handler = |
| 29 PepperMediaDeviceManager::Get(render_view); | 29 PepperMediaDeviceManager::Get(render_view); |
| 30 if (!handler) | 30 if (!handler) |
| 31 handler = new PepperMediaDeviceManager(render_view); | 31 handler = new PepperMediaDeviceManager(render_view); |
| 32 return handler; | 32 return handler; |
| 33 } | 33 } |
| 34 | 34 |
| 35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view) | 35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view) |
| 36 : RenderViewObserver(render_view), | 36 : RenderViewObserver(render_view), |
| 37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view), | 37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view), |
| 38 next_id_(1) { | 38 next_id_(1) {} |
| 39 } | |
| 40 | 39 |
| 41 PepperMediaDeviceManager::~PepperMediaDeviceManager() { | 40 PepperMediaDeviceManager::~PepperMediaDeviceManager() { |
| 42 DCHECK(enumerate_callbacks_.empty()); | 41 DCHECK(enumerate_callbacks_.empty()); |
| 43 DCHECK(open_callbacks_.empty()); | 42 DCHECK(open_callbacks_.empty()); |
| 44 } | 43 } |
| 45 | 44 |
| 46 int PepperMediaDeviceManager::EnumerateDevices( | 45 int PepperMediaDeviceManager::EnumerateDevices( |
| 47 PP_DeviceType_Dev type, | 46 PP_DeviceType_Dev type, |
| 48 const GURL& document_url, | 47 const GURL& document_url, |
| 49 const EnumerateDevicesCallback& callback) { | 48 const EnumerateDevicesCallback& callback) { |
| 50 enumerate_callbacks_[next_id_] = callback; | 49 enumerate_callbacks_[next_id_] = callback; |
| 51 int request_id = next_id_++; | 50 int request_id = next_id_++; |
| 52 | 51 |
| 53 #if defined(ENABLE_WEBRTC) | 52 #if defined(ENABLE_WEBRTC) |
| 54 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices( | 53 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices( |
| 55 request_id, AsWeakPtr(), | 54 request_id, |
| 55 AsWeakPtr(), |
| 56 PepperMediaDeviceManager::FromPepperDeviceType(type), | 56 PepperMediaDeviceManager::FromPepperDeviceType(type), |
| 57 document_url.GetOrigin()); | 57 document_url.GetOrigin()); |
| 58 #else | 58 #else |
| 59 base::MessageLoop::current()->PostTask( | 59 base::MessageLoop::current()->PostTask( |
| 60 FROM_HERE, | 60 FROM_HERE, |
| 61 base::Bind( | 61 base::Bind(&PepperMediaDeviceManager::OnDevicesEnumerated, |
| 62 &PepperMediaDeviceManager::OnDevicesEnumerated, | 62 AsWeakPtr(), |
| 63 AsWeakPtr(), | 63 request_id, |
| 64 request_id, | 64 StreamDeviceInfoArray())); |
| 65 StreamDeviceInfoArray())); | |
| 66 #endif | 65 #endif |
| 67 | 66 |
| 68 return request_id; | 67 return request_id; |
| 69 } | 68 } |
| 70 | 69 |
| 71 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { | 70 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { |
| 72 enumerate_callbacks_.erase(request_id); | 71 enumerate_callbacks_.erase(request_id); |
| 73 | 72 |
| 74 #if defined(ENABLE_WEBRTC) | 73 #if defined(ENABLE_WEBRTC) |
| 75 // Need to post task since this function might be called inside the callback | 74 // Need to post task since this function might be called inside the callback |
| 76 // of EnumerateDevices. | 75 // of EnumerateDevices. |
| 77 base::MessageLoop::current()->PostTask( | 76 base::MessageLoop::current()->PostTask( |
| 78 FROM_HERE, | 77 FROM_HERE, |
| 79 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices, | 78 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices, |
| 80 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(), | 79 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(), |
| 81 request_id, | 80 request_id, |
| 82 AsWeakPtr())); | 81 AsWeakPtr())); |
| 83 #endif | 82 #endif |
| 84 } | 83 } |
| 85 | 84 |
| 86 int PepperMediaDeviceManager::OpenDevice( | 85 int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type, |
| 87 PP_DeviceType_Dev type, | 86 const std::string& device_id, |
| 88 const std::string& device_id, | 87 const GURL& document_url, |
| 89 const GURL& document_url, | 88 const OpenDeviceCallback& callback) { |
| 90 const OpenDeviceCallback& callback) { | |
| 91 open_callbacks_[next_id_] = callback; | 89 open_callbacks_[next_id_] = callback; |
| 92 int request_id = next_id_++; | 90 int request_id = next_id_++; |
| 93 | 91 |
| 94 #if defined(ENABLE_WEBRTC) | 92 #if defined(ENABLE_WEBRTC) |
| 95 GetRenderViewImpl()->media_stream_dispatcher()-> | 93 GetRenderViewImpl()->media_stream_dispatcher()->OpenDevice( |
| 96 OpenDevice( | 94 request_id, |
| 97 request_id, | 95 AsWeakPtr(), |
| 98 AsWeakPtr(), | 96 device_id, |
| 99 device_id, | 97 PepperMediaDeviceManager::FromPepperDeviceType(type), |
| 100 PepperMediaDeviceManager::FromPepperDeviceType(type), | 98 document_url.GetOrigin()); |
| 101 document_url.GetOrigin()); | |
| 102 #else | 99 #else |
| 103 base::MessageLoop::current()->PostTask( | 100 base::MessageLoop::current()->PostTask( |
| 104 FROM_HERE, | 101 FROM_HERE, |
| 105 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, | 102 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, |
| 106 AsWeakPtr(), | 103 AsWeakPtr(), |
| 107 request_id)); | 104 request_id)); |
| 108 #endif | 105 #endif |
| 109 | 106 |
| 110 return request_id; | 107 return request_id; |
| 111 } | 108 } |
| 112 | 109 |
| 113 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { | 110 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { |
| 114 open_callbacks_.erase(request_id); | 111 open_callbacks_.erase(request_id); |
| 115 | 112 |
| 116 #if defined(ENABLE_WEBRTC) | 113 #if defined(ENABLE_WEBRTC) |
| 117 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice( | 114 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice(request_id, |
| 118 request_id, AsWeakPtr()); | 115 AsWeakPtr()); |
| 119 #endif | 116 #endif |
| 120 } | 117 } |
| 121 | 118 |
| 122 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { | 119 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { |
| 123 #if defined(ENABLE_WEBRTC) | 120 #if defined(ENABLE_WEBRTC) |
| 124 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label); | 121 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label); |
| 125 #endif | 122 #endif |
| 126 } | 123 } |
| 127 | 124 |
| 128 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, | 125 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 141 } | 138 } |
| 142 #else | 139 #else |
| 143 return 0; | 140 return 0; |
| 144 #endif | 141 #endif |
| 145 } | 142 } |
| 146 | 143 |
| 147 void PepperMediaDeviceManager::OnStreamGenerated( | 144 void PepperMediaDeviceManager::OnStreamGenerated( |
| 148 int request_id, | 145 int request_id, |
| 149 const std::string& label, | 146 const std::string& label, |
| 150 const StreamDeviceInfoArray& audio_device_array, | 147 const StreamDeviceInfoArray& audio_device_array, |
| 151 const StreamDeviceInfoArray& video_device_array) { | 148 const StreamDeviceInfoArray& video_device_array) {} |
| 152 } | |
| 153 | 149 |
| 154 void PepperMediaDeviceManager::OnStreamGenerationFailed( | 150 void PepperMediaDeviceManager::OnStreamGenerationFailed( |
| 155 int request_id, | 151 int request_id, |
| 156 content::MediaStreamRequestResult result) { | 152 content::MediaStreamRequestResult result) {} |
| 157 } | |
| 158 | 153 |
| 159 void PepperMediaDeviceManager::OnDeviceStopped( | 154 void PepperMediaDeviceManager::OnDeviceStopped( |
| 160 const std::string& label, | 155 const std::string& label, |
| 161 const StreamDeviceInfo& device_info) { | 156 const StreamDeviceInfo& device_info) {} |
| 162 } | |
| 163 | 157 |
| 164 void PepperMediaDeviceManager::OnDevicesEnumerated( | 158 void PepperMediaDeviceManager::OnDevicesEnumerated( |
| 165 int request_id, | 159 int request_id, |
| 166 const StreamDeviceInfoArray& device_array) { | 160 const StreamDeviceInfoArray& device_array) { |
| 167 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id); | 161 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id); |
| 168 if (iter == enumerate_callbacks_.end()) { | 162 if (iter == enumerate_callbacks_.end()) { |
| 169 // This might be enumerated result sent before StopEnumerateDevices is | 163 // This might be enumerated result sent before StopEnumerateDevices is |
| 170 // called since EnumerateDevices is persistent request. | 164 // called since EnumerateDevices is persistent request. |
| 171 return; | 165 return; |
| 172 } | 166 } |
| 173 | 167 |
| 174 EnumerateDevicesCallback callback = iter->second; | 168 EnumerateDevicesCallback callback = iter->second; |
| 175 | 169 |
| 176 std::vector<ppapi::DeviceRefData> devices; | 170 std::vector<ppapi::DeviceRefData> devices; |
| 177 devices.reserve(device_array.size()); | 171 devices.reserve(device_array.size()); |
| 178 for (StreamDeviceInfoArray::const_iterator info = | 172 for (StreamDeviceInfoArray::const_iterator info = device_array.begin(); |
| 179 device_array.begin(); info != device_array.end(); ++info) { | 173 info != device_array.end(); |
| 174 ++info) { |
| 180 devices.push_back(FromStreamDeviceInfo(*info)); | 175 devices.push_back(FromStreamDeviceInfo(*info)); |
| 181 } | 176 } |
| 182 callback.Run(request_id, devices); | 177 callback.Run(request_id, devices); |
| 183 } | 178 } |
| 184 | 179 |
| 185 void PepperMediaDeviceManager::OnDeviceOpened( | 180 void PepperMediaDeviceManager::OnDeviceOpened( |
| 186 int request_id, | 181 int request_id, |
| 187 const std::string& label, | 182 const std::string& label, |
| 188 const StreamDeviceInfo& device_info) { | 183 const StreamDeviceInfo& device_info) { |
| 189 NotifyDeviceOpened(request_id, true, label); | 184 NotifyDeviceOpened(request_id, true, label); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 218 case MEDIA_DEVICE_AUDIO_CAPTURE: | 213 case MEDIA_DEVICE_AUDIO_CAPTURE: |
| 219 return PP_DEVICETYPE_DEV_AUDIOCAPTURE; | 214 return PP_DEVICETYPE_DEV_AUDIOCAPTURE; |
| 220 case MEDIA_DEVICE_VIDEO_CAPTURE: | 215 case MEDIA_DEVICE_VIDEO_CAPTURE: |
| 221 return PP_DEVICETYPE_DEV_VIDEOCAPTURE; | 216 return PP_DEVICETYPE_DEV_VIDEOCAPTURE; |
| 222 default: | 217 default: |
| 223 NOTREACHED(); | 218 NOTREACHED(); |
| 224 return PP_DEVICETYPE_DEV_INVALID; | 219 return PP_DEVICETYPE_DEV_INVALID; |
| 225 } | 220 } |
| 226 } | 221 } |
| 227 | 222 |
| 228 void PepperMediaDeviceManager::NotifyDeviceOpened( | 223 void PepperMediaDeviceManager::NotifyDeviceOpened(int request_id, |
| 229 int request_id, | 224 bool succeeded, |
| 230 bool succeeded, | 225 const std::string& label) { |
| 231 const std::string& label) { | |
| 232 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id); | 226 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id); |
| 233 if (iter == open_callbacks_.end()) { | 227 if (iter == open_callbacks_.end()) { |
| 234 // The callback may have been unregistered. | 228 // The callback may have been unregistered. |
| 235 return; | 229 return; |
| 236 } | 230 } |
| 237 | 231 |
| 238 OpenDeviceCallback callback = iter->second; | 232 OpenDeviceCallback callback = iter->second; |
| 239 open_callbacks_.erase(iter); | 233 open_callbacks_.erase(iter); |
| 240 | 234 |
| 241 callback.Run(request_id, succeeded, label); | 235 callback.Run(request_id, succeeded, label); |
| 242 } | 236 } |
| 243 | 237 |
| 244 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() { | 238 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() { |
| 245 return static_cast<RenderViewImpl*>(render_view()); | 239 return static_cast<RenderViewImpl*>(render_view()); |
| 246 } | 240 } |
| 247 | 241 |
| 248 } // namespace content | 242 } // namespace content |
| OLD | NEW |