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 23 matching lines...) Expand all Loading... |
34 #include "content/public/common/content_client.h" | 34 #include "content/public/common/content_client.h" |
35 #include "content/public/common/content_switches.h" | 35 #include "content/public/common/content_switches.h" |
36 #include "content/public/common/media_stream_request.h" | 36 #include "content/public/common/media_stream_request.h" |
37 #include "media/audio/audio_manager_base.h" | 37 #include "media/audio/audio_manager_base.h" |
38 #include "media/audio/audio_parameters.h" | 38 #include "media/audio/audio_parameters.h" |
39 #include "media/base/channel_layout.h" | 39 #include "media/base/channel_layout.h" |
40 #include "media/base/media_switches.h" | 40 #include "media/base/media_switches.h" |
41 #include "media/video/capture/video_capture_device_factory.h" | 41 #include "media/video/capture/video_capture_device_factory.h" |
42 #include "url/gurl.h" | 42 #include "url/gurl.h" |
43 | 43 |
44 #if defined(OS_WIN) | |
45 #include "base/win/scoped_com_initializer.h" | |
46 #endif | |
47 | |
48 #if defined(OS_CHROMEOS) | 44 #if defined(OS_CHROMEOS) |
49 #include "chromeos/audio/cras_audio_handler.h" | 45 #include "chromeos/audio/cras_audio_handler.h" |
50 #endif | 46 #endif |
51 | 47 |
52 namespace content { | 48 namespace content { |
53 | 49 |
54 // Forward declaration of DeviceMonitorMac and its only useable method. | 50 // Forward declaration of DeviceMonitorMac and its only useable method. |
55 class DeviceMonitorMac { | 51 class DeviceMonitorMac { |
56 public: | 52 public: |
57 void StartMonitoring( | 53 void StartMonitoring( |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 | 376 |
381 MediaStreamManager::EnumerationCache::EnumerationCache() | 377 MediaStreamManager::EnumerationCache::EnumerationCache() |
382 : valid(false) { | 378 : valid(false) { |
383 } | 379 } |
384 | 380 |
385 MediaStreamManager::EnumerationCache::~EnumerationCache() { | 381 MediaStreamManager::EnumerationCache::~EnumerationCache() { |
386 } | 382 } |
387 | 383 |
388 MediaStreamManager::MediaStreamManager() | 384 MediaStreamManager::MediaStreamManager() |
389 : audio_manager_(NULL), | 385 : audio_manager_(NULL), |
390 #if defined(OS_WIN) | |
391 video_capture_thread_("VideoCaptureThread"), | |
392 #endif | |
393 monitoring_started_(false), | 386 monitoring_started_(false), |
394 #if defined(OS_CHROMEOS) | 387 #if defined(OS_CHROMEOS) |
395 has_checked_keyboard_mic_(false), | 388 has_checked_keyboard_mic_(false), |
396 #endif | 389 #endif |
397 io_loop_(NULL), | 390 io_loop_(NULL), |
398 use_fake_ui_(false) {} | 391 use_fake_ui_(false) {} |
399 | 392 |
400 MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) | 393 MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) |
401 : audio_manager_(audio_manager), | 394 : audio_manager_(audio_manager), |
402 #if defined(OS_WIN) | |
403 video_capture_thread_("VideoCaptureThread"), | |
404 #endif | |
405 monitoring_started_(false), | 395 monitoring_started_(false), |
406 #if defined(OS_CHROMEOS) | 396 #if defined(OS_CHROMEOS) |
407 has_checked_keyboard_mic_(false), | 397 has_checked_keyboard_mic_(false), |
408 #endif | 398 #endif |
409 io_loop_(NULL), | 399 io_loop_(NULL), |
410 use_fake_ui_(false) { | 400 use_fake_ui_(false) { |
411 DCHECK(audio_manager_); | 401 DCHECK(audio_manager_); |
412 memset(active_enumeration_ref_count_, 0, | 402 memset(active_enumeration_ref_count_, 0, |
413 sizeof(active_enumeration_ref_count_)); | 403 sizeof(active_enumeration_ref_count_)); |
414 | 404 |
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 void MediaStreamManager::InitializeDeviceManagersOnIOThread() { | 1615 void MediaStreamManager::InitializeDeviceManagersOnIOThread() { |
1626 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is | 1616 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is |
1627 // fixed. | 1617 // fixed. |
1628 tracked_objects::ScopedTracker tracking_profile1( | 1618 tracked_objects::ScopedTracker tracking_profile1( |
1629 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1619 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1630 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 1")); | 1620 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 1")); |
1631 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1621 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1632 if (device_task_runner_.get()) | 1622 if (device_task_runner_.get()) |
1633 return; | 1623 return; |
1634 | 1624 |
| 1625 // On Windows this must be a COM STA thread to avoid crashes on enumeration of |
| 1626 // buggy third party Direct Show modules, http://crbug.com/428958. |
1635 device_task_runner_ = audio_manager_->GetWorkerTaskRunner(); | 1627 device_task_runner_ = audio_manager_->GetWorkerTaskRunner(); |
1636 | 1628 |
1637 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is | 1629 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is |
1638 // fixed. | 1630 // fixed. |
1639 tracked_objects::ScopedTracker tracking_profile2( | 1631 tracked_objects::ScopedTracker tracking_profile2( |
1640 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1632 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1641 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 2")); | 1633 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 2")); |
1642 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); | 1634 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); |
1643 audio_input_device_manager_->Register(this, device_task_runner_); | 1635 audio_input_device_manager_->Register(this, device_task_runner_); |
1644 | 1636 |
(...skipping 13 matching lines...) Expand all Loading... |
1658 } | 1650 } |
1659 | 1651 |
1660 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is | 1652 // TODO(dalecurtis): Remove ScopedTracker below once crbug.com/457525 is |
1661 // fixed. | 1653 // fixed. |
1662 tracked_objects::ScopedTracker tracking_profile4( | 1654 tracked_objects::ScopedTracker tracking_profile4( |
1663 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1655 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
1664 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 4")); | 1656 "457525 MediaStreamManager::InitializeDeviceManagersOnIOThread 4")); |
1665 video_capture_manager_ = | 1657 video_capture_manager_ = |
1666 new VideoCaptureManager(media::VideoCaptureDeviceFactory::CreateFactory( | 1658 new VideoCaptureManager(media::VideoCaptureDeviceFactory::CreateFactory( |
1667 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI))); | 1659 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI))); |
1668 #if defined(OS_WIN) | |
1669 // Use an STA Video Capture Thread to try to avoid crashes on enumeration of | |
1670 // buggy third party Direct Show modules, http://crbug.com/428958. | |
1671 video_capture_thread_.init_com_with_mta(false); | |
1672 CHECK(video_capture_thread_.Start()); | |
1673 video_capture_manager_->Register(this, | |
1674 video_capture_thread_.message_loop_proxy()); | |
1675 #else | |
1676 video_capture_manager_->Register(this, device_task_runner_); | 1660 video_capture_manager_->Register(this, device_task_runner_); |
1677 #endif | |
1678 } | 1661 } |
1679 | 1662 |
1680 void MediaStreamManager::Opened(MediaStreamType stream_type, | 1663 void MediaStreamManager::Opened(MediaStreamType stream_type, |
1681 int capture_session_id) { | 1664 int capture_session_id) { |
1682 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1665 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1683 DVLOG(1) << "Opened({stream_type = " << stream_type << "} " | 1666 DVLOG(1) << "Opened({stream_type = " << stream_type << "} " |
1684 << "{capture_session_id = " << capture_session_id << "})"; | 1667 << "{capture_session_id = " << capture_session_id << "})"; |
1685 // Find the request(s) containing this device and mark it as used. | 1668 // Find the request(s) containing this device and mark it as used. |
1686 // It can be used in several requests since the same device can be | 1669 // It can be used in several requests since the same device can be |
1687 // requested from the same web page. | 1670 // requested from the same web page. |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2197 } | 2180 } |
2198 } | 2181 } |
2199 | 2182 |
2200 void MediaStreamManager::SetKeyboardMicOnDeviceThread() { | 2183 void MediaStreamManager::SetKeyboardMicOnDeviceThread() { |
2201 DCHECK(device_task_runner_->BelongsToCurrentThread()); | 2184 DCHECK(device_task_runner_->BelongsToCurrentThread()); |
2202 audio_manager_->SetHasKeyboardMic(); | 2185 audio_manager_->SetHasKeyboardMic(); |
2203 } | 2186 } |
2204 #endif | 2187 #endif |
2205 | 2188 |
2206 } // namespace content | 2189 } // namespace content |
OLD | NEW |