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) |