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

Side by Side Diff: content/renderer/media/media_stream_dependency_factory.cc

Issue 99033003: Enable platform echo cancellation through the AudioRecord path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add PlatformEffects, unittests and clean up. Created 7 years 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
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 "content/renderer/media/media_stream_dependency_factory.h" 5 #include "content/renderer/media/media_stream_dependency_factory.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 &already_set_value, NULL)) { 89 &already_set_value, NULL)) {
90 constraints->AddMandatory(kDefaultAudioConstraints[i].key, 90 constraints->AddMandatory(kDefaultAudioConstraints[i].key,
91 kDefaultAudioConstraints[i].value, false); 91 kDefaultAudioConstraints[i].value, false);
92 } else { 92 } else {
93 DVLOG(1) << "Constraint " << kDefaultAudioConstraints[i].key 93 DVLOG(1) << "Constraint " << kDefaultAudioConstraints[i].key
94 << " already set to " << already_set_value; 94 << " already set to " << already_set_value;
95 } 95 }
96 } 96 }
97 } 97 }
98 98
99 typedef media::AudioParameters::PlatformEffects PlatformEffects;
tommi (sloooow) - chröme 2013/12/11 12:14:36 Is it a good idea to create a new type for this?
ajm 2013/12/12 01:51:27 Removed.
100
101 // |key| is the constraint for which |constraints| should be updated, and
102 // |effect| is the state of the corresponding platform effect.
tommi (sloooow) - chröme 2013/12/11 12:14:36 This function is still confusing to me since both
ajm 2013/12/11 17:46:49 That works, and I agree is much cleaner.
ajm 2013/12/12 01:51:27 Ugh, on further reflection, it doesn't work. First
103 // |constraints| and |effect| are both input and output parameters.
104 //
105 // See the function below for a full description of the purpose.
106 void ReconcileConstraintAndPlatformEffect(const char* key,
107 RTCMediaConstraints* constraints,
108 bool* effect) {
109 bool value;
110 if (!webrtc::FindConstraint(constraints, key, &value, NULL) ||
tommi (sloooow) - chröme 2013/12/11 12:14:36 nit: this fits on one line: if (!webrtc::FindCon
ajm 2013/12/12 01:51:27 Removed.
111 value == false) {
112 // If the constraint does not exist, or is set to false, disable the
113 // corresponding platform effect.
114 *effect = false;
115 DVLOG(1) << "Disabling platform effect: " << key;
116 } else if (*effect) {
117 // If the constraint is set to true, and the corresponding platform effect
118 // is available, disable the constraint.
119 constraints->AddMandatory(key,
120 webrtc::MediaConstraintsInterface::kValueFalse, true);
121 DVLOG(1) << "Disabling constraint: " << key;
122 }
123 }
124
125 // Updates |constraints| and |effects| to be consistent with each other. At
126 // input, |constraints| must be the media constraints requested for the gUM
127 // stream. At output |constraints| will be updated to reflect what should be
128 // applied to the source (e.g. PeerConnection). At input, |effects| must be the
129 // available platform (i.e. built-in, typically hardware) audio effects which
130 // should be used in preference to software effects. At output, |effects| will
131 // be updated to reflect what should be applied to the platform capturer.
132 //
133 // In particular this means:
134 // - Any true constraint with an available corresponding platform effect at
135 // input will be set to false at output.
136 // - Any false constraint at input will cause the corresponding platform effect
137 // to be disabled at output.
138 void ReconcileConstraintsAndPlatformEffects(RTCMediaConstraints* constraints,
139 PlatformEffects* effects) {
140 // This currently only deals with AEC, but is prepared for expansion to other
141 // platform effects.
142 ReconcileConstraintAndPlatformEffect(
143 webrtc::MediaConstraintsInterface::kEchoCancellation,
144 constraints,
145 &effects->echo_canceller);
146 }
147
99 class P2PPortAllocatorFactory : public webrtc::PortAllocatorFactoryInterface { 148 class P2PPortAllocatorFactory : public webrtc::PortAllocatorFactoryInterface {
100 public: 149 public:
101 P2PPortAllocatorFactory( 150 P2PPortAllocatorFactory(
102 P2PSocketDispatcher* socket_dispatcher, 151 P2PSocketDispatcher* socket_dispatcher,
103 talk_base::NetworkManager* network_manager, 152 talk_base::NetworkManager* network_manager,
104 talk_base::PacketSocketFactory* socket_factory, 153 talk_base::PacketSocketFactory* socket_factory,
105 blink::WebFrame* web_frame) 154 blink::WebFrame* web_frame)
106 : socket_dispatcher_(socket_dispatcher), 155 : socket_dispatcher_(socket_dispatcher),
107 network_manager_(network_manager), 156 network_manager_(network_manager),
108 socket_factory_(socket_factory), 157 socket_factory_(socket_factory),
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 static_cast<MediaStreamSourceExtraData*>(source.extraData()); 365 static_cast<MediaStreamSourceExtraData*>(source.extraData());
317 366
318 // Check if the source has already been created. This happens when the same 367 // Check if the source has already been created. This happens when the same
319 // source is used in multiple MediaStreams as a result of calling 368 // source is used in multiple MediaStreams as a result of calling
320 // getUserMedia. 369 // getUserMedia.
321 if (source_data->local_audio_source()) 370 if (source_data->local_audio_source())
322 continue; 371 continue;
323 372
324 // TODO(xians): Create a new capturer for difference microphones when we 373 // TODO(xians): Create a new capturer for difference microphones when we
325 // support multiple microphones. See issue crbug/262117 . 374 // support multiple microphones. See issue crbug/262117 .
326 const StreamDeviceInfo device_info = source_data->device_info(); 375 StreamDeviceInfo device_info = source_data->device_info();
376
377 RTCMediaConstraints platform_constraints = native_audio_constraints;
378 // This has the potential to update both the constraints and the platform
379 // effects, such that we prefer platform to software effects but disable
380 // platform effects when requested by constraints.
381 //
382 // See the function documentation for a full description.
383 ReconcileConstraintsAndPlatformEffects(&platform_constraints,
384 &device_info.device.input.effects);
327 scoped_refptr<WebRtcAudioCapturer> capturer( 385 scoped_refptr<WebRtcAudioCapturer> capturer(
328 MaybeCreateAudioCapturer(render_view_id, device_info)); 386 MaybeCreateAudioCapturer(render_view_id, device_info));
329 if (!capturer.get()) { 387 if (!capturer.get()) {
330 DLOG(WARNING) << "Failed to create the capturer for device " 388 DLOG(WARNING) << "Failed to create the capturer for device "
331 << device_info.device.id; 389 << device_info.device.id;
332 sources_created.Run(web_stream, false); 390 sources_created.Run(web_stream, false);
333 // TODO(xians): Don't we need to check if source_observer is observing 391 // TODO(xians): Don't we need to check if source_observer is observing
334 // something? If not, then it looks like we have a leak here. 392 // something? If not, then it looks like we have a leak here.
335 // OTOH, if it _is_ observing something, then the callback might 393 // OTOH, if it _is_ observing something, then the callback might
336 // be called multiple times which is likely also a bug. 394 // be called multiple times which is likely also a bug.
337 return; 395 return;
338 } 396 }
339 source_data->SetAudioCapturer(capturer); 397 source_data->SetAudioCapturer(capturer);
340 398
341 // Creates a LocalAudioSource object which holds audio options. 399 // Creates a LocalAudioSource object which holds audio options.
342 // TODO(xians): The option should apply to the track instead of the source. 400 // TODO(xians): The option should apply to the track instead of the source.
343 source_data->SetLocalAudioSource( 401 source_data->SetLocalAudioSource(
344 CreateLocalAudioSource(&native_audio_constraints).get()); 402 CreateLocalAudioSource(&platform_constraints).get());
345 source_observer->AddSource(source_data->local_audio_source()); 403 source_observer->AddSource(source_data->local_audio_source());
346 } 404 }
347 405
348 source_observer->StartObservering(); 406 source_observer->StartObservering();
349 } 407 }
350 408
351 void MediaStreamDependencyFactory::CreateNativeLocalMediaStream( 409 void MediaStreamDependencyFactory::CreateNativeLocalMediaStream(
352 blink::WebMediaStream* web_stream) { 410 blink::WebMediaStream* web_stream) {
353 DVLOG(1) << "MediaStreamDependencyFactory::CreateNativeLocalMediaStream()"; 411 DVLOG(1) << "MediaStreamDependencyFactory::CreateNativeLocalMediaStream()";
354 if (!EnsurePeerConnectionFactory()) { 412 if (!EnsurePeerConnectionFactory()) {
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 961
904 if (!capturer->Initialize( 962 if (!capturer->Initialize(
905 render_view_id, 963 render_view_id,
906 static_cast<media::ChannelLayout>( 964 static_cast<media::ChannelLayout>(
907 device_info.device.input.channel_layout), 965 device_info.device.input.channel_layout),
908 device_info.device.input.sample_rate, 966 device_info.device.input.sample_rate,
909 device_info.device.input.frames_per_buffer, 967 device_info.device.input.frames_per_buffer,
910 device_info.session_id, 968 device_info.session_id,
911 device_info.device.id, 969 device_info.device.id,
912 device_info.device.matched_output.sample_rate, 970 device_info.device.matched_output.sample_rate,
913 device_info.device.matched_output.frames_per_buffer)) { 971 device_info.device.matched_output.frames_per_buffer,
972 device_info.device.input.effects)) {
914 return NULL; 973 return NULL;
915 } 974 }
916 975
917 // Add the capturer to the WebRtcAudioDeviceImpl if it is a new capturer. 976 // Add the capturer to the WebRtcAudioDeviceImpl if it is a new capturer.
918 if (is_new_capturer) 977 if (is_new_capturer)
919 GetWebRtcAudioDevice()->AddAudioCapturer(capturer); 978 GetWebRtcAudioDevice()->AddAudioCapturer(capturer);
920 979
921 return capturer; 980 return capturer;
922 } 981 }
923 982
(...skipping 28 matching lines...) Expand all
952 MediaStreamDependencyFactory::GetNativeMediaStreamTrack( 1011 MediaStreamDependencyFactory::GetNativeMediaStreamTrack(
953 const blink::WebMediaStreamTrack& track) { 1012 const blink::WebMediaStreamTrack& track) {
954 if (track.isNull()) 1013 if (track.isNull())
955 return NULL; 1014 return NULL;
956 MediaStreamTrackExtraData* extra_data = 1015 MediaStreamTrackExtraData* extra_data =
957 static_cast<MediaStreamTrackExtraData*>(track.extraData()); 1016 static_cast<MediaStreamTrackExtraData*>(track.extraData());
958 return extra_data ? extra_data->track().get() : NULL; 1017 return extra_data ? extra_data->track().get() : NULL;
959 } 1018 }
960 1019
961 } // namespace content 1020 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698