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