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

Side by Side 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: addressed Magnus' comments. Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/rand_util.h" 12 #include "base/rand_util.h"
13 #include "content/browser/renderer_host/media/audio_input_device_manager.h" 13 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
14 #include "content/browser/renderer_host/media/media_stream_device_settings.h" 14 #include "content/browser/renderer_host/media/media_stream_device_settings.h"
15 #include "content/browser/renderer_host/media/media_stream_requester.h" 15 #include "content/browser/renderer_host/media/media_stream_requester.h"
16 #include "content/browser/renderer_host/media/video_capture_manager.h" 16 #include "content/browser/renderer_host/media/video_capture_manager.h"
17 #include "content/browser/resource_context_impl.h" 17 #include "content/browser/resource_context_impl.h"
18 #include "content/common/media/media_stream_options.h" 18 #include "content/common/media/media_stream_options.h"
19 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/content_browser_client.h" 20 #include "content/public/browser/content_browser_client.h"
21 #include "content/public/browser/media_observer.h" 21 #include "content/public/browser/media_observer.h"
22 #include "googleurl/src/gurl.h" 22 #include "googleurl/src/gurl.h"
23 #include "media/audio/audio_manager.h"
24 23
25 using content::BrowserThread; 24 using content::BrowserThread;
26 25
27 static const char* kMediaStreamManagerKeyName = "content_media_stream_manager"; 26 static const char* kMediaStreamManagerKeyName = "content_media_stream_manager";
28 27
29 namespace media_stream { 28 namespace media_stream {
30 29
31 // Creates a random label used to identify requests. 30 // Creates a random label used to identify requests.
32 static std::string RandomLabel() { 31 static std::string RandomLabel() {
33 // An earlier PeerConnection spec, 32 // An earlier PeerConnection spec,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 std::vector<RequestState> state; 108 std::vector<RequestState> state;
110 RequestType type; 109 RequestType type;
111 int render_process_id; 110 int render_process_id;
112 int render_view_id; 111 int render_view_id;
113 GURL security_origin; 112 GURL security_origin;
114 std::string requested_device_id; 113 std::string requested_device_id;
115 StreamDeviceInfoArray audio_devices; 114 StreamDeviceInfoArray audio_devices;
116 StreamDeviceInfoArray video_devices; 115 StreamDeviceInfoArray video_devices;
117 }; 116 };
118 117
118 // Static function to stop and delete the device thread on blocking pool.
119 void ShutdownDeviceThread(base::Thread* thread) {
120 thread->Stop();
121 delete thread;
122 }
123
119 // static 124 // static
120 MediaStreamManager* MediaStreamManager::GetForResourceContext( 125 MediaStreamManager* MediaStreamManager::GetForResourceContext(
121 content::ResourceContext* resource_context, 126 content::ResourceContext* resource_context) {
122 media::AudioManager* audio_manager) {
123 MediaStreamManager* rv = static_cast<MediaStreamManager*>( 127 MediaStreamManager* rv = static_cast<MediaStreamManager*>(
124 resource_context->GetUserData(kMediaStreamManagerKeyName)); 128 resource_context->GetUserData(kMediaStreamManagerKeyName));
125 if (!rv) { 129 if (!rv) {
126 rv = new MediaStreamManager(audio_manager); 130 rv = new MediaStreamManager();
127 resource_context->SetUserData(kMediaStreamManagerKeyName, rv); 131 resource_context->SetUserData(kMediaStreamManagerKeyName, rv);
128 } 132 }
129 return rv; 133 return rv;
130 } 134 }
131 135
132 MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager) 136 MediaStreamManager::MediaStreamManager()
133 : ALLOW_THIS_IN_INITIALIZER_LIST( 137 : ALLOW_THIS_IN_INITIALIZER_LIST(
134 device_settings_(new MediaStreamDeviceSettings(this))), 138 device_settings_(new MediaStreamDeviceSettings(this))),
135 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), 139 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) {
136 audio_manager_(audio_manager) {
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
138 } 141 }
139 142
140 MediaStreamManager::~MediaStreamManager() { 143 MediaStreamManager::~MediaStreamManager() {
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
142 if (video_capture_manager_.get()) 145 if (video_capture_manager_.get())
143 video_capture_manager_->Unregister(); 146 video_capture_manager_->Unregister();
144 if (audio_input_device_manager_.get()) 147 if (audio_input_device_manager_.get())
145 audio_input_device_manager_->Unregister(); 148 audio_input_device_manager_->Unregister();
149
150 if (device_thread_.get()) {
151 content::BrowserThread::PostBlockingPoolTask(
152 FROM_HERE, base::Bind(&ShutdownDeviceThread, device_thread_.release()));
153 }
146 } 154 }
147 155
148 VideoCaptureManager* MediaStreamManager::video_capture_manager() { 156 VideoCaptureManager* MediaStreamManager::video_capture_manager() {
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
158 EnsureDeviceThread();
150 if (!video_capture_manager_.get()) { 159 if (!video_capture_manager_.get()) {
151 video_capture_manager_ = new VideoCaptureManager(); 160 video_capture_manager_ = new VideoCaptureManager(
161 device_thread_->message_loop_proxy());
152 video_capture_manager_->Register(this); 162 video_capture_manager_->Register(this);
153 } 163 }
154 return video_capture_manager_.get(); 164 return video_capture_manager_.get();
155 } 165 }
156 166
157 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { 167 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() {
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
169 EnsureDeviceThread();
159 if (!audio_input_device_manager_.get()) { 170 if (!audio_input_device_manager_.get()) {
160 audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_); 171 audio_input_device_manager_ = new AudioInputDeviceManager(
172 device_thread_->message_loop_proxy());
161 audio_input_device_manager_->Register(this); 173 audio_input_device_manager_->Register(this);
162 } 174 }
163 return audio_input_device_manager_.get(); 175 return audio_input_device_manager_.get();
164 } 176 }
165 177
166 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, 178 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
167 int render_process_id, 179 int render_process_id,
168 int render_view_id, 180 int render_view_id,
169 const StreamOptions& options, 181 const StreamOptions& options,
170 const GURL& security_origin, 182 const GURL& security_origin,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage, 372 base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
361 base::Unretained(device_settings_.get()), 373 base::Unretained(device_settings_.get()),
362 request_label, new_request->render_process_id, 374 request_label, new_request->render_process_id,
363 new_request->render_view_id, new_request->options, 375 new_request->render_view_id, new_request->options,
364 new_request->security_origin)); 376 new_request->security_origin));
365 } 377 }
366 378
367 (*label) = request_label; 379 (*label) = request_label;
368 } 380 }
369 381
382 void MediaStreamManager::EnsureDeviceThread() {
383 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
384 if (device_thread_.get())
385 return;
386
387 device_thread_.reset(new DeviceThread("MediaStreamDeviceThread"));
388 CHECK(device_thread_->Start());
389 }
390
370 void MediaStreamManager::Opened(MediaStreamType stream_type, 391 void MediaStreamManager::Opened(MediaStreamType stream_type,
371 int capture_session_id) { 392 int capture_session_id) {
372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 393 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
373 394
374 // Find the request containing this device and mark it as used. 395 // Find the request containing this device and mark it as used.
375 DeviceRequest* request = NULL; 396 DeviceRequest* request = NULL;
376 StreamDeviceInfoArray* devices = NULL; 397 StreamDeviceInfoArray* devices = NULL;
377 std::string label; 398 std::string label;
378 for (DeviceRequests::iterator request_it = requests_.begin(); 399 for (DeviceRequests::iterator request_it = requests_.begin();
379 request_it != requests_.end() && request == NULL; ++request_it) { 400 request_it != requests_.end() && request == NULL; ++request_it) {
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { 709 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) {
689 return video_capture_manager(); 710 return video_capture_manager();
690 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { 711 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) {
691 return audio_input_device_manager(); 712 return audio_input_device_manager();
692 } 713 }
693 NOTREACHED(); 714 NOTREACHED();
694 return NULL; 715 return NULL;
695 } 716 }
696 717
697 } // namespace media_stream 718 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698