Chromium Code Reviews| 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..514451daffcadefcd3a0db021d4809aad536d5b9 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,29 @@ struct MediaStreamManager::DeviceRequest { |
| StreamDeviceInfoArray video_devices; |
| }; |
| +// Static function to delete the device thread on FILE thread. |
| +void ShutdownOnFileThread(base::Thread* thread) { |
| + DCHECK(thread); |
|
jam
2012/06/26 22:32:01
nit: unnecessary, if it's NULL the next line will
no longer working on chromium
2012/06/27 14:07:16
Done.
|
| + 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 +147,19 @@ MediaStreamManager::~MediaStreamManager() { |
| video_capture_manager_->Unregister(); |
| if (audio_input_device_manager_.get()) |
| audio_input_device_manager_->Unregister(); |
| + |
| + if (device_thread_.get()) { |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
|
jam
2012/06/26 22:32:01
nit: instead of the FILE thread, I would use the b
no longer working on chromium
2012/06/27 14:07:16
Great idea. Thanks for pointing out.
Do you know i
jam
2012/06/27 16:13:14
it uses multiple threads. you can pass in a token
|
| + base::Bind(&ShutdownOnFileThread, |
| + 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 +167,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 +380,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 +635,10 @@ void MediaStreamManager::UseFakeDevice() { |
| device_settings_->UseFakeUI(); |
| } |
| +scoped_refptr<base::MessageLoopProxy> MediaStreamManager::GetMessageLoop() { |
| + return device_thread_.get() ? device_thread_->message_loop_proxy() : NULL; |
|
scherkus (not reviewing)
2012/06/27 00:52:31
I don't think you need this method as in both call
no longer working on chromium
2012/06/27 14:07:16
It is mainly for media_stream_dispatch_host_unitte
|
| +} |
| + |
| void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { |
| content::MediaObserver* media_observer = |
| content::GetContentClient()->browser()->GetMediaObserver(); |