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);
 }