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

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

Issue 2956063003: Add support for echoCancellation and deviceId to MediaStreamTrack.getSettings (Closed)
Patch Set: Created 3 years, 5 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 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/user_media_client_impl.h" 5 #include "content/renderer/media/user_media_client_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 source == kMediaStreamSourceDesktop || 225 source == kMediaStreamSourceDesktop ||
226 source == kMediaStreamSourceSystem; 226 source == kMediaStreamSourceSystem;
227 } 227 }
228 228
229 bool IsValidVideoContentSource(const std::string& source) { 229 bool IsValidVideoContentSource(const std::string& source) {
230 return source == kMediaStreamSourceTab || 230 return source == kMediaStreamSourceTab ||
231 source == kMediaStreamSourceDesktop || 231 source == kMediaStreamSourceDesktop ||
232 source == kMediaStreamSourceScreen; 232 source == kMediaStreamSourceScreen;
233 } 233 }
234 234
235 void SetHardwareEchoCancellationSetting(blink::WebMediaStreamSource* source) {
hbos_chromium 2017/07/04 15:26:49 Should this be generalized and/or renamed, e.g. Su
Guido Urdaneta 2017/07/05 09:23:36 This would probably be the place for future settin
236 MediaStreamAudioSource* source_impl =
237 static_cast<MediaStreamAudioSource*>(source->GetExtraData());
238 media::AudioParameters params = source_impl->GetAudioParameters();
239 if (params.IsValid() &&
240 (params.effects() & media::AudioParameters::ECHO_CANCELLER))
241 source->SetEchoCancellation(true);
242 }
243
235 static int g_next_request_id = 0; 244 static int g_next_request_id = 0;
236 245
237 } // namespace 246 } // namespace
238 247
239 // Class for storing information about a Blink request to create a 248 // Class for storing information about a Blink request to create a
240 // MediaStream. 249 // MediaStream.
241 class UserMediaClientImpl::UserMediaRequestInfo 250 class UserMediaClientImpl::UserMediaRequestInfo
242 : public base::SupportsWeakPtr<UserMediaRequestInfo> { 251 : public base::SupportsWeakPtr<UserMediaRequestInfo> {
243 public: 252 public:
244 using ResourcesReady = 253 using ResourcesReady =
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 970
962 // While sources are being initialized, keep them in a separate array. 971 // While sources are being initialized, keep them in a separate array.
963 // Once they've finished initialized, they'll be moved over to local_sources_. 972 // Once they've finished initialized, they'll be moved over to local_sources_.
964 // See OnAudioSourceStarted for more details. 973 // See OnAudioSourceStarted for more details.
965 pending_local_sources_.push_back(source); 974 pending_local_sources_.push_back(source);
966 975
967 MediaStreamSource::ConstraintsCallback source_ready = base::Bind( 976 MediaStreamSource::ConstraintsCallback source_ready = base::Bind(
968 &UserMediaClientImpl::OnAudioSourceStartedOnAudioThread, 977 &UserMediaClientImpl::OnAudioSourceStartedOnAudioThread,
969 base::ThreadTaskRunnerHandle::Get(), weak_factory_.GetWeakPtr()); 978 base::ThreadTaskRunnerHandle::Get(), weak_factory_.GetWeakPtr());
970 979
971 MediaStreamAudioSource* const audio_source = 980 bool has_sw_echo_cancellation = false;
972 CreateAudioSource(device, constraints, source_ready); 981 MediaStreamAudioSource* const audio_source = CreateAudioSource(
982 device, constraints, source_ready, &has_sw_echo_cancellation);
973 audio_source->SetStopCallback(base::Bind( 983 audio_source->SetStopCallback(base::Bind(
974 &UserMediaClientImpl::OnLocalSourceStopped, weak_factory_.GetWeakPtr())); 984 &UserMediaClientImpl::OnLocalSourceStopped, weak_factory_.GetWeakPtr()));
975 source.SetExtraData(audio_source); // Takes ownership. 985 source.SetExtraData(audio_source); // Takes ownership.
986 // If the hardware has echo cancellation, the value is updated in
987 // CreateAudioTracks(), after the track has started.
hbos_chromium 2017/07/04 15:26:48 Could you clarify that the reason we don't set it
Guido Urdaneta 2017/07/05 09:23:37 Done.
988 source.SetEchoCancellation(has_sw_echo_cancellation);
976 return source; 989 return source;
977 } 990 }
978 991
979 MediaStreamAudioSource* UserMediaClientImpl::CreateAudioSource( 992 MediaStreamAudioSource* UserMediaClientImpl::CreateAudioSource(
980 const StreamDeviceInfo& device, 993 const StreamDeviceInfo& device,
981 const blink::WebMediaConstraints& constraints, 994 const blink::WebMediaConstraints& constraints,
982 const MediaStreamSource::ConstraintsCallback& source_ready) { 995 const MediaStreamSource::ConstraintsCallback& source_ready,
996 bool* has_sw_echo_cancellation) {
983 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); 997 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
984 DCHECK(current_request_info_); 998 DCHECK(current_request_info_);
985 // If the audio device is a loopback device (for screen capture), or if the 999 // If the audio device is a loopback device (for screen capture), or if the
986 // constraints/effects parameters indicate no audio processing is needed, 1000 // constraints/effects parameters indicate no audio processing is needed,
987 // create an efficient, direct-path MediaStreamAudioSource instance. 1001 // create an efficient, direct-path MediaStreamAudioSource instance.
988 AudioProcessingProperties audio_processing_properties = 1002 AudioProcessingProperties audio_processing_properties =
989 IsOldAudioConstraints() ? AudioProcessingProperties::FromConstraints( 1003 IsOldAudioConstraints() ? AudioProcessingProperties::FromConstraints(
990 constraints, device.device.input) 1004 constraints, device.device.input)
991 : current_request_info_->audio_capture_settings() 1005 : current_request_info_->audio_capture_settings()
992 .audio_processing_properties(); 1006 .audio_processing_properties();
993 if (IsScreenCaptureMediaType(device.device.type) || 1007 if (IsScreenCaptureMediaType(device.device.type) ||
994 !MediaStreamAudioProcessor::WouldModifyAudio( 1008 !MediaStreamAudioProcessor::WouldModifyAudio(
995 audio_processing_properties)) { 1009 audio_processing_properties)) {
1010 *has_sw_echo_cancellation = false;
996 return new LocalMediaStreamAudioSource(RenderFrameObserver::routing_id(), 1011 return new LocalMediaStreamAudioSource(RenderFrameObserver::routing_id(),
997 device, source_ready); 1012 device, source_ready);
998 } 1013 }
999 1014
1000 // The audio device is not associated with screen capture and also requires 1015 // The audio device is not associated with screen capture and also requires
1001 // processing. 1016 // processing.
1002 ProcessedLocalAudioSource* source = new ProcessedLocalAudioSource( 1017 ProcessedLocalAudioSource* source = new ProcessedLocalAudioSource(
1003 RenderFrameObserver::routing_id(), device, audio_processing_properties, 1018 RenderFrameObserver::routing_id(), device, audio_processing_properties,
1004 source_ready, dependency_factory_); 1019 source_ready, dependency_factory_);
1020 *has_sw_echo_cancellation =
1021 audio_processing_properties.enable_sw_echo_cancellation;
1005 return source; 1022 return source;
1006 } 1023 }
1007 1024
1008 MediaStreamVideoSource* UserMediaClientImpl::CreateVideoSource( 1025 MediaStreamVideoSource* UserMediaClientImpl::CreateVideoSource(
1009 const StreamDeviceInfo& device, 1026 const StreamDeviceInfo& device,
1010 const MediaStreamSource::SourceStoppedCallback& stop_callback) { 1027 const MediaStreamSource::SourceStoppedCallback& stop_callback) {
1011 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); 1028 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1012 DCHECK(current_request_info_); 1029 DCHECK(current_request_info_);
1013 if (IsOldVideoConstraints()) { 1030 if (IsOldVideoConstraints()) {
1014 return new MediaStreamVideoCapturerSource(stop_callback, device, 1031 return new MediaStreamVideoCapturerSource(stop_callback, device,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 MediaStreamDevice::AudioDeviceParameters(); 1080 MediaStreamDevice::AudioDeviceParameters();
1064 } 1081 }
1065 } 1082 }
1066 1083
1067 for (size_t i = 0; i < overridden_audio_array.size(); ++i) { 1084 for (size_t i = 0; i < overridden_audio_array.size(); ++i) {
1068 bool is_pending = false; 1085 bool is_pending = false;
1069 blink::WebMediaStreamSource source = InitializeAudioSourceObject( 1086 blink::WebMediaStreamSource source = InitializeAudioSourceObject(
1070 overridden_audio_array[i], constraints, &is_pending); 1087 overridden_audio_array[i], constraints, &is_pending);
1071 (*webkit_tracks)[i].Initialize(source); 1088 (*webkit_tracks)[i].Initialize(source);
1072 current_request_info_->StartAudioTrack((*webkit_tracks)[i], is_pending); 1089 current_request_info_->StartAudioTrack((*webkit_tracks)[i], is_pending);
1090 SetHardwareEchoCancellationSetting(&source);
hbos_chromium 2017/07/04 15:26:48 Add a comment saying the source's current value re
Guido Urdaneta 2017/07/05 09:23:36 Done.
1073 } 1091 }
1074 } 1092 }
1075 1093
1076 void UserMediaClientImpl::OnCreateNativeTracksCompleted( 1094 void UserMediaClientImpl::OnCreateNativeTracksCompleted(
1077 const std::string& label, 1095 const std::string& label,
1078 UserMediaRequestInfo* request_info, 1096 UserMediaRequestInfo* request_info,
1079 MediaStreamRequestResult result, 1097 MediaStreamRequestResult result,
1080 const blink::WebString& result_name) { 1098 const blink::WebString& result_name) {
1081 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); 1099 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1082 if (result == content::MEDIA_DEVICE_OK) { 1100 if (result == content::MEDIA_DEVICE_OK) {
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 const blink::WebString& result_name) { 1563 const blink::WebString& result_name) {
1546 // Check if we're waiting to be notified of this source. If not, then we'll 1564 // Check if we're waiting to be notified of this source. If not, then we'll
1547 // ignore the notification. 1565 // ignore the notification.
1548 auto found = std::find(sources_waiting_for_callback_.begin(), 1566 auto found = std::find(sources_waiting_for_callback_.begin(),
1549 sources_waiting_for_callback_.end(), source); 1567 sources_waiting_for_callback_.end(), source);
1550 if (found != sources_waiting_for_callback_.end()) 1568 if (found != sources_waiting_for_callback_.end())
1551 OnTrackStarted(source, result, result_name); 1569 OnTrackStarted(source, result, result_name);
1552 } 1570 }
1553 1571
1554 } // namespace content 1572 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698