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