10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2010 Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_SESSION_PHONE_FAKEWEBRTCVOICEENGINE_H_
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_SESSION_PHONE_FAKEWEBRTCVOICEENGINE_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <list>
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map>
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/codec.h"
36ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org#include "talk/media/base/rtputils.h"
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/voiceprocessor.h"
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/fakewebrtccommon.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvoe.h"
40cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/basictypes.h"
41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h"
42cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/stringutils.h"
43440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
44440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#include "webrtc/modules/audio_processing/include/audio_processing.h"
45440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#endif
465462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
47afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Function returning stats will return these values
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// for all values based on type.
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst int kIntStatValue = 123;
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst float kFractionLostStatValue = 0.5;
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kFakeDefaultDeviceName[] = "Fake Default";
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kFakeDefaultDeviceId = -1;
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kFakeDeviceName[] = "Fake Device";
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kFakeDeviceId = 0;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kFakeDeviceId = 1;
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
64ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgstatic const int kOpusBandwidthNb = 4000;
65ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgstatic const int kOpusBandwidthMb = 6000;
66ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgstatic const int kOpusBandwidthWb = 8000;
67ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgstatic const int kOpusBandwidthSwb = 12000;
68ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgstatic const int kOpusBandwidthFb = 20000;
69ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
703ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org// Verify the header extension ID, if enabled, is within the bounds specified in
713ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org// [RFC5285]: 1-14 inclusive.
723ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org#define WEBRTC_CHECK_HEADER_EXTENSION_ID(enable, id) \
733ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  do { \
743ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    if (enable && (id < 1 || id > 14)) { \
753ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      return -1; \
763ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    } \
773ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  } while (0);
783ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
79440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
80440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.orgclass FakeAudioProcessing : public webrtc::AudioProcessing {
81440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org public:
82440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  FakeAudioProcessing() : experimental_ns_enabled_(false) {}
83440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
84440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(Initialize, ())
85440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(Initialize, (
86440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int input_sample_rate_hz,
87440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int output_sample_rate_hz,
88440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int reverse_sample_rate_hz,
89440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout input_layout,
90440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout output_layout,
91440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout reverse_layout));
92440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
93440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_VOID_FUNC(SetExtraOptions, (const webrtc::Config& config)) {
94440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    experimental_ns_enabled_ = config.Get<webrtc::ExperimentalNs>().enabled;
95440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
96440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
97440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(set_sample_rate_hz, (int rate));
98440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(input_sample_rate_hz, ());
99440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(sample_rate_hz, ());
100440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(proc_sample_rate_hz, ());
101440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(proc_split_sample_rate_hz, ());
102440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(num_input_channels, ());
103440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(num_output_channels, ());
104440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(num_reverse_channels, ());
105440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_VOID_STUB(set_output_will_be_muted, (bool muted));
106440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_BOOL_STUB_CONST(output_will_be_muted, ());
107440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(ProcessStream, (webrtc::AudioFrame* frame));
108440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(ProcessStream, (
109440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      const float* const* src,
110440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int samples_per_channel,
111440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int input_sample_rate_hz,
112440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout input_layout,
113440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int output_sample_rate_hz,
114440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout output_layout,
115440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      float* const* dest));
116440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(AnalyzeReverseStream, (webrtc::AudioFrame* frame));
117440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(AnalyzeReverseStream, (
118440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      const float* const* data,
119440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int samples_per_channel,
120440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      int sample_rate_hz,
121440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org      webrtc::AudioProcessing::ChannelLayout layout));
122440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(set_stream_delay_ms, (int delay));
123440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(stream_delay_ms, ());
124440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_BOOL_STUB_CONST(was_stream_delay_set, ());
125440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_VOID_STUB(set_stream_key_pressed, (bool key_pressed));
126440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_BOOL_STUB_CONST(stream_key_pressed, ());
127440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_VOID_STUB(set_delay_offset_ms, (int offset));
128440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB_CONST(delay_offset_ms, ());
129440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(StartDebugRecording, (const char filename[kMaxFilenameSize]));
130440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(StartDebugRecording, (FILE* handle));
131440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  WEBRTC_STUB(StopDebugRecording, ());
132440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::EchoCancellation* echo_cancellation() const OVERRIDE {
133440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
134440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
135440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::EchoControlMobile* echo_control_mobile() const OVERRIDE {
136440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
137440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
138440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::GainControl* gain_control() const OVERRIDE { return NULL; }
139440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::HighPassFilter* high_pass_filter() const OVERRIDE {
140440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
141440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
142440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::LevelEstimator* level_estimator() const OVERRIDE {
143440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
144440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
145440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::NoiseSuppression* noise_suppression() const OVERRIDE {
146440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
147440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
148440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  virtual webrtc::VoiceDetection* voice_detection() const OVERRIDE {
149440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return NULL;
150440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
151440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
152440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  bool experimental_ns_enabled() {
153440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return experimental_ns_enabled_;
154440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  }
155440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
156440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org private:
157440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  bool experimental_ns_enabled_;
158440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org};
159440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#endif
160440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeWebRtcVoiceEngine
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public webrtc::VoEAudioProcessing,
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::VoEBase, public webrtc::VoECodec, public webrtc::VoEDtmf,
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::VoEFile, public webrtc::VoEHardware,
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::VoEExternalMedia, public webrtc::VoENetEqStats,
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::VoENetwork, public webrtc::VoERTP_RTCP,
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public webrtc::VoEVideoSync, public webrtc::VoEVolumeControl {
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct DtmfInfo {
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    DtmfInfo()
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : dtmf_event_code(-1),
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        dtmf_out_of_band(false),
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        dtmf_length_ms(-1) {}
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int dtmf_event_code;
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool dtmf_out_of_band;
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int dtmf_length_ms;
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct Channel {
17929b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org    explicit Channel()
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : external_transport(false),
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send(false),
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          playout(false),
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          volume_scale(1.0),
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          volume_pan_left(1.0),
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          volume_pan_right(1.0),
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          file(false),
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          vad(false),
18807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org          codec_fec(false),
189ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org          max_encoding_bandwidth(0),
19007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org          red(false),
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          nack(false),
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          media_processor_registered(false),
1935c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org          rx_agc_enabled(false),
1945c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org          rx_agc_mode(webrtc::kAgcDefault),
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          cn8_type(13),
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          cn16_type(105),
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          dtmf_type(106),
19807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org          red_type(117),
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          nack_max_packets(0),
200afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org          vie_network(NULL),
201afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org          video_channel(-1),
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          send_ssrc(0),
2033ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org          send_audio_level_ext_(-1),
2042ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org          receive_audio_level_ext_(-1),
2053ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org          send_absolute_sender_time_ext_(-1),
20629b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org          receive_absolute_sender_time_ext_(-1) {
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      memset(&send_codec, 0, sizeof(send_codec));
2085c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      memset(&rx_agc_config, 0, sizeof(rx_agc_config));
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool external_transport;
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool send;
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool playout;
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    float volume_scale;
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    float volume_pan_left;
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    float volume_pan_right;
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool file;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool vad;
21807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    bool codec_fec;
219ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    int max_encoding_bandwidth;
22007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    bool red;
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool nack;
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool media_processor_registered;
2235c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    bool rx_agc_enabled;
2245c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    webrtc::AgcModes rx_agc_mode;
2255c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    webrtc::AgcConfig rx_agc_config;
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int cn8_type;
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int cn16_type;
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int dtmf_type;
22907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    int red_type;
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int nack_max_packets;
231afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    webrtc::ViENetwork* vie_network;
232afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    int video_channel;
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint32 send_ssrc;
2343ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    int send_audio_level_ext_;
2352ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    int receive_audio_level_ext_;
2363ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    int send_absolute_sender_time_ext_;
2373ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    int receive_absolute_sender_time_ext_;
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    DtmfInfo dtmf_info;
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::vector<webrtc::CodecInst> recv_codecs;
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::CodecInst send_codec;
241afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    webrtc::PacketTime last_rtp_packet_time;
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::list<std::string> packets;
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  FakeWebRtcVoiceEngine(const cricket::AudioCodec* const* codecs,
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        int num_codecs)
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : inited_(false),
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        last_channel_(-1),
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_create_channel_(false),
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        codecs_(codecs),
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        num_codecs_(num_codecs),
252a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org        num_set_send_codecs_(0),
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ec_enabled_(false),
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ec_metrics_enabled_(false),
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        cng_enabled_(false),
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ns_enabled_(false),
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        agc_enabled_(false),
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        highpass_filter_enabled_(false),
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        stereo_swapping_enabled_(false),
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        typing_detection_enabled_(false),
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ec_mode_(webrtc::kEcDefault),
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        aecm_mode_(webrtc::kAecmSpeakerphone),
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ns_mode_(webrtc::kNsDefault),
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        agc_mode_(webrtc::kAgcDefault),
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        observer_(NULL),
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        playout_fail_channel_(-1),
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        send_fail_channel_(-1),
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        fail_start_recording_microphone_(false),
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        recording_microphone_(false),
2705c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org        recording_sample_rate_(-1),
2715c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org        playout_sample_rate_(-1),
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        media_processor_(NULL) {
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    memset(&agc_config_, 0, sizeof(agc_config_));
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~FakeWebRtcVoiceEngine() {
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Ought to have all been deleted by the WebRtcVoiceMediaChannel
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // destructors, but just in case ...
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::map<int, Channel*>::const_iterator i = channels_.begin();
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         i != channels_.end(); ++i) {
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      delete i->second;
2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsExternalMediaProcessorRegistered() const {
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return media_processor_ != NULL;
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsInited() const { return inited_; }
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetLastChannel() const { return last_channel_; }
289f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  int GetChannelFromLocalSsrc(uint32 local_ssrc) const {
290f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    for (std::map<int, Channel*>::const_iterator iter = channels_.begin();
291f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org         iter != channels_.end(); ++iter) {
292f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org      if (local_ssrc == iter->second->send_ssrc)
293f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org        return iter->first;
294f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    }
295f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org    return -1;
296f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org  }
297cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  int GetNumChannels() const { return static_cast<int>(channels_.size()); }
2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetPlayout(int channel) {
2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->playout;
3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetSend(int channel) {
3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->send;
3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetRecordingMicrophone() {
3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return recording_microphone_;
3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetVAD(int channel) {
3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->vad;
3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
31007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  bool GetRED(int channel) {
31107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    return channels_[channel]->red;
31207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  }
31307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  bool GetCodecFEC(int channel) {
31407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    return channels_[channel]->codec_fec;
3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
316ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  int GetMaxEncodingBandwidth(int channel) {
317ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    return channels_[channel]->max_encoding_bandwidth;
318ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  }
3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetNACK(int channel) {
3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->nack;
3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNACKMaxPackets(int channel) {
3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->nack_max_packets;
3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
325afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  webrtc::ViENetwork* GetViENetwork(int channel) {
326afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
3275462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    // WARNING: This pointer is for verification purposes only. Calling
3285462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    // functions on it may result in undefined behavior!
329afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return channels_[channel]->vie_network;
330afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
331afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  int GetVideoChannel(int channel) {
332afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
333afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return channels_[channel]->video_channel;
334afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
335afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  const webrtc::PacketTime& GetLastRtpPacketTime(int channel) {
336afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
337afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return channels_[channel]->last_rtp_packet_time;
338afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetSendCNPayloadType(int channel, bool wideband) {
3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (wideband) ?
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        channels_[channel]->cn16_type :
3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        channels_[channel]->cn8_type;
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetSendTelephoneEventPayloadType(int channel) {
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->dtmf_type;
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
34707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  int GetSendREDPayloadType(int channel) {
34807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    return channels_[channel]->red_type;
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckPacket(int channel, const void* data, size_t len) {
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool result = !CheckNoPacket(channel);
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (result) {
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string packet = channels_[channel]->packets.front();
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      result = (packet == std::string(static_cast<const char*>(data), len));
3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[channel]->packets.pop_front();
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckNoPacket(int channel) {
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channels_[channel]->packets.empty();
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TriggerCallbackOnError(int channel_num, int err_code) {
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT(observer_ != NULL);
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    observer_->CallbackOnError(channel_num, err_code);
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_playout_fail_channel(int channel) {
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    playout_fail_channel_ = channel;
3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_send_fail_channel(int channel) {
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    send_fail_channel_ = channel;
3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_start_recording_microphone(
3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      bool fail_start_recording_microphone) {
3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    fail_start_recording_microphone_ = fail_start_recording_microphone;
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_fail_create_channel(bool fail_create_channel) {
3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    fail_create_channel_ = fail_create_channel;
3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TriggerProcessPacket(MediaProcessorDirection direction) {
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::ProcessingTypes pt =
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        (direction == cricket::MPD_TX) ?
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            webrtc::kRecordingPerChannel : webrtc::kPlaybackAllChannelsMixed;
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (media_processor_ != NULL) {
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      media_processor_->Process(0,
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                pt,
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                NULL,
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                0,
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                0,
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                true);
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
39229b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org  int AddChannel() {
3933db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    if (fail_create_channel_) {
3943db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      return -1;
3953db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    }
39629b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org    Channel* ch = new Channel();
3973db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    for (int i = 0; i < NumOfCodecs(); ++i) {
3983db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      webrtc::CodecInst codec;
3993db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      GetCodec(i, codec);
4003db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org      ch->recv_codecs.push_back(codec);
4013db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    }
4023db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    channels_[++last_channel_] = ch;
4033db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org    return last_channel_;
4043db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
4052ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  int GetSendRtpExtensionId(int channel, const std::string& extension) {
4062ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4072ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    if (extension == kRtpAudioLevelHeaderExtension) {
4082ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_[channel]->send_audio_level_ext_;
4092ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
4102ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_[channel]->send_absolute_sender_time_ext_;
4112ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    }
4122ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return -1;
4133ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
4142ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  int GetReceiveRtpExtensionId(int channel, const std::string& extension) {
4152ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    WEBRTC_ASSERT_CHANNEL(channel);
4162ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    if (extension == kRtpAudioLevelHeaderExtension) {
4172ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_[channel]->receive_audio_level_ext_;
4182ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    } else if (extension == kRtpAbsoluteSenderTimeHeaderExtension) {
4192ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      return channels_[channel]->receive_absolute_sender_time_ext_;
4202ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    }
4212ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    return -1;
4223ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
424a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  int GetNumSetSendCodecs() const { return num_set_send_codecs_; }
425a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org
4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(Release, ());
4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEBase
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RegisterVoiceEngineObserver, (
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      webrtc::VoiceEngineObserver& observer)) {
4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    observer_ = &observer;
4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeRegisterVoiceEngineObserver, ());
4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(Init, (webrtc::AudioDeviceModule* adm,
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     webrtc::AudioProcessing* audioproc)) {
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    inited_ = true;
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(Terminate, ()) {
4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    inited_ = false;
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual webrtc::AudioProcessing* audio_processing() OVERRIDE {
445440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
446440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org    return &audio_processing_;
447440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#else
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return NULL;
449440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#endif
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(CreateChannel, ()) {
45229b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org    return AddChannel();
4533db045861afcaf20aed671c0de15a6ff4ca32d08wu@webrtc.org  }
45429b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org  WEBRTC_FUNC(CreateChannel, (const webrtc::Config& /*config*/)) {
45529b36076e91f73262536dc3878f1d27987bdf9febuildbot@webrtc.org    return AddChannel();
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeleteChannel, (int channel)) {
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    delete channels_[channel];
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_.erase(channel);
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartReceive, (int channel));
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartPlayout, (int channel)) {
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (playout_fail_channel_ != channel) {
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(channel);
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[channel]->playout = true;
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // When playout_fail_channel_ == channel, fail the StartPlayout on this
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // channel.
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartSend, (int channel)) {
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_fail_channel_ != channel) {
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      WEBRTC_CHECK_CHANNEL(channel);
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[channel]->send = true;
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return 0;
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // When send_fail_channel_ == channel, fail the StartSend on this
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // channel.
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopReceive, (int channel));
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopPlayout, (int channel)) {
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->playout = false;
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopSend, (int channel)) {
4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send = false;
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetVersion, (char version[1024]));
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(LastError, ());
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetOnHoldStatus, (int, bool, webrtc::OnHoldModes));
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetOnHoldStatus, (int, bool&, webrtc::OnHoldModes&));
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoECodec
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(NumOfCodecs, ()) {
5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return num_codecs_;
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetCodec, (int index, webrtc::CodecInst& codec)) {
5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (index < 0 || index >= NumOfCodecs()) {
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::AudioCodec& c(*codecs_[index]);
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec.pltype = c.id;
5122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::strcpyn(codec.plname, sizeof(codec.plname), c.name.c_str());
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec.plfreq = c.clockrate;
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec.pacsize = 0;
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec.channels = c.channels;
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec.rate = c.bitrate;
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendCodec, (int channel, const webrtc::CodecInst& codec)) {
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
5217587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org    // To match the behavior of the real implementation.
5227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org    if (_stricmp(codec.plname, "telephone-event") == 0 ||
5237587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org        _stricmp(codec.plname, "audio/telephone-event") == 0 ||
5247587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org        _stricmp(codec.plname, "CN") == 0 ||
5257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org        _stricmp(codec.plname, "red") == 0 ) {
5267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org      return -1;
5277587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org    }
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_codec = codec;
529a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org    ++num_set_send_codecs_;
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetSendCodec, (int channel, webrtc::CodecInst& codec)) {
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    codec = channels_[channel]->send_codec;
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetSecondarySendCodec, (int channel,
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      const webrtc::CodecInst& codec,
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      int red_payload_type));
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RemoveSecondarySendCodec, (int channel));
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSecondarySendCodec, (int channel,
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      webrtc::CodecInst& codec));
543ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  WEBRTC_FUNC(GetRecCodec, (int channel, webrtc::CodecInst& codec)) {
544ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
545ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    const Channel* c = channels_[channel];
546ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    for (std::list<std::string>::const_iterator it_packet = c->packets.begin();
547ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org        it_packet != c->packets.end(); ++it_packet) {
548ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      int pltype;
549ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      if (!GetRtpPayloadType(it_packet->data(), it_packet->length(), &pltype)) {
550ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org        continue;
551ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      }
552ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      for (std::vector<webrtc::CodecInst>::const_iterator it_codec =
553ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org          c->recv_codecs.begin(); it_codec != c->recv_codecs.end();
554ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org          ++it_codec) {
555ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org        if (it_codec->pltype == pltype) {
556ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org          codec = *it_codec;
557ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org          return 0;
558ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org        }
559ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org      }
560ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    }
561ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org    return -1;
562ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org  }
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetAMREncFormat, (int channel, webrtc::AmrMode mode));
5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetAMRDecFormat, (int channel, webrtc::AmrMode mode));
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetAMRWbEncFormat, (int channel, webrtc::AmrMode mode));
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetAMRWbDecFormat, (int channel, webrtc::AmrMode mode));
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetISACInitTargetRate, (int channel, int rateBps,
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      bool useFixedFrameSize));
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetISACMaxRate, (int channel, int rateBps));
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetISACMaxPayloadSize, (int channel, int sizeBytes));
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetRecPayloadType, (int channel,
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  const webrtc::CodecInst& codec)) {
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Channel* ch = channels_[channel];
5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ch->playout)
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;  // Channel is in use.
5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Check if something else already has this slot.
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (codec.pltype != -1) {
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      for (std::vector<webrtc::CodecInst>::iterator it =
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          ch->recv_codecs.begin(); it != ch->recv_codecs.end(); ++it) {
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        if (it->pltype == codec.pltype &&
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            _stricmp(it->plname, codec.plname) != 0) {
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          return -1;
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        }
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Otherwise try to find this codec and update its payload type.
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::vector<webrtc::CodecInst>::iterator it = ch->recv_codecs.begin();
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != ch->recv_codecs.end(); ++it) {
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (strcmp(it->plname, codec.plname) == 0 &&
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          it->plfreq == codec.plfreq) {
5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        it->pltype = codec.pltype;
5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        it->channels = codec.channels;
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return 0;
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;  // not found
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendCNPayloadType, (int channel, int type,
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     webrtc::PayloadFrequencies frequency)) {
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (frequency == webrtc::kFreq8000Hz) {
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[channel]->cn8_type = type;
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (frequency == webrtc::kFreq16000Hz) {
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channels_[channel]->cn16_type = type;
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetRecPayloadType, (int channel, webrtc::CodecInst& codec)) {
6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Channel* ch = channels_[channel];
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::vector<webrtc::CodecInst>::iterator it = ch->recv_codecs.begin();
6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != ch->recv_codecs.end(); ++it) {
6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (strcmp(it->plname, codec.plname) == 0 &&
6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          it->plfreq == codec.plfreq &&
6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          it->channels == codec.channels &&
6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          it->pltype != -1) {
6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        codec.pltype = it->pltype;
6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return 0;
6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;  // not found
6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetVADStatus, (int channel, bool enable, webrtc::VadModes mode,
6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             bool disableDTX)) {
6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (channels_[channel]->send_codec.channels == 2) {
6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Replicating VoE behavior; VAD cannot be enabled for stereo.
6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->vad = enable;
6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetVADStatus, (int channel, bool& enabled,
6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             webrtc::VadModes& mode, bool& disabledDTX));
636ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
63707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
63807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  WEBRTC_FUNC(SetFECStatus, (int channel, bool enable)) {
63907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
640ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    if (_stricmp(channels_[channel]->send_codec.plname, "opus") != 0) {
641c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org      // Return -1 if current send codec is not Opus.
642c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org      // TODO(minyue): Excludes other codecs if they support inband FEC.
643c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org      return -1;
644c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org    }
64507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    channels_[channel]->codec_fec = enable;
64607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    return 0;
64707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  }
64807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  WEBRTC_FUNC(GetFECStatus, (int channel, bool& enable)) {
64907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
65007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    enable = channels_[channel]->codec_fec;
65107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    return 0;
65207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  }
653ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org
654ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  WEBRTC_FUNC(SetOpusMaxPlaybackRate, (int channel, int frequency_hz)) {
655ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
656ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    if (_stricmp(channels_[channel]->send_codec.plname, "opus") != 0) {
657ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      // Return -1 if current send codec is not Opus.
658ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      return -1;
659ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    }
660ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    if (frequency_hz <= 8000)
661ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      channels_[channel]->max_encoding_bandwidth = kOpusBandwidthNb;
662ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    else if (frequency_hz <= 12000)
663ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      channels_[channel]->max_encoding_bandwidth = kOpusBandwidthMb;
664ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    else if (frequency_hz <= 16000)
665ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      channels_[channel]->max_encoding_bandwidth = kOpusBandwidthWb;
666ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    else if (frequency_hz <= 24000)
667ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      channels_[channel]->max_encoding_bandwidth = kOpusBandwidthSwb;
668ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    else
669ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org      channels_[channel]->max_encoding_bandwidth = kOpusBandwidthFb;
670ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org    return 0;
671ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org  }
67207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#endif  // USE_WEBRTC_DEV_BRANCH
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEDtmf
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SendTelephoneEvent, (int channel, int event_code,
6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      bool out_of_band = true, int length_ms = 160, int attenuation_db = 10)) {
6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->dtmf_info.dtmf_event_code = event_code;
6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->dtmf_info.dtmf_out_of_band = out_of_band;
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->dtmf_info.dtmf_length_ms = length_ms;
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetSendTelephoneEventPayloadType,
6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (int channel, unsigned char type)) {
6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->dtmf_type = type;
6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSendTelephoneEventPayloadType,
6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (int channel, unsigned char& type));
6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetDtmfFeedbackStatus, (bool enable, bool directFeedback));
6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetDtmfFeedbackStatus, (bool& enabled, bool& directFeedback));
69345017aec092dbdfd293de1268c258e61aa6d4be5henrik.lundin@webrtc.org  WEBRTC_STUB(SetDtmfPlayoutStatus, (int channel, bool enable));
69445017aec092dbdfd293de1268c258e61aa6d4be5henrik.lundin@webrtc.org  WEBRTC_STUB(GetDtmfPlayoutStatus, (int channel, bool& enabled));
6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(PlayDtmfTone,
6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (int event_code, int length_ms = 200, int attenuation_db = 10)) {
6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    dtmf_info_.dtmf_event_code = event_code;
6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    dtmf_info_.dtmf_length_ms = length_ms;
7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartPlayingDtmfTone,
7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      (int eventCode, int attenuationDb = 10));
7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopPlayingDtmfTone, ());
7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEFile
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartPlayingFileLocally, (int channel, const char* fileNameUTF8,
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        bool loop, webrtc::FileFormats format,
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        float volumeScaling, int startPointMs,
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        int stopPointMs)) {
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->file = true;
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartPlayingFileLocally, (int channel, webrtc::InStream* stream,
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        webrtc::FileFormats format,
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        float volumeScaling, int startPointMs,
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        int stopPointMs)) {
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->file = true;
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopPlayingFileLocally, (int channel)) {
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->file = false;
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(IsPlayingFileLocally, (int channel)) {
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_[channel]->file) ? 1 : 0;
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ScaleLocalFilePlayout, (int channel, float scale));
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartPlayingFileAsMicrophone, (int channel,
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             const char* fileNameUTF8,
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             bool loop,
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             bool mixWithMicrophone,
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             webrtc::FileFormats format,
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             float volumeScaling));
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartPlayingFileAsMicrophone, (int channel,
7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             webrtc::InStream* stream,
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             bool mixWithMicrophone,
7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             webrtc::FileFormats format,
7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             float volumeScaling));
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopPlayingFileAsMicrophone, (int channel));
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(IsPlayingFileAsMicrophone, (int channel));
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ScaleFileAsMicrophonePlayout, (int channel, float scale));
7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartRecordingPlayout, (int channel, const char* fileNameUTF8,
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      webrtc::CodecInst* compression,
7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      int maxSizeBytes));
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartRecordingPlayout, (int channel, webrtc::OutStream* stream,
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      webrtc::CodecInst* compression));
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopRecordingPlayout, (int channel));
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartRecordingMicrophone, (const char* fileNameUTF8,
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         webrtc::CodecInst* compression,
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         int maxSizeBytes)) {
7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_start_recording_microphone_) {
7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recording_microphone_ = true;
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StartRecordingMicrophone, (webrtc::OutStream* stream,
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                         webrtc::CodecInst* compression)) {
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (fail_start_recording_microphone_) {
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recording_microphone_ = true;
7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(StopRecordingMicrophone, ()) {
7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!recording_microphone_) {
7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    recording_microphone_ = false;
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertPCMToWAV, (const char* fileNameInUTF8,
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                const char* fileNameOutUTF8));
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertPCMToWAV, (webrtc::InStream* streamIn,
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                webrtc::OutStream* streamOut));
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertWAVToPCM, (const char* fileNameInUTF8,
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                const char* fileNameOutUTF8));
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertWAVToPCM, (webrtc::InStream* streamIn,
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                webrtc::OutStream* streamOut));
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertPCMToCompressed, (const char* fileNameInUTF8,
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       const char* fileNameOutUTF8,
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       webrtc::CodecInst* compression));
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertPCMToCompressed, (webrtc::InStream* streamIn,
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       webrtc::OutStream* streamOut,
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       webrtc::CodecInst* compression));
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertCompressedToPCM, (const char* fileNameInUTF8,
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     const char* fileNameOutUTF8));
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ConvertCompressedToPCM, (webrtc::InStream* streamIn,
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       webrtc::OutStream* streamOut));
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetFileDuration, (const char* fileNameUTF8, int& durationMs,
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                webrtc::FileFormats format));
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetPlaybackPosition, (int channel, int& positionMs));
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEHardware
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetCPULoad, (int&));
8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetNumOfRecordingDevices, (int& num)) {
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetNumDevices(num);
8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetNumOfPlayoutDevices, (int& num)) {
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetNumDevices(num);
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetRecordingDeviceName, (int i, char* name, char* guid)) {
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetDeviceName(i, name, guid);
8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetPlayoutDeviceName, (int i, char* name, char* guid)) {
8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetDeviceName(i, name, guid);
8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetRecordingDevice, (int, webrtc::StereoChannel));
8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetPlayoutDevice, (int));
8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetAudioDeviceLayer, (webrtc::AudioLayers));
8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetAudioDeviceLayer, (webrtc::AudioLayers&));
8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetPlayoutDeviceStatus, (bool&));
8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRecordingDeviceStatus, (bool&));
8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ResetAudioDevice, ());
8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(AudioDeviceControl, (unsigned int, unsigned int, unsigned int));
8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetLoudspeakerStatus, (bool enable));
8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetLoudspeakerStatus, (bool& enabled));
8235c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(SetRecordingSampleRate, (unsigned int samples_per_sec)) {
8245c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    recording_sample_rate_ = samples_per_sec;
8255c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
8265c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
8275c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC_CONST(RecordingSampleRate, (unsigned int* samples_per_sec)) {
8285c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    *samples_per_sec = recording_sample_rate_;
8295c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
8305c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
8315c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(SetPlayoutSampleRate, (unsigned int samples_per_sec)) {
8325c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    playout_sample_rate_ = samples_per_sec;
8335c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
8345c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
8355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC_CONST(PlayoutSampleRate, (unsigned int* samples_per_sec)) {
8365c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    *samples_per_sec = playout_sample_rate_;
8375c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
8385c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(EnableBuiltInAEC, (bool enable));
8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool BuiltInAECIsEnabled() const { return true; }
8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoENetEqStats
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetNetworkStatistics, (int, webrtc::NetworkStatistics&));
84440ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org  WEBRTC_FUNC_CONST(GetDecodingCallStatistics, (int channel,
84540ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org      webrtc::AudioDecodingCallStats*)) {
84640ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
84740ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org    return 0;
84840ce06146a24b60291ebcbec6f49e02ce381ba7bwu@webrtc.org  }
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoENetwork
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RegisterExternalTransport, (int channel,
8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          webrtc::Transport& transport)) {
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->external_transport = true;
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeRegisterExternalTransport, (int channel)) {
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->external_transport = false;
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(ReceivedRTPPacket, (int channel, const void* data,
8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned int length)) {
8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!channels_[channel]->external_transport) return -1;
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->packets.push_back(
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        std::string(static_cast<const char*>(data), length));
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
870afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  WEBRTC_FUNC(ReceivedRTPPacket, (int channel, const void* data,
871afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org                                  unsigned int length,
872afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org                                  const webrtc::PacketTime& packet_time)) {
873afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
874afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    if (ReceivedRTPPacket(channel, data, length) == -1) {
875afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org      return -1;
876afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    }
877afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    channels_[channel]->last_rtp_packet_time = packet_time;
878afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return 0;
879afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
880afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org
8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ReceivedRTCPPacket, (int channel, const void* data,
8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   unsigned int length));
8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoERTP_RTCP
8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRTPObserver, (int channel,
8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                    webrtc::VoERTPObserver& observer));
8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeRegisterRTPObserver, (int channel));
8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRTCPObserver, (int channel,
8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     webrtc::VoERTCPObserver& observer));
8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeRegisterRTCPObserver, (int channel));
8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetLocalSSRC, (int channel, unsigned int ssrc)) {
8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->send_ssrc = ssrc;
8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetLocalSSRC, (int channel, unsigned int& ssrc)) {
8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ssrc = channels_[channel]->send_ssrc;
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRemoteSSRC, (int channel, unsigned int& ssrc));
9023ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  WEBRTC_FUNC(SetSendAudioLevelIndicationStatus, (int channel, bool enable,
9033ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      unsigned char id)) {
9043ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9053ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    WEBRTC_CHECK_HEADER_EXTENSION_ID(enable, id);
9063ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    channels_[channel]->send_audio_level_ext_ = (enable) ? id : -1;
9073ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    return 0;
9083ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  }
9092ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  WEBRTC_FUNC(SetReceiveAudioLevelIndicationStatus, (int channel, bool enable,
9102ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org      unsigned char id)) {
9112ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9122ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    WEBRTC_CHECK_HEADER_EXTENSION_ID(enable, id);
9132ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org    channels_[channel]->receive_audio_level_ext_ = (enable) ? id : -1;
9142ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org   return 0;
9152ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org  }
9163ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  WEBRTC_FUNC(SetSendAbsoluteSenderTimeStatus, (int channel, bool enable,
9173ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      unsigned char id)) {
9183ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9193ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    WEBRTC_CHECK_HEADER_EXTENSION_ID(enable, id);
9203ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    channels_[channel]->send_absolute_sender_time_ext_ = (enable) ? id : -1;
9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9233ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org  WEBRTC_FUNC(SetReceiveAbsoluteSenderTimeStatus, (int channel, bool enable,
9243ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org      unsigned char id)) {
9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9263ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    WEBRTC_CHECK_HEADER_EXTENSION_ID(enable, id);
9273ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org    channels_[channel]->receive_absolute_sender_time_ext_ = (enable) ? id : -1;
9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9303ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRemoteCSRCs, (int channel, unsigned int arrCSRC[15]));
9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetRTCPStatus, (int channel, bool enable));
9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRTCPStatus, (int channel, bool& enabled));
9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetRTCP_CNAME, (int channel, const char cname[256]));
9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRTCP_CNAME, (int channel, char cname[256]));
9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRemoteRTCP_CNAME, (int channel, char* cname));
9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRemoteRTCPData, (int channel, unsigned int& NTPHigh,
9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned int& NTPLow,
9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned int& timestamp,
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned int& playoutTimestamp,
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned int* jitter,
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  unsigned short* fractionLost));
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRemoteRTCPSenderInfo, (int channel,
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        webrtc::SenderInfo* sender_info));
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetRemoteRTCPReportBlocks,
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (int channel, std::vector<webrtc::ReportBlock>* receive_blocks)) {
9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::ReportBlock block;
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    block.source_SSRC = channels_[channel]->send_ssrc;
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    webrtc::CodecInst send_codec = channels_[channel]->send_codec;
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (send_codec.pltype >= 0) {
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      block.fraction_lost = (unsigned char)(kFractionLostStatValue * 256);
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (send_codec.plfreq / 1000 > 0) {
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        block.interarrival_jitter = kIntStatValue * (send_codec.plfreq / 1000);
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      block.cumulative_num_packets_lost = kIntStatValue;
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      block.extended_highest_sequence_number = kIntStatValue;
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      receive_blocks->push_back(block);
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SendApplicationDefinedRTCPPacket, (int channel,
9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 unsigned char subType,
9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 unsigned int name,
9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 const char* data,
9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 unsigned short dataLength));
9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRTPStatistics, (int channel, unsigned int& averageJitterMs,
9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 unsigned int& maxJitterMs,
9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 unsigned int& discardedPackets));
9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetRTCPStatistics, (int channel, webrtc::CallStatistics& stats)) {
9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.fractionLost = static_cast<int16>(kIntStatValue);
9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.cumulativeLost = kIntStatValue;
9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.extendedMax = kIntStatValue;
9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.jitterSamples = kIntStatValue;
9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.rttMs = kIntStatValue;
9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.bytesSent = kIntStatValue;
9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.packetsSent = kIntStatValue;
9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.bytesReceived = kIntStatValue;
9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stats.packetsReceived = kIntStatValue;
9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
98307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
98407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  WEBRTC_FUNC(SetREDStatus, (int channel, bool enable, int redPayloadtype)) {
98511b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org    return SetFECStatus(channel, enable, redPayloadtype);
98611b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  }
98711b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org#endif
98811b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  // TODO(minyue): remove the below function when transition to SetREDStatus
98911b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  //               is finished.
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetFECStatus, (int channel, bool enable, int redPayloadtype)) {
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
99207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    channels_[channel]->red = enable;
99307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    channels_[channel]->red_type = redPayloadtype;
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
99607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
99707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org  WEBRTC_FUNC(GetREDStatus, (int channel, bool& enable, int& redPayloadtype)) {
99811b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org    return GetFECStatus(channel, enable, redPayloadtype);
99911b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  }
100011b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org#endif
100111b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  // TODO(minyue): remove the below function when transition to GetREDStatus
100211b3791161793cfee9c6ec541d30a2c5b6b2aef9buildbot@webrtc.org  //               is finished.
10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetFECStatus, (int channel, bool& enable, int& redPayloadtype)) {
10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
100507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    enable = channels_[channel]->red;
100607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org    redPayloadtype = channels_[channel]->red_type;
10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetNACKStatus, (int channel, bool enable, int maxNoPackets)) {
10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->nack = enable;
10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->nack_max_packets = maxNoPackets;
10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartRTPDump, (int channel, const char* fileNameUTF8,
10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             webrtc::RTPDirections direction));
10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopRTPDump, (int channel, webrtc::RTPDirections direction));
10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RTPDumpIsActive, (int channel, webrtc::RTPDirections direction));
10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(InsertExtraRTPPacket, (int channel, unsigned char payloadType,
10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     bool markerBit, const char* payloadData,
10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     unsigned short payloadSize));
10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetLastRemoteTimeStamp, (int channel,
10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       uint32_t* lastRemoteTimeStamp));
1024afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  WEBRTC_FUNC(SetVideoEngineBWETarget, (int channel,
1025afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org                                        webrtc::ViENetwork* vie_network,
1026afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org                                        int video_channel)) {
1027afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
1028afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    channels_[channel]->vie_network = vie_network;
1029afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    channels_[channel]->video_channel = video_channel;
10305462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    if (vie_network) {
10315462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      // The interface is released here to avoid leaks. A test should not
10325462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      // attempt to call functions on the interface stored in the channel.
10335462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org      vie_network->Release();
10345462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    }
1035afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org    return 0;
1036afaf4d10603cf012a13d43a62fbc43c0757ec3b9buildbot@webrtc.org  }
10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEVideoSync
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetPlayoutBufferSize, (int& bufferMs));
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetPlayoutTimestamp, (int channel, unsigned int& timestamp));
1041fdedc6fe2f331fce751de4415b7643d6a5b1caf6wu@webrtc.org  WEBRTC_STUB(GetRtpRtcp, (int, webrtc::RtpRtcp**, webrtc::RtpReceiver**));
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetInitTimestamp, (int channel, unsigned int timestamp));
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetInitSequenceNumber, (int channel, short sequenceNumber));
10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetMinimumPlayoutDelay, (int channel, int delayMs));
10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetInitialPlayoutDelay, (int channel, int delay_ms));
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetDelayEstimate, (int channel, int* jitter_buffer_delay_ms,
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 int* playout_buffer_delay_ms));
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB_CONST(GetLeastRequiredDelayMs, (int channel));
10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEVolumeControl
10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetSpeakerVolume, (unsigned int));
10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSpeakerVolume, (unsigned int&));
10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetSystemOutputMute, (bool));
10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSystemOutputMute, (bool&));
10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetMicVolume, (unsigned int));
10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetMicVolume, (unsigned int&));
10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetInputMute, (int, bool));
10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetInputMute, (int, bool&));
10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetSystemInputMute, (bool));
10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSystemInputMute, (bool&));
10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSpeechInputLevel, (unsigned int&));
10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSpeechOutputLevel, (int, unsigned int&));
10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSpeechInputLevelFullRange, (unsigned int&));
10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetSpeechOutputLevelFullRange, (int, unsigned int&));
10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetChannelOutputVolumeScaling, (int channel, float scale)) {
10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->volume_scale= scale;
10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetChannelOutputVolumeScaling, (int channel, float& scale)) {
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    scale = channels_[channel]->volume_scale;
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetOutputVolumePan, (int channel, float left, float right)) {
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->volume_pan_left = left;
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->volume_pan_right = right;
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetOutputVolumePan, (int channel, float& left, float& right)) {
10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    left = channels_[channel]->volume_pan_left;
10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    right = channels_[channel]->volume_pan_right;
10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEAudioProcessing
10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetNsStatus, (bool enable, webrtc::NsModes mode)) {
10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ns_enabled_ = enable;
10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ns_mode_ = mode;
10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetNsStatus, (bool& enabled, webrtc::NsModes& mode)) {
10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabled = ns_enabled_;
10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mode = ns_mode_;
10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetAgcStatus, (bool enable, webrtc::AgcModes mode)) {
11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    agc_enabled_ = enable;
11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    agc_mode_ = mode;
11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetAgcStatus, (bool& enabled, webrtc::AgcModes& mode)) {
11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabled = agc_enabled_;
11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mode = agc_mode_;
11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetAgcConfig, (webrtc::AgcConfig config)) {
11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    agc_config_ = config;
11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetAgcConfig, (webrtc::AgcConfig& config)) {
11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    config = agc_config_;
11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetEcStatus, (bool enable, webrtc::EcModes mode)) {
11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ec_enabled_ = enable;
11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ec_mode_ = mode;
11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetEcStatus, (bool& enabled, webrtc::EcModes& mode)) {
11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabled = ec_enabled_;
11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mode = ec_mode_;
11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(EnableDriftCompensation, (bool enable))
11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_BOOL_STUB(DriftCompensationEnabled, ())
11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_VOID_STUB(SetDelayOffsetMs, (int offset))
11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DelayOffsetMs, ());
11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetAecmMode, (webrtc::AecmModes mode, bool enableCNG)) {
11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    aecm_mode_ = mode;
11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cng_enabled_ = enableCNG;
11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetAecmMode, (webrtc::AecmModes& mode, bool& enabledCNG)) {
11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    mode = aecm_mode_;
11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabledCNG = cng_enabled_;
11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetRxNsStatus, (int channel, bool enable, webrtc::NsModes mode));
11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetRxNsStatus, (int channel, bool& enabled,
11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              webrtc::NsModes& mode));
11465c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(SetRxAgcStatus, (int channel, bool enable,
11475c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                               webrtc::AgcModes mode)) {
11485c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    channels_[channel]->rx_agc_enabled = enable;
11495c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    channels_[channel]->rx_agc_mode = mode;
11505c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
11515c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
11525c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(GetRxAgcStatus, (int channel, bool& enabled,
11535c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                               webrtc::AgcModes& mode)) {
11545c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    enabled = channels_[channel]->rx_agc_enabled;
11555c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    mode = channels_[channel]->rx_agc_mode;
11565c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
11575c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
11585c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
11595c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(SetRxAgcConfig, (int channel, webrtc::AgcConfig config)) {
11605c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    channels_[channel]->rx_agc_config = config;
11615c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
11625c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
11635c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  WEBRTC_FUNC(GetRxAgcConfig, (int channel, webrtc::AgcConfig& config)) {
11645c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    config = channels_[channel]->rx_agc_config;
11655c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    return 0;
11665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  }
11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(RegisterRxVadObserver, (int, webrtc::VoERxVadCallback&));
11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(DeRegisterRxVadObserver, (int channel));
11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(VoiceActivityIndicator, (int channel));
11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetEcMetricsStatus, (bool enable)) {
11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ec_metrics_enabled_ = enable;
11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetEcMetricsStatus, (bool& enabled)) {
11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabled = ec_metrics_enabled_;
11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetEchoMetrics, (int& ERL, int& ERLE, int& RERL, int& A_NLP));
11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetEcDelayMetrics, (int& delay_median, int& delay_std));
11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StartDebugRecording, (const char* fileNameUTF8));
1183cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org  WEBRTC_STUB(StartDebugRecording, (FILE* handle));
11840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(StopDebugRecording, ());
11850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(SetTypingDetectionStatus, (bool enable)) {
11870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    typing_detection_enabled_ = enable;
11880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(GetTypingDetectionStatus, (bool& enabled)) {
11910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    enabled = typing_detection_enabled_;
11920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
11930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(TimeSinceLastTyping, (int& seconds));
11960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetTypingDetectionParameters, (int timeWindow,
11970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             int costPerTyping,
11980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             int reportingThreshold,
11990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             int penaltyDecay,
12000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             int typeEventDelay));
12010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int EnableHighPassFilter(bool enable) {
12020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    highpass_filter_enabled_ = enable;
12030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsHighPassFilterEnabled() {
12060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return highpass_filter_enabled_;
12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool IsStereoChannelSwappingEnabled() {
12090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return stereo_swapping_enabled_;
12100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void EnableStereoChannelSwapping(bool enable) {
12120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    stereo_swapping_enabled_ = enable;
12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool WasSendTelephoneEventCalled(int channel, int event_code, int length_ms) {
12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (channels_[channel]->dtmf_info.dtmf_event_code == event_code &&
12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            channels_[channel]->dtmf_info.dtmf_out_of_band == true &&
12170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            channels_[channel]->dtmf_info.dtmf_length_ms == length_ms);
12180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool WasPlayDtmfToneCalled(int event_code, int length_ms) {
12200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (dtmf_info_.dtmf_event_code == event_code &&
12210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            dtmf_info_.dtmf_length_ms == length_ms);
12220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // webrtc::VoEExternalMedia
12240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(RegisterExternalMediaProcessing,
12250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (int channel, webrtc::ProcessingTypes type,
12260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               webrtc::VoEMediaProcess& processObject)) {
12270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (channels_[channel]->media_processor_registered) {
12290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
12300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
12310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->media_processor_registered = true;
12320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_processor_ = &processObject;
12330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_FUNC(DeRegisterExternalMediaProcessing,
12360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (int channel, webrtc::ProcessingTypes type)) {
12370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WEBRTC_CHECK_CHANNEL(channel);
12380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!channels_[channel]->media_processor_registered) {
12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
12400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channels_[channel]->media_processor_registered = false;
12420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    media_processor_ = NULL;
12430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetExternalRecordingStatus, (bool enable));
12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetExternalPlayoutStatus, (bool enable));
12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ExternalRecordingInsertData,
12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (const int16_t speechData10ms[], int lengthSamples,
12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               int samplingFreqHz, int current_delay_ms));
12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(ExternalPlayoutGetData,
12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              (int16_t speechData10ms[], int samplingFreqHz,
12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               int current_delay_ms, int& lengthSamples));
12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(GetAudioFrame, (int channel, int desired_sample_rate_hz,
12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              webrtc::AudioFrame* frame));
12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WEBRTC_STUB(SetExternalMixing, (int channel, bool enable));
12560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
12580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetNumDevices(int& num) {
12590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32
12600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    num = 1;
12610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else
12620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // On non-Windows platforms VE adds a special entry for the default device,
12630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // so if there is one physical device then there are two entries in the
12640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // list.
12650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    num = 2;
12660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
12670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int GetDeviceName(int i, char* name, char* guid) {
12710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const char *s;
12720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32
12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (0 == i) {
12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      s = kFakeDeviceName;
12750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
12760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else
12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // See comment above.
12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (0 == i) {
12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      s = kFakeDefaultDeviceName;
12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (1 == i) {
12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      s = kFakeDeviceName;
12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return -1;
12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
12880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    strcpy(name, s);
12890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    guid[0] = '\0';
12900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
12910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
12920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool inited_;
12940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int last_channel_;
12950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::map<int, Channel*> channels_;
12960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_create_channel_;
12970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const cricket::AudioCodec* const* codecs_;
12980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_codecs_;
1299a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org  int num_set_send_codecs_;  // how many times we call SetSendCodec().
13000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_enabled_;
13010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ec_metrics_enabled_;
13020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool cng_enabled_;
13030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool ns_enabled_;
13040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool agc_enabled_;
13050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool highpass_filter_enabled_;
13060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool stereo_swapping_enabled_;
13070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool typing_detection_enabled_;
13080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::EcModes ec_mode_;
13090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AecmModes aecm_mode_;
13100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::NsModes ns_mode_;
13110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcModes agc_mode_;
13120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::AgcConfig agc_config_;
13130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::VoiceEngineObserver* observer_;
13140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int playout_fail_channel_;
13150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int send_fail_channel_;
13160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool fail_start_recording_microphone_;
13170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool recording_microphone_;
13185c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  int recording_sample_rate_;
13195c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  int playout_sample_rate_;
13200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DtmfInfo dtmf_info_;
13210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  webrtc::VoEMediaProcess* media_processor_;
1322440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH
1323440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org  FakeAudioProcessing audio_processing_;
1324440a0915704985c3050819e14d77ee43590782d9buildbot@webrtc.org#endif
13250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
13260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13273ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org#undef WEBRTC_CHECK_HEADER_EXTENSION_ID
13283ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org
13290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
13300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_SESSION_PHONE_FAKEWEBRTCVOICEENGINE_H_
1332