Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: content/renderer/media/media_stream_dispatcher.cc

Issue 1918173002: Add support for device-change notifications to MediaStreamDispatcher and MediaStreamDispatcherHost (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and palmer's comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 url::Origin& security_origin) { 79 const url::Origin& 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
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 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
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
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() {
422 DCHECK(thread_checker_.CalledOnValidThread());
423 for (auto event_handler : device_change_subscribers_) {
424 DCHECK(event_handler);
425 event_handler->OnDevicesChanged();
426 }
427 }
428
381 int MediaStreamDispatcher::audio_session_id(const std::string& label, 429 int MediaStreamDispatcher::audio_session_id(const std::string& label,
382 int index) { 430 int index) {
383 DCHECK(thread_checker_.CalledOnValidThread()); 431 DCHECK(thread_checker_.CalledOnValidThread());
384 LabelStreamMap::iterator it = label_stream_map_.find(label); 432 LabelStreamMap::iterator it = label_stream_map_.find(label);
385 if (it == label_stream_map_.end() || 433 if (it == label_stream_map_.end() ||
386 it->second.audio_array.size() <= static_cast<size_t>(index)) { 434 it->second.audio_array.size() <= static_cast<size_t>(index)) {
387 return StreamDeviceInfo::kNoId; 435 return StreamDeviceInfo::kNoId;
388 } 436 }
389 return it->second.audio_array[index].session_id; 437 return it->second.audio_array[index].session_id;
390 } 438 }
391 439
392 bool MediaStreamDispatcher::IsStream(const std::string& label) { 440 bool MediaStreamDispatcher::IsStream(const std::string& label) {
393 DCHECK(thread_checker_.CalledOnValidThread()); 441 DCHECK(thread_checker_.CalledOnValidThread());
394 return label_stream_map_.find(label) != label_stream_map_.end(); 442 return label_stream_map_.find(label) != label_stream_map_.end();
395 } 443 }
396 444
397 int MediaStreamDispatcher::video_session_id(const std::string& label, 445 int MediaStreamDispatcher::video_session_id(const std::string& label,
398 int index) { 446 int index) {
399 DCHECK(thread_checker_.CalledOnValidThread()); 447 DCHECK(thread_checker_.CalledOnValidThread());
400 LabelStreamMap::iterator it = label_stream_map_.find(label); 448 LabelStreamMap::iterator it = label_stream_map_.find(label);
401 if (it == label_stream_map_.end() || 449 if (it == label_stream_map_.end() ||
402 it->second.video_array.size() <= static_cast<size_t>(index)) { 450 it->second.video_array.size() <= static_cast<size_t>(index)) {
403 return StreamDeviceInfo::kNoId; 451 return StreamDeviceInfo::kNoId;
404 } 452 }
405 return it->second.video_array[index].session_id; 453 return it->second.video_array[index].session_id;
406 } 454 }
407 455
408 } // namespace content 456 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_dispatcher.h ('k') | content/renderer/media/media_stream_dispatcher_eventhandler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698