| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 DCHECK(video_capture_manager_.get()); | 477 DCHECK(video_capture_manager_.get()); |
| 478 return video_capture_manager_.get(); | 478 return video_capture_manager_.get(); |
| 479 } | 479 } |
| 480 | 480 |
| 481 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { | 481 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { |
| 482 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 482 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 483 DCHECK(audio_input_device_manager_.get()); | 483 DCHECK(audio_input_device_manager_.get()); |
| 484 return audio_input_device_manager_.get(); | 484 return audio_input_device_manager_.get(); |
| 485 } | 485 } |
| 486 | 486 |
| 487 AudioOutputDeviceEnumerator* | |
| 488 MediaStreamManager::audio_output_device_enumerator() { | |
| 489 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 490 DCHECK(audio_output_device_enumerator_.get()); | |
| 491 return audio_output_device_enumerator_.get(); | |
| 492 } | |
| 493 | |
| 494 MediaDevicesManager* MediaStreamManager::media_devices_manager() { | 487 MediaDevicesManager* MediaStreamManager::media_devices_manager() { |
| 495 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 488 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 496 DCHECK(media_devices_manager_.get()); | 489 DCHECK(media_devices_manager_.get()); |
| 497 return media_devices_manager_.get(); | 490 return media_devices_manager_.get(); |
| 498 } | 491 } |
| 499 | 492 |
| 500 std::string MediaStreamManager::MakeMediaAccessRequest( | 493 std::string MediaStreamManager::MakeMediaAccessRequest( |
| 501 int render_process_id, | 494 int render_process_id, |
| 502 int render_frame_id, | 495 int render_frame_id, |
| 503 int page_request_id, | 496 int page_request_id, |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 | 755 |
| 763 void MediaStreamManager::DoEnumerateDevices(const std::string& label) { | 756 void MediaStreamManager::DoEnumerateDevices(const std::string& label) { |
| 764 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 757 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 765 DeviceRequest* request = FindRequest(label); | 758 DeviceRequest* request = FindRequest(label); |
| 766 if (!request) | 759 if (!request) |
| 767 return; // This can happen if the request has been canceled. | 760 return; // This can happen if the request has been canceled. |
| 768 | 761 |
| 769 if (request->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT) { | 762 if (request->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT) { |
| 770 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); | 763 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); |
| 771 request->SetState(MEDIA_DEVICE_AUDIO_OUTPUT, MEDIA_REQUEST_STATE_REQUESTED); | 764 request->SetState(MEDIA_DEVICE_AUDIO_OUTPUT, MEDIA_REQUEST_STATE_REQUESTED); |
| 765 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; |
| 766 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true; |
| 772 media_devices_manager_->EnumerateDevices( | 767 media_devices_manager_->EnumerateDevices( |
| 773 {{false /* audio input */, false /* video input*/, | 768 devices_to_enumerate, |
| 774 true /* audio output */}}, | |
| 775 base::Bind(&MediaStreamManager::AudioOutputDevicesEnumerated, | 769 base::Bind(&MediaStreamManager::AudioOutputDevicesEnumerated, |
| 776 base::Unretained(this), label)); | 770 base::Unretained(this), label)); |
| 777 return; | 771 return; |
| 778 } | 772 } |
| 779 | 773 |
| 780 StartEnumeration(request, label); | 774 StartEnumeration(request, label); |
| 781 DVLOG(1) << "Enumerate Devices ({label = " << label << "})"; | 775 DVLOG(1) << "Enumerate Devices ({label = " << label << "})"; |
| 782 } | 776 } |
| 783 | 777 |
| 784 void MediaStreamManager::AudioOutputDevicesEnumerated( | 778 void MediaStreamManager::AudioOutputDevicesEnumerated( |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 if (request_audio_input) | 967 if (request_audio_input) |
| 974 request->SetState(request->audio_type(), MEDIA_REQUEST_STATE_REQUESTED); | 968 request->SetState(request->audio_type(), MEDIA_REQUEST_STATE_REQUESTED); |
| 975 | 969 |
| 976 bool request_video_input = request->video_type() != MEDIA_NO_SERVICE; | 970 bool request_video_input = request->video_type() != MEDIA_NO_SERVICE; |
| 977 if (request_video_input) | 971 if (request_video_input) |
| 978 request->SetState(request->video_type(), MEDIA_REQUEST_STATE_REQUESTED); | 972 request->SetState(request->video_type(), MEDIA_REQUEST_STATE_REQUESTED); |
| 979 | 973 |
| 980 // base::Unretained is safe here because MediaStreamManager is deleted on the | 974 // base::Unretained is safe here because MediaStreamManager is deleted on the |
| 981 // UI thread, after the IO thread has been stopped. | 975 // UI thread, after the IO thread has been stopped. |
| 982 DCHECK(request_audio_input || request_video_input); | 976 DCHECK(request_audio_input || request_video_input); |
| 977 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; |
| 978 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = request_audio_input; |
| 979 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input; |
| 983 media_devices_manager_->EnumerateDevices( | 980 media_devices_manager_->EnumerateDevices( |
| 984 {{request_audio_input, request_video_input, false /* no audio output */}}, | 981 devices_to_enumerate, |
| 985 base::Bind(&MediaStreamManager::DevicesEnumerated, base::Unretained(this), | 982 base::Bind(&MediaStreamManager::DevicesEnumerated, base::Unretained(this), |
| 986 request_audio_input, request_video_input, label)); | 983 request_audio_input, request_video_input, label)); |
| 987 } | 984 } |
| 988 | 985 |
| 989 std::string MediaStreamManager::AddRequest(DeviceRequest* request) { | 986 std::string MediaStreamManager::AddRequest(DeviceRequest* request) { |
| 990 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 987 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 991 | 988 |
| 992 // Create a label for this request and verify it is unique. | 989 // Create a label for this request and verify it is unique. |
| 993 std::string unique_label; | 990 std::string unique_label; |
| 994 do { | 991 do { |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1479 #if defined(OS_WIN) | 1476 #if defined(OS_WIN) |
| 1480 // Use an STA Video Capture Thread to try to avoid crashes on enumeration of | 1477 // Use an STA Video Capture Thread to try to avoid crashes on enumeration of |
| 1481 // buggy third party Direct Show modules, http://crbug.com/428958. | 1478 // buggy third party Direct Show modules, http://crbug.com/428958. |
| 1482 video_capture_thread_.init_com_with_mta(false); | 1479 video_capture_thread_.init_com_with_mta(false); |
| 1483 CHECK(video_capture_thread_.Start()); | 1480 CHECK(video_capture_thread_.Start()); |
| 1484 video_capture_manager_->Register(this, video_capture_thread_.task_runner()); | 1481 video_capture_manager_->Register(this, video_capture_thread_.task_runner()); |
| 1485 #else | 1482 #else |
| 1486 video_capture_manager_->Register(this, device_task_runner_); | 1483 video_capture_manager_->Register(this, device_task_runner_); |
| 1487 #endif | 1484 #endif |
| 1488 | 1485 |
| 1489 audio_output_device_enumerator_.reset(new AudioOutputDeviceEnumerator( | |
| 1490 audio_manager_, AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING)); | |
| 1491 | |
| 1492 media_devices_manager_.reset( | 1486 media_devices_manager_.reset( |
| 1493 new MediaDevicesManager(audio_manager_, video_capture_manager_, this)); | 1487 new MediaDevicesManager(audio_manager_, video_capture_manager_, this)); |
| 1494 } | 1488 } |
| 1495 | 1489 |
| 1496 void MediaStreamManager::Opened(MediaStreamType stream_type, | 1490 void MediaStreamManager::Opened(MediaStreamType stream_type, |
| 1497 int capture_session_id) { | 1491 int capture_session_id) { |
| 1498 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1492 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1499 DVLOG(1) << "Opened({stream_type = " << stream_type << "} " | 1493 DVLOG(1) << "Opened({stream_type = " << stream_type << "} " |
| 1500 << "{capture_session_id = " << capture_session_id << "})"; | 1494 << "{capture_session_id = " << capture_session_id << "})"; |
| 1501 // Find the request(s) containing this device and mark it as used. | 1495 // Find the request(s) containing this device and mark it as used. |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 if (device_task_runner_.get()) { | 1784 if (device_task_runner_.get()) { |
| 1791 media_devices_manager_->StopMonitoring(); | 1785 media_devices_manager_->StopMonitoring(); |
| 1792 | 1786 |
| 1793 video_capture_manager_->Unregister(); | 1787 video_capture_manager_->Unregister(); |
| 1794 audio_input_device_manager_->Unregister(); | 1788 audio_input_device_manager_->Unregister(); |
| 1795 device_task_runner_ = NULL; | 1789 device_task_runner_ = NULL; |
| 1796 } | 1790 } |
| 1797 | 1791 |
| 1798 audio_input_device_manager_ = NULL; | 1792 audio_input_device_manager_ = NULL; |
| 1799 video_capture_manager_ = NULL; | 1793 video_capture_manager_ = NULL; |
| 1800 audio_output_device_enumerator_ = NULL; | |
| 1801 media_devices_manager_ = NULL; | 1794 media_devices_manager_ = NULL; |
| 1802 g_media_stream_manager_tls_ptr.Pointer()->Set(NULL); | 1795 g_media_stream_manager_tls_ptr.Pointer()->Set(NULL); |
| 1803 } | 1796 } |
| 1804 | 1797 |
| 1805 void MediaStreamManager::NotifyDevicesChanged( | 1798 void MediaStreamManager::NotifyDevicesChanged( |
| 1806 MediaDeviceType device_type, | 1799 MediaDeviceType device_type, |
| 1807 const MediaDeviceInfoArray& devices) { | 1800 const MediaDeviceInfoArray& devices) { |
| 1808 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1801 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1809 MediaObserver* media_observer = | 1802 MediaObserver* media_observer = |
| 1810 GetContentClient()->browser()->GetMediaObserver(); | 1803 GetContentClient()->browser()->GetMediaObserver(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2036 request->state(stream_type) == MEDIA_REQUEST_STATE_REQUESTED && | 2029 request->state(stream_type) == MEDIA_REQUEST_STATE_REQUESTED && |
| 2037 (request->audio_type() == stream_type || | 2030 (request->audio_type() == stream_type || |
| 2038 request->video_type() == stream_type)) { | 2031 request->video_type() == stream_type)) { |
| 2039 ProcessEnumerationRequest(labeled_request.first, request, stream_type, | 2032 ProcessEnumerationRequest(labeled_request.first, request, stream_type, |
| 2040 device_infos); | 2033 device_infos); |
| 2041 } | 2034 } |
| 2042 } | 2035 } |
| 2043 } | 2036 } |
| 2044 | 2037 |
| 2045 } // namespace content | 2038 } // namespace content |
| OLD | NEW |