 Chromium Code Reviews
 Chromium Code Reviews Issue 10662049:
  Move the device enumerate/open/close work to device thread from IO thread  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 10662049:
  Move the device enumerate/open/close work to device thread from IO thread  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| Index: content/browser/renderer_host/media/media_stream_manager.cc | 
| diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc | 
| index d6b2e60dbaaff16919a76ce2ebce97105ad392d1..676955ef8147ab27f24512b2f95ee0a3a259606d 100644 | 
| --- a/content/browser/renderer_host/media/media_stream_manager.cc | 
| +++ b/content/browser/renderer_host/media/media_stream_manager.cc | 
| @@ -20,7 +20,6 @@ | 
| #include "content/public/browser/content_browser_client.h" | 
| #include "content/public/browser/media_observer.h" | 
| #include "googleurl/src/gurl.h" | 
| -#include "media/audio/audio_manager.h" | 
| using content::BrowserThread; | 
| @@ -116,24 +115,28 @@ struct MediaStreamManager::DeviceRequest { | 
| StreamDeviceInfoArray video_devices; | 
| }; | 
| +// Static function to stop and delete the device thread on blocking pool. | 
| +void ShutdownDeviceThread(base::Thread* thread) { | 
| + thread->Stop(); | 
| + delete thread; | 
| +} | 
| + | 
| // static | 
| MediaStreamManager* MediaStreamManager::GetForResourceContext( | 
| - content::ResourceContext* resource_context, | 
| - media::AudioManager* audio_manager) { | 
| + content::ResourceContext* resource_context) { | 
| MediaStreamManager* rv = static_cast<MediaStreamManager*>( | 
| resource_context->GetUserData(kMediaStreamManagerKeyName)); | 
| if (!rv) { | 
| - rv = new MediaStreamManager(audio_manager); | 
| + rv = new MediaStreamManager(); | 
| resource_context->SetUserData(kMediaStreamManagerKeyName, rv); | 
| } | 
| return rv; | 
| } | 
| -MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) | 
| +MediaStreamManager::MediaStreamManager() | 
| : ALLOW_THIS_IN_INITIALIZER_LIST( | 
| device_settings_(new MediaStreamDeviceSettings(this))), | 
| - enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), | 
| - audio_manager_(audio_manager) { | 
| + enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| } | 
| @@ -143,12 +146,18 @@ MediaStreamManager::~MediaStreamManager() { | 
| video_capture_manager_->Unregister(); | 
| if (audio_input_device_manager_.get()) | 
| audio_input_device_manager_->Unregister(); | 
| + | 
| + if (device_thread_.get()) { | 
| + content::BrowserThread::PostBlockingPoolTask( | 
| + FROM_HERE, base::Bind(&ShutdownDeviceThread, device_thread_.release())); | 
| + } | 
| } | 
| VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| + EnsureDeviceThread(); | 
| if (!video_capture_manager_.get()) { | 
| - video_capture_manager_ = new VideoCaptureManager(); | 
| + video_capture_manager_ = new VideoCaptureManager(GetMessageLoop()); | 
| video_capture_manager_->Register(this); | 
| } | 
| return video_capture_manager_.get(); | 
| @@ -156,8 +165,10 @@ VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 
| AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| + EnsureDeviceThread(); | 
| if (!audio_input_device_manager_.get()) { | 
| - audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); | 
| + audio_input_device_manager_ = new AudioInputDeviceManager( | 
| + GetMessageLoop()); | 
| audio_input_device_manager_->Register(this); | 
| } | 
| return audio_input_device_manager_.get(); | 
| @@ -367,6 +378,15 @@ void MediaStreamManager::StartEnumeration( | 
| (*label) = request_label; | 
| } | 
| +void MediaStreamManager::EnsureDeviceThread() { | 
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| + if (device_thread_.get()) | 
| + return; | 
| + | 
| + device_thread_.reset(new base::Thread("MediaStreamDeviceThread")); | 
| + CHECK(device_thread_->Start()); | 
| +} | 
| + | 
| void MediaStreamManager::Opened(MediaStreamType stream_type, | 
| int capture_session_id) { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| @@ -613,6 +633,10 @@ void MediaStreamManager::UseFakeDevice() { | 
| device_settings_->UseFakeUI(); | 
| } | 
| +scoped_refptr<base::MessageLoopProxy> MediaStreamManager::GetMessageLoop() { | 
| 
scherkus (not reviewing)
2012/06/28 01:24:20
it still seems unfortunate to expose this for the
 | 
| + return device_thread_.get() ? device_thread_->message_loop_proxy() : NULL; | 
| +} | 
| + | 
| void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { | 
| content::MediaObserver* media_observer = | 
| content::GetContentClient()->browser()->GetMediaObserver(); |