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/browser/renderer_host/media/media_stream_manager.h" | 5 #include "content/browser/renderer_host/media/media_stream_manager.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
176 // MediaStreamManager::DeviceRequest represents a request to either enumerate | 176 // MediaStreamManager::DeviceRequest represents a request to either enumerate |
177 // available devices or open one or more devices. | 177 // available devices or open one or more devices. |
178 // TODO(perkj): MediaStreamManager still needs refactoring. I propose we create | 178 // TODO(perkj): MediaStreamManager still needs refactoring. I propose we create |
179 // several subclasses of DeviceRequest and move some of the responsibility of | 179 // several subclasses of DeviceRequest and move some of the responsibility of |
180 // the MediaStreamManager to the subclasses to get rid of the way too many if | 180 // the MediaStreamManager to the subclasses to get rid of the way too many if |
181 // statements in MediaStreamManager. | 181 // statements in MediaStreamManager. |
182 class MediaStreamManager::DeviceRequest { | 182 class MediaStreamManager::DeviceRequest { |
183 public: | 183 public: |
184 DeviceRequest(MediaStreamRequester* requester, | 184 DeviceRequest(MediaStreamRequester* requester, |
185 int requesting_process_id, | 185 int requesting_process_id, |
186 int requesting_view_id, | 186 int requesting_frame_id, |
187 int page_request_id, | 187 int page_request_id, |
188 const GURL& security_origin, | 188 const GURL& security_origin, |
189 bool have_permission, | 189 bool have_permission, |
190 bool user_gesture, | 190 bool user_gesture, |
191 MediaStreamRequestType request_type, | 191 MediaStreamRequestType request_type, |
192 const StreamOptions& options, | 192 const StreamOptions& options, |
193 const ResourceContext::SaltCallback& salt_callback) | 193 const ResourceContext::SaltCallback& salt_callback) |
194 : requester(requester), | 194 : requester(requester), |
195 requesting_process_id(requesting_process_id), | 195 requesting_process_id(requesting_process_id), |
196 requesting_view_id(requesting_view_id), | 196 requesting_frame_id(requesting_frame_id), |
197 page_request_id(page_request_id), | 197 page_request_id(page_request_id), |
198 security_origin(security_origin), | 198 security_origin(security_origin), |
199 have_permission(have_permission), | 199 have_permission(have_permission), |
200 user_gesture(user_gesture), | 200 user_gesture(user_gesture), |
201 request_type(request_type), | 201 request_type(request_type), |
202 options(options), | 202 options(options), |
203 salt_callback(salt_callback), | 203 salt_callback(salt_callback), |
204 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), | 204 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), |
205 audio_type_(MEDIA_NO_SERVICE), | 205 audio_type_(MEDIA_NO_SERVICE), |
206 video_type_(MEDIA_NO_SERVICE) { | 206 video_type_(MEDIA_NO_SERVICE) { |
(...skipping 16 matching lines...) Expand all Loading... | |
223 } | 223 } |
224 | 224 |
225 MediaStreamType video_type() const { return video_type_; } | 225 MediaStreamType video_type() const { return video_type_; } |
226 | 226 |
227 // Creates a MediaStreamRequest object that is used by this request when UI | 227 // Creates a MediaStreamRequest object that is used by this request when UI |
228 // is asked for permission and device selection. | 228 // is asked for permission and device selection. |
229 void CreateUIRequest(const std::string& requested_audio_device_id, | 229 void CreateUIRequest(const std::string& requested_audio_device_id, |
230 const std::string& requested_video_device_id) { | 230 const std::string& requested_video_device_id) { |
231 DCHECK(!ui_request_); | 231 DCHECK(!ui_request_); |
232 ui_request_.reset(new MediaStreamRequest(requesting_process_id, | 232 ui_request_.reset(new MediaStreamRequest(requesting_process_id, |
233 requesting_view_id, | 233 requesting_frame_id, |
234 page_request_id, | 234 page_request_id, |
235 security_origin, | 235 security_origin, |
236 user_gesture, | 236 user_gesture, |
237 request_type, | 237 request_type, |
238 requested_audio_device_id, | 238 requested_audio_device_id, |
239 requested_video_device_id, | 239 requested_video_device_id, |
240 audio_type_, | 240 audio_type_, |
241 video_type_)); | 241 video_type_)); |
242 } | 242 } |
243 | 243 |
244 // Creates a tab capture specific MediaStreamRequest object that is used by | 244 // Creates a tab capture specific MediaStreamRequest object that is used by |
245 // this request when UI is asked for permission and device selection. | 245 // this request when UI is asked for permission and device selection. |
246 void CreateTabCatureUIRequest(int target_render_process_id, | 246 void CreateTabCaptureUIRequest(int target_render_process_id, |
247 int target_render_view_id, | 247 int target_render_frame_id, |
248 const std::string& tab_capture_id) { | 248 const std::string& tab_capture_id) { |
249 DCHECK(!ui_request_); | 249 DCHECK(!ui_request_); |
250 ui_request_.reset(new MediaStreamRequest(target_render_process_id, | 250 ui_request_.reset(new MediaStreamRequest(target_render_process_id, |
251 target_render_view_id, | 251 target_render_frame_id, |
252 page_request_id, | 252 page_request_id, |
253 security_origin, | 253 security_origin, |
254 user_gesture, | 254 user_gesture, |
255 request_type, | 255 request_type, |
256 "", | 256 "", |
257 "", | 257 "", |
258 audio_type_, | 258 audio_type_, |
259 video_type_)); | 259 video_type_)); |
260 ui_request_->tab_capture_device_id = tab_capture_id; | 260 ui_request_->tab_capture_device_id = tab_capture_id; |
261 } | 261 } |
(...skipping 14 matching lines...) Expand all Loading... | |
276 MediaObserver* media_observer = | 276 MediaObserver* media_observer = |
277 GetContentClient()->browser()->GetMediaObserver(); | 277 GetContentClient()->browser()->GetMediaObserver(); |
278 if (!media_observer) | 278 if (!media_observer) |
279 return; | 279 return; |
280 | 280 |
281 // If |ui_request_| doesn't exist, it means that the request has not yet | 281 // If |ui_request_| doesn't exist, it means that the request has not yet |
282 // been setup fully and there are no valid observers. | 282 // been setup fully and there are no valid observers. |
283 if (!ui_request_) | 283 if (!ui_request_) |
284 return; | 284 return; |
285 | 285 |
286 // If we appended a device_id scheme, we want to remove it when notifying | |
287 // observers which may be in different modules since this scheme is only | |
288 // used internally within the content module. | |
289 std::string device_id = | |
290 WebContentsCaptureUtil::StripWebContentsDeviceScheme( | |
tommi (sloooow) - chröme
2014/07/09 07:46:55
I'm not familiar with what this does/did. Are the
miu
2014/07/09 19:48:07
A couple years ago, MediaStreamImpl/Dispatcher/Man
ncarter (slow)
2014/07/10 01:17:51
FWIW, jam@ and I were chatting about this a few we
tommi (sloooow) - chröme
2014/07/10 13:12:55
Great. The fewer mysteries the better.
| |
291 ui_request_->tab_capture_device_id); | |
292 | |
293 media_observer->OnMediaRequestStateChanged( | 286 media_observer->OnMediaRequestStateChanged( |
294 ui_request_->render_process_id, ui_request_->render_view_id, | 287 ui_request_->render_process_id, ui_request_->render_frame_id, |
295 ui_request_->page_request_id, ui_request_->security_origin, | 288 ui_request_->page_request_id, ui_request_->security_origin, |
296 MediaStreamDevice(stream_type, device_id, device_id), new_state); | 289 stream_type, new_state); |
297 } | 290 } |
298 | 291 |
299 MediaRequestState state(MediaStreamType stream_type) const { | 292 MediaRequestState state(MediaStreamType stream_type) const { |
300 return state_[stream_type]; | 293 return state_[stream_type]; |
301 } | 294 } |
302 | 295 |
303 MediaStreamRequester* const requester; // Can be NULL. | 296 MediaStreamRequester* const requester; // Can be NULL. |
304 | 297 |
305 | 298 |
306 // The render process id that requested this stream to be generated and that | 299 // The render process id that requested this stream to be generated and that |
307 // will receive a handle to the MediaStream. This may be different from | 300 // will receive a handle to the MediaStream. This may be different from |
308 // MediaStreamRequest::render_process_id which in the tab capture case | 301 // MediaStreamRequest::render_process_id which in the tab capture case |
309 // specifies the target renderer from which audio and video is captured. | 302 // specifies the target renderer from which audio and video is captured. |
310 const int requesting_process_id; | 303 const int requesting_process_id; |
311 | 304 |
312 // The render view id that requested this stream to be generated and that | 305 // The render frame id that requested this stream to be generated and that |
313 // will receive a handle to the MediaStream. This may be different from | 306 // will receive a handle to the MediaStream. This may be different from |
314 // MediaStreamRequest::render_view_id which in the tab capture case | 307 // MediaStreamRequest::render_frame_id which in the tab capture case |
315 // specifies the target renderer from which audio and video is captured. | 308 // specifies the target renderer from which audio and video is captured. |
316 const int requesting_view_id; | 309 const int requesting_frame_id; |
317 | 310 |
318 // An ID the render view provided to identify this request. | 311 // An ID the render frame provided to identify this request. |
319 const int page_request_id; | 312 const int page_request_id; |
320 | 313 |
321 const GURL security_origin; | 314 const GURL security_origin; |
322 | 315 |
323 // This is used when enumerating devices; if we don't have device access | 316 // This is used when enumerating devices; if we don't have device access |
324 // permission, we remove the device label. | 317 // permission, we remove the device label. |
325 bool have_permission; | 318 bool have_permission; |
326 | 319 |
327 const bool user_gesture; | 320 const bool user_gesture; |
328 | 321 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
407 } | 400 } |
408 | 401 |
409 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { | 402 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { |
410 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 403 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
411 DCHECK(audio_input_device_manager_.get()); | 404 DCHECK(audio_input_device_manager_.get()); |
412 return audio_input_device_manager_.get(); | 405 return audio_input_device_manager_.get(); |
413 } | 406 } |
414 | 407 |
415 std::string MediaStreamManager::MakeMediaAccessRequest( | 408 std::string MediaStreamManager::MakeMediaAccessRequest( |
416 int render_process_id, | 409 int render_process_id, |
417 int render_view_id, | 410 int render_frame_id, |
418 int page_request_id, | 411 int page_request_id, |
419 const StreamOptions& options, | 412 const StreamOptions& options, |
420 const GURL& security_origin, | 413 const GURL& security_origin, |
421 const MediaRequestResponseCallback& callback) { | 414 const MediaRequestResponseCallback& callback) { |
422 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 415 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
423 | 416 |
424 // TODO(perkj): The argument list with NULL parameters to DeviceRequest | 417 // TODO(perkj): The argument list with NULL parameters to DeviceRequest |
425 // suggests that this is the wrong design. Can this be refactored? | 418 // suggests that this is the wrong design. Can this be refactored? |
426 DeviceRequest* request = new DeviceRequest(NULL, | 419 DeviceRequest* request = new DeviceRequest(NULL, |
427 render_process_id, | 420 render_process_id, |
428 render_view_id, | 421 render_frame_id, |
429 page_request_id, | 422 page_request_id, |
430 security_origin, | 423 security_origin, |
431 true, | 424 true, |
432 false, // user gesture | 425 false, // user gesture |
433 MEDIA_DEVICE_ACCESS, | 426 MEDIA_DEVICE_ACCESS, |
434 options, | 427 options, |
435 base::Bind(&ReturnEmptySalt)); | 428 base::Bind(&ReturnEmptySalt)); |
436 | 429 |
437 const std::string& label = AddRequest(request); | 430 const std::string& label = AddRequest(request); |
438 | 431 |
439 request->callback = callback; | 432 request->callback = callback; |
440 // Post a task and handle the request asynchronously. The reason is that the | 433 // Post a task and handle the request asynchronously. The reason is that the |
441 // requester won't have a label for the request until this function returns | 434 // requester won't have a label for the request until this function returns |
442 // and thus can not handle a response. Using base::Unretained is safe since | 435 // and thus can not handle a response. Using base::Unretained is safe since |
443 // MediaStreamManager is deleted on the UI thread, after the IO thread has | 436 // MediaStreamManager is deleted on the UI thread, after the IO thread has |
444 // been stopped. | 437 // been stopped. |
445 BrowserThread::PostTask( | 438 BrowserThread::PostTask( |
446 BrowserThread::IO, FROM_HERE, | 439 BrowserThread::IO, FROM_HERE, |
447 base::Bind(&MediaStreamManager::SetupRequest, | 440 base::Bind(&MediaStreamManager::SetupRequest, |
448 base::Unretained(this), label)); | 441 base::Unretained(this), label)); |
449 return label; | 442 return label; |
450 } | 443 } |
451 | 444 |
452 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, | 445 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
453 int render_process_id, | 446 int render_process_id, |
454 int render_view_id, | 447 int render_frame_id, |
455 const ResourceContext::SaltCallback& sc, | 448 const ResourceContext::SaltCallback& sc, |
456 int page_request_id, | 449 int page_request_id, |
457 const StreamOptions& options, | 450 const StreamOptions& options, |
458 const GURL& security_origin, | 451 const GURL& security_origin, |
459 bool user_gesture) { | 452 bool user_gesture) { |
460 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 453 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
461 DVLOG(1) << "GenerateStream()"; | 454 DVLOG(1) << "GenerateStream()"; |
462 if (CommandLine::ForCurrentProcess()->HasSwitch( | 455 if (CommandLine::ForCurrentProcess()->HasSwitch( |
463 switches::kUseFakeUIForMediaStream)) { | 456 switches::kUseFakeUIForMediaStream)) { |
464 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); | 457 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); |
465 } | 458 } |
466 | 459 |
467 DeviceRequest* request = new DeviceRequest(requester, | 460 DeviceRequest* request = new DeviceRequest(requester, |
468 render_process_id, | 461 render_process_id, |
469 render_view_id, | 462 render_frame_id, |
470 page_request_id, | 463 page_request_id, |
471 security_origin, | 464 security_origin, |
472 true, | 465 true, |
473 user_gesture, | 466 user_gesture, |
474 MEDIA_GENERATE_STREAM, | 467 MEDIA_GENERATE_STREAM, |
475 options, | 468 options, |
476 sc); | 469 sc); |
477 | 470 |
478 const std::string& label = AddRequest(request); | 471 const std::string& label = AddRequest(request); |
479 | 472 |
480 // Post a task and handle the request asynchronously. The reason is that the | 473 // Post a task and handle the request asynchronously. The reason is that the |
481 // requester won't have a label for the request until this function returns | 474 // requester won't have a label for the request until this function returns |
482 // and thus can not handle a response. Using base::Unretained is safe since | 475 // and thus can not handle a response. Using base::Unretained is safe since |
483 // MediaStreamManager is deleted on the UI thread, after the IO thread has | 476 // MediaStreamManager is deleted on the UI thread, after the IO thread has |
484 // been stopped. | 477 // been stopped. |
485 BrowserThread::PostTask( | 478 BrowserThread::PostTask( |
486 BrowserThread::IO, FROM_HERE, | 479 BrowserThread::IO, FROM_HERE, |
487 base::Bind(&MediaStreamManager::SetupRequest, | 480 base::Bind(&MediaStreamManager::SetupRequest, |
488 base::Unretained(this), label)); | 481 base::Unretained(this), label)); |
489 } | 482 } |
490 | 483 |
491 void MediaStreamManager::CancelRequest(int render_process_id, | 484 void MediaStreamManager::CancelRequest(int render_process_id, |
492 int render_view_id, | 485 int render_frame_id, |
493 int page_request_id) { | 486 int page_request_id) { |
494 for (DeviceRequests::const_iterator request_it = requests_.begin(); | 487 for (DeviceRequests::const_iterator request_it = requests_.begin(); |
495 request_it != requests_.end(); ++request_it) { | 488 request_it != requests_.end(); ++request_it) { |
496 const DeviceRequest* request = request_it->second; | 489 const DeviceRequest* request = request_it->second; |
497 if (request->requesting_process_id == render_process_id && | 490 if (request->requesting_process_id == render_process_id && |
498 request->requesting_view_id == render_view_id && | 491 request->requesting_frame_id == render_frame_id && |
499 request->page_request_id == page_request_id) { | 492 request->page_request_id == page_request_id) { |
500 CancelRequest(request_it->first); | 493 CancelRequest(request_it->first); |
501 return; | 494 return; |
502 } | 495 } |
503 } | 496 } |
504 NOTREACHED(); | 497 NOTREACHED(); |
505 } | 498 } |
506 | 499 |
507 void MediaStreamManager::CancelRequest(const std::string& label) { | 500 void MediaStreamManager::CancelRequest(const std::string& label) { |
508 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 501 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
550 continue; | 543 continue; |
551 } | 544 } |
552 | 545 |
553 std::string label = request_it->first; | 546 std::string label = request_it->first; |
554 ++request_it; | 547 ++request_it; |
555 CancelRequest(label); | 548 CancelRequest(label); |
556 } | 549 } |
557 } | 550 } |
558 | 551 |
559 void MediaStreamManager::StopStreamDevice(int render_process_id, | 552 void MediaStreamManager::StopStreamDevice(int render_process_id, |
560 int render_view_id, | 553 int render_frame_id, |
561 const std::string& device_id) { | 554 const std::string& device_id) { |
562 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 555 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
563 DVLOG(1) << "StopStreamDevice({render_view_id = " << render_view_id << "} " | 556 DVLOG(1) << "StopStreamDevice({render_frame_id = " << render_frame_id << "} " |
564 << ", {device_id = " << device_id << "})"; | 557 << ", {device_id = " << device_id << "})"; |
565 // Find the first request for this |render_process_id| and |render_view_id| | 558 // Find the first request for this |render_process_id| and |render_frame_id| |
566 // of type MEDIA_GENERATE_STREAM that has requested to use |device_id| and | 559 // of type MEDIA_GENERATE_STREAM that has requested to use |device_id| and |
567 // stop it. | 560 // stop it. |
568 for (DeviceRequests::iterator request_it = requests_.begin(); | 561 for (DeviceRequests::iterator request_it = requests_.begin(); |
569 request_it != requests_.end(); ++request_it) { | 562 request_it != requests_.end(); ++request_it) { |
570 DeviceRequest* request = request_it->second; | 563 DeviceRequest* request = request_it->second; |
571 if (request->requesting_process_id != render_process_id || | 564 if (request->requesting_process_id != render_process_id || |
572 request->requesting_view_id != render_view_id || | 565 request->requesting_frame_id != render_frame_id || |
573 request->request_type != MEDIA_GENERATE_STREAM) { | 566 request->request_type != MEDIA_GENERATE_STREAM) { |
574 continue; | 567 continue; |
575 } | 568 } |
576 | 569 |
577 StreamDeviceInfoArray& devices = request->devices; | 570 StreamDeviceInfoArray& devices = request->devices; |
578 for (StreamDeviceInfoArray::iterator device_it = devices.begin(); | 571 for (StreamDeviceInfoArray::iterator device_it = devices.begin(); |
579 device_it != devices.end(); ++device_it) { | 572 device_it != devices.end(); ++device_it) { |
580 if (device_it->device.id == device_id) { | 573 if (device_it->device.id == device_id) { |
581 StopDevice(device_it->device.type, device_it->session_id); | 574 StopDevice(device_it->device.type, device_it->session_id); |
582 return; | 575 return; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
641 // Note that only one device per type can be opened. | 634 // Note that only one device per type can be opened. |
642 request_it->second->SetState(type, MEDIA_REQUEST_STATE_CLOSING); | 635 request_it->second->SetState(type, MEDIA_REQUEST_STATE_CLOSING); |
643 } | 636 } |
644 } | 637 } |
645 } | 638 } |
646 } | 639 } |
647 | 640 |
648 std::string MediaStreamManager::EnumerateDevices( | 641 std::string MediaStreamManager::EnumerateDevices( |
649 MediaStreamRequester* requester, | 642 MediaStreamRequester* requester, |
650 int render_process_id, | 643 int render_process_id, |
651 int render_view_id, | 644 int render_frame_id, |
652 const ResourceContext::SaltCallback& sc, | 645 const ResourceContext::SaltCallback& sc, |
653 int page_request_id, | 646 int page_request_id, |
654 MediaStreamType type, | 647 MediaStreamType type, |
655 const GURL& security_origin, | 648 const GURL& security_origin, |
656 bool have_permission) { | 649 bool have_permission) { |
657 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 650 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
658 DCHECK(requester); | 651 DCHECK(requester); |
659 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || | 652 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || |
660 type == MEDIA_DEVICE_VIDEO_CAPTURE || | 653 type == MEDIA_DEVICE_VIDEO_CAPTURE || |
661 type == MEDIA_DEVICE_AUDIO_OUTPUT); | 654 type == MEDIA_DEVICE_AUDIO_OUTPUT); |
662 | 655 |
663 DeviceRequest* request = new DeviceRequest(requester, | 656 DeviceRequest* request = new DeviceRequest(requester, |
664 render_process_id, | 657 render_process_id, |
665 render_view_id, | 658 render_frame_id, |
666 page_request_id, | 659 page_request_id, |
667 security_origin, | 660 security_origin, |
668 have_permission, | 661 have_permission, |
669 false, // user gesture | 662 false, // user gesture |
670 MEDIA_ENUMERATE_DEVICES, | 663 MEDIA_ENUMERATE_DEVICES, |
671 StreamOptions(), | 664 StreamOptions(), |
672 sc); | 665 sc); |
673 if (IsAudioInputMediaType(type) || type == MEDIA_DEVICE_AUDIO_OUTPUT) | 666 if (IsAudioInputMediaType(type) || type == MEDIA_DEVICE_AUDIO_OUTPUT) |
674 request->SetAudioType(type); | 667 request->SetAudioType(type); |
675 else if (IsVideoMediaType(type)) | 668 else if (IsVideoMediaType(type)) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
726 // Cached device list of this type exists. Just send it out. | 719 // Cached device list of this type exists. Just send it out. |
727 request->SetState(type, MEDIA_REQUEST_STATE_REQUESTED); | 720 request->SetState(type, MEDIA_REQUEST_STATE_REQUESTED); |
728 request->devices = cache->devices; | 721 request->devices = cache->devices; |
729 FinalizeEnumerateDevices(label, request); | 722 FinalizeEnumerateDevices(label, request); |
730 } else { | 723 } else { |
731 StartEnumeration(request); | 724 StartEnumeration(request); |
732 } | 725 } |
733 DVLOG(1) << "Enumerate Devices ({label = " << label << "})"; | 726 DVLOG(1) << "Enumerate Devices ({label = " << label << "})"; |
734 } | 727 } |
735 | 728 |
736 void MediaStreamManager::EnumerateAudioOutputDevices( | 729 void MediaStreamManager::EnumerateAudioOutputDevices(const std::string& label) { |
737 const std::string& label) { | |
738 DCHECK(device_task_runner_->BelongsToCurrentThread()); | 730 DCHECK(device_task_runner_->BelongsToCurrentThread()); |
739 | 731 |
740 scoped_ptr<media::AudioDeviceNames> device_names( | 732 scoped_ptr<media::AudioDeviceNames> device_names( |
741 new media::AudioDeviceNames()); | 733 new media::AudioDeviceNames()); |
742 audio_manager_->GetAudioOutputDeviceNames(device_names.get()); | 734 audio_manager_->GetAudioOutputDeviceNames(device_names.get()); |
743 StreamDeviceInfoArray devices; | 735 StreamDeviceInfoArray devices; |
744 for (media::AudioDeviceNames::iterator it = device_names->begin(); | 736 for (media::AudioDeviceNames::iterator it = device_names->begin(); |
745 it != device_names->end(); ++it) { | 737 it != device_names->end(); ++it) { |
746 StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_OUTPUT, | 738 StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_OUTPUT, |
747 it->device_name, | 739 it->device_name, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
779 FinalizeEnumerateDevices(it->first, it->second); | 771 FinalizeEnumerateDevices(it->first, it->second); |
780 } | 772 } |
781 } | 773 } |
782 | 774 |
783 --active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT]; | 775 --active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT]; |
784 DCHECK_GE(active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT], 0); | 776 DCHECK_GE(active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT], 0); |
785 } | 777 } |
786 | 778 |
787 void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, | 779 void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, |
788 int render_process_id, | 780 int render_process_id, |
789 int render_view_id, | 781 int render_frame_id, |
790 const ResourceContext::SaltCallback& sc, | 782 const ResourceContext::SaltCallback& sc, |
791 int page_request_id, | 783 int page_request_id, |
792 const std::string& device_id, | 784 const std::string& device_id, |
793 MediaStreamType type, | 785 MediaStreamType type, |
794 const GURL& security_origin) { | 786 const GURL& security_origin) { |
795 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 787 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
796 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || | 788 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || |
797 type == MEDIA_DEVICE_VIDEO_CAPTURE); | 789 type == MEDIA_DEVICE_VIDEO_CAPTURE); |
798 DVLOG(1) << "OpenDevice ({page_request_id = " << page_request_id << "})"; | 790 DVLOG(1) << "OpenDevice ({page_request_id = " << page_request_id << "})"; |
799 StreamOptions options; | 791 StreamOptions options; |
800 if (IsAudioInputMediaType(type)) { | 792 if (IsAudioInputMediaType(type)) { |
801 options.audio_requested = true; | 793 options.audio_requested = true; |
802 options.mandatory_audio.push_back( | 794 options.mandatory_audio.push_back( |
803 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); | 795 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); |
804 } else if (IsVideoMediaType(type)) { | 796 } else if (IsVideoMediaType(type)) { |
805 options.video_requested = true; | 797 options.video_requested = true; |
806 options.mandatory_video.push_back( | 798 options.mandatory_video.push_back( |
807 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); | 799 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); |
808 } else { | 800 } else { |
809 NOTREACHED(); | 801 NOTREACHED(); |
810 } | 802 } |
811 DeviceRequest* request = new DeviceRequest(requester, | 803 DeviceRequest* request = new DeviceRequest(requester, |
812 render_process_id, | 804 render_process_id, |
813 render_view_id, | 805 render_frame_id, |
814 page_request_id, | 806 page_request_id, |
815 security_origin, | 807 security_origin, |
816 true, | 808 true, |
817 false, // user gesture | 809 false, // user gesture |
818 MEDIA_OPEN_DEVICE, | 810 MEDIA_OPEN_DEVICE, |
819 options, | 811 options, |
820 sc); | 812 sc); |
821 | 813 |
822 const std::string& label = AddRequest(request); | 814 const std::string& label = AddRequest(request); |
823 // Post a task and handle the request asynchronously. The reason is that the | 815 // Post a task and handle the request asynchronously. The reason is that the |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
903 device_it != request->devices.end(); ++device_it) { | 895 device_it != request->devices.end(); ++device_it) { |
904 std::string source_id = content::GetHMACForMediaDeviceID( | 896 std::string source_id = content::GetHMACForMediaDeviceID( |
905 request->salt_callback, | 897 request->salt_callback, |
906 request->security_origin, | 898 request->security_origin, |
907 device.id); | 899 device.id); |
908 if (device_it->device.id == source_id && | 900 if (device_it->device.id == source_id && |
909 device_it->device.type == device.type) { | 901 device_it->device.type == device.type) { |
910 session_ids.push_back(device_it->session_id); | 902 session_ids.push_back(device_it->session_id); |
911 if (it->second->requester) { | 903 if (it->second->requester) { |
912 it->second->requester->DeviceStopped( | 904 it->second->requester->DeviceStopped( |
913 it->second->requesting_view_id, | 905 it->second->requesting_frame_id, |
914 it->first, | 906 it->first, |
915 *device_it); | 907 *device_it); |
916 } | 908 } |
917 } | 909 } |
918 } | 910 } |
919 } | 911 } |
920 for (std::vector<int>::const_iterator it = session_ids.begin(); | 912 for (std::vector<int>::const_iterator it = session_ids.begin(); |
921 it != session_ids.end(); ++it) { | 913 it != session_ids.end(); ++it) { |
922 StopDevice(device.type, *it); | 914 StopDevice(device.type, *it); |
923 } | 915 } |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1288 &mandatory_audio) && | 1280 &mandatory_audio) && |
1289 !request->options.GetFirstVideoConstraintByName(kMediaStreamSourceId, | 1281 !request->options.GetFirstVideoConstraintByName(kMediaStreamSourceId, |
1290 &capture_device_id, | 1282 &capture_device_id, |
1291 &mandatory_video)) { | 1283 &mandatory_video)) { |
1292 return false; | 1284 return false; |
1293 } | 1285 } |
1294 DCHECK(mandatory_audio || mandatory_video); | 1286 DCHECK(mandatory_audio || mandatory_video); |
1295 | 1287 |
1296 // Customize options for a WebContents based capture. | 1288 // Customize options for a WebContents based capture. |
1297 int target_render_process_id = 0; | 1289 int target_render_process_id = 0; |
1298 int target_render_view_id = 0; | 1290 int target_render_frame_id = 0; |
1299 | |
1300 // TODO(justinlin): Can't plumb audio mirroring using stream type right | |
1301 // now, so plumbing by device_id. Will revisit once it's refactored. | |
1302 // http://crbug.com/163100 | |
1303 std::string tab_capture_device_id = | |
1304 WebContentsCaptureUtil::AppendWebContentsDeviceScheme(capture_device_id); | |
1305 | 1291 |
1306 bool has_valid_device_id = WebContentsCaptureUtil::ExtractTabCaptureTarget( | 1292 bool has_valid_device_id = WebContentsCaptureUtil::ExtractTabCaptureTarget( |
1307 tab_capture_device_id, &target_render_process_id, | 1293 capture_device_id, &target_render_process_id, &target_render_frame_id); |
1308 &target_render_view_id); | |
1309 if (!has_valid_device_id || | 1294 if (!has_valid_device_id || |
1310 (request->audio_type() != MEDIA_TAB_AUDIO_CAPTURE && | 1295 (request->audio_type() != MEDIA_TAB_AUDIO_CAPTURE && |
1311 request->audio_type() != MEDIA_NO_SERVICE) || | 1296 request->audio_type() != MEDIA_NO_SERVICE) || |
1312 (request->video_type() != MEDIA_TAB_VIDEO_CAPTURE && | 1297 (request->video_type() != MEDIA_TAB_VIDEO_CAPTURE && |
1313 request->video_type() != MEDIA_NO_SERVICE)) { | 1298 request->video_type() != MEDIA_NO_SERVICE)) { |
1314 return false; | 1299 return false; |
1315 } | 1300 } |
1316 | 1301 |
1317 request->CreateTabCatureUIRequest(target_render_process_id, | 1302 request->CreateTabCaptureUIRequest(target_render_process_id, |
1318 target_render_view_id, | 1303 target_render_frame_id, |
1319 tab_capture_device_id); | 1304 capture_device_id); |
1320 | 1305 |
1321 DVLOG(3) << "SetupTabCaptureRequest " | 1306 DVLOG(3) << "SetupTabCaptureRequest " |
1322 << ", {tab_capture_device_id = " << tab_capture_device_id << "}" | 1307 << ", {capture_device_id = " << capture_device_id << "}" |
1323 << ", {target_render_process_id = " << target_render_process_id | 1308 << ", {target_render_process_id = " << target_render_process_id |
1324 << "}" | 1309 << "}" |
1325 << ", {target_render_view_id = " << target_render_view_id << "}"; | 1310 << ", {target_render_frame_id = " << target_render_frame_id << "}"; |
1326 return true; | 1311 return true; |
1327 } | 1312 } |
1328 | 1313 |
1329 bool MediaStreamManager::SetupScreenCaptureRequest(DeviceRequest* request) { | 1314 bool MediaStreamManager::SetupScreenCaptureRequest(DeviceRequest* request) { |
1330 DCHECK(request->audio_type() == MEDIA_LOOPBACK_AUDIO_CAPTURE || | 1315 DCHECK(request->audio_type() == MEDIA_LOOPBACK_AUDIO_CAPTURE || |
1331 request->video_type() == MEDIA_DESKTOP_VIDEO_CAPTURE); | 1316 request->video_type() == MEDIA_DESKTOP_VIDEO_CAPTURE); |
1332 | 1317 |
1333 // For screen capture we only support two valid combinations: | 1318 // For screen capture we only support two valid combinations: |
1334 // (1) screen video capture only, or | 1319 // (1) screen video capture only, or |
1335 // (2) screen video capture with loopback audio capture. | 1320 // (2) screen video capture with loopback audio capture. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1387 | 1372 |
1388 std::string source_id = content::GetHMACForMediaDeviceID( | 1373 std::string source_id = content::GetHMACForMediaDeviceID( |
1389 new_request.salt_callback, | 1374 new_request.salt_callback, |
1390 new_request.security_origin, | 1375 new_request.security_origin, |
1391 new_device_info.id); | 1376 new_device_info.id); |
1392 | 1377 |
1393 for (DeviceRequests::const_iterator it = requests_.begin(); | 1378 for (DeviceRequests::const_iterator it = requests_.begin(); |
1394 it != requests_.end() ; ++it) { | 1379 it != requests_.end() ; ++it) { |
1395 const DeviceRequest* request = it->second; | 1380 const DeviceRequest* request = it->second; |
1396 if (request->requesting_process_id == new_request.requesting_process_id && | 1381 if (request->requesting_process_id == new_request.requesting_process_id && |
1397 request->requesting_view_id == new_request.requesting_view_id && | 1382 request->requesting_frame_id == new_request.requesting_frame_id && |
1398 request->request_type == new_request.request_type) { | 1383 request->request_type == new_request.request_type) { |
1399 for (StreamDeviceInfoArray::const_iterator device_it = | 1384 for (StreamDeviceInfoArray::const_iterator device_it = |
1400 request->devices.begin(); | 1385 request->devices.begin(); |
1401 device_it != request->devices.end(); ++device_it) { | 1386 device_it != request->devices.end(); ++device_it) { |
1402 if (device_it->device.id == source_id && | 1387 if (device_it->device.id == source_id && |
1403 device_it->device.type == new_device_info.type) { | 1388 device_it->device.type == new_device_info.type) { |
1404 *existing_device_info = *device_it; | 1389 *existing_device_info = *device_it; |
1405 *existing_request_state = request->state(device_it->device.type); | 1390 *existing_request_state = request->state(device_it->device.type); |
1406 return true; | 1391 return true; |
1407 } | 1392 } |
(...skipping 16 matching lines...) Expand all Loading... | |
1424 if (IsAudioInputMediaType(device_it->device.type)) { | 1409 if (IsAudioInputMediaType(device_it->device.type)) { |
1425 audio_devices.push_back(*device_it); | 1410 audio_devices.push_back(*device_it); |
1426 } else if (IsVideoMediaType(device_it->device.type)) { | 1411 } else if (IsVideoMediaType(device_it->device.type)) { |
1427 video_devices.push_back(*device_it); | 1412 video_devices.push_back(*device_it); |
1428 } else { | 1413 } else { |
1429 NOTREACHED(); | 1414 NOTREACHED(); |
1430 } | 1415 } |
1431 } | 1416 } |
1432 | 1417 |
1433 request->requester->StreamGenerated( | 1418 request->requester->StreamGenerated( |
1434 request->requesting_view_id, | 1419 request->requesting_frame_id, |
1435 request->page_request_id, | 1420 request->page_request_id, |
1436 label, audio_devices, video_devices); | 1421 label, audio_devices, video_devices); |
1437 } | 1422 } |
1438 | 1423 |
1439 void MediaStreamManager::FinalizeRequestFailed( | 1424 void MediaStreamManager::FinalizeRequestFailed( |
1440 const std::string& label, | 1425 const std::string& label, |
1441 DeviceRequest* request, | 1426 DeviceRequest* request, |
1442 content::MediaStreamRequestResult result) { | 1427 content::MediaStreamRequestResult result) { |
1443 if (request->requester) | 1428 if (request->requester) |
1444 request->requester->StreamGenerationFailed( | 1429 request->requester->StreamGenerationFailed( |
1445 request->requesting_view_id, | 1430 request->requesting_frame_id, |
1446 request->page_request_id, | 1431 request->page_request_id, |
1447 result); | 1432 result); |
1448 | 1433 |
1449 if (request->request_type == MEDIA_DEVICE_ACCESS && | 1434 if (request->request_type == MEDIA_DEVICE_ACCESS && |
1450 !request->callback.is_null()) { | 1435 !request->callback.is_null()) { |
1451 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass()); | 1436 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass()); |
1452 } | 1437 } |
1453 | 1438 |
1454 DeleteRequest(label); | 1439 DeleteRequest(label); |
1455 } | 1440 } |
1456 | 1441 |
1457 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, | 1442 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, |
1458 DeviceRequest* request) { | 1443 DeviceRequest* request) { |
1459 const StreamDeviceInfoArray& requested_devices = request->devices; | 1444 const StreamDeviceInfoArray& requested_devices = request->devices; |
1460 request->requester->DeviceOpened(request->requesting_view_id, | 1445 request->requester->DeviceOpened(request->requesting_frame_id, |
1461 request->page_request_id, | 1446 request->page_request_id, |
1462 label, requested_devices.front()); | 1447 label, requested_devices.front()); |
1463 } | 1448 } |
1464 | 1449 |
1465 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, | 1450 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, |
1466 DeviceRequest* request) { | 1451 DeviceRequest* request) { |
1467 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1452 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1468 DCHECK_EQ(request->request_type, MEDIA_ENUMERATE_DEVICES); | 1453 DCHECK_EQ(request->request_type, MEDIA_ENUMERATE_DEVICES); |
1469 | 1454 |
1470 if (request->security_origin.is_valid()) { | 1455 if (request->security_origin.is_valid()) { |
1471 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); | 1456 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); |
1472 it != request->devices.end(); ++it) { | 1457 it != request->devices.end(); ++it) { |
1473 TranslateDeviceIdToSourceId(request, &it->device); | 1458 TranslateDeviceIdToSourceId(request, &it->device); |
1474 } | 1459 } |
1475 } else { | 1460 } else { |
1476 request->devices.clear(); | 1461 request->devices.clear(); |
1477 } | 1462 } |
1478 | 1463 |
1479 if (!request->have_permission) | 1464 if (!request->have_permission) |
1480 ClearDeviceLabels(&request->devices); | 1465 ClearDeviceLabels(&request->devices); |
1481 | 1466 |
1482 request->requester->DevicesEnumerated( | 1467 request->requester->DevicesEnumerated( |
1483 request->requesting_view_id, | 1468 request->requesting_frame_id, |
1484 request->page_request_id, | 1469 request->page_request_id, |
1485 label, | 1470 label, |
1486 request->devices); | 1471 request->devices); |
1487 | 1472 |
1488 // TODO(tommi): | 1473 // TODO(tommi): |
1489 // Ideally enumeration requests should be deleted once they have been served | 1474 // Ideally enumeration requests should be deleted once they have been served |
1490 // (as any request). However, this implementation mixes requests and | 1475 // (as any request). However, this implementation mixes requests and |
1491 // notifications together so enumeration requests are kept open by some | 1476 // notifications together so enumeration requests are kept open by some |
1492 // implementations (only Pepper?) and enumerations are done again when | 1477 // implementations (only Pepper?) and enumerations are done again when |
1493 // device notifications are fired. | 1478 // device notifications are fired. |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1810 DCHECK(!devices.empty()); | 1795 DCHECK(!devices.empty()); |
1811 | 1796 |
1812 // Process all newly-accepted devices for this request. | 1797 // Process all newly-accepted devices for this request. |
1813 bool found_audio = false; | 1798 bool found_audio = false; |
1814 bool found_video = false; | 1799 bool found_video = false; |
1815 for (MediaStreamDevices::const_iterator device_it = devices.begin(); | 1800 for (MediaStreamDevices::const_iterator device_it = devices.begin(); |
1816 device_it != devices.end(); ++device_it) { | 1801 device_it != devices.end(); ++device_it) { |
1817 StreamDeviceInfo device_info; | 1802 StreamDeviceInfo device_info; |
1818 device_info.device = *device_it; | 1803 device_info.device = *device_it; |
1819 | 1804 |
1820 // TODO(justinlin): Nicer way to do this? | |
1821 // Re-append the device's id since we lost it when posting request to UI. | |
1822 if (device_info.device.type == content::MEDIA_TAB_VIDEO_CAPTURE || | 1805 if (device_info.device.type == content::MEDIA_TAB_VIDEO_CAPTURE || |
1823 device_info.device.type == content::MEDIA_TAB_AUDIO_CAPTURE) { | 1806 device_info.device.type == content::MEDIA_TAB_AUDIO_CAPTURE) { |
1824 device_info.device.id = request->UIRequest()->tab_capture_device_id; | 1807 device_info.device.id = request->UIRequest()->tab_capture_device_id; |
1825 | 1808 |
1826 // Initialize the sample_rate and channel_layout here since for audio | 1809 // Initialize the sample_rate and channel_layout here since for audio |
1827 // mirroring, we don't go through EnumerateDevices where these are usually | 1810 // mirroring, we don't go through EnumerateDevices where these are usually |
1828 // initialized. | 1811 // initialized. |
1829 if (device_info.device.type == content::MEDIA_TAB_AUDIO_CAPTURE) { | 1812 if (device_info.device.type == content::MEDIA_TAB_AUDIO_CAPTURE) { |
1830 const media::AudioParameters parameters = | 1813 const media::AudioParameters parameters = |
1831 audio_manager_->GetDefaultOutputStreamParameters(); | 1814 audio_manager_->GetDefaultOutputStreamParameters(); |
1832 int sample_rate = parameters.sample_rate(); | 1815 int sample_rate = parameters.sample_rate(); |
1833 // If we weren't able to get the native sampling rate or the sample_rate | 1816 // If we weren't able to get the native sampling rate or the sample_rate |
1834 // is outside the valid range for input devices set reasonable defaults. | 1817 // is outside the valid range for input devices set reasonable defaults. |
1835 if (sample_rate <= 0 || sample_rate > 96000) | 1818 if (sample_rate <= 0 || sample_rate > 96000) |
1836 sample_rate = 44100; | 1819 sample_rate = 44100; |
1837 | 1820 |
1838 device_info.device.input.sample_rate = sample_rate; | 1821 device_info.device.input.sample_rate = sample_rate; |
1839 device_info.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO; | 1822 device_info.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO; |
1840 } | 1823 } |
1841 } | 1824 } |
1842 | 1825 |
1843 if (device_info.device.type == request->audio_type()) { | 1826 if (device_info.device.type == request->audio_type()) { |
1844 found_audio = true; | 1827 found_audio = true; |
1845 } else if (device_info.device.type == request->video_type()) { | 1828 } else if (device_info.device.type == request->video_type()) { |
1846 found_video = true; | 1829 found_video = true; |
1847 } | 1830 } |
1848 | 1831 |
1849 // If this is request for a new MediaStream, a device is only opened once | 1832 // If this is request for a new MediaStream, a device is only opened once |
1850 // per render view. This is so that the permission to use a device can be | 1833 // per render frame. This is so that the permission to use a device can be |
1851 // revoked by a single call to StopStreamDevice regardless of how many | 1834 // revoked by a single call to StopStreamDevice regardless of how many |
1852 // MediaStreams it is being used in. | 1835 // MediaStreams it is being used in. |
1853 if (request->request_type == MEDIA_GENERATE_STREAM) { | 1836 if (request->request_type == MEDIA_GENERATE_STREAM) { |
1854 MediaRequestState state; | 1837 MediaRequestState state; |
1855 if (FindExistingRequestedDeviceInfo(*request, | 1838 if (FindExistingRequestedDeviceInfo(*request, |
1856 device_info.device, | 1839 device_info.device, |
1857 &device_info, | 1840 &device_info, |
1858 &state)) { | 1841 &state)) { |
1859 request->devices.push_back(device_info); | 1842 request->devices.push_back(device_info); |
1860 request->SetState(device_info.device.type, state); | 1843 request->SetState(device_info.device.type, state); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1893 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1876 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1894 | 1877 |
1895 DeviceRequest* request = FindRequest(label); | 1878 DeviceRequest* request = FindRequest(label); |
1896 if (!request) | 1879 if (!request) |
1897 return; | 1880 return; |
1898 | 1881 |
1899 // Notify renderers that the devices in the stream will be stopped. | 1882 // Notify renderers that the devices in the stream will be stopped. |
1900 if (request->requester) { | 1883 if (request->requester) { |
1901 for (StreamDeviceInfoArray::iterator device_it = request->devices.begin(); | 1884 for (StreamDeviceInfoArray::iterator device_it = request->devices.begin(); |
1902 device_it != request->devices.end(); ++device_it) { | 1885 device_it != request->devices.end(); ++device_it) { |
1903 request->requester->DeviceStopped(request->requesting_view_id, | 1886 request->requester->DeviceStopped(request->requesting_frame_id, |
1904 label, | 1887 label, |
1905 *device_it); | 1888 *device_it); |
1906 } | 1889 } |
1907 } | 1890 } |
1908 | 1891 |
1909 CancelRequest(label); | 1892 CancelRequest(label); |
1910 } | 1893 } |
1911 | 1894 |
1912 void MediaStreamManager::UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy> fake_ui) { | 1895 void MediaStreamManager::UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy> fake_ui) { |
1913 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1896 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2032 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { | 2015 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { |
2033 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, | 2016 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, |
2034 window_id); | 2017 window_id); |
2035 break; | 2018 break; |
2036 } | 2019 } |
2037 } | 2020 } |
2038 } | 2021 } |
2039 } | 2022 } |
2040 | 2023 |
2041 } // namespace content | 2024 } // namespace content |
OLD | NEW |