1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voe_codec_impl.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 13471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h" 14471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 15471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 16471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/channel.h" 17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/include/voe_errors.h" 18471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoECodec* VoECodec::GetInterface(VoiceEngine* voiceEngine) 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_CODEC_API 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (NULL == voiceEngine) 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 32b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org s->AddRef(); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return s; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_CODEC_API 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoECodecImpl::VoECodecImpl(voe::SharedData* shared) : _shared(shared) 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "VoECodecImpl() - ctor"); 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoECodecImpl::~VoECodecImpl() 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "~VoECodecImpl() - dtor"); 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::NumOfCodecs() 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "NumOfCodecs()"); 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Number of supported codecs in the ACM 5854f03bc96c30337a3a97af7262cfb5148063b162pbos@webrtc.org uint8_t nSupportedCodecs = AudioCodingModule::NumberOfCodecs(); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "NumOfCodecs() => %u", nSupportedCodecs); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return (nSupportedCodecs); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::GetCodec(int index, CodecInst& codec) 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetCodec(index=%d, codec=?)", index); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CodecInst acmCodec; 71e9bb4e54a1f7b8b9dcbd3f47b5d99e3ea6012cc8tina.legrand@webrtc.org if (AudioCodingModule::Codec(index, &acmCodec) 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org == -1) 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_LISTNR, kTraceError, 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetCodec() invalid index"); 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ACMToExternalCodecRepresentation(codec, acmCodec); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetCodec() => plname=%s, pacsize=%d, plfreq=%d, pltype=%d, " 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codec.plfreq, codec.pltype, codec.channels, codec.rate); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::SetSendCodec(int channel, const CodecInst& codec) 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CodecInst copyCodec; 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ExternalToACMCodecRepresentation(copyCodec, codec); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec(channel=%d, codec)", channel); 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1), 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "codec: plname=%s, pacsize=%d, plfreq=%d, pltype=%d, " 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codec.plfreq, codec.pltype, codec.channels, codec.rate); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // External sanity checks performed outside the ACM 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ((STR_CASE_CMP(copyCodec.plname, "L16") == 0) && 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (copyCodec.pacsize >= 960)) 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec() invalid L16 packet size"); 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!STR_CASE_CMP(copyCodec.plname, "CN") 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org || !STR_CASE_CMP(copyCodec.plname, "TELEPHONE-EVENT") 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org || !STR_CASE_CMP(copyCodec.plname, "RED")) 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec() invalid codec name"); 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ((copyCodec.channels != 1) && (copyCodec.channels != 2)) 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec() invalid number of channels"); 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 125b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 126b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSendCodec() failed to locate channel"); 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!AudioCodingModule::IsCodecValid( 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (CodecInst&) copyCodec)) 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec() invalid codec"); 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr->SetSendCodec(copyCodec) != 0) 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CANNOT_SET_SEND_CODEC, kTraceError, 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCodec() failed to set send codec"); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::GetSendCodec(int channel, CodecInst& codec) 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSendCodec(channel=%d, codec=?)", channel); 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 159b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 160b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSendCodec() failed to locate channel"); 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CodecInst acmCodec; 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr->GetSendCodec(acmCodec) != 0) 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CANNOT_GET_SEND_CODEC, kTraceError, 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSendCodec() failed to get send codec"); 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ACMToExternalCodecRepresentation(codec, acmCodec); 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetSendCodec() => plname=%s, pacsize=%d, plfreq=%d, " 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codec.plfreq, codec.channels, codec.rate); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::GetRecCodec(int channel, CodecInst& codec) 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecCodec(channel=%d, codec=?)", channel); 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 192b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 193b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecCodec() failed to locate channel"); 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CodecInst acmCodec; 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr->GetRecCodec(acmCodec) != 0) 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CANNOT_GET_REC_CODEC, kTraceError, 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecCodec() failed to get received codec"); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ACMToExternalCodecRepresentation(codec, acmCodec); 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEId(_shared->instance_id(), -1), 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecCodec() => plname=%s, pacsize=%d, plfreq=%d, " 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codec.plfreq, codec.channels, codec.rate); 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::SetRecPayloadType(int channel, const CodecInst& codec) 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetRecPayloadType(channel=%d, codec)", channel); 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1), 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "codec: plname=%s, plfreq=%d, pltype=%d, channels=%u, " 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "pacsize=%d, rate=%d", codec.plname, codec.plfreq, codec.pltype, 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codec.channels, codec.pacsize, codec.rate); 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 229b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 230b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecPayloadType() failed to locate channel"); 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->SetRecPayloadType(codec); 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::GetRecPayloadType(int channel, CodecInst& codec) 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecPayloadType(channel=%d, codec)", channel); 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 249b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 250b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetRecPayloadType() failed to locate channel"); 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->GetRecPayloadType(codec); 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::SetSendCNPayloadType(int channel, int type, 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PayloadFrequencies frequency) 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCNPayloadType(channel=%d, type=%d, frequency=%d)", 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel, type, frequency); 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (type < 96 || type > 127) 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Only allow dynamic range: 96 to 127 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_PLTYPE, kTraceError, 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCNPayloadType() invalid payload type"); 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ((frequency != kFreq16000Hz) && (frequency != kFreq32000Hz)) 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // It is not possible to modify the payload type for CN/8000. 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We only allow modification of the CN payload type for CN/16000 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // and CN/32000. 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_PLFREQ, kTraceError, 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCNPayloadType() invalid payload frequency"); 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 287b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 288b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetSendCNPayloadType() failed to locate channel"); 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->SetSendCNPayloadType(type, frequency); 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 298dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.orgint VoECodecImpl::SetFECStatus(int channel, bool enable) { 299dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 300dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org "SetCodecFECStatus(channel=%d, enable=%d)", channel, enable); 301dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org if (!_shared->statistics().Initialized()) { 302dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 303dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return -1; 304dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org } 305dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 306dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org voe::Channel* channelPtr = ch.channel(); 307dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org if (channelPtr == NULL) { 308dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 309dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org "SetCodecFECStatus() failed to locate channel"); 310dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return -1; 311dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org } 312dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return channelPtr->SetCodecFECStatus(enable); 313dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org} 314dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org 315dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.orgint VoECodecImpl::GetFECStatus(int channel, bool& enabled) { 316dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 317dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org "GetCodecFECStatus(channel=%d)", channel); 318dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org if (!_shared->statistics().Initialized()) { 319dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 320dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return -1; 321dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org } 322dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 323dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org voe::Channel* channelPtr = ch.channel(); 324dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org if (channelPtr == NULL) { 325dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 326dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org "GetFECStatus() failed to locate channel"); 327dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return -1; 328dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org } 329dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org enabled = channelPtr->GetCodecFECStatus(); 330dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org return 0; 331dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org} 332dd671dea7a51c5db5e15123acac599e89f9be201minyue@webrtc.org 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::SetVADStatus(int channel, bool enable, VadModes mode, 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool disableDTX) 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetVADStatus(channel=%i, enable=%i, mode=%i, disableDTX=%i)", 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel, enable, mode, disableDTX); 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 345b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 346b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "SetVADStatus failed to locate channel"); 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ACMVADMode vadMode(VADNormal); 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (mode) 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kVadConventional: 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadMode = VADNormal; 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kVadAggressiveLow: 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadMode = VADLowBitrate; 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kVadAggressiveMid: 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadMode = VADAggr; 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kVadAggressiveHigh: 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadMode = VADVeryAggr; 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return channelPtr->SetVADStatus(enable, vadMode, disableDTX); 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoECodecImpl::GetVADStatus(int channel, bool& enabled, VadModes& mode, 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool& disabledDTX) 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetVADStatus(channel=%i)", channel); 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_shared->statistics().Initialized()) 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 384b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 385b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channelPtr == NULL) 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetVADStatus failed to locate channel"); 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ACMVADMode vadMode; 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int ret = channelPtr->GetVADStatus(enabled, vadMode, disabledDTX); 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ret != 0) 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _shared->SetLastError(VE_INVALID_OPERATION, kTraceError, 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "GetVADStatus failed to get VAD mode"); 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (vadMode) 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case VADNormal: 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mode = kVadConventional; 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case VADLowBitrate: 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mode = kVadAggressiveLow; 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case VADAggr: 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mode = kVadAggressiveMid; 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case VADVeryAggr: 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mode = kVadAggressiveHigh; 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 421b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.orgint VoECodecImpl::SetOpusMaxPlaybackRate(int channel, int frequency_hz) { 4221bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 423b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org "SetOpusMaxPlaybackRate(channel=%d, frequency_hz=%d)", channel, 424b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org frequency_hz); 4251bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org if (!_shared->statistics().Initialized()) { 4261bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 4271bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org return -1; 4281bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org } 4291bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 4301bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org voe::Channel* channelPtr = ch.channel(); 4311bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org if (channelPtr == NULL) { 4321bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 433b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org "SetOpusMaxPlaybackRate failed to locate channel"); 4341bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org return -1; 4351bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org } 436b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org return channelPtr->SetOpusMaxPlaybackRate(frequency_hz); 4371bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org} 4381bfd54032a8e60b993fb3b32c15ba9c55184c86bminyue@webrtc.org 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VoECodecImpl::ACMToExternalCodecRepresentation(CodecInst& toInst, 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const CodecInst& fromInst) 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst = fromInst; 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (STR_CASE_CMP(fromInst.plname,"SILK") == 0) 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.plfreq == 12000) 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.pacsize == 320) 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 240; 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 640) 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 480; 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 960) 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 720; 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.plfreq == 24000) 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.pacsize == 640) 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 480; 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 1280) 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 960; 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 1920) 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 1440; 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VoECodecImpl::ExternalToACMCodecRepresentation(CodecInst& toInst, 479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const CodecInst& fromInst) 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst = fromInst; 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (STR_CASE_CMP(fromInst.plname,"SILK") == 0) 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.plfreq == 12000) 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.pacsize == 240) 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 320; 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 480) 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 640; 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 720) 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 960; 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.plfreq == 24000) 500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fromInst.pacsize == 480) 502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 640; 504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 960) 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 1280; 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (fromInst.pacsize == 1440) 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org toInst.pacsize = 1920; 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 5177db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.orgint VoECodecImpl::SetSecondarySendCodec(int channel, const CodecInst& codec, 5187db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org int red_payload_type) { 5197db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org CodecInst copy_codec; 5207db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org ExternalToACMCodecRepresentation(copy_codec, codec); 5217db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 5227db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 5237db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec(channel=%d, codec)", channel); 5247db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1), 5257db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "codec: plname=%s, pacsize=%d, plfreq=%d, pltype=%d, " 5267db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 5277db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org codec.plfreq, codec.pltype, codec.channels, codec.rate); 5287db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (!_shared->statistics().Initialized()) { 5297db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 5307db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5317db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5327db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 5337db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org // External sanity checks performed outside the ACM 5347db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if ((STR_CASE_CMP(copy_codec.plname, "L16") == 0) && 5357db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org (copy_codec.pacsize >= 960)) { 5367db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 5377db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() invalid L16 packet size"); 5387db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5397db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5407db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 5417db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org // None of the following codecs can be registered as the secondary encoder. 5427db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (!STR_CASE_CMP(copy_codec.plname, "CN") || 5437db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org !STR_CASE_CMP(copy_codec.plname, "TELEPHONE-EVENT") || 5447db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org !STR_CASE_CMP(copy_codec.plname, "RED")) { 5457db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 5467db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() invalid codec name"); 5477db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5487db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5497db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 5507db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org // Only mono and stereo are supported. 5517db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if ((copy_codec.channels != 1) && (copy_codec.channels != 2)) { 5527db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 5537db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() invalid number of channels"); 5547db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5557db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 556b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 557b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 5587db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (channelPtr == NULL) { 5597db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 5607db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() failed to locate channel"); 5617db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5627db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5637db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (!AudioCodingModule::IsCodecValid(copy_codec)) { 5647db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError, 5657db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() invalid codec"); 5667db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5677db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5687db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (channelPtr->SetSecondarySendCodec(copy_codec, red_payload_type) != 0) { 5697db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_CANNOT_SET_SECONDARY_SEND_CODEC, kTraceError, 5707db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "SetSecondarySendCodec() failed to set secondary " 5717db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "send codec"); 5727db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5737db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5747db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return 0; 5757db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org} 5767db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 5777db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.orgint VoECodecImpl::GetSecondarySendCodec(int channel, CodecInst& codec) { 5787db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 5797db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "GetSecondarySendCodec(channel=%d, codec=?)", channel); 5807db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (!_shared->statistics().Initialized()) { 5817db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_NOT_INITED, kTraceError); 5827db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5837db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 584b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 585b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 5867db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (channelPtr == NULL) { 5877db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 5887db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "GetSecondarySendCodec() failed to locate channel"); 5897db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5907db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5917db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org CodecInst acm_codec; 5927db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (channelPtr->GetSecondarySendCodec(&acm_codec) != 0) { 5937db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_CANNOT_GET_SECONDARY_SEND_CODEC, kTraceError, 5947db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "GetSecondarySendCodec() failed to get secondary " 5957db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "send codec"); 5967db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 5977db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 5987db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org ACMToExternalCodecRepresentation(codec, acm_codec); 5997db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, 6007db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org VoEId(_shared->instance_id(), -1), 6017db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "GetSecondarySendCodec() => plname=%s, pacsize=%d, plfreq=%d, " 6027db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "channels=%d, rate=%d", codec.plname, codec.pacsize, 6037db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org codec.plfreq, codec.channels, codec.rate); 6047db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return 0; 6057db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org} 6067db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 6077db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.orgint VoECodecImpl::RemoveSecondarySendCodec(int channel) { 6087db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 6097db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "RemoveSecondarySendCodec(channel=%d)", channel); 610b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 611b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org voe::Channel* channelPtr = ch.channel(); 6127db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org if (channelPtr == NULL) { 6137db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 6147db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "RemoveSecondarySendCodec() failed to locate " 6157db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org "channel"); 6167db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return -1; 6177db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org } 6187db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org channelPtr->RemoveSecondarySendCodec(); 6197db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org return 0; 6207db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org} 6217db529046a2f5fc57f964619b9926a53b513c0a4turaj@webrtc.org 622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_VOICE_ENGINE_CODEC_API 623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 6243b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 625