| 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/media/media_stream_dispatcher.h" | 5 #include "content/renderer/media/media_stream_dispatcher.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "content/common/media/media_stream_messages.h" | 10 #include "content/common/media/media_stream_messages.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; | 61 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; |
| 62 StreamDeviceInfoArray audio_array; | 62 StreamDeviceInfoArray audio_array; |
| 63 StreamDeviceInfoArray video_array; | 63 StreamDeviceInfoArray video_array; |
| 64 }; | 64 }; |
| 65 | 65 |
| 66 MediaStreamDispatcher::MediaStreamDispatcher(RenderFrame* render_frame) | 66 MediaStreamDispatcher::MediaStreamDispatcher(RenderFrame* render_frame) |
| 67 : RenderFrameObserver(render_frame), | 67 : RenderFrameObserver(render_frame), |
| 68 next_ipc_id_(0) { | 68 next_ipc_id_(0) { |
| 69 } | 69 } |
| 70 | 70 |
| 71 MediaStreamDispatcher::~MediaStreamDispatcher() { | 71 MediaStreamDispatcher::~MediaStreamDispatcher() {} |
| 72 DCHECK(device_change_subscribers_.empty()); | |
| 73 } | |
| 74 | 72 |
| 75 void MediaStreamDispatcher::GenerateStream( | 73 void MediaStreamDispatcher::GenerateStream( |
| 76 int request_id, | 74 int request_id, |
| 77 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, | 75 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, |
| 78 const StreamControls& controls, | 76 const StreamControls& controls, |
| 79 const url::Origin& security_origin) { | 77 const url::Origin& security_origin) { |
| 80 DCHECK(thread_checker_.CalledOnValidThread()); | 78 DCHECK(thread_checker_.CalledOnValidThread()); |
| 81 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; | 79 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; |
| 82 | 80 |
| 83 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); | 81 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 << ", {label = " << label << "}"; | 202 << ", {label = " << label << "}"; |
| 205 | 203 |
| 206 LabelStreamMap::iterator it = label_stream_map_.find(label); | 204 LabelStreamMap::iterator it = label_stream_map_.find(label); |
| 207 if (it == label_stream_map_.end()) | 205 if (it == label_stream_map_.end()) |
| 208 return; | 206 return; |
| 209 label_stream_map_.erase(it); | 207 label_stream_map_.erase(it); |
| 210 | 208 |
| 211 Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label)); | 209 Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label)); |
| 212 } | 210 } |
| 213 | 211 |
| 214 void MediaStreamDispatcher::SubscribeToDeviceChangeNotifications( | |
| 215 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, | |
| 216 const url::Origin& security_origin) { | |
| 217 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 218 DCHECK(std::find_if( | |
| 219 device_change_subscribers_.begin(), | |
| 220 device_change_subscribers_.end(), | |
| 221 [&event_handler]( | |
| 222 const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) { | |
| 223 return event_handler.get() == item.get(); | |
| 224 }) == device_change_subscribers_.end()); | |
| 225 DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications"; | |
| 226 | |
| 227 if (device_change_subscribers_.empty()) { | |
| 228 Send(new MediaStreamHostMsg_SubscribeToDeviceChangeNotifications( | |
| 229 routing_id(), security_origin)); | |
| 230 } | |
| 231 device_change_subscribers_.push_back(event_handler); | |
| 232 } | |
| 233 | |
| 234 void MediaStreamDispatcher::CancelDeviceChangeNotifications( | |
| 235 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { | |
| 236 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 237 DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications"; | |
| 238 auto it = std::find_if( | |
| 239 device_change_subscribers_.begin(), device_change_subscribers_.end(), | |
| 240 [&event_handler]( | |
| 241 const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) { | |
| 242 return event_handler.get() == item.get(); | |
| 243 }); | |
| 244 CHECK(it != device_change_subscribers_.end()); | |
| 245 device_change_subscribers_.erase(it); | |
| 246 | |
| 247 if (device_change_subscribers_.empty()) | |
| 248 Send(new MediaStreamHostMsg_CancelDeviceChangeNotifications(routing_id())); | |
| 249 } | |
| 250 | |
| 251 void MediaStreamDispatcher::OnDestruct() { | 212 void MediaStreamDispatcher::OnDestruct() { |
| 252 // Do not self-destruct. UserMediaClientImpl owns |this|. | 213 // Do not self-destruct. UserMediaClientImpl owns |this|. |
| 253 } | 214 } |
| 254 | 215 |
| 255 bool MediaStreamDispatcher::Send(IPC::Message* message) { | 216 bool MediaStreamDispatcher::Send(IPC::Message* message) { |
| 256 if (!RenderThread::Get()) { | 217 if (!RenderThread::Get()) { |
| 257 delete message; | 218 delete message; |
| 258 return false; | 219 return false; |
| 259 } | 220 } |
| 260 | 221 |
| 261 return RenderThread::Get()->Send(message); | 222 return RenderThread::Get()->Send(message); |
| 262 } | 223 } |
| 263 | 224 |
| 264 bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { | 225 bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { |
| 265 bool handled = true; | 226 bool handled = true; |
| 266 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcher, message) | 227 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcher, message) |
| 267 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated, | 228 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated, |
| 268 OnStreamGenerated) | 229 OnStreamGenerated) |
| 269 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerationFailed, | 230 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerationFailed, |
| 270 OnStreamGenerationFailed) | 231 OnStreamGenerationFailed) |
| 271 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceStopped, | 232 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceStopped, |
| 272 OnDeviceStopped) | 233 OnDeviceStopped) |
| 273 IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesEnumerated, | 234 IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesEnumerated, |
| 274 OnDevicesEnumerated) | 235 OnDevicesEnumerated) |
| 275 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpened, | 236 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpened, |
| 276 OnDeviceOpened) | 237 OnDeviceOpened) |
| 277 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpenFailed, | 238 IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpenFailed, |
| 278 OnDeviceOpenFailed) | 239 OnDeviceOpenFailed) |
| 279 IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesChanged, OnDevicesChanged) | |
| 280 IPC_MESSAGE_UNHANDLED(handled = false) | 240 IPC_MESSAGE_UNHANDLED(handled = false) |
| 281 IPC_END_MESSAGE_MAP() | 241 IPC_END_MESSAGE_MAP() |
| 282 return handled; | 242 return handled; |
| 283 } | 243 } |
| 284 | 244 |
| 285 void MediaStreamDispatcher::OnStreamGenerated( | 245 void MediaStreamDispatcher::OnStreamGenerated( |
| 286 int request_id, | 246 int request_id, |
| 287 const std::string& label, | 247 const std::string& label, |
| 288 const StreamDeviceInfoArray& audio_array, | 248 const StreamDeviceInfoArray& audio_array, |
| 289 const StreamDeviceInfoArray& video_array) { | 249 const StreamDeviceInfoArray& video_array) { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 request.handler->OnDeviceOpenFailed(request.request_id); | 371 request.handler->OnDeviceOpenFailed(request.request_id); |
| 412 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpenFailed(" | 372 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpenFailed(" |
| 413 << request.request_id << ")\n"; | 373 << request.request_id << ")\n"; |
| 414 } | 374 } |
| 415 requests_.erase(it); | 375 requests_.erase(it); |
| 416 break; | 376 break; |
| 417 } | 377 } |
| 418 } | 378 } |
| 419 } | 379 } |
| 420 | 380 |
| 421 void MediaStreamDispatcher::OnDevicesChanged() { | |
| 422 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 423 for (auto event_handler : device_change_subscribers_) { | |
| 424 DCHECK(event_handler); | |
| 425 event_handler->OnDevicesChanged(); | |
| 426 } | |
| 427 } | |
| 428 | |
| 429 int MediaStreamDispatcher::audio_session_id(const std::string& label, | 381 int MediaStreamDispatcher::audio_session_id(const std::string& label, |
| 430 int index) { | 382 int index) { |
| 431 DCHECK(thread_checker_.CalledOnValidThread()); | 383 DCHECK(thread_checker_.CalledOnValidThread()); |
| 432 LabelStreamMap::iterator it = label_stream_map_.find(label); | 384 LabelStreamMap::iterator it = label_stream_map_.find(label); |
| 433 if (it == label_stream_map_.end() || | 385 if (it == label_stream_map_.end() || |
| 434 it->second.audio_array.size() <= static_cast<size_t>(index)) { | 386 it->second.audio_array.size() <= static_cast<size_t>(index)) { |
| 435 return StreamDeviceInfo::kNoId; | 387 return StreamDeviceInfo::kNoId; |
| 436 } | 388 } |
| 437 return it->second.audio_array[index].session_id; | 389 return it->second.audio_array[index].session_id; |
| 438 } | 390 } |
| 439 | 391 |
| 440 bool MediaStreamDispatcher::IsStream(const std::string& label) { | 392 bool MediaStreamDispatcher::IsStream(const std::string& label) { |
| 441 DCHECK(thread_checker_.CalledOnValidThread()); | 393 DCHECK(thread_checker_.CalledOnValidThread()); |
| 442 return label_stream_map_.find(label) != label_stream_map_.end(); | 394 return label_stream_map_.find(label) != label_stream_map_.end(); |
| 443 } | 395 } |
| 444 | 396 |
| 445 int MediaStreamDispatcher::video_session_id(const std::string& label, | 397 int MediaStreamDispatcher::video_session_id(const std::string& label, |
| 446 int index) { | 398 int index) { |
| 447 DCHECK(thread_checker_.CalledOnValidThread()); | 399 DCHECK(thread_checker_.CalledOnValidThread()); |
| 448 LabelStreamMap::iterator it = label_stream_map_.find(label); | 400 LabelStreamMap::iterator it = label_stream_map_.find(label); |
| 449 if (it == label_stream_map_.end() || | 401 if (it == label_stream_map_.end() || |
| 450 it->second.video_array.size() <= static_cast<size_t>(index)) { | 402 it->second.video_array.size() <= static_cast<size_t>(index)) { |
| 451 return StreamDeviceInfo::kNoId; | 403 return StreamDeviceInfo::kNoId; |
| 452 } | 404 } |
| 453 return it->second.video_array[index].session_id; | 405 return it->second.video_array[index].session_id; |
| 454 } | 406 } |
| 455 | 407 |
| 456 } // namespace content | 408 } // namespace content |
| OLD | NEW |