| Index: content/renderer/media/media_stream_renderer_factory_impl.cc
|
| diff --git a/content/renderer/media/media_stream_renderer_factory_impl.cc b/content/renderer/media/media_stream_renderer_factory_impl.cc
|
| index 40463f58d3d69e5e51e003c992b8f711eb5e496e..13043806544fa78d2a119882aa9445eec022448e 100644
|
| --- a/content/renderer/media/media_stream_renderer_factory_impl.cc
|
| +++ b/content/renderer/media/media_stream_renderer_factory_impl.cc
|
| @@ -9,9 +9,9 @@
|
| #include "content/renderer/media/media_stream_audio_track.h"
|
| #include "content/renderer/media/media_stream_video_renderer_sink.h"
|
| #include "content/renderer/media/media_stream_video_track.h"
|
| +#include "content/renderer/media/track_audio_renderer.h"
|
| #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
|
| #include "content/renderer/media/webrtc_audio_renderer.h"
|
| -#include "content/renderer/media/webrtc_local_audio_renderer.h"
|
| #include "content/renderer/render_thread_impl.h"
|
| #include "media/base/audio_hardware_config.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStream.h"
|
| @@ -27,59 +27,26 @@ PeerConnectionDependencyFactory* GetPeerConnectionDependencyFactory() {
|
| return RenderThreadImpl::current()->GetPeerConnectionDependencyFactory();
|
| }
|
|
|
| -// Returns a valid session id if a single capture device is currently open
|
| -// (and then the matching session_id), otherwise -1.
|
| -// This is used to pass on a session id to a webrtc audio renderer (either
|
| -// local or remote), so that audio will be rendered to a matching output
|
| -// device, should one exist.
|
| +// Returns a valid session id if a single WebRTC capture device is currently
|
| +// open (and then the matching session_id), otherwise 0.
|
| +// This is used to pass on a session id to an audio renderer, so that audio will
|
| +// be rendered to a matching output device, should one exist.
|
| // Note that if there are more than one open capture devices the function
|
| -// will not be able to pick an appropriate device and return false.
|
| -bool GetSessionIdForAudioRenderer(int* session_id) {
|
| +// will not be able to pick an appropriate device and return 0.
|
| +int GetSessionIdForWebRtcAudioRenderer() {
|
| WebRtcAudioDeviceImpl* audio_device =
|
| GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
|
| if (!audio_device)
|
| - return false;
|
| + return 0;
|
|
|
| + int session_id = 0;
|
| int sample_rate; // ignored, read from output device
|
| int frames_per_buffer; // ignored, read from output device
|
| - return audio_device->GetAuthorizedDeviceInfoForAudioRenderer(
|
| - session_id, &sample_rate, &frames_per_buffer);
|
| -}
|
| -
|
| -scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer(
|
| - const blink::WebMediaStream& stream,
|
| - int render_frame_id,
|
| - const std::string& device_id,
|
| - const url::Origin& security_origin) {
|
| - DVLOG(1) << "MediaStreamRendererFactoryImpl::CreateRemoteAudioRenderer id:"
|
| - << stream.id().utf8();
|
| - // |stream| will always contain at least one audio track.
|
| - // See MediaStreamRendererFactoryImpl::GetAudioRenderer.
|
| -
|
| - // TODO(tommi): Change the default value of session_id to be
|
| - // StreamDeviceInfo::kNoId. Also update AudioOutputDevice etc.
|
| - int session_id = 0;
|
| - GetSessionIdForAudioRenderer(&session_id);
|
| -
|
| - return new WebRtcAudioRenderer(
|
| - GetPeerConnectionDependencyFactory()->GetWebRtcSignalingThread(), stream,
|
| - render_frame_id, session_id, device_id, security_origin);
|
| -}
|
| -
|
| -scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
|
| - const blink::WebMediaStreamTrack& audio_track,
|
| - int render_frame_id,
|
| - const std::string& device_id,
|
| - const url::Origin& security_origin) {
|
| - DVLOG(1) << "MediaStreamRendererFactoryImpl::CreateLocalAudioRenderer";
|
| -
|
| - int session_id = 0;
|
| - GetSessionIdForAudioRenderer(&session_id);
|
| -
|
| - // Create a new WebRtcLocalAudioRenderer instance and connect it to the
|
| - // existing WebRtcAudioCapturer so that the renderer can use it as source.
|
| - return new WebRtcLocalAudioRenderer(audio_track, render_frame_id, session_id,
|
| - device_id, security_origin);
|
| + if (!audio_device->GetAuthorizedDeviceInfoForAudioRenderer(
|
| + &session_id, &sample_rate, &frames_per_buffer)) {
|
| + session_id = 0;
|
| + }
|
| + return session_id;
|
| }
|
|
|
| } // namespace
|
| @@ -151,29 +118,44 @@ MediaStreamRendererFactoryImpl::GetAudioRenderer(
|
| return nullptr;
|
| }
|
|
|
| - if (audio_track->is_local_track()) {
|
| + // If the track has a local source, or is a remote track that does not use the
|
| + // WebRTC audio pipeline, return a new TrackAudioRenderer instance.
|
| + //
|
| + // TODO(miu): In a soon up-coming change, I'll introduce a cleaner way (i.e.,
|
| + // rather than calling GetAudioAdapter()) to determine whether a remote source
|
| + // is via WebRTC or something else.
|
| + if (audio_track->is_local_track() || !audio_track->GetAudioAdapter()) {
|
| // TODO(xians): Add support for the case where the media stream contains
|
| // multiple audio tracks.
|
| - return CreateLocalAudioRenderer(audio_tracks[0], render_frame_id, device_id,
|
| - security_origin);
|
| + DVLOG(1) << "Creating TrackAudioRenderer for "
|
| + << (audio_track->is_local_track() ? "local" : "remote")
|
| + << " track.";
|
| + return new TrackAudioRenderer(audio_tracks[0], render_frame_id,
|
| + 0 /* no session_id */, device_id,
|
| + security_origin);
|
| }
|
|
|
| // This is a remote WebRTC media stream.
|
| WebRtcAudioDeviceImpl* audio_device =
|
| GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
|
| + DCHECK(audio_device);
|
|
|
| // Share the existing renderer if any, otherwise create a new one.
|
| scoped_refptr<WebRtcAudioRenderer> renderer(audio_device->renderer());
|
| - if (!renderer.get()) {
|
| - renderer = CreateRemoteAudioRenderer(web_stream, render_frame_id,
|
| - device_id, security_origin);
|
| -
|
| - if (renderer.get() && !audio_device->SetAudioRenderer(renderer.get()))
|
| - renderer = NULL;
|
| + if (renderer) {
|
| + DVLOG(1) << "Using existing WebRtcAudioRenderer for remote WebRTC track.";
|
| + } else {
|
| + DVLOG(1) << "Creating WebRtcAudioRenderer for remote WebRTC track.";
|
| + renderer = new WebRtcAudioRenderer(
|
| + GetPeerConnectionDependencyFactory()->GetWebRtcSignalingThread(),
|
| + web_stream, render_frame_id, GetSessionIdForWebRtcAudioRenderer(),
|
| + device_id, security_origin);
|
| +
|
| + if (!audio_device->SetAudioRenderer(renderer.get()))
|
| + return nullptr;
|
| }
|
|
|
| - return renderer.get() ? renderer->CreateSharedAudioRendererProxy(web_stream)
|
| - : NULL;
|
| + return renderer->CreateSharedAudioRendererProxy(web_stream);
|
| }
|
|
|
| } // namespace content
|
|
|