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

Unified Diff: content/renderer/media/media_stream_impl.cc

Issue 23731007: Implicit audio output device selection for getUserMedia. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 7 years, 3 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
« no previous file with comments | « content/renderer/media/media_stream_impl.h ('k') | content/renderer/media/webrtc_audio_device_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/media_stream_impl.cc
diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc
index 9eab908f5f90e64927df8e065b0a605a71145c31..d3b2c7421ac3402e19fc036dcb60307bf0baa8c7 100644
--- a/content/renderer/media/media_stream_impl.cc
+++ b/content/renderer/media/media_stream_impl.cc
@@ -21,6 +21,8 @@
#include "content/renderer/media/webrtc_audio_renderer.h"
#include "content/renderer/media/webrtc_local_audio_renderer.h"
#include "content/renderer/media/webrtc_uma_histograms.h"
+#include "content/renderer/render_thread_impl.h"
+#include "media/base/audio_hardware_config.h"
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
@@ -120,6 +122,15 @@ webrtc::MediaStreamInterface* GetNativeMediaStream(
return extra_data->stream().get();
}
+void GetDefaultOutputDeviceParams(
+ int* output_sample_rate, int* output_buffer_size) {
+ // Fetch the default audio output hardware config.
+ media::AudioHardwareConfig* hardware_config =
+ RenderThreadImpl::current()->GetAudioHardwareConfig();
+ *output_sample_rate = hardware_config->GetOutputSampleRate();
+ *output_buffer_size = hardware_config->GetOutputBufferSize();
+}
+
} // namespace
MediaStreamImpl::MediaStreamImpl(
@@ -592,7 +603,15 @@ scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer(
DVLOG(1) << "MediaStreamImpl::CreateRemoteAudioRenderer label:"
<< stream->label();
- return new WebRtcAudioRenderer(RenderViewObserver::routing_id());
+ int session_id = 0, sample_rate = 0, buffer_size = 0;
+ if (!GetAuthorizedDeviceInfoForAudioRenderer(&session_id,
+ &sample_rate,
+ &buffer_size)) {
+ GetDefaultOutputDeviceParams(&sample_rate, &buffer_size);
+ }
+
+ return new WebRtcAudioRenderer(RenderViewObserver::routing_id(),
+ session_id, sample_rate, buffer_size);
}
scoped_refptr<WebRtcLocalAudioRenderer>
@@ -611,11 +630,21 @@ MediaStreamImpl::CreateLocalAudioRenderer(
<< "audio_track.id : " << audio_track->id()
<< "audio_track.enabled: " << audio_track->enabled();
+ int session_id = 0, sample_rate = 0, buffer_size = 0;
+ if (!GetAuthorizedDeviceInfoForAudioRenderer(&session_id,
+ &sample_rate,
+ &buffer_size)) {
+ GetDefaultOutputDeviceParams(&sample_rate, &buffer_size);
+ }
+
// Create a new WebRtcLocalAudioRenderer instance and connect it to the
// existing WebRtcAudioCapturer so that the renderer can use it as source.
return new WebRtcLocalAudioRenderer(
static_cast<WebRtcLocalAudioTrack*>(audio_track),
- RenderViewObserver::routing_id());
+ RenderViewObserver::routing_id(),
+ session_id,
+ sample_rate,
+ buffer_size);
}
void MediaStreamImpl::StopLocalAudioTrack(
@@ -639,6 +668,49 @@ void MediaStreamImpl::StopLocalAudioTrack(
}
}
+bool MediaStreamImpl::GetAuthorizedDeviceInfoForAudioRenderer(
+ int* session_id,
+ int* output_sample_rate,
+ int* output_frames_per_buffer) {
+ DCHECK(CalledOnValidThread());
+
+ const StreamDeviceInfo* device_info = NULL;
+ WebKit::WebString session_id_str;
+ UserMediaRequests::iterator it = user_media_requests_.begin();
+ for (; it != user_media_requests_.end(); ++it) {
+ UserMediaRequestInfo* request = (*it);
+ for (size_t i = 0; i < request->audio_sources.size(); ++i) {
+ const WebKit::WebMediaStreamSource& source = request->audio_sources[i];
+ if (source.readyState() == WebKit::WebMediaStreamSource::ReadyStateEnded)
+ continue;
+
+ if (!session_id_str.isEmpty() &&
+ !session_id_str.equals(source.deviceId())) {
+ DVLOG(1) << "Multiple capture devices are open so we can't pick a "
+ "session for a matching output device.";
+ return false;
+ }
+
+ // TODO(tommi): Storing the session id in the deviceId field doesn't
+ // feel right. Move it over to MediaStreamSourceExtraData?
+ session_id_str = source.deviceId();
+ content::MediaStreamSourceExtraData* extra_data =
+ static_cast<content::MediaStreamSourceExtraData*>(source.extraData());
+ device_info = &extra_data->device_info();
+ }
+ }
+
+ if (session_id_str.isEmpty() || !device_info)
+ return false;
+
+ base::StringToInt(UTF16ToUTF8(session_id_str), session_id);
+ *output_sample_rate = device_info->device.matched_output.sample_rate;
+ *output_frames_per_buffer =
+ device_info->device.matched_output.frames_per_buffer;
+
+ return true;
+}
+
MediaStreamSourceExtraData::MediaStreamSourceExtraData(
const StreamDeviceInfo& device_info,
const WebKit::WebMediaStreamSource& webkit_source)
« no previous file with comments | « content/renderer/media/media_stream_impl.h ('k') | content/renderer/media/webrtc_audio_device_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698