1/* 2 * libjingle 3 * Copyright 2013 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28#include "talk/app/webrtc/localaudiosource.h" 29 30#include <vector> 31 32#include "talk/app/webrtc/mediaconstraintsinterface.h" 33#include "talk/media/base/mediaengine.h" 34 35using webrtc::MediaConstraintsInterface; 36using webrtc::MediaSourceInterface; 37 38namespace webrtc { 39 40namespace { 41 42// Convert constraints to audio options. Return false if constraints are 43// invalid. 44void FromConstraints(const MediaConstraintsInterface::Constraints& constraints, 45 cricket::AudioOptions* options) { 46 // This design relies on the fact that all the audio constraints are actually 47 // "options", i.e. boolean-valued and always satisfiable. If the constraints 48 // are extended to include non-boolean values or actual format constraints, 49 // a different algorithm will be required. 50 struct { 51 const char* name; 52 rtc::Optional<bool>& value; 53 } key_to_value[] = { 54 {MediaConstraintsInterface::kGoogEchoCancellation, 55 options->echo_cancellation}, 56 {MediaConstraintsInterface::kExtendedFilterEchoCancellation, 57 options->extended_filter_aec}, 58 {MediaConstraintsInterface::kDAEchoCancellation, 59 options->delay_agnostic_aec}, 60 {MediaConstraintsInterface::kAutoGainControl, options->auto_gain_control}, 61 {MediaConstraintsInterface::kExperimentalAutoGainControl, 62 options->experimental_agc}, 63 {MediaConstraintsInterface::kNoiseSuppression, 64 options->noise_suppression}, 65 {MediaConstraintsInterface::kExperimentalNoiseSuppression, 66 options->experimental_ns}, 67 {MediaConstraintsInterface::kHighpassFilter, options->highpass_filter}, 68 {MediaConstraintsInterface::kTypingNoiseDetection, 69 options->typing_detection}, 70 {MediaConstraintsInterface::kAudioMirroring, options->stereo_swapping}, 71 {MediaConstraintsInterface::kAecDump, options->aec_dump} 72 }; 73 74 for (const auto& constraint : constraints) { 75 bool value = false; 76 if (!rtc::FromString(constraint.value, &value)) 77 continue; 78 79 for (auto& entry : key_to_value) { 80 if (constraint.key.compare(entry.name) == 0) 81 entry.value = rtc::Optional<bool>(value); 82 } 83 } 84} 85 86} // namespace 87 88rtc::scoped_refptr<LocalAudioSource> LocalAudioSource::Create( 89 const PeerConnectionFactoryInterface::Options& options, 90 const MediaConstraintsInterface* constraints) { 91 rtc::scoped_refptr<LocalAudioSource> source( 92 new rtc::RefCountedObject<LocalAudioSource>()); 93 source->Initialize(options, constraints); 94 return source; 95} 96 97void LocalAudioSource::Initialize( 98 const PeerConnectionFactoryInterface::Options& options, 99 const MediaConstraintsInterface* constraints) { 100 if (!constraints) 101 return; 102 103 // Apply optional constraints first, they will be overwritten by mandatory 104 // constraints. 105 FromConstraints(constraints->GetOptional(), &options_); 106 107 cricket::AudioOptions mandatory_options; 108 FromConstraints(constraints->GetMandatory(), &mandatory_options); 109 options_.SetAll(mandatory_options); 110 source_state_ = kLive; 111} 112 113} // namespace webrtc 114