| Index: content/browser/renderer_host/media/media_stream_manager.h | 
| diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h | 
| index 17f863e90fda9b5140ee47983298bb4f17ac1026..3082ac0f76fd6ec5434b6a81657bcb4ba6849261 100644 | 
| --- a/content/browser/renderer_host/media/media_stream_manager.h | 
| +++ b/content/browser/renderer_host/media/media_stream_manager.h | 
| @@ -29,19 +29,15 @@ | 
| #include "base/basictypes.h" | 
| #include "base/memory/scoped_ptr.h" | 
| #include "base/memory/ref_counted.h" | 
| -#include "base/supports_user_data.h" | 
| +#include "base/threading/thread.h" | 
| +#include "base/win/scoped_com_initializer.h" | 
| #include "content/browser/renderer_host/media/media_stream_provider.h" | 
| #include "content/browser/renderer_host/media/media_stream_settings_requester.h" | 
| #include "content/common/media/media_stream_options.h" | 
| #include "content/common/content_export.h" | 
| +#include "content/public/browser/browser_thread.h" | 
|  | 
| -namespace content { | 
| -class ResourceContext; | 
| -} | 
| - | 
| -namespace media { | 
| -class AudioManager; | 
| -} | 
| +using base::win::ScopedCOMInitializer; | 
|  | 
| namespace media_stream { | 
|  | 
| @@ -50,22 +46,31 @@ class MediaStreamDeviceSettings; | 
| class MediaStreamRequester; | 
| class VideoCaptureManager; | 
|  | 
| +// Thread that enters MTA on windows, and is base::Thread on linux and mac. | 
| +class DeviceThread : public base::Thread { | 
| + public: | 
| +  explicit DeviceThread(const char* name) | 
| +      : base::Thread(name), | 
| +        com_init_(ScopedCOMInitializer::kMTA) {} | 
| + | 
| + private: | 
| +  ScopedCOMInitializer com_init_; | 
| +  DISALLOW_COPY_AND_ASSIGN(DeviceThread); | 
| +}; | 
| + | 
| // MediaStreamManager is used to generate and close new media devices, not to | 
| // start the media flow. | 
| // The classes requesting new media streams are answered using | 
| // MediaStreamManager::Listener. | 
| class CONTENT_EXPORT MediaStreamManager | 
| : public MediaStreamProviderListener, | 
| -      public SettingsRequester, | 
| -      public base::SupportsUserData::Data { | 
| +      public SettingsRequester { | 
| public: | 
| -  // Returns the MediaStreamManager for the given ResourceContext. If it hasn't | 
| -  // been created yet, it will be constructed with the given AudioManager. | 
| -  static MediaStreamManager* GetForResourceContext( | 
| -      content::ResourceContext* resource_context, | 
| -      media::AudioManager* audio_manager); | 
| +  // This class takes the ownerships of the |audio_input_device_manager| | 
| +  // and |video_capture_manager|. | 
| +  MediaStreamManager(AudioInputDeviceManager* audio_input_device_manager, | 
| +                     VideoCaptureManager* video_capture_manager); | 
|  | 
| -  explicit MediaStreamManager(media::AudioManager* audio_manager); | 
| virtual ~MediaStreamManager(); | 
|  | 
| // Used to access VideoCaptureManager. | 
| @@ -130,6 +135,8 @@ class CONTENT_EXPORT MediaStreamManager | 
|  | 
| // Used by unit test to make sure fake devices are used instead of a real | 
| // devices, which is needed for server based testing. | 
| +  // TODO(xians): Remove this hack since we can create our own | 
| +  // MediaStreamManager in our unit tests. | 
| void UseFakeDevice(); | 
|  | 
| private: | 
| @@ -149,9 +156,16 @@ class CONTENT_EXPORT MediaStreamManager | 
| void StartEnumeration(DeviceRequest* new_request, | 
| std::string* label); | 
|  | 
| +  // Helper to ensure the device thread and pass the message loop to device | 
| +  // managers, it also register itself as the listener to the device managers. | 
| +  void EnsureDeviceThreadAndListener(); | 
| + | 
| +  // Device thread shared by VideoCaptureManager and AudioInputDeviceManager. | 
| +  scoped_ptr<base::Thread> device_thread_; | 
| + | 
| scoped_ptr<MediaStreamDeviceSettings> device_settings_; | 
| -  scoped_refptr<VideoCaptureManager> video_capture_manager_; | 
| scoped_refptr<AudioInputDeviceManager> audio_input_device_manager_; | 
| +  scoped_refptr<VideoCaptureManager> video_capture_manager_; | 
|  | 
| // Keeps track of device types currently being enumerated to not enumerate | 
| // when not necessary. | 
| @@ -160,7 +174,6 @@ class CONTENT_EXPORT MediaStreamManager | 
| // All non-closed request. | 
| typedef std::map<std::string, DeviceRequest> DeviceRequests; | 
| DeviceRequests requests_; | 
| -  media::AudioManager* audio_manager_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(MediaStreamManager); | 
| }; | 
|  |