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
This commit is contained in:
parent
5af76aedcd
commit
38d88816e3
@ -41,9 +41,8 @@ namespace {
|
|||||||
|
|
||||||
// Convert constraints to audio options. Return false if constraints are
|
// Convert constraints to audio options. Return false if constraints are
|
||||||
// invalid.
|
// invalid.
|
||||||
bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
|
void FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
|
||||||
cricket::AudioOptions* options) {
|
cricket::AudioOptions* options) {
|
||||||
bool success = true;
|
|
||||||
MediaConstraintsInterface::Constraints::const_iterator iter;
|
MediaConstraintsInterface::Constraints::const_iterator iter;
|
||||||
|
|
||||||
// This design relies on the fact that all the audio constraints are actually
|
// 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) {
|
for (iter = constraints.begin(); iter != constraints.end(); ++iter) {
|
||||||
bool value = false;
|
bool value = false;
|
||||||
|
|
||||||
if (!rtc::FromString(iter->value, &value)) {
|
if (!rtc::FromString(iter->value, &value))
|
||||||
success = false;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (iter->key == MediaConstraintsInterface::kEchoCancellation)
|
if (iter->key == MediaConstraintsInterface::kEchoCancellation)
|
||||||
options->echo_cancellation.Set(value);
|
options->echo_cancellation.Set(value);
|
||||||
@ -79,10 +76,7 @@ bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
|
|||||||
options->typing_detection.Set(value);
|
options->typing_detection.Set(value);
|
||||||
else if (iter->key == MediaConstraintsInterface::kAudioMirroring)
|
else if (iter->key == MediaConstraintsInterface::kAudioMirroring)
|
||||||
options->stereo_swapping.Set(value);
|
options->stereo_swapping.Set(value);
|
||||||
else
|
|
||||||
success = false;
|
|
||||||
}
|
}
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -106,12 +100,9 @@ void LocalAudioSource::Initialize(
|
|||||||
// constraints.
|
// constraints.
|
||||||
FromConstraints(constraints->GetOptional(), &options_);
|
FromConstraints(constraints->GetOptional(), &options_);
|
||||||
|
|
||||||
cricket::AudioOptions audio_options;
|
cricket::AudioOptions mandatory_options;
|
||||||
if (!FromConstraints(constraints->GetMandatory(), &audio_options)) {
|
FromConstraints(constraints->GetMandatory(), &mandatory_options);
|
||||||
source_state_ = kEnded;
|
options_.SetAll(mandatory_options);
|
||||||
return;
|
|
||||||
}
|
|
||||||
options_.SetAll(audio_options);
|
|
||||||
source_state_ = kLive;
|
source_state_ = kLive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +118,8 @@ TEST(LocalAudioSourceTest, InvalidMandatory) {
|
|||||||
LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
|
LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(),
|
||||||
&constraints);
|
&constraints);
|
||||||
|
|
||||||
EXPECT_EQ(MediaSourceInterface::kEnded, source->state());
|
EXPECT_EQ(MediaSourceInterface::kLive, source->state());
|
||||||
bool value;
|
bool value;
|
||||||
EXPECT_FALSE(source->options().highpass_filter.Get(&value));
|
EXPECT_TRUE(source->options().highpass_filter.Get(&value));
|
||||||
|
EXPECT_FALSE(value);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user