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

Side by Side Diff: content/browser/renderer_host/media/media_stream_manager.cc

Issue 216473002: Replace DCHECK(BrowserThread::CurrentlyOn) with DCHECK_CURRENTLY_ON in content/browser/renderer_hos… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync to r260263 Created 6 years, 9 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 | Annotate | Revision Log
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/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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 *video_type = MEDIA_DEVICE_VIDEO_CAPTURE; 112 *video_type = MEDIA_DEVICE_VIDEO_CAPTURE;
113 } 113 }
114 } 114 }
115 } 115 }
116 116
117 // Private helper method for SendMessageToNativeLog() that obtains the global 117 // Private helper method for SendMessageToNativeLog() that obtains the global
118 // MediaStreamManager instance on the UI thread before sending |message| to the 118 // MediaStreamManager instance on the UI thread before sending |message| to the
119 // webrtcLoggingPrivate API. 119 // webrtcLoggingPrivate API.
120 void DoAddLogMessage(const std::string& message) { 120 void DoAddLogMessage(const std::string& message) {
121 // Must be on the UI thread to access BrowserMainLoop. 121 // Must be on the UI thread to access BrowserMainLoop.
122 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 122 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
123 // May be null in tests. 123 // May be null in tests.
124 // TODO(vrk): Handle this more elegantly by having native log messages become 124 // TODO(vrk): Handle this more elegantly by having native log messages become
125 // no-ops until MediaStreamManager is aware that a renderer process has 125 // no-ops until MediaStreamManager is aware that a renderer process has
126 // started logging. crbug.com/333894 126 // started logging. crbug.com/333894
127 if (content::BrowserMainLoop::GetInstance()) { 127 if (content::BrowserMainLoop::GetInstance()) {
128 BrowserThread::PostTask( 128 BrowserThread::PostTask(
129 BrowserThread::IO, 129 BrowserThread::IO,
130 FROM_HERE, 130 FROM_HERE,
131 base::Bind(&MediaStreamManager::AddLogMessageOnIOThread, 131 base::Bind(&MediaStreamManager::AddLogMessageOnIOThread,
132 base::Unretained(content::BrowserMainLoop::GetInstance() 132 base::Unretained(content::BrowserMainLoop::GetInstance()
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 } 361 }
362 } 362 }
363 363
364 MediaStreamManager::~MediaStreamManager() { 364 MediaStreamManager::~MediaStreamManager() {
365 DVLOG(1) << "~MediaStreamManager"; 365 DVLOG(1) << "~MediaStreamManager";
366 DCHECK(requests_.empty()); 366 DCHECK(requests_.empty());
367 DCHECK(!device_task_runner_); 367 DCHECK(!device_task_runner_);
368 } 368 }
369 369
370 VideoCaptureManager* MediaStreamManager::video_capture_manager() { 370 VideoCaptureManager* MediaStreamManager::video_capture_manager() {
371 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 371 DCHECK_CURRENTLY_ON(BrowserThread::IO);
372 DCHECK(video_capture_manager_.get()); 372 DCHECK(video_capture_manager_.get());
373 return video_capture_manager_.get(); 373 return video_capture_manager_.get();
374 } 374 }
375 375
376 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { 376 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() {
377 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 377 DCHECK_CURRENTLY_ON(BrowserThread::IO);
378 DCHECK(audio_input_device_manager_.get()); 378 DCHECK(audio_input_device_manager_.get());
379 return audio_input_device_manager_.get(); 379 return audio_input_device_manager_.get();
380 } 380 }
381 381
382 std::string MediaStreamManager::MakeMediaAccessRequest( 382 std::string MediaStreamManager::MakeMediaAccessRequest(
383 int render_process_id, 383 int render_process_id,
384 int render_view_id, 384 int render_view_id,
385 int page_request_id, 385 int page_request_id,
386 const StreamOptions& options, 386 const StreamOptions& options,
387 const GURL& security_origin, 387 const GURL& security_origin,
388 const MediaRequestResponseCallback& callback) { 388 const MediaRequestResponseCallback& callback) {
389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 389 DCHECK_CURRENTLY_ON(BrowserThread::IO);
390 390
391 // TODO(perkj): The argument list with NULL parameters to DeviceRequest 391 // TODO(perkj): The argument list with NULL parameters to DeviceRequest
392 // suggests that this is the wrong design. Can this be refactored? 392 // suggests that this is the wrong design. Can this be refactored?
393 DeviceRequest* request = new DeviceRequest(NULL, 393 DeviceRequest* request = new DeviceRequest(NULL,
394 render_process_id, 394 render_process_id,
395 render_view_id, 395 render_view_id,
396 page_request_id, 396 page_request_id,
397 security_origin, 397 security_origin,
398 false, // user gesture 398 false, // user gesture
399 MEDIA_DEVICE_ACCESS, 399 MEDIA_DEVICE_ACCESS,
(...skipping 16 matching lines...) Expand all
416 } 416 }
417 417
418 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, 418 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
419 int render_process_id, 419 int render_process_id,
420 int render_view_id, 420 int render_view_id,
421 const ResourceContext::SaltCallback& sc, 421 const ResourceContext::SaltCallback& sc,
422 int page_request_id, 422 int page_request_id,
423 const StreamOptions& options, 423 const StreamOptions& options,
424 const GURL& security_origin, 424 const GURL& security_origin,
425 bool user_gesture) { 425 bool user_gesture) {
426 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 426 DCHECK_CURRENTLY_ON(BrowserThread::IO);
427 DVLOG(1) << "GenerateStream()"; 427 DVLOG(1) << "GenerateStream()";
428 if (CommandLine::ForCurrentProcess()->HasSwitch( 428 if (CommandLine::ForCurrentProcess()->HasSwitch(
429 switches::kUseFakeUIForMediaStream)) { 429 switches::kUseFakeUIForMediaStream)) {
430 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); 430 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>());
431 } 431 }
432 432
433 DeviceRequest* request = new DeviceRequest(requester, 433 DeviceRequest* request = new DeviceRequest(requester,
434 render_process_id, 434 render_process_id,
435 render_view_id, 435 render_view_id,
436 page_request_id, 436 page_request_id,
(...skipping 26 matching lines...) Expand all
463 request->requesting_view_id == render_view_id && 463 request->requesting_view_id == render_view_id &&
464 request->page_request_id == page_request_id) { 464 request->page_request_id == page_request_id) {
465 CancelRequest(request_it->first); 465 CancelRequest(request_it->first);
466 return; 466 return;
467 } 467 }
468 } 468 }
469 NOTREACHED(); 469 NOTREACHED();
470 } 470 }
471 471
472 void MediaStreamManager::CancelRequest(const std::string& label) { 472 void MediaStreamManager::CancelRequest(const std::string& label) {
473 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 473 DCHECK_CURRENTLY_ON(BrowserThread::IO);
474 DVLOG(1) << "CancelRequest({label = " << label << "})"; 474 DVLOG(1) << "CancelRequest({label = " << label << "})";
475 DeviceRequest* request = FindRequest(label); 475 DeviceRequest* request = FindRequest(label);
476 if (!request) { 476 if (!request) {
477 // The request does not exist. 477 // The request does not exist.
478 LOG(ERROR) << "The request with label = " << label << " does not exist."; 478 LOG(ERROR) << "The request with label = " << label << " does not exist.";
479 return; 479 return;
480 } 480 }
481 481
482 if (request->request_type == MEDIA_ENUMERATE_DEVICES) { 482 if (request->request_type == MEDIA_ENUMERATE_DEVICES) {
483 // It isn't an ideal use of "CancelRequest" to make it a requirement 483 // It isn't an ideal use of "CancelRequest" to make it a requirement
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 517
518 std::string label = request_it->first; 518 std::string label = request_it->first;
519 ++request_it; 519 ++request_it;
520 CancelRequest(label); 520 CancelRequest(label);
521 } 521 }
522 } 522 }
523 523
524 void MediaStreamManager::StopStreamDevice(int render_process_id, 524 void MediaStreamManager::StopStreamDevice(int render_process_id,
525 int render_view_id, 525 int render_view_id,
526 const std::string& device_id) { 526 const std::string& device_id) {
527 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 527 DCHECK_CURRENTLY_ON(BrowserThread::IO);
528 DVLOG(1) << "StopStreamDevice({render_view_id = " << render_view_id << "} " 528 DVLOG(1) << "StopStreamDevice({render_view_id = " << render_view_id << "} "
529 << ", {device_id = " << device_id << "})"; 529 << ", {device_id = " << device_id << "})";
530 // Find the first request for this |render_process_id| and |render_view_id| 530 // Find the first request for this |render_process_id| and |render_view_id|
531 // of type MEDIA_GENERATE_STREAM that has requested to use |device_id| and 531 // of type MEDIA_GENERATE_STREAM that has requested to use |device_id| and
532 // stop it. 532 // stop it.
533 for (DeviceRequests::iterator request_it = requests_.begin(); 533 for (DeviceRequests::iterator request_it = requests_.begin();
534 request_it != requests_.end(); ++request_it) { 534 request_it != requests_.end(); ++request_it) {
535 DeviceRequest* request = request_it->second; 535 DeviceRequest* request = request_it->second;
536 if (request->requesting_process_id != render_process_id || 536 if (request->requesting_process_id != render_process_id ||
537 request->requesting_view_id != render_view_id || 537 request->requesting_view_id != render_view_id ||
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 } 611 }
612 612
613 std::string MediaStreamManager::EnumerateDevices( 613 std::string MediaStreamManager::EnumerateDevices(
614 MediaStreamRequester* requester, 614 MediaStreamRequester* requester,
615 int render_process_id, 615 int render_process_id,
616 int render_view_id, 616 int render_view_id,
617 const ResourceContext::SaltCallback& sc, 617 const ResourceContext::SaltCallback& sc,
618 int page_request_id, 618 int page_request_id,
619 MediaStreamType type, 619 MediaStreamType type,
620 const GURL& security_origin) { 620 const GURL& security_origin) {
621 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 621 DCHECK_CURRENTLY_ON(BrowserThread::IO);
622 DCHECK(requester); 622 DCHECK(requester);
623 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 623 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
624 type == MEDIA_DEVICE_VIDEO_CAPTURE); 624 type == MEDIA_DEVICE_VIDEO_CAPTURE);
625 625
626 DeviceRequest* request = new DeviceRequest(requester, 626 DeviceRequest* request = new DeviceRequest(requester,
627 render_process_id, 627 render_process_id,
628 render_view_id, 628 render_view_id,
629 page_request_id, 629 page_request_id,
630 security_origin, 630 security_origin,
631 false, // user gesture 631 false, // user gesture
(...skipping 12 matching lines...) Expand all
644 // MediaStreamManager is deleted on the UI thread, after the IO thread has 644 // MediaStreamManager is deleted on the UI thread, after the IO thread has
645 // been stopped. 645 // been stopped.
646 BrowserThread::PostTask( 646 BrowserThread::PostTask(
647 BrowserThread::IO, FROM_HERE, 647 BrowserThread::IO, FROM_HERE,
648 base::Bind(&MediaStreamManager::DoEnumerateDevices, 648 base::Bind(&MediaStreamManager::DoEnumerateDevices,
649 base::Unretained(this), label)); 649 base::Unretained(this), label));
650 return label; 650 return label;
651 } 651 }
652 652
653 void MediaStreamManager::DoEnumerateDevices(const std::string& label) { 653 void MediaStreamManager::DoEnumerateDevices(const std::string& label) {
654 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 654 DCHECK_CURRENTLY_ON(BrowserThread::IO);
655 DeviceRequest* request = FindRequest(label); 655 DeviceRequest* request = FindRequest(label);
656 if (!request) 656 if (!request)
657 return; // This can happen if the request has been canceled. 657 return; // This can happen if the request has been canceled.
658 658
659 MediaStreamType type; 659 MediaStreamType type;
660 EnumerationCache* cache; 660 EnumerationCache* cache;
661 if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE) { 661 if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE) {
662 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); 662 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type());
663 type = MEDIA_DEVICE_AUDIO_CAPTURE; 663 type = MEDIA_DEVICE_AUDIO_CAPTURE;
664 cache = &audio_enumeration_cache_; 664 cache = &audio_enumeration_cache_;
(...skipping 15 matching lines...) Expand all
680 } 680 }
681 681
682 void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, 682 void MediaStreamManager::OpenDevice(MediaStreamRequester* requester,
683 int render_process_id, 683 int render_process_id,
684 int render_view_id, 684 int render_view_id,
685 const ResourceContext::SaltCallback& sc, 685 const ResourceContext::SaltCallback& sc,
686 int page_request_id, 686 int page_request_id,
687 const std::string& device_id, 687 const std::string& device_id,
688 MediaStreamType type, 688 MediaStreamType type,
689 const GURL& security_origin) { 689 const GURL& security_origin) {
690 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 690 DCHECK_CURRENTLY_ON(BrowserThread::IO);
691 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 691 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
692 type == MEDIA_DEVICE_VIDEO_CAPTURE); 692 type == MEDIA_DEVICE_VIDEO_CAPTURE);
693 DVLOG(1) << "OpenDevice ({page_request_id = " << page_request_id << "})"; 693 DVLOG(1) << "OpenDevice ({page_request_id = " << page_request_id << "})";
694 StreamOptions options; 694 StreamOptions options;
695 if (IsAudioMediaType(type)) { 695 if (IsAudioMediaType(type)) {
696 options.audio_requested = true; 696 options.audio_requested = true;
697 options.mandatory_audio.push_back( 697 options.mandatory_audio.push_back(
698 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); 698 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id));
699 } else if (IsVideoMediaType(type)) { 699 } else if (IsVideoMediaType(type)) {
700 options.video_requested = true; 700 options.video_requested = true;
(...skipping 18 matching lines...) Expand all
719 // and thus can not handle a response. Using base::Unretained is safe since 719 // and thus can not handle a response. Using base::Unretained is safe since
720 // MediaStreamManager is deleted on the UI thread, after the IO thread has 720 // MediaStreamManager is deleted on the UI thread, after the IO thread has
721 // been stopped. 721 // been stopped.
722 BrowserThread::PostTask( 722 BrowserThread::PostTask(
723 BrowserThread::IO, FROM_HERE, 723 BrowserThread::IO, FROM_HERE,
724 base::Bind(&MediaStreamManager::SetupRequest, 724 base::Bind(&MediaStreamManager::SetupRequest,
725 base::Unretained(this), label)); 725 base::Unretained(this), label));
726 } 726 }
727 727
728 void MediaStreamManager::EnsureDeviceMonitorStarted() { 728 void MediaStreamManager::EnsureDeviceMonitorStarted() {
729 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 729 DCHECK_CURRENTLY_ON(BrowserThread::IO);
730 StartMonitoring(); 730 StartMonitoring();
731 } 731 }
732 732
733 void MediaStreamManager::StopRemovedDevices( 733 void MediaStreamManager::StopRemovedDevices(
734 const StreamDeviceInfoArray& old_devices, 734 const StreamDeviceInfoArray& old_devices,
735 const StreamDeviceInfoArray& new_devices) { 735 const StreamDeviceInfoArray& new_devices) {
736 DVLOG(1) << "StopRemovedDevices(" 736 DVLOG(1) << "StopRemovedDevices("
737 << "{#old_devices = " << old_devices.size() << "} " 737 << "{#old_devices = " << old_devices.size() << "} "
738 << "{#new_devices = " << new_devices.size() << "})"; 738 << "{#new_devices = " << new_devices.size() << "})";
739 for (StreamDeviceInfoArray::const_iterator old_dev_it = old_devices.begin(); 739 for (StreamDeviceInfoArray::const_iterator old_dev_it = old_devices.begin();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 } 779 }
780 } 780 }
781 } 781 }
782 for (std::vector<int>::const_iterator it = session_ids.begin(); 782 for (std::vector<int>::const_iterator it = session_ids.begin();
783 it != session_ids.end(); ++it) { 783 it != session_ids.end(); ++it) {
784 StopDevice(device.type, *it); 784 StopDevice(device.type, *it);
785 } 785 }
786 } 786 }
787 787
788 void MediaStreamManager::StartMonitoring() { 788 void MediaStreamManager::StartMonitoring() {
789 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 789 DCHECK_CURRENTLY_ON(BrowserThread::IO);
790 if (monitoring_started_) 790 if (monitoring_started_)
791 return; 791 return;
792 792
793 if (!base::SystemMonitor::Get()) 793 if (!base::SystemMonitor::Get())
794 return; 794 return;
795 795
796 monitoring_started_ = true; 796 monitoring_started_ = true;
797 base::SystemMonitor::Get()->AddDevicesChangedObserver(this); 797 base::SystemMonitor::Get()->AddDevicesChangedObserver(this);
798 798
799 // Enumerate both the audio and video devices to cache the device lists 799 // Enumerate both the audio and video devices to cache the device lists
800 // and send them to media observer. 800 // and send them to media observer.
801 ++active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_CAPTURE]; 801 ++active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_CAPTURE];
802 audio_input_device_manager_->EnumerateDevices(MEDIA_DEVICE_AUDIO_CAPTURE); 802 audio_input_device_manager_->EnumerateDevices(MEDIA_DEVICE_AUDIO_CAPTURE);
803 ++active_enumeration_ref_count_[MEDIA_DEVICE_VIDEO_CAPTURE]; 803 ++active_enumeration_ref_count_[MEDIA_DEVICE_VIDEO_CAPTURE];
804 video_capture_manager_->EnumerateDevices(MEDIA_DEVICE_VIDEO_CAPTURE); 804 video_capture_manager_->EnumerateDevices(MEDIA_DEVICE_VIDEO_CAPTURE);
805 805
806 #if defined(OS_MACOSX) 806 #if defined(OS_MACOSX)
807 BrowserThread::PostTask( 807 BrowserThread::PostTask(
808 BrowserThread::UI, FROM_HERE, 808 BrowserThread::UI, FROM_HERE,
809 base::Bind(&MediaStreamManager::StartMonitoringOnUIThread, 809 base::Bind(&MediaStreamManager::StartMonitoringOnUIThread,
810 base::Unretained(this))); 810 base::Unretained(this)));
811 #endif 811 #endif
812 } 812 }
813 813
814 #if defined(OS_MACOSX) 814 #if defined(OS_MACOSX)
815 void MediaStreamManager::StartMonitoringOnUIThread() { 815 void MediaStreamManager::StartMonitoringOnUIThread() {
816 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 816 DCHECK_CURRENTLY_ON(BrowserThread::UI);
817 BrowserMainLoop* browser_main_loop = content::BrowserMainLoop::GetInstance(); 817 BrowserMainLoop* browser_main_loop = content::BrowserMainLoop::GetInstance();
818 if (browser_main_loop) 818 if (browser_main_loop)
819 browser_main_loop->device_monitor_mac()->StartMonitoring(); 819 browser_main_loop->device_monitor_mac()->StartMonitoring();
820 } 820 }
821 #endif 821 #endif
822 822
823 void MediaStreamManager::StopMonitoring() { 823 void MediaStreamManager::StopMonitoring() {
824 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 824 DCHECK_EQ(base::MessageLoop::current(), io_loop_);
825 if (monitoring_started_) { 825 if (monitoring_started_) {
826 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this); 826 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this);
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 // Make sure the cache is marked as invalid so that FinalizeEnumerateDevices 951 // Make sure the cache is marked as invalid so that FinalizeEnumerateDevices
952 // will be called at the end of the enumeration. 952 // will be called at the end of the enumeration.
953 ClearEnumerationCache(cache); 953 ClearEnumerationCache(cache);
954 } 954 }
955 #endif 955 #endif
956 // If the cache isn't valid, we need to start a full enumeration. 956 // If the cache isn't valid, we need to start a full enumeration.
957 return !cache->valid; 957 return !cache->valid;
958 } 958 }
959 959
960 void MediaStreamManager::StartEnumeration(DeviceRequest* request) { 960 void MediaStreamManager::StartEnumeration(DeviceRequest* request) {
961 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 961 DCHECK_CURRENTLY_ON(BrowserThread::IO);
962 962
963 // Start monitoring the devices when doing the first enumeration. 963 // Start monitoring the devices when doing the first enumeration.
964 StartMonitoring(); 964 StartMonitoring();
965 965
966 // Start enumeration for devices of all requested device types. 966 // Start enumeration for devices of all requested device types.
967 const MediaStreamType streams[] = { request->audio_type(), 967 const MediaStreamType streams[] = { request->audio_type(),
968 request->video_type() }; 968 request->video_type() };
969 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(streams); ++i) { 969 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(streams); ++i) {
970 if (streams[i] == MEDIA_NO_SERVICE) 970 if (streams[i] == MEDIA_NO_SERVICE)
971 continue; 971 continue;
972 request->SetState(streams[i], MEDIA_REQUEST_STATE_REQUESTED); 972 request->SetState(streams[i], MEDIA_REQUEST_STATE_REQUESTED);
973 DCHECK_GE(active_enumeration_ref_count_[streams[i]], 0); 973 DCHECK_GE(active_enumeration_ref_count_[streams[i]], 0);
974 if (active_enumeration_ref_count_[streams[i]] == 0) { 974 if (active_enumeration_ref_count_[streams[i]] == 0) {
975 ++active_enumeration_ref_count_[streams[i]]; 975 ++active_enumeration_ref_count_[streams[i]];
976 GetDeviceManager(streams[i])->EnumerateDevices(streams[i]); 976 GetDeviceManager(streams[i])->EnumerateDevices(streams[i]);
977 } 977 }
978 } 978 }
979 } 979 }
980 980
981 std::string MediaStreamManager::AddRequest(DeviceRequest* request) { 981 std::string MediaStreamManager::AddRequest(DeviceRequest* request) {
982 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 982 DCHECK_CURRENTLY_ON(BrowserThread::IO);
983 983
984 // Create a label for this request and verify it is unique. 984 // Create a label for this request and verify it is unique.
985 std::string unique_label; 985 std::string unique_label;
986 do { 986 do {
987 unique_label = RandomLabel(); 987 unique_label = RandomLabel();
988 } while (requests_.find(unique_label) != requests_.end()); 988 } while (requests_.find(unique_label) != requests_.end());
989 989
990 requests_.insert(std::make_pair(unique_label, request)); 990 requests_.insert(std::make_pair(unique_label, request));
991 991
992 return unique_label; 992 return unique_label;
993 } 993 }
994 994
995 MediaStreamManager::DeviceRequest* 995 MediaStreamManager::DeviceRequest*
996 MediaStreamManager::FindRequest(const std::string& label) const { 996 MediaStreamManager::FindRequest(const std::string& label) const {
997 DeviceRequests::const_iterator request_it = requests_.find(label); 997 DeviceRequests::const_iterator request_it = requests_.find(label);
998 return request_it == requests_.end() ? NULL : request_it->second; 998 return request_it == requests_.end() ? NULL : request_it->second;
999 } 999 }
1000 1000
1001 void MediaStreamManager::DeleteRequest(const std::string& label) { 1001 void MediaStreamManager::DeleteRequest(const std::string& label) {
1002 DVLOG(1) << "DeleteRequest({label= " << label << "})"; 1002 DVLOG(1) << "DeleteRequest({label= " << label << "})";
1003 DeviceRequests::iterator it = requests_.find(label); 1003 DeviceRequests::iterator it = requests_.find(label);
1004 scoped_ptr<DeviceRequest> request(it->second); 1004 scoped_ptr<DeviceRequest> request(it->second);
1005 requests_.erase(it); 1005 requests_.erase(it);
1006 } 1006 }
1007 1007
1008 void MediaStreamManager::PostRequestToUI(const std::string& label, 1008 void MediaStreamManager::PostRequestToUI(const std::string& label,
1009 DeviceRequest* request) { 1009 DeviceRequest* request) {
1010 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1010 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1011 DCHECK(request->UIRequest()); 1011 DCHECK(request->UIRequest());
1012 DVLOG(1) << "PostRequestToUI({label= " << label << "})"; 1012 DVLOG(1) << "PostRequestToUI({label= " << label << "})";
1013 1013
1014 const MediaStreamType audio_type = request->audio_type(); 1014 const MediaStreamType audio_type = request->audio_type();
1015 const MediaStreamType video_type = request->video_type(); 1015 const MediaStreamType video_type = request->video_type();
1016 1016
1017 // Post the request to UI and set the state. 1017 // Post the request to UI and set the state.
1018 if (IsAudioMediaType(audio_type)) 1018 if (IsAudioMediaType(audio_type))
1019 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); 1019 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL);
1020 if (IsVideoMediaType(video_type)) 1020 if (IsVideoMediaType(video_type))
(...skipping 26 matching lines...) Expand all
1047 request->ui_proxy = MediaStreamUIProxy::Create(); 1047 request->ui_proxy = MediaStreamUIProxy::Create();
1048 } 1048 }
1049 1049
1050 request->ui_proxy->RequestAccess( 1050 request->ui_proxy->RequestAccess(
1051 *request->UIRequest(), 1051 *request->UIRequest(),
1052 base::Bind(&MediaStreamManager::HandleAccessRequestResponse, 1052 base::Bind(&MediaStreamManager::HandleAccessRequestResponse,
1053 base::Unretained(this), label)); 1053 base::Unretained(this), label));
1054 } 1054 }
1055 1055
1056 void MediaStreamManager::SetupRequest(const std::string& label) { 1056 void MediaStreamManager::SetupRequest(const std::string& label) {
1057 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1057 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1058 DeviceRequest* request = FindRequest(label); 1058 DeviceRequest* request = FindRequest(label);
1059 if (!request) { 1059 if (!request) {
1060 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!"; 1060 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!";
1061 return; // This can happen if the request has been canceled. 1061 return; // This can happen if the request has been canceled.
1062 } 1062 }
1063 1063
1064 if (!request->security_origin.is_valid()) { 1064 if (!request->security_origin.is_valid()) {
1065 LOG(ERROR) << "Invalid security origin. " 1065 LOG(ERROR) << "Invalid security origin. "
1066 << request->security_origin; 1066 << request->security_origin;
1067 FinalizeRequestFailed(label, 1067 FinalizeRequestFailed(label,
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, 1332 void MediaStreamManager::FinalizeOpenDevice(const std::string& label,
1333 DeviceRequest* request) { 1333 DeviceRequest* request) {
1334 const StreamDeviceInfoArray& requested_devices = request->devices; 1334 const StreamDeviceInfoArray& requested_devices = request->devices;
1335 request->requester->DeviceOpened(request->requesting_view_id, 1335 request->requester->DeviceOpened(request->requesting_view_id,
1336 request->page_request_id, 1336 request->page_request_id,
1337 label, requested_devices.front()); 1337 label, requested_devices.front());
1338 } 1338 }
1339 1339
1340 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, 1340 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label,
1341 DeviceRequest* request) { 1341 DeviceRequest* request) {
1342 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1342 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1343 DCHECK_EQ(request->request_type, MEDIA_ENUMERATE_DEVICES); 1343 DCHECK_EQ(request->request_type, MEDIA_ENUMERATE_DEVICES);
1344 1344
1345 if (request->security_origin.is_valid()) { 1345 if (request->security_origin.is_valid()) {
1346 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); 1346 for (StreamDeviceInfoArray::iterator it = request->devices.begin();
1347 it != request->devices.end(); ++it) { 1347 it != request->devices.end(); ++it) {
1348 TranslateDeviceIdToSourceId(request, &it->device); 1348 TranslateDeviceIdToSourceId(request, &it->device);
1349 } 1349 }
1350 } else { 1350 } else {
1351 request->devices.clear(); 1351 request->devices.clear();
1352 } 1352 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 DeviceRequest* request, 1392 DeviceRequest* request,
1393 const MediaStreamDevices& devices) { 1393 const MediaStreamDevices& devices) {
1394 if (!request->callback.is_null()) 1394 if (!request->callback.is_null())
1395 request->callback.Run(devices, request->ui_proxy.Pass()); 1395 request->callback.Run(devices, request->ui_proxy.Pass());
1396 1396
1397 // Delete the request since it is done. 1397 // Delete the request since it is done.
1398 DeleteRequest(label); 1398 DeleteRequest(label);
1399 } 1399 }
1400 1400
1401 void MediaStreamManager::InitializeDeviceManagersOnIOThread() { 1401 void MediaStreamManager::InitializeDeviceManagersOnIOThread() {
1402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1402 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1403 if (device_task_runner_) 1403 if (device_task_runner_)
1404 return; 1404 return;
1405 1405
1406 device_task_runner_ = audio_manager_->GetWorkerTaskRunner(); 1406 device_task_runner_ = audio_manager_->GetWorkerTaskRunner();
1407 1407
1408 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); 1408 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_);
1409 audio_input_device_manager_->Register(this, device_task_runner_); 1409 audio_input_device_manager_->Register(this, device_task_runner_);
1410 1410
1411 video_capture_manager_ = new VideoCaptureManager(); 1411 video_capture_manager_ = new VideoCaptureManager();
1412 video_capture_manager_->Register(this, device_task_runner_); 1412 video_capture_manager_->Register(this, device_task_runner_);
1413 1413
1414 // We want to be notified of IO message loop destruction to delete the thread 1414 // We want to be notified of IO message loop destruction to delete the thread
1415 // and the device managers. 1415 // and the device managers.
1416 io_loop_ = base::MessageLoop::current(); 1416 io_loop_ = base::MessageLoop::current();
1417 io_loop_->AddDestructionObserver(this); 1417 io_loop_->AddDestructionObserver(this);
1418 1418
1419 if (CommandLine::ForCurrentProcess()->HasSwitch( 1419 if (CommandLine::ForCurrentProcess()->HasSwitch(
1420 switches::kUseFakeDeviceForMediaStream)) { 1420 switches::kUseFakeDeviceForMediaStream)) {
1421 DVLOG(1) << "Using fake device"; 1421 DVLOG(1) << "Using fake device";
1422 UseFakeDevice(); 1422 UseFakeDevice();
1423 } 1423 }
1424 } 1424 }
1425 1425
1426 void MediaStreamManager::Opened(MediaStreamType stream_type, 1426 void MediaStreamManager::Opened(MediaStreamType stream_type,
1427 int capture_session_id) { 1427 int capture_session_id) {
1428 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1428 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1429 DVLOG(1) << "Opened({stream_type = " << stream_type << "} " 1429 DVLOG(1) << "Opened({stream_type = " << stream_type << "} "
1430 << "{capture_session_id = " << capture_session_id << "})"; 1430 << "{capture_session_id = " << capture_session_id << "})";
1431 // Find the request(s) containing this device and mark it as used. 1431 // Find the request(s) containing this device and mark it as used.
1432 // It can be used in several requests since the same device can be 1432 // It can be used in several requests since the same device can be
1433 // requested from the same web page. 1433 // requested from the same web page.
1434 for (DeviceRequests::iterator request_it = requests_.begin(); 1434 for (DeviceRequests::iterator request_it = requests_.begin();
1435 request_it != requests_.end(); ++request_it) { 1435 request_it != requests_.end(); ++request_it) {
1436 const std::string& label = request_it->first; 1436 const std::string& label = request_it->first;
1437 DeviceRequest* request = request_it->second; 1437 DeviceRequest* request = request_it->second;
1438 StreamDeviceInfoArray* devices = &(request->devices); 1438 StreamDeviceInfoArray* devices = &(request->devices);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1491 label), 1491 label),
1492 base::Bind(&MediaStreamManager::OnMediaStreamUIWindowId, 1492 base::Bind(&MediaStreamManager::OnMediaStreamUIWindowId,
1493 base::Unretained(this), 1493 base::Unretained(this),
1494 request->video_type(), 1494 request->video_type(),
1495 request->devices)); 1495 request->devices));
1496 } 1496 }
1497 } 1497 }
1498 1498
1499 void MediaStreamManager::Closed(MediaStreamType stream_type, 1499 void MediaStreamManager::Closed(MediaStreamType stream_type,
1500 int capture_session_id) { 1500 int capture_session_id) {
1501 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1501 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1502 } 1502 }
1503 1503
1504 void MediaStreamManager::DevicesEnumerated( 1504 void MediaStreamManager::DevicesEnumerated(
1505 MediaStreamType stream_type, const StreamDeviceInfoArray& devices) { 1505 MediaStreamType stream_type, const StreamDeviceInfoArray& devices) {
1506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1506 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1507 DVLOG(1) << "DevicesEnumerated(" 1507 DVLOG(1) << "DevicesEnumerated("
1508 << "{stream_type = " << stream_type << "})" << std::endl; 1508 << "{stream_type = " << stream_type << "})" << std::endl;
1509 1509
1510 std::string log_message = "New device enumeration result:\n" + 1510 std::string log_message = "New device enumeration result:\n" +
1511 GetLogMessageString(stream_type, devices); 1511 GetLogMessageString(stream_type, devices);
1512 SendMessageToNativeLog(log_message); 1512 SendMessageToNativeLog(log_message);
1513 1513
1514 // Only cache the device list when the device list has been changed. 1514 // Only cache the device list when the device list has been changed.
1515 bool need_update_clients = false; 1515 bool need_update_clients = false;
1516 EnumerationCache* cache = 1516 EnumerationCache* cache =
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1587 1587
1588 // static 1588 // static
1589 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { 1589 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) {
1590 BrowserThread::PostTask( 1590 BrowserThread::PostTask(
1591 BrowserThread::UI, FROM_HERE, 1591 BrowserThread::UI, FROM_HERE,
1592 base::Bind(DoAddLogMessage, message)); 1592 base::Bind(DoAddLogMessage, message));
1593 } 1593 }
1594 1594
1595 void MediaStreamManager::AddLogMessageOnIOThread(const std::string& message) { 1595 void MediaStreamManager::AddLogMessageOnIOThread(const std::string& message) {
1596 // Get render process ids on the IO thread. 1596 // Get render process ids on the IO thread.
1597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1597 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1598 1598
1599 // Grab all unique process ids that request a MediaStream or have a 1599 // Grab all unique process ids that request a MediaStream or have a
1600 // MediaStream running. 1600 // MediaStream running.
1601 std::set<int> requesting_process_ids; 1601 std::set<int> requesting_process_ids;
1602 for (DeviceRequests::const_iterator it = requests_.begin(); 1602 for (DeviceRequests::const_iterator it = requests_.begin();
1603 it != requests_.end(); ++it) { 1603 it != requests_.end(); ++it) {
1604 DeviceRequest* request = it->second; 1604 DeviceRequest* request = it->second;
1605 if (request->request_type == MEDIA_GENERATE_STREAM) 1605 if (request->request_type == MEDIA_GENERATE_STREAM)
1606 requesting_process_ids.insert(request->requesting_process_id); 1606 requesting_process_ids.insert(request->requesting_process_id);
1607 } 1607 }
1608 1608
1609 // MediaStreamManager is a singleton in BrowserMainLoop, which owns the UI 1609 // MediaStreamManager is a singleton in BrowserMainLoop, which owns the UI
1610 // thread. MediaStreamManager has the same lifetime as the UI thread, so it is 1610 // thread. MediaStreamManager has the same lifetime as the UI thread, so it is
1611 // safe to use base::Unretained. 1611 // safe to use base::Unretained.
1612 BrowserThread::PostTask( 1612 BrowserThread::PostTask(
1613 BrowserThread::UI, 1613 BrowserThread::UI,
1614 FROM_HERE, 1614 FROM_HERE,
1615 base::Bind(&MediaStreamManager::AddLogMessageOnUIThread, 1615 base::Bind(&MediaStreamManager::AddLogMessageOnUIThread,
1616 base::Unretained(this), 1616 base::Unretained(this),
1617 requesting_process_ids, 1617 requesting_process_ids,
1618 message)); 1618 message));
1619 } 1619 }
1620 1620
1621 void MediaStreamManager::AddLogMessageOnUIThread( 1621 void MediaStreamManager::AddLogMessageOnUIThread(
1622 const std::set<int>& requesting_process_ids, 1622 const std::set<int>& requesting_process_ids,
1623 const std::string& message) { 1623 const std::string& message) {
1624 #if defined(ENABLE_WEBRTC) 1624 #if defined(ENABLE_WEBRTC)
1625 // Must be on the UI thread to access RenderProcessHost from process ID. 1625 // Must be on the UI thread to access RenderProcessHost from process ID.
1626 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1626 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1627 1627
1628 for (std::set<int>::const_iterator it = requesting_process_ids.begin(); 1628 for (std::set<int>::const_iterator it = requesting_process_ids.begin();
1629 it != requesting_process_ids.end(); ++it) { 1629 it != requesting_process_ids.end(); ++it) {
1630 // Log the message to all renderers that are requesting a MediaStream or 1630 // Log the message to all renderers that are requesting a MediaStream or
1631 // have a MediaStream running. 1631 // have a MediaStream running.
1632 content::RenderProcessHostImpl* render_process_host_impl = 1632 content::RenderProcessHostImpl* render_process_host_impl =
1633 static_cast<content::RenderProcessHostImpl*>( 1633 static_cast<content::RenderProcessHostImpl*>(
1634 content::RenderProcessHost::FromID(*it)); 1634 content::RenderProcessHost::FromID(*it));
1635 if (render_process_host_impl) 1635 if (render_process_host_impl)
1636 render_process_host_impl->WebRtcLogMessage(message); 1636 render_process_host_impl->WebRtcLogMessage(message);
1637 } 1637 }
1638 #endif 1638 #endif
1639 } 1639 }
1640 1640
1641 void MediaStreamManager::HandleAccessRequestResponse( 1641 void MediaStreamManager::HandleAccessRequestResponse(
1642 const std::string& label, 1642 const std::string& label,
1643 const MediaStreamDevices& devices, 1643 const MediaStreamDevices& devices,
1644 content::MediaStreamRequestResult result) { 1644 content::MediaStreamRequestResult result) {
1645 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1645 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1646 DVLOG(1) << "HandleAccessRequestResponse(" 1646 DVLOG(1) << "HandleAccessRequestResponse("
1647 << ", {label = " << label << "})"; 1647 << ", {label = " << label << "})";
1648 1648
1649 DeviceRequest* request = FindRequest(label); 1649 DeviceRequest* request = FindRequest(label);
1650 if (!request) { 1650 if (!request) {
1651 // The request has been canceled before the UI returned. 1651 // The request has been canceled before the UI returned.
1652 return; 1652 return;
1653 } 1653 }
1654 1654
1655 if (request->request_type == MEDIA_DEVICE_ACCESS) { 1655 if (request->request_type == MEDIA_DEVICE_ACCESS) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 } 1737 }
1738 1738
1739 if (!found_video && IsVideoMediaType(request->video_type())) 1739 if (!found_video && IsVideoMediaType(request->video_type()))
1740 request->SetState(request->video_type(), MEDIA_REQUEST_STATE_ERROR); 1740 request->SetState(request->video_type(), MEDIA_REQUEST_STATE_ERROR);
1741 1741
1742 if (RequestDone(*request)) 1742 if (RequestDone(*request))
1743 HandleRequestDone(label, request); 1743 HandleRequestDone(label, request);
1744 } 1744 }
1745 1745
1746 void MediaStreamManager::StopMediaStreamFromBrowser(const std::string& label) { 1746 void MediaStreamManager::StopMediaStreamFromBrowser(const std::string& label) {
1747 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1747 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1748 1748
1749 DeviceRequest* request = FindRequest(label); 1749 DeviceRequest* request = FindRequest(label);
1750 if (!request) 1750 if (!request)
1751 return; 1751 return;
1752 1752
1753 // Notify renderers that the devices in the stream will be stopped. 1753 // Notify renderers that the devices in the stream will be stopped.
1754 if (request->requester) { 1754 if (request->requester) {
1755 for (StreamDeviceInfoArray::iterator device_it = request->devices.begin(); 1755 for (StreamDeviceInfoArray::iterator device_it = request->devices.begin();
1756 device_it != request->devices.end(); ++device_it) { 1756 device_it != request->devices.end(); ++device_it) {
1757 request->requester->DeviceStopped(request->requesting_view_id, 1757 request->requester->DeviceStopped(request->requesting_view_id,
1758 label, 1758 label,
1759 *device_it); 1759 *device_it);
1760 } 1760 }
1761 } 1761 }
1762 1762
1763 CancelRequest(label); 1763 CancelRequest(label);
1764 } 1764 }
1765 1765
1766 void MediaStreamManager::UseFakeDevice() { 1766 void MediaStreamManager::UseFakeDevice() {
1767 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1767 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1768 video_capture_manager()->UseFakeDevice(); 1768 video_capture_manager()->UseFakeDevice();
1769 audio_input_device_manager()->UseFakeDevice(); 1769 audio_input_device_manager()->UseFakeDevice();
1770 } 1770 }
1771 1771
1772 void MediaStreamManager::UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy> fake_ui) { 1772 void MediaStreamManager::UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy> fake_ui) {
1773 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1773 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1774 use_fake_ui_ = true; 1774 use_fake_ui_ = true;
1775 fake_ui_ = fake_ui.Pass(); 1775 fake_ui_ = fake_ui.Pass();
1776 } 1776 }
1777 1777
1778 void MediaStreamManager::WillDestroyCurrentMessageLoop() { 1778 void MediaStreamManager::WillDestroyCurrentMessageLoop() {
1779 DVLOG(3) << "MediaStreamManager::WillDestroyCurrentMessageLoop()"; 1779 DVLOG(3) << "MediaStreamManager::WillDestroyCurrentMessageLoop()";
1780 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 1780 DCHECK_EQ(base::MessageLoop::current(), io_loop_);
1781 DCHECK(requests_.empty()); 1781 DCHECK(requests_.empty());
1782 if (device_task_runner_) { 1782 if (device_task_runner_) {
1783 StopMonitoring(); 1783 StopMonitoring();
1784 1784
1785 video_capture_manager_->Unregister(); 1785 video_capture_manager_->Unregister();
1786 audio_input_device_manager_->Unregister(); 1786 audio_input_device_manager_->Unregister();
1787 device_task_runner_ = NULL; 1787 device_task_runner_ = NULL;
1788 } 1788 }
1789 1789
1790 audio_input_device_manager_ = NULL; 1790 audio_input_device_manager_ = NULL;
1791 video_capture_manager_ = NULL; 1791 video_capture_manager_ = NULL;
1792 } 1792 }
1793 1793
1794 void MediaStreamManager::NotifyDevicesChanged( 1794 void MediaStreamManager::NotifyDevicesChanged(
1795 MediaStreamType stream_type, 1795 MediaStreamType stream_type,
1796 const StreamDeviceInfoArray& devices) { 1796 const StreamDeviceInfoArray& devices) {
1797 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1797 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1798 MediaObserver* media_observer = 1798 MediaObserver* media_observer =
1799 GetContentClient()->browser()->GetMediaObserver(); 1799 GetContentClient()->browser()->GetMediaObserver();
1800 if (media_observer == NULL) 1800 if (media_observer == NULL)
1801 return; 1801 return;
1802 1802
1803 // Map the devices to MediaStreamDevices. 1803 // Map the devices to MediaStreamDevices.
1804 MediaStreamDevices new_devices; 1804 MediaStreamDevices new_devices;
1805 for (StreamDeviceInfoArray::const_iterator it = devices.begin(); 1805 for (StreamDeviceInfoArray::const_iterator it = devices.begin();
1806 it != devices.end(); ++it) { 1806 it != devices.end(); ++it) {
1807 new_devices.push_back(it->device); 1807 new_devices.push_back(it->device);
1808 } 1808 }
1809 1809
1810 if (IsAudioMediaType(stream_type)) { 1810 if (IsAudioMediaType(stream_type)) {
1811 MediaCaptureDevicesImpl::GetInstance()->OnAudioCaptureDevicesChanged( 1811 MediaCaptureDevicesImpl::GetInstance()->OnAudioCaptureDevicesChanged(
1812 new_devices); 1812 new_devices);
1813 media_observer->OnAudioCaptureDevicesChanged(); 1813 media_observer->OnAudioCaptureDevicesChanged();
1814 } else if (IsVideoMediaType(stream_type)) { 1814 } else if (IsVideoMediaType(stream_type)) {
1815 MediaCaptureDevicesImpl::GetInstance()->OnVideoCaptureDevicesChanged( 1815 MediaCaptureDevicesImpl::GetInstance()->OnVideoCaptureDevicesChanged(
1816 new_devices); 1816 new_devices);
1817 media_observer->OnVideoCaptureDevicesChanged(); 1817 media_observer->OnVideoCaptureDevicesChanged();
1818 } else { 1818 } else {
1819 NOTREACHED(); 1819 NOTREACHED();
1820 } 1820 }
1821 } 1821 }
1822 1822
1823 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { 1823 bool MediaStreamManager::RequestDone(const DeviceRequest& request) const {
1824 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1824 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1825 1825
1826 const bool requested_audio = IsAudioMediaType(request.audio_type()); 1826 const bool requested_audio = IsAudioMediaType(request.audio_type());
1827 const bool requested_video = IsVideoMediaType(request.video_type()); 1827 const bool requested_video = IsVideoMediaType(request.video_type());
1828 1828
1829 const bool audio_done = 1829 const bool audio_done =
1830 !requested_audio || 1830 !requested_audio ||
1831 request.state(request.audio_type()) == MEDIA_REQUEST_STATE_DONE || 1831 request.state(request.audio_type()) == MEDIA_REQUEST_STATE_DONE ||
1832 request.state(request.audio_type()) == MEDIA_REQUEST_STATE_ERROR; 1832 request.state(request.audio_type()) == MEDIA_REQUEST_STATE_ERROR;
1833 if (!audio_done) 1833 if (!audio_done)
1834 return false; 1834 return false;
(...skipping 14 matching lines...) Expand all
1849 return video_capture_manager(); 1849 return video_capture_manager();
1850 } else if (IsAudioMediaType(stream_type)) { 1850 } else if (IsAudioMediaType(stream_type)) {
1851 return audio_input_device_manager(); 1851 return audio_input_device_manager();
1852 } 1852 }
1853 NOTREACHED(); 1853 NOTREACHED();
1854 return NULL; 1854 return NULL;
1855 } 1855 }
1856 1856
1857 void MediaStreamManager::OnDevicesChanged( 1857 void MediaStreamManager::OnDevicesChanged(
1858 base::SystemMonitor::DeviceType device_type) { 1858 base::SystemMonitor::DeviceType device_type) {
1859 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1859 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1860 1860
1861 // NOTE: This method is only called in response to physical audio/video device 1861 // NOTE: This method is only called in response to physical audio/video device
1862 // changes (from the operating system). 1862 // changes (from the operating system).
1863 1863
1864 MediaStreamType stream_type; 1864 MediaStreamType stream_type;
1865 if (device_type == base::SystemMonitor::DEVTYPE_AUDIO_CAPTURE) { 1865 if (device_type == base::SystemMonitor::DEVTYPE_AUDIO_CAPTURE) {
1866 stream_type = MEDIA_DEVICE_AUDIO_CAPTURE; 1866 stream_type = MEDIA_DEVICE_AUDIO_CAPTURE;
1867 } else if (device_type == base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE) { 1867 } else if (device_type == base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE) {
1868 stream_type = MEDIA_DEVICE_VIDEO_CAPTURE; 1868 stream_type = MEDIA_DEVICE_VIDEO_CAPTURE;
1869 } else { 1869 } else {
1870 return; // Uninteresting device change. 1870 return; // Uninteresting device change.
1871 } 1871 }
1872 1872
1873 // Always do enumeration even though some enumeration is in progress, 1873 // Always do enumeration even though some enumeration is in progress,
1874 // because those enumeration commands could be sent before these devices 1874 // because those enumeration commands could be sent before these devices
1875 // change. 1875 // change.
1876 ++active_enumeration_ref_count_[stream_type]; 1876 ++active_enumeration_ref_count_[stream_type];
1877 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); 1877 GetDeviceManager(stream_type)->EnumerateDevices(stream_type);
1878 } 1878 }
1879 1879
1880 void MediaStreamManager::OnMediaStreamUIWindowId(MediaStreamType video_type, 1880 void MediaStreamManager::OnMediaStreamUIWindowId(MediaStreamType video_type,
1881 StreamDeviceInfoArray devices, 1881 StreamDeviceInfoArray devices,
1882 gfx::NativeViewId window_id) { 1882 gfx::NativeViewId window_id) {
1883 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1883 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1884 if (!window_id) 1884 if (!window_id)
1885 return; 1885 return;
1886 1886
1887 // Pass along for desktop capturing. Ignored for other stream types. 1887 // Pass along for desktop capturing. Ignored for other stream types.
1888 if (video_type == MEDIA_DESKTOP_VIDEO_CAPTURE) { 1888 if (video_type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
1889 for (StreamDeviceInfoArray::iterator it = devices.begin(); 1889 for (StreamDeviceInfoArray::iterator it = devices.begin();
1890 it != devices.end(); 1890 it != devices.end();
1891 ++it) { 1891 ++it) {
1892 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { 1892 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
1893 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, 1893 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id,
1894 window_id); 1894 window_id);
1895 break; 1895 break;
1896 } 1896 }
1897 } 1897 }
1898 } 1898 }
1899 } 1899 }
1900 1900
1901 } // namespace content 1901 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698