Index: content/renderer/media/media_stream_audio_processor_options.cc |
diff --git a/content/renderer/media/media_stream_audio_processor_options.cc b/content/renderer/media/media_stream_audio_processor_options.cc |
index 5c61a055cc47fd2e1bc014e2e385ad4af4710c9d..8a7056ed3c91906bbdb39f05967f1e4fac0dd5dc 100644 |
--- a/content/renderer/media/media_stream_audio_processor_options.cc |
+++ b/content/renderer/media/media_stream_audio_processor_options.cc |
@@ -65,6 +65,8 @@ struct { |
{ MediaAudioConstraints::kGoogHighpassFilter, true }, |
{ MediaAudioConstraints::kGoogTypingNoiseDetection, true }, |
{ MediaAudioConstraints::kGoogExperimentalNoiseSuppression, false }, |
+ // Beamforming will only be enabled if we are also provided with a |
+ // multi-microphone geometry. |
{ MediaAudioConstraints::kGoogBeamforming, false }, |
{ kMediaStreamAudioHotword, false }, |
}; |
@@ -99,6 +101,19 @@ DelayBasedEchoQuality EchoDelayFrequencyToQuality(float delay_frequency) { |
return DELAY_BASED_ECHO_QUALITY_BAD; |
} |
+webrtc::Point WebrtcPointFromMediaPoint(const media::Point& point) { |
+ return webrtc::Point(point.x(), point.y(), point.z()); |
+} |
+ |
+std::vector<webrtc::Point> WebrtcPointsFromMediaPoints( |
+ const std::vector<media::Point>& points) { |
+ std::vector<webrtc::Point> webrtc_points; |
+ webrtc_points.reserve(webrtc_points.size()); |
+ for (const auto& point : points) |
+ webrtc_points.push_back(WebrtcPointFromMediaPoint(point)); |
+ return webrtc_points; |
+} |
+ |
} // namespace |
// TODO(xians): Remove this method after the APM in WebRtc is deprecated. |
@@ -377,36 +392,19 @@ void GetAecStats(webrtc::EchoCancellation* echo_cancellation, |
} |
} |
-CONTENT_EXPORT std::vector<webrtc::Point> ParseArrayGeometry( |
- const std::string& geometry_string) { |
- const auto& tokens = |
- base::SplitString(geometry_string, base::kWhitespaceASCII, |
- base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
- std::vector<webrtc::Point> geometry; |
- if (tokens.size() < 3 || tokens.size() % 3 != 0) { |
- LOG(ERROR) << "Malformed geometry string: " << geometry_string; |
- return geometry; |
- } |
- |
- std::vector<float> float_tokens; |
- float_tokens.reserve(tokens.size()); |
- for (const auto& token : tokens) { |
- double float_token; |
- if (!base::StringToDouble(token, &float_token)) { |
- LOG(ERROR) << "Unable to convert token=" << token |
- << " to double from geometry string: " << geometry_string; |
- return geometry; |
- } |
- float_tokens.push_back(float_token); |
- } |
- |
- geometry.reserve(float_tokens.size() / 3); |
- for (size_t i = 0; i < float_tokens.size(); i += 3) { |
- geometry.push_back(webrtc::Point(float_tokens[i + 0], float_tokens[i + 1], |
- float_tokens[i + 2])); |
- } |
- |
- return geometry; |
+std::vector<webrtc::Point> GetArrayGeometryPreferringConstraints( |
+ const MediaAudioConstraints& audio_constraints, |
+ const MediaStreamDevice::AudioDeviceParameters& input_params) { |
+ const std::string constraints_geometry = |
+ audio_constraints.GetPropertyAsString( |
+ MediaAudioConstraints::kGoogArrayGeometry); |
+ |
+ // Give preference to the audio constraint over the device-supplied mic |
+ // positions. This is mainly for testing purposes. |
+ return WebrtcPointsFromMediaPoints( |
+ constraints_geometry.empty() |
+ ? input_params.mic_positions |
+ : media::ParsePointsFromString(constraints_geometry)); |
} |
} // namespace content |