Index: chrome/browser/media/media_capture_devices_dispatcher.cc |
diff --git a/chrome/browser/media/media_capture_devices_dispatcher.cc b/chrome/browser/media/media_capture_devices_dispatcher.cc |
index a3a1ddcf23d30ab14882fad7b5f4cd158dd6d2a9..2d0a798918b2803ed790b473fd37952f59e243d4 100644 |
--- a/chrome/browser/media/media_capture_devices_dispatcher.cc |
+++ b/chrome/browser/media/media_capture_devices_dispatcher.cc |
@@ -54,6 +54,12 @@ |
#include "ash/shell.h" |
#endif // defined(OS_CHROMEOS) |
+// Only do audio stream monitoring for platforms that use it for the tab media |
+// indicator UI or the OOM killer. |
+#if !defined(OS_ANDROID) && !defined(OS_IOS) |
+#define AUDIO_STREAM_MONITORING |
+#include "chrome/browser/media/audio_stream_monitor.h" |
+#endif // !defined(OS_ANDROID) && !defined(OS_IOS) |
#if defined(ENABLE_EXTENSIONS) |
#include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" |
@@ -190,6 +196,43 @@ scoped_ptr<content::MediaStreamUI> GetDevicesForDesktopCapture( |
return ui.Pass(); |
} |
+#if defined(AUDIO_STREAM_MONITORING) |
+ |
+AudioStreamMonitor* AudioStreamMonitorFromRenderFrame( |
+ int render_process_id, |
+ int render_frame_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ content::WebContents* const web_contents = |
+ content::WebContents::FromRenderFrameHost( |
+ content::RenderFrameHost::FromID(render_process_id, render_frame_id)); |
+ if (!web_contents) |
+ return NULL; |
+ return AudioStreamMonitor::FromWebContents(web_contents); |
+} |
+ |
+void StartAudioStreamMonitoringOnUIThread( |
+ int render_process_id, |
+ int render_frame_id, |
+ int stream_id, |
+ const AudioStreamMonitor::ReadPowerAndClipCallback& read_power_callback) { |
+ AudioStreamMonitor* const audio_stream_monitor = |
+ AudioStreamMonitorFromRenderFrame(render_process_id, render_frame_id); |
+ if (audio_stream_monitor) |
+ audio_stream_monitor->StartMonitoringStream(stream_id, read_power_callback); |
+} |
+ |
+void StopAudioStreamMonitoringOnUIThread( |
+ int render_process_id, |
+ int render_frame_id, |
+ int stream_id) { |
+ AudioStreamMonitor* const audio_stream_monitor = |
+ AudioStreamMonitorFromRenderFrame(render_process_id, render_frame_id); |
+ if (audio_stream_monitor) |
+ audio_stream_monitor->StopMonitoringStream(stream_id); |
+} |
+ |
+#endif // defined(AUDIO_STREAM_MONITORING) |
+ |
#if !defined(OS_ANDROID) |
// Find browser or app window from a given |web_contents|. |
gfx::NativeWindow FindParentWindowForWebContents( |
@@ -894,6 +937,40 @@ void MediaCaptureDevicesDispatcher::OnMediaRequestStateChanged( |
page_request_id, security_origin, stream_type, state)); |
} |
+void MediaCaptureDevicesDispatcher::OnAudioStreamPlaying( |
+ int render_process_id, |
+ int render_frame_id, |
+ int stream_id, |
+ const ReadPowerAndClipCallback& read_power_callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+#if defined(AUDIO_STREAM_MONITORING) |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&StartAudioStreamMonitoringOnUIThread, |
+ render_process_id, |
+ render_frame_id, |
+ stream_id, |
+ read_power_callback)); |
+#endif |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnAudioStreamStopped( |
+ int render_process_id, |
+ int render_frame_id, |
+ int stream_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+#if defined(AUDIO_STREAM_MONITORING) |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&StopAudioStreamMonitoringOnUIThread, |
+ render_process_id, |
+ render_frame_id, |
+ stream_id)); |
+#endif |
+} |
+ |
void MediaCaptureDevicesDispatcher::OnCreatingAudioStream( |
int render_process_id, |
int render_frame_id) { |
@@ -992,6 +1069,16 @@ void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
FOR_EACH_OBSERVER(Observer, observers_, |
OnCreatingAudioStream(render_process_id, render_frame_id)); |
+#if defined(AUDIO_STREAM_MONITORING) |
+ content::WebContents* const web_contents = |
+ content::WebContents::FromRenderFrameHost( |
+ content::RenderFrameHost::FromID(render_process_id, render_frame_id)); |
+ if (web_contents) { |
+ // Note: Calling CreateForWebContents() multiple times is valid (see usage |
+ // info for content::WebContentsUserData). |
+ AudioStreamMonitor::CreateForWebContents(web_contents); |
+ } |
+#endif |
} |
bool MediaCaptureDevicesDispatcher::IsDesktopCaptureInProgress() { |
@@ -999,6 +1086,7 @@ bool MediaCaptureDevicesDispatcher::IsDesktopCaptureInProgress() { |
return desktop_capture_sessions_.size() > 0; |
} |
+ |
void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( |
const MediaStreamDevices& devices) { |
test_audio_devices_ = devices; |