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

Side by Side Diff: chrome/browser/media/media_capture_devices_dispatcher.cc

Issue 22408006: Properly set loopback device ID for system audio capture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Give a valid name to the system audio capture device. Created 7 years, 4 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
« no previous file with comments | « build/common.gypi ('k') | content/browser/renderer_host/media/audio_input_renderer_host.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "chrome/browser/media/media_capture_devices_dispatcher.h" 5 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/prefs/pref_service.h" 9 #include "base/prefs/pref_service.h"
10 #include "base/sha1.h" 10 #include "base/sha1.h"
(...skipping 17 matching lines...) Expand all
28 #include "content/public/browser/media_devices_monitor.h" 28 #include "content/public/browser/media_devices_monitor.h"
29 #include "content/public/browser/notification_service.h" 29 #include "content/public/browser/notification_service.h"
30 #include "content/public/browser/notification_source.h" 30 #include "content/public/browser/notification_source.h"
31 #include "content/public/browser/notification_types.h" 31 #include "content/public/browser/notification_types.h"
32 #include "content/public/browser/web_contents.h" 32 #include "content/public/browser/web_contents.h"
33 #include "content/public/common/media_stream_request.h" 33 #include "content/public/common/media_stream_request.h"
34 #include "extensions/common/constants.h" 34 #include "extensions/common/constants.h"
35 #include "grit/generated_resources.h" 35 #include "grit/generated_resources.h"
36 #include "ui/base/l10n/l10n_util.h" 36 #include "ui/base/l10n/l10n_util.h"
37 37
38 #if defined(USE_CRAS)
39 #include "media/audio/cras/audio_manager_cras.h"
40 #endif
41
38 using content::BrowserThread; 42 using content::BrowserThread;
39 using content::MediaStreamDevices; 43 using content::MediaStreamDevices;
40 44
41 namespace { 45 namespace {
42 46
43 // Finds a device in |devices| that has |device_id|, or NULL if not found. 47 // Finds a device in |devices| that has |device_id|, or NULL if not found.
44 const content::MediaStreamDevice* FindDeviceWithId( 48 const content::MediaStreamDevice* FindDeviceWithId(
45 const content::MediaStreamDevices& devices, 49 const content::MediaStreamDevices& devices,
46 const std::string& device_id) { 50 const std::string& device_id) {
47 content::MediaStreamDevices::const_iterator iter = devices.begin(); 51 content::MediaStreamDevices::const_iterator iter = devices.begin();
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 } else { 190 } else {
187 ProcessRegularMediaAccessRequest(web_contents, request, callback); 191 ProcessRegularMediaAccessRequest(web_contents, request, callback);
188 } 192 }
189 } 193 }
190 194
191 void MediaCaptureDevicesDispatcher::ProcessScreenCaptureAccessRequest( 195 void MediaCaptureDevicesDispatcher::ProcessScreenCaptureAccessRequest(
192 content::WebContents* web_contents, 196 content::WebContents* web_contents,
193 const content::MediaStreamRequest& request, 197 const content::MediaStreamRequest& request,
194 const content::MediaResponseCallback& callback, 198 const content::MediaResponseCallback& callback,
195 const extensions::Extension* extension) { 199 const extensions::Extension* extension) {
196 bool component_extension = 200 const bool component_extension =
197 extension && extension->location() == extensions::Manifest::COMPONENT; 201 extension && extension->location() == extensions::Manifest::COMPONENT;
198 202
199 content::MediaStreamDevices devices; 203 content::MediaStreamDevices devices;
200 204
201 bool screen_capture_enabled = 205 const bool screen_capture_enabled =
202 CommandLine::ForCurrentProcess()->HasSwitch( 206 CommandLine::ForCurrentProcess()->HasSwitch(
203 switches::kEnableUserMediaScreenCapturing) || 207 switches::kEnableUserMediaScreenCapturing) ||
204 IsOriginWhitelistedForScreenCapture(request.security_origin); 208 IsOriginWhitelistedForScreenCapture(request.security_origin);
205 209
206 bool origin_is_secure = 210 const bool origin_is_secure =
207 request.security_origin.SchemeIsSecure() || 211 request.security_origin.SchemeIsSecure() ||
208 request.security_origin.SchemeIs(extensions::kExtensionScheme) || 212 request.security_origin.SchemeIs(extensions::kExtensionScheme) ||
209 CommandLine::ForCurrentProcess()->HasSwitch( 213 CommandLine::ForCurrentProcess()->HasSwitch(
210 switches::kAllowHttpScreenCapture); 214 switches::kAllowHttpScreenCapture);
211 215
216 const bool screen_video_capture_requested =
217 request.video_type == content::MEDIA_SCREEN_VIDEO_CAPTURE;
218
219 const bool system_audio_capture_requested =
220 request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE;
221
222 #if defined(USE_CRAS)
223 const bool system_audio_capture_supported = true;
224 #else
225 const bool system_audio_capture_supported = false;
226 #endif
227
212 // Approve request only when the following conditions are met: 228 // Approve request only when the following conditions are met:
213 // 1. Screen capturing is enabled via command line switch or white-listed for 229 // 1. Screen capturing is enabled via command line switch or white-listed for
214 // the given origin. 230 // the given origin.
215 // 2. Request comes from a page with a secure origin or from an extension. 231 // 2. Request comes from a page with a secure origin or from an extension.
216 // 3. Video capture is requested for screen video. 232 // 3. Video capture is requested for screen video.
217 // 4. Audio capture is either not requested, or requested for system audio. 233 // 4. Audio capture is either not requested, or requested for system audio.
218 if (screen_capture_enabled && origin_is_secure && 234 if (screen_capture_enabled && origin_is_secure &&
219 request.video_type == content::MEDIA_SCREEN_VIDEO_CAPTURE && 235 screen_video_capture_requested &&
220 (request.audio_type == content::MEDIA_NO_SERVICE || 236 (!system_audio_capture_requested || system_audio_capture_supported)) {
221 request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE)) {
222 // For component extensions, bypass message box. 237 // For component extensions, bypass message box.
223 bool user_approved = false; 238 bool user_approved = false;
224 if (!component_extension) { 239 if (!component_extension) {
225 string16 application_name = UTF8ToUTF16(request.security_origin.spec()); 240 string16 application_name = UTF8ToUTF16(request.security_origin.spec());
226 string16 confirmation_text = l10n_util::GetStringFUTF16( 241 string16 confirmation_text = l10n_util::GetStringFUTF16(
227 request.audio_type == content::MEDIA_NO_SERVICE ? 242 request.audio_type == content::MEDIA_NO_SERVICE ?
228 IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TEXT : 243 IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TEXT :
229 IDS_MEDIA_SCREEN_AND_AUDIO_CAPTURE_CONFIRMATION_TEXT, 244 IDS_MEDIA_SCREEN_AND_AUDIO_CAPTURE_CONFIRMATION_TEXT,
230 application_name); 245 application_name);
231 chrome::MessageBoxResult result = chrome::ShowMessageBox( 246 chrome::MessageBoxResult result = chrome::ShowMessageBox(
232 NULL, 247 NULL,
233 l10n_util::GetStringFUTF16( 248 l10n_util::GetStringFUTF16(
234 IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TITLE, application_name), 249 IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TITLE, application_name),
235 confirmation_text, 250 confirmation_text,
236 chrome::MESSAGE_BOX_TYPE_QUESTION); 251 chrome::MESSAGE_BOX_TYPE_QUESTION);
237 user_approved = (result == chrome::MESSAGE_BOX_RESULT_YES); 252 user_approved = (result == chrome::MESSAGE_BOX_RESULT_YES);
238 } 253 }
239 254
240 if (user_approved || component_extension) { 255 if (user_approved || component_extension) {
241 devices.push_back(content::MediaStreamDevice( 256 devices.push_back(content::MediaStreamDevice(
242 content::MEDIA_SCREEN_VIDEO_CAPTURE, std::string(), "Screen")); 257 content::MEDIA_SCREEN_VIDEO_CAPTURE, std::string(), "Screen"));
243 if (request.audio_type == content::MEDIA_SYSTEM_AUDIO_CAPTURE) { 258 if (system_audio_capture_requested) {
259 #if defined(USE_CRAS)
260 // Use the special loopback device ID for system audio capture.
244 devices.push_back(content::MediaStreamDevice( 261 devices.push_back(content::MediaStreamDevice(
245 content::MEDIA_SYSTEM_AUDIO_CAPTURE, std::string(), std::string())); 262 content::MEDIA_SYSTEM_AUDIO_CAPTURE,
263 media::AudioManagerCras::kLoopbackDeviceId,
264 "System Audio"));
265 #endif
246 } 266 }
247 } 267 }
248 } 268 }
249 269
250 scoped_ptr<content::MediaStreamUI> ui; 270 scoped_ptr<content::MediaStreamUI> ui;
251 // Unless we're being invoked from a component extension, register to display 271 // Unless we're being invoked from a component extension, register to display
252 // the notification for stream capture. 272 // the notification for stream capture.
253 if (!devices.empty() && !component_extension) { 273 if (!devices.empty() && !component_extension) {
254 // Use extension name as title for extensions and origin for drive-by web. 274 // Use extension name as title for extensions and origin for drive-by web.
255 std::string title; 275 std::string title;
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 state)); 589 state));
570 } 590 }
571 591
572 void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread( 592 void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread(
573 int render_process_id, 593 int render_process_id,
574 int render_view_id) { 594 int render_view_id) {
575 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 595 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
576 FOR_EACH_OBSERVER(Observer, observers_, 596 FOR_EACH_OBSERVER(Observer, observers_,
577 OnCreatingAudioStream(render_process_id, render_view_id)); 597 OnCreatingAudioStream(render_process_id, render_view_id));
578 } 598 }
OLDNEW
« no previous file with comments | « build/common.gypi ('k') | content/browser/renderer_host/media/audio_input_renderer_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698