From 38d88816e395dfc32b355769f67a6f39c18bd511 Mon Sep 17 00:00:00 2001 From: "xians@webrtc.org" Date: Wed, 13 Aug 2014 13:51:58 +0000 Subject: [PATCH] Fix the audio source failure due to unsupported constraints. Some constraints, like kEchoCancellation, kMediaStreamAudioDucking are supported in Chrome but not in Libjingle, if the users set it in mandatory, LocalAudioSource::Initialize() will fail the getUserMedia call. This patch fixes the problem by fully initializing the LocalAudioSource even though some constraints are not supported in libjingle. BUT=crbug/398080 TEST=manual test: var constraints = {audio: { mandatory: { googEchoCancellation: true } }}; getUserMedia(constraints, gotStream, gotStreamFailed); verify you get a gotStream callback R=henrika@webrtc.org, tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/21049004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6885 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/app/webrtc/localaudiosource.cc | 19 +++++-------------- talk/app/webrtc/localaudiosource_unittest.cc | 5 +++-- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/talk/app/webrtc/localaudiosource.cc b/talk/app/webrtc/localaudiosource.cc index 9a3711297..e82280ea6 100644 --- a/talk/app/webrtc/localaudiosource.cc +++ b/talk/app/webrtc/localaudiosource.cc @@ -41,9 +41,8 @@ namespace { // Convert constraints to audio options. Return false if constraints are // invalid. -bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints, +void FromConstraints(const MediaConstraintsInterface::Constraints& constraints, cricket::AudioOptions* options) { - bool success = true; MediaConstraintsInterface::Constraints::const_iterator iter; // This design relies on the fact that all the audio constraints are actually @@ -53,10 +52,8 @@ bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints, for (iter = constraints.begin(); iter != constraints.end(); ++iter) { bool value = false; - if (!rtc::FromString(iter->value, &value)) { - success = false; + if (!rtc::FromString(iter->value, &value)) continue; - } if (iter->key == MediaConstraintsInterface::kEchoCancellation) options->echo_cancellation.Set(value); @@ -79,10 +76,7 @@ bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints, options->typing_detection.Set(value); else if (iter->key == MediaConstraintsInterface::kAudioMirroring) options->stereo_swapping.Set(value); - else - success = false; } - return success; } } // namespace @@ -106,12 +100,9 @@ void LocalAudioSource::Initialize( // constraints. FromConstraints(constraints->GetOptional(), &options_); - cricket::AudioOptions audio_options; - if (!FromConstraints(constraints->GetMandatory(), &audio_options)) { - source_state_ = kEnded; - return; - } - options_.SetAll(audio_options); + cricket::AudioOptions mandatory_options; + FromConstraints(constraints->GetMandatory(), &mandatory_options); + options_.SetAll(mandatory_options); source_state_ = kLive; } diff --git a/talk/app/webrtc/localaudiosource_unittest.cc b/talk/app/webrtc/localaudiosource_unittest.cc index 3a14bec58..2e045eed8 100644 --- a/talk/app/webrtc/localaudiosource_unittest.cc +++ b/talk/app/webrtc/localaudiosource_unittest.cc @@ -118,7 +118,8 @@ TEST(LocalAudioSourceTest, InvalidMandatory) { LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), &constraints); - EXPECT_EQ(MediaSourceInterface::kEnded, source->state()); + EXPECT_EQ(MediaSourceInterface::kLive, source->state()); bool value; - EXPECT_FALSE(source->options().highpass_filter.Get(&value)); + EXPECT_TRUE(source->options().highpass_filter.Get(&value)); + EXPECT_FALSE(value); }