Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1749)

Unified Diff: content/browser/renderer_host/media/media_stream_manager.cc

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
Patch Set: ready for review. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698