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/talk@6885 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/app/webrtc/localaudiosource.cc b/app/webrtc/localaudiosource.cc
index 9a37112..e82280e 100644
--- a/app/webrtc/localaudiosource.cc
+++ b/app/webrtc/localaudiosource.cc
@@ -41,9 +41,8 @@
// 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 @@
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 @@
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 @@
// 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/app/webrtc/localaudiosource_unittest.cc b/app/webrtc/localaudiosource_unittest.cc
index 3a14bec..2e045ee 100644
--- a/app/webrtc/localaudiosource_unittest.cc
+++ b/app/webrtc/localaudiosource_unittest.cc
@@ -118,7 +118,8 @@
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);
}