13ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org/* 23ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * libjingle 33ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * Copyright 2008 Google Inc. 43ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 53ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 63ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 73ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 83ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 93ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * this list of conditions and the following disclaimer. 103ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 113ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 123ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * and/or other materials provided with the distribution. 133ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 143ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * derived from this software without specific prior written permission. 153ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * 163ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 173ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 183ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 193ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 203ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 213ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 223ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 233ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 243ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 253ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 263ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32 292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/win32.h" 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <objbase.h> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/byteorder.h" 342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/constants.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaprocessor.h" 3880303b162fe139828d0661df23e03f09126508acwu@webrtc.org#include "talk/media/base/fakenetworkinterface.h" 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakertp.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/fakewebrtcvoiceengine.h" 415462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org#include "talk/media/webrtc/webrtcvie.h" 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/webrtc/webrtcvoiceengine.h" 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/fakesession.h" 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/channel.h" 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests for the WebRtcVoiceEngine/VoiceChannel code. 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 482ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgusing cricket::kRtpAudioLevelHeaderExtension; 492ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgusing cricket::kRtpAbsoluteSenderTimeHeaderExtension; 502ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0); 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0); 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCeltCodec(110, "CELT", 32000, 64000, 2, 0); 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0); 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0); 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0); 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0); 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0); 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::AudioCodec* const kAudioCodecs[] = { 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &kPcmuCodec, &kIsacCodec, &kCeltCodec, &kOpusCodec, &kRedCodec, 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec, 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst char kRingbackTone[] = "RIFF____WAVE____ABCD1234"; 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic uint32 kSsrc1 = 0x99; 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic uint32 kSsrc2 = 0x98; 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass FakeVoEWrapper : public cricket::VoEWrapper { 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine) 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : cricket::VoEWrapper(engine, // processing 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // base 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // codec 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // dtmf 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // file 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // hw 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // media 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // neteq 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // network 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // rtp 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine, // sync 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine) { // volume 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 865c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgclass FakeVoETraceWrapper : public cricket::VoETraceWrapper { 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int SetTraceFilter(const unsigned int filter) { 895c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org filter_ = filter; 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int SetTraceFile(const char* fileNameUTF8) { 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int SetTraceCallback(webrtc::TraceCallback* callback) { 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 985c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org unsigned int filter_; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass WebRtcVoiceEngineTestFake : public testing::Test { 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org class ChannelErrorListener : public sigslot::has_slots<> { 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit ChannelErrorListener(cricket::VoiceMediaChannel* channel) 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : ssrc_(0), error_(cricket::VoiceMediaChannel::ERROR_NONE) { 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel != NULL); 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel->SignalMediaError.connect( 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &ChannelErrorListener::OnVoiceChannelError); 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnVoiceChannelError(uint32 ssrc, 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel::Error error) { 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_ = ssrc; 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org error_ = error; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void Reset() { 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_ = 0; 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org error_ = cricket::VoiceMediaChannel::ERROR_NONE; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc() const { 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ssrc_; 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel::Error error() const { 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return error_; 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc_; 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel::Error error_; 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WebRtcVoiceEngineTestFake() 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)), 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_sc_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)), 1355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org trace_wrapper_(new FakeVoETraceWrapper()), 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_(new FakeVoEWrapper(&voe_), 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new FakeVoEWrapper(&voe_sc_), 1385c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org trace_wrapper_), 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_(NULL), soundclip_(NULL) { 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_conference_.conference_mode.Set(true); 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_adjust_agc_.adjust_agc_delta.Set(-10); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1432ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org bool SetupEngineWithoutStream() { 1442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org if (!engine_.Init(rtc::Thread::Current())) { 1452ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org return false; 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1472ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org channel_ = engine_.CreateChannel(); 1482ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org return (channel_ != NULL); 1492ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org } 1502ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org bool SetupEngine() { 1512ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org if (!SetupEngineWithoutStream()) { 1522ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org return false; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1542ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org return channel_->AddSendStream( 1552ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1)); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 157f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org void SetupForMultiSendStream() { 158f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(SetupEngine()); 159f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Remove stream added in Setup, which is corresponding to default channel. 160f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int default_channel_num = voe_.GetLastChannel(); 161c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org uint32 default_send_ssrc = 0u; 162f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc)); 163f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(kSsrc1, default_send_ssrc); 164f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc)); 165f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 166f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify the default channel still exists. 167f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc)); 168f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DeliverPacket(const void* data, int len) { 1702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer packet(data, len); 1712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org channel_->OnPacketReceived(&packet, rtc::PacketTime()); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void TearDown() { 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete soundclip_; 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete channel_; 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.Terminate(); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 179952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org void TestInsertDtmf(uint32 ssrc, bool caller) { 1802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 181952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org channel_ = engine_.CreateChannel(); 182952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_ != NULL); 183952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org if (caller) { 184952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // if this is a caller, local description will be applied and add the 185952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // send stream. 186952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 187952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 188952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org } 189952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int channel_id = voe_.GetLastChannel(); 190952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test we can only InsertDtmf when the other side supports telephone-event. 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->CanInsertDtmf()); 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND)); 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->CanInsertDtmf()); 201952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 202952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org if (!caller) { 203952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // There's no active send channel yet. 204952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND)); 205952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 206952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 207952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org } 208952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we fail if the ssrc is invalid. 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND)); 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test send 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123)); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND)); 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123)); 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test play 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134)); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY)); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134)); 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test send and play 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145)); 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145)); 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145, 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::DF_PLAY | cricket::DF_SEND)); 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145)); 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145)); 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that send bandwidth is set correctly. 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |codec| is the codec under test. 233f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // |max_bitrate| is a parameter to set to SetMaxSendBandwidth(). 234f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // |expected_result| is the expected result from SetMaxSendBandwidth(). 235f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // |expected_bitrate| is the expected audio bitrate afterward. 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestSendBandwidth(const cricket::AudioCodec& codec, 237f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org int max_bitrate, 238f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool expected_result, 239f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org int expected_bitrate) { 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(codec); 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 246f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org bool result = channel_->SetMaxSendBandwidth(max_bitrate); 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_result, result); 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 249cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org webrtc::CodecInst temp_codec; 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec)); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 252f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_EQ(expected_bitrate, temp_codec.rate); 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2552ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org void TestSetSendRtpHeaderExtensions(const std::string& ext) { 2562ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(SetupEngineWithoutStream()); 2572ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 258f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2593ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org // Ensure extensions are off by default. 2602ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext)); 261f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2622ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org std::vector<cricket::RtpHeaderExtension> extensions; 263f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Ensure unknown extensions won't cause an error. 264f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org extensions.push_back(cricket::RtpHeaderExtension( 2653ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org "urn:ietf:params:unknownextention", 1)); 266f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions)); 2672ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext)); 268f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2693ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org // Ensure extensions stay off with an empty list of headers. 2703ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org extensions.clear(); 271f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions)); 2722ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext)); 273f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2742ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure extension is set properly. 2752ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org const int id = 1; 2762ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org extensions.push_back(cricket::RtpHeaderExtension(ext, id)); 277f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions)); 2782ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext)); 2793ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 2802ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure extension is set properly on new channel. 2812ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // The first stream to occupy the default channel. 2822ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 2832ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org cricket::StreamParams::CreateLegacy(123))); 2842ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 2852ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org cricket::StreamParams::CreateLegacy(234))); 2862ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org int new_channel_num = voe_.GetLastChannel(); 2872ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_NE(channel_num, new_channel_num); 2882ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext)); 289f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2903ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org // Ensure all extensions go back off with an empty list. 291f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org extensions.clear(); 292f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions)); 2932ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext)); 2942ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext)); 2953ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org } 2963ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 2972ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org void TestSetRecvRtpHeaderExtensions(const std::string& ext) { 2982ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(SetupEngineWithoutStream()); 2992ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 3003ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 3013ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org // Ensure extensions are off by default. 3022ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext)); 3033ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 3042ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org std::vector<cricket::RtpHeaderExtension> extensions; 3053ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org // Ensure unknown extensions won't cause an error. 3063ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org extensions.push_back(cricket::RtpHeaderExtension( 3073ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org "urn:ietf:params:unknownextention", 1)); 3083ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions)); 3092ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext)); 3103ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 3112ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure extensions stay off with an empty list of headers. 3123ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org extensions.clear(); 3133ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions)); 3142ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext)); 3153ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 3162ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure extension is set properly. 3172ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org const int id = 2; 3182ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org extensions.push_back(cricket::RtpHeaderExtension(ext, id)); 3193ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions)); 3202ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext)); 3213ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org 3222ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure extension is set properly on new channel. 3232ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // The first stream to occupy the default channel. 3242ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 3252ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org cricket::StreamParams::CreateLegacy(345))); 3262ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 3272ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org cricket::StreamParams::CreateLegacy(456))); 3282ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org int new_channel_num = voe_.GetLastChannel(); 3292ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_NE(channel_num, new_channel_num); 3302ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext)); 3312ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org 3322ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org // Ensure all extensions go back off with an empty list. 3333ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org extensions.clear(); 3343ca77cb43bc675f562521d4c90e8156a6e088cbchenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions)); 3352ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext)); 3362ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext)); 337f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 338f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeWebRtcVoiceEngine voe_; 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeWebRtcVoiceEngine voe_sc_; 3425c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org FakeVoETraceWrapper* trace_wrapper_; 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine_; 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel* channel_; 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SoundclipMedia* soundclip_; 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_conference_; 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_adjust_agc_; 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that our stub library "works". 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) { 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.IsInited()); 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_sc_.IsInited()); 3552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.IsInited()); 35762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org // The soundclip engine is lazily initialized. 35862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org EXPECT_FALSE(voe_sc_.IsInited()); 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.Terminate(); 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.IsInited()); 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_sc_.IsInited()); 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we can create and destroy a channel. 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateChannel) { 3662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_ = engine_.CreateChannel(); 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_ != NULL); 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we properly handle failures in CreateChannel. 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) { 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_create_channel(true); 3742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_ = engine_.CreateChannel(); 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_ == NULL); 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the list of supported codecs is created properly and ordered 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// correctly 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CodecPreference) { 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<cricket::AudioCodec>& codecs = engine_.codecs(); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(codecs.empty()); 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STRCASEEQ("opus", codecs[0].name.c_str()); 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(48000, codecs[0].clockrate); 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, codecs[0].channels); 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, codecs[0].bitrate); 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int pref = codecs[0].preference; 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 1; i < codecs.size(); ++i) { 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GT(pref, codecs[i].preference); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pref = codecs[i].preference; 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that we can find codecs by name or id, and that we interpret the 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// clockrate and bitrate fields properly. 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, FindCodec) { 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec codec; 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst codec_inst; 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find PCMU with explicit clockrate and bitrate. 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst)); 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find ISAC with explicit clockrate and 0 bitrate. 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst)); 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find telephone-event with explicit clockrate and 0 bitrate. 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst)); 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find ISAC with a different payload id. 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec = kIsacCodec; 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec.id = 127; 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst)); 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(codec.id, codec_inst.pltype); 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find PCMU with a 0 clockrate. 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec = kPcmuCodec; 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec.clockrate = 0; 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst)); 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(codec.id, codec_inst.pltype); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(8000, codec_inst.plfreq); 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find PCMU with a 0 bitrate. 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec = kPcmuCodec; 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec.bitrate = 0; 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst)); 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(codec.id, codec_inst.pltype); 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, codec_inst.rate); 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find ISAC with an explicit bitrate. 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec = kIsacCodec; 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codec.bitrate = 32000; 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst)); 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(codec.id, codec_inst.pltype); 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, codec_inst.rate); 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we set our inbound codecs properly, including changing PT. 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) { 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 106; // collide with existing telephone-event 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].id = 126; 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 4432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC"); 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 16000; 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.channels = 1; 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec)); 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(106, gcodec.pltype); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 4492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "telephone-event"); 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 8000; 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec)); 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(126, gcodec.pltype); 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("telephone-event", gcodec.plname); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail to set an unknown inbound codec. 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) { 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0)); 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetRecvCodecs(codecs)); 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we have duplicate types in the inbound list. 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) { 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = kIsacCodec.id; 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetRecvCodecs(codecs)); 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS without stereo parameters. 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) { 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst opus; 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.FindWebRtcCodec(kOpusCodec, &opus); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Even without stereo parameters, recv codecs still specify channels = 2. 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, opus.channels); 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", opus.plname); 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org opus.pltype = 0; 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus)); 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS with stereo = 0. 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) { 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].params["stereo"] = "0"; 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst opus; 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.FindWebRtcCodec(kOpusCodec, &opus); 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Even when stereo is off, recv codecs still specify channels = 2. 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, opus.channels); 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", opus.plname); 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org opus.pltype = 0; 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus)); 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can decode OPUS with stereo = 1. 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) { 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].params["stereo"] = "1"; 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst opus; 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.FindWebRtcCodec(kOpusCodec, &opus); 5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, opus.channels); 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", opus.plname); 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org opus.pltype = 0; 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus)); 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, opus.pltype); 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that changes to recv codecs are applied to all streams. 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) { 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 106; // collide with existing telephone-event 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].id = 126; 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 5612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC"); 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 16000; 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.channels = 1; 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec)); 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(106, gcodec.pltype); 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 5672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "telephone-event"); 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 8000; 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.channels = 1; 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec)); 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(126, gcodec.pltype); 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("telephone-event", gcodec.plname); 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) { 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 106; // collide with existing telephone-event 5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 5892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC"); 5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 16000; 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.channels = 1; 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec)); 5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(106, gcodec.pltype); 5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can apply the same set of codecs again while playing. 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) { 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Changing the payload type of a codec should fail. 6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetRecvCodecs(codecs)); 6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can add a codec while playing. 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) { 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec)); 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kOpusCodec.id, gcodec.pltype); 6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) { 6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 6340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); 6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 636f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // Test that when autobw is enabled, bitrate is kept as the default 637f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // value. autobw is enabled for the following tests because the target 638f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // bitrate is <= 0. 6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ISAC, default bitrate == 32000. 641f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kIsacCodec, 0, true, 32000); 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // PCMU, default bitrate == 64000. 644f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, -1, true, 64000); 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CELT, default bitrate == 64000. 647f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kCeltCodec, 0, true, 64000); 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // opus, default bitrate == 64000. 650f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kOpusCodec, -1, true, 64000); 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 653f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) { 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 657f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // Test that the bitrate of a multi-rate codec is always the maximum. 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ISAC, default bitrate == 32000. 660f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kIsacCodec, 128000, true, 128000); 661f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kIsacCodec, 16000, true, 16000); 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CELT, default bitrate == 64000. 664f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kCeltCodec, 96000, true, 96000); 665f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kCeltCodec, 32000, true, 32000); 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // opus, default bitrate == 64000. 668f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kOpusCodec, 96000, true, 96000); 669f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kOpusCodec, 48000, true, 48000); 670f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org} 671f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 672f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) { 673f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_TRUE(SetupEngine()); 674f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); 675f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 676f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // Test that we can only set a maximum bitrate for a fixed-rate codec 677f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // if it's bigger than the fixed rate. 678f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 679f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org // PCMU, fixed bitrate == 64000. 680f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 0, true, 64000); 681f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 1, false, 64000); 682f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 128000, true, 64000); 683f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 32000, false, 64000); 684f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 64000, true, 64000); 685f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 63999, false, 64000); 686f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TestSendBandwidth(kPcmuCodec, 64001, true, 64000); 6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 689f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) { 6902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 691cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org channel_ = engine_.CreateChannel(); 692cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(channel_ != NULL); 693cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); 694cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org 695cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org int desired_bitrate = 128000; 696f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_TRUE(channel_->SetMaxSendBandwidth(desired_bitrate)); 697cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org 698cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 699cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 700cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org 701cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org int channel_num = voe_.GetLastChannel(); 702cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org webrtc::CodecInst codec; 703cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec)); 704cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_EQ(desired_bitrate, codec.rate); 705cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org} 706cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org 7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that bitrate cannot be set for CBR codecs. 7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Bitrate is ignored if it is higher than the fixed bitrate. 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Bitrate less then the fixed bitrate is an error. 710f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgTEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) { 7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst codec; 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // PCMU, default bitrate == 64000. 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec)); 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, codec.rate); 723f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_TRUE(channel_->SetMaxSendBandwidth(128000)); 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec)); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, codec.rate); 726f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org EXPECT_FALSE(channel_->SetMaxSendBandwidth(128)); 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec)); 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, codec.rate); 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we apply codecs properly. 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) { 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 96; 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 48000; 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 742a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_EQ(1, voe_.GetNumSetSendCodecs()); 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(48000, gcodec.rate); 7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetVAD(channel_num)); 74907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false)); 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true)); 7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num)); 7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 755a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried 756a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org// to apply. 757a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) { 758a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_TRUE(SetupEngine()); 759a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 760a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org codecs.push_back(kIsacCodec); 761a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org codecs.push_back(kPcmuCodec); 762a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org codecs.push_back(kRedCodec); 763a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org codecs[0].id = 96; 764a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org codecs[0].bitrate = 48000; 765a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 766a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_EQ(1, voe_.GetNumSetSendCodecs()); 767a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org // Calling SetSendCodec again with same codec which is already set. 768a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org // In this case media channel shouldn't send codec to VoE. 769a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 770a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org EXPECT_EQ(1, voe_.GetNumSetSendCodecs()); 771a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org} 772a32dfc68b5624bdc8e3901c1a91adb869f919ef8wu@webrtc.org 7737587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if clockrate is not 48000 for opus, we fail. 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) { 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].clockrate = 50000; 7807587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7837587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if channels=0 for opus, we fail. 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) { 7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 0; 7907587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7937587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that if channels=0 for opus, we fail. 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) { 7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 0; 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "1"; 8017587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and there's no stereo, we fail. 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) { 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 1; 8117587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and stereo=0, we fail. 8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) { 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 1; 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "0"; 8227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if channel is 1 for opus and stereo=1, we fail. 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) { 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 1; 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "1"; 8337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and no stereo, 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and 32000. 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) { 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and stereo=0, 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and 32000. 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) { 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "0"; 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8697162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that with bitrate=invalid and stereo=0, 8707162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// channels and bitrate are 1 and 32000. 8717162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) { 8727162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(SetupEngine()); 8737162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int channel_num = voe_.GetLastChannel(); 8747162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 8757162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs.push_back(kOpusCodec); 8767162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].params["stereo"] = "0"; 8777162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org webrtc::CodecInst gcodec; 8787162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 8797162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // bitrate that's out of the range between 6000 and 510000 will be considered 8807162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // as invalid and ignored. 8817162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].bitrate = 5999; 8827162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 8837162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 8847162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 8857162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 8867162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 8877162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 8887162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].bitrate = 510001; 8897162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 8907162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 8917162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 8927162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 8937162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 8947162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org} 8957162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=0 and stereo=1, 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 2 and 64000. 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) { 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; 9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "1"; 9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, gcodec.channels); 9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9137162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that with bitrate=invalid and stereo=1, 9147162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// channels and bitrate are 2 and 64000. 9157162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) { 9167162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9177162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9187162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9197162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs.push_back(kOpusCodec); 9207162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].params["stereo"] = "1"; 9217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org webrtc::CodecInst gcodec; 9227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 9237162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // bitrate that's out of the range between 6000 and 510000 will be considered 9247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // as invalid and ignored. 9257162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].bitrate = 5999; 9267162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(2, gcodec.channels); 9307162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 9317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 9327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].bitrate = 510001; 9337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9347162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(2, gcodec.channels); 9377162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 9387162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org} 9397162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo unset, 9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N. 9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) { 9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 96000; 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, gcodec.pltype); 9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96000, gcodec.rate); 9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(48000, gcodec.plfreq); 9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo=0, 9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N. 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) { 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 30000; 9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "0"; 9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(30000, gcodec.rate); 9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and without any parameters, 9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 1 and N. 9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) { 9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 30000; 9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(30000, gcodec.rate); 9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that with bitrate=N and stereo=1, 9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// channels and bitrate are 2 and N. 9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) { 9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 30000; 9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["stereo"] = "1"; 10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, gcodec.channels); 10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(30000, gcodec.rate); 10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10087162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Test that bitrate will be overridden by the "maxaveragebitrate" parameter. 10097162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// Also test that the "maxaveragebitrate" can't be set to values outside the 10107162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org// range of 6000 and 510000 10117162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) { 10127162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(SetupEngine()); 10137162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org int channel_num = voe_.GetLastChannel(); 10147162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 10157162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs.push_back(kOpusCodec); 10167162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].bitrate = 30000; 10177162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org webrtc::CodecInst gcodec; 10187162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 10197162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // Ignore if less than 6000. 10207162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].params["maxaveragebitrate"] = "5999"; 10217162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10227162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 10237162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(30000, gcodec.rate); 10247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 10257162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org // Ignore if larger than 510000. 10267162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].params["maxaveragebitrate"] = "510001"; 10277162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10287162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 10297162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(30000, gcodec.rate); 10307162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 10317162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org codecs[0].params["maxaveragebitrate"] = "200000"; 10327162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10337162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 10347162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org EXPECT_EQ(200000, gcodec.rate); 10357162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org} 10367162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 1037952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we can enable NACK with opus as caller. 1038952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) { 10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty)); 10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num)); 10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1050952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we can enable NACK with opus as callee. 1051952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) { 10522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 1053952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org channel_ = engine_.CreateChannel(); 1054952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_ != NULL); 1055952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1056952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int channel_num = voe_.GetLastChannel(); 1057952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 1058952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kOpusCodec); 1059952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 1060952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::kParamValueEmpty)); 1061952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num)); 1062952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1063952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num)); 1064952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1065952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1066952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 1067952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 1068952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 1069952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can enable NACK on receive streams. 10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) { 10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num1 = voe_.GetLastChannel(); 10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty)); 10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num1)); 10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num2)); 10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num1)); 10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num2)); 10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can disable NACK. 10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) { 10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty)); 10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.clear(); 11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num)); 11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can disable NACK on receive streams. 11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) { 11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num1 = voe_.GetLastChannel(); 11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty)); 11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num1)); 11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num2)); 11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.clear(); 11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kOpusCodec); 11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num1)); 11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetNACK(channel_num2)); 11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that NACK is enabled on a new receive stream. 11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) { 11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 11320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 11330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamNack, 11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kParamValueEmpty)); 11360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 11370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 11380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 11400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_num = voe_.GetLastChannel(); 11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3))); 11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_num = voe_.GetLastChannel(); 11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetNACK(channel_num)); 11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 114807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#ifdef USE_WEBRTC_DEV_BRANCH 114907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that without useinbandfec, Opus FEC is off. 115002632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) { 115107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 115207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 115307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 115407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs.push_back(kOpusCodec); 115507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 115607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); 115707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org} 115807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org 115907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=0, Opus FEC is off. 116002632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) { 116107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 116207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 116307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 116407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs.push_back(kOpusCodec); 116507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].bitrate = 0; 116607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].params["useinbandfec"] = "0"; 116707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 116807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); 116907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org webrtc::CodecInst gcodec; 117007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 117107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 117207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(1, gcodec.channels); 117307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 117407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org} 117507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org 117607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=1, Opus FEC is on. 117702632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) { 117807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 117907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 118007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 118107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs.push_back(kOpusCodec); 118207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].bitrate = 0; 118307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].params["useinbandfec"] = "1"; 118407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 118507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(voe_.GetCodecFEC(channel_num)); 118607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org webrtc::CodecInst gcodec; 118707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 118807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 118907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(1, gcodec.channels); 119007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 119107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org} 119207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org 119307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with useinbandfec=1, stereo=1, Opus FEC is on. 119402632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) { 119507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 119607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 119707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 119807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs.push_back(kOpusCodec); 119907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].bitrate = 0; 120007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].params["stereo"] = "1"; 120107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs[0].params["useinbandfec"] = "1"; 120207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 120307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(voe_.GetCodecFEC(channel_num)); 120407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org webrtc::CodecInst gcodec; 120507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 120607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 120707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(2, gcodec.channels); 120807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(64000, gcodec.rate); 120907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org} 121007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org 121107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that with non-Opus, codec FEC is off. 121202632fd0ce3e3625079f6472bd55370ed58509debuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) { 121307617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 121407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 121507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 121607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org codecs.push_back(kIsacCodec); 121707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 121807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); 121907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org} 1220c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org 1221c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org// Test the with non-Opus, even if useinbandfec=1, FEC is off. 1222c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) { 1223c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1224c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1225c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1226c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org codecs.push_back(kIsacCodec); 1227c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org codecs[0].params["useinbandfec"] = "1"; 1228c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1229c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); 1230c547a07407ddf9d3bb52be8874eec40f47889413buildbot@webrtc.org} 1231ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1232ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test that Opus FEC status can be changed. 1233ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) { 1234ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1235ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1236ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1237ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1238ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1239ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); 1240ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].params["useinbandfec"] = "1"; 1241ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1242ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(voe_.GetCodecFEC(channel_num)); 1243ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1244ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1245ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test maxplaybackrate <= 8000 triggers Opus narrow band mode. 1246ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) { 1247ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1248ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1249ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1250ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1251ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].bitrate = 0; 1252ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000); 1253ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1254ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthNb, 1255ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1256ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org webrtc::CodecInst gcodec; 1257ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1258ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 1259ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // TODO(minyue): Default bit rate is not but can in future be affected by 1260ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // kCodecParamMaxPlaybackRate. 1261ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 1262ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1263ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1264ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode. 1265ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) { 1266ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1267ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1268ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1269ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1270ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].bitrate = 0; 1271ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001); 1272ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1273ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthMb, 1274ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1275ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org webrtc::CodecInst gcodec; 1276ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1277ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 1278ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // TODO(minyue): Default bit rate is not but can in future be affected by 1279ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // kCodecParamMaxPlaybackRate. 1280ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 1281ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1282ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1283ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode. 1284ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) { 1285ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1286ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1287ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1288ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1289ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].bitrate = 0; 1290ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001); 1291ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1292ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthWb, 1293ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1294ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org webrtc::CodecInst gcodec; 1295ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1296ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 1297ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // TODO(minyue): Default bit rate is not but can in future be affected by 1298ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // kCodecParamMaxPlaybackRate. 1299ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 1300ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1301ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1302ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode. 1303ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) { 1304ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1305ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1306ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1307ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1308ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].bitrate = 0; 1309ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001); 1310ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1311ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthSwb, 1312ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1313ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org webrtc::CodecInst gcodec; 1314ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1315ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 1316ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // TODO(minyue): Default bit rate is not but can in future be affected by 1317ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // kCodecParamMaxPlaybackRate. 1318ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 1319ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1320ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1321ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test 24000 < maxplaybackrate triggers Opus full band mode. 1322ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) { 1323ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1324ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1325ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1326ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1327ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].bitrate = 0; 1328ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001); 1329ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1330ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthFb, 1331ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1332ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org webrtc::CodecInst gcodec; 1333ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1334ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 1335ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // TODO(minyue): Default bit rate is not but can in future be affected by 1336ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // kCodecParamMaxPlaybackRate. 1337ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(32000, gcodec.rate); 1338ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1339ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1340ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test Opus that without maxplaybackrate, default playback rate is used. 1341ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) { 1342ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1343ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1344ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1345ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1346ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1347ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthFb, 1348ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1349ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1350ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1351ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test the with non-Opus, maxplaybackrate has no effect. 1352ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) { 1353ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1354ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1355ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1356ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kIsacCodec); 1357ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000); 1358ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1359ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num)); 1360ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 1361ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1362ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org// Test maxplaybackrate can be set on two streams. 1363ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) { 1364ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 1365ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org int channel_num = voe_.GetLastChannel(); 1366ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org std::vector<cricket::AudioCodec> codecs; 1367ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs.push_back(kOpusCodec); 1368ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1369ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org // Default bandwidth is 24000. 1370ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthFb, 1371ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1372ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1373ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000); 1374ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1375ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1376ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthNb, 1377ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1378ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org 1379ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2)); 1380ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org channel_num = voe_.GetLastChannel(); 1381ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org EXPECT_EQ(cricket::kOpusBandwidthNb, 1382ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org voe_.GetMaxEncodingBandwidth(channel_num)); 1383ded08bf766f814b46b099c7949f9c9e1726a6adebuildbot@webrtc.org} 138407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org#endif // USE_WEBRTC_DEV_BRANCH 138507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org 13860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can apply CELT with stereo mode but fail with mono mode. 13870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCelt) { 13880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 13890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 13900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 13910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCeltCodec); 13927587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kIsacCodec); 13930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 96; 13940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 2; 13950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 96000; 13967587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs[1].bitrate = 64000; 13970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 13980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 13990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 14010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96000, gcodec.rate); 14020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, gcodec.channels); 14030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("CELT", gcodec.plname); 14040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Doesn't support mono, expect it to fall back to the next codec in the list. 14050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].channels = 1; 14060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14087587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(103, gcodec.pltype); 14090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, gcodec.channels); 14100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 14117587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 14120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can switch back and forth between CELT and ISAC with CN. 14150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacCeltSwitching) { 14160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 14170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 14180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> celt_codecs; 14190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org celt_codecs.push_back(kCeltCodec); 14200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(celt_codecs)); 14210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 14220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(110, gcodec.pltype); 14240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("CELT", gcodec.plname); 14250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> isac_codecs; 14270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org isac_codecs.push_back(kIsacCodec); 14280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org isac_codecs.push_back(kCn16000Codec); 14290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org isac_codecs.push_back(kCeltCodec); 14300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(isac_codecs)); 14310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(103, gcodec.pltype); 14330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 14340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(celt_codecs)); 14360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(110, gcodec.pltype); 14380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("CELT", gcodec.plname); 14390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we handle various ways of specifying bitrate. 14420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) { 14430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 14440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 14450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 14460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); // bitrate == 32000 14470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 14490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(103, gcodec.pltype); 14510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 14520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 14530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; // bitrate == default 14550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(103, gcodec.pltype); 14580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 14590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, gcodec.rate); 14600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 28000; // bitrate == 28000 14620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(103, gcodec.pltype); 14650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 14660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(28000, gcodec.rate); 14670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0] = kPcmuCodec; // bitrate == 64000 14690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, gcodec.pltype); 14720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("PCMU", gcodec.plname); 14730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 14740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; // bitrate == default 14760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, gcodec.pltype); 14790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("PCMU", gcodec.plname); 14800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(64000, gcodec.rate); 14810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0] = kOpusCodec; 14830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].bitrate = 0; // bitrate == default 14840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 14850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 14860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, gcodec.pltype); 14870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("opus", gcodec.plname); 14880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(32000, gcodec.rate); 14890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 14900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 14917587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we fail if no codecs are specified. 14920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) { 14930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 14947587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 14957587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_FALSE(channel_->SetSendCodecs(codecs)); 14967587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 14977587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 14987587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we can set send codecs even with telephone-event codec as the first 14997587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// one on the list. 15007587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) { 15017587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(SetupEngine()); 15020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 15030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 15047587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 15057587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kIsacCodec); 15067587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kPcmuCodec); 15077587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs[0].id = 98; // DTMF 15087587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs[1].id = 96; 15090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 15100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 15110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 15127587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 15137587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 15147587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num)); 15157587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org} 15167587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org 15177587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// Test that we can set send codecs even with CN codec as the first 15187587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org// one on the list. 15197587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) { 15207587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(SetupEngine()); 15217587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org int channel_num = voe_.GetLastChannel(); 15227587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 15237587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kCn16000Codec); 15247587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kIsacCodec); 15257587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs.push_back(kPcmuCodec); 15267587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs[0].id = 98; // wideband CN 15277587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org codecs[1].id = 96; 15287587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 15297587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org webrtc::CodecInst gcodec; 15307587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 15317587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 15327587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 15337587c5e0b2fb5100b52bf271370ee1369ba18690henrike@webrtc.org EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true)); 15340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1536952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we set VAD and DTMF types correctly as caller. 1537952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) { 15380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 15390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 15400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 15410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 15420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 15430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(juberti): cn 32000 15440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 15450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn8000Codec); 15460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 15470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 15480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 96; 15490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].id = 97; // wideband CN 15500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[4].id = 98; // DTMF 15510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 15520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 15530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 15540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 15550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 15560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 155707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 15580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false)); 15590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true)); 15600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num)); 15610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 15620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1563952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test that we set VAD and DTMF types correctly as callee. 1564952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) { 15652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 1566952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org channel_ = engine_.CreateChannel(); 1567952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_ != NULL); 1568952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1569952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int channel_num = voe_.GetLastChannel(); 1570952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 1571952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kIsacCodec); 1572952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kPcmuCodec); 1573952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org // TODO(juberti): cn 32000 1574952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kCn16000Codec); 1575952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kCn8000Codec); 1576952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kTelephoneEventCodec); 1577952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kRedCodec); 1578952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[0].id = 96; 1579952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[2].id = 97; // wideband CN 1580952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[4].id = 98; // DTMF 1581952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1582952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1583952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 1584952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1585952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org webrtc::CodecInst gcodec; 1586952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1587952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(96, gcodec.pltype); 1588952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 1589952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 159007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 1591952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false)); 1592952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true)); 1593952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num)); 1594952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 1595952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 15960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we only apply VAD if we have a CN codec that matches the 15970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// send codec clockrate. 15980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) { 15990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 16000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 16010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 16020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set ISAC(16K) and CN(16K). VAD should be activated. 16030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 16040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 16050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 97; 16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 16100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 16110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true)); 16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set PCMU(8K) and CN(16K). VAD should not be activated. 16130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0] = kPcmuCodec; 16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("PCMU", gcodec.plname); 16170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetVAD(channel_num)); 16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set PCMU(8K) and CN(8K). VAD should be activated. 16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1] = kCn8000Codec; 16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("PCMU", gcodec.plname); 16230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 16240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false)); 16250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set ISAC(16K) and CN(8K). VAD should not be activated. 16260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0] = kIsacCodec; 16270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 16300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetVAD(channel_num)); 16310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 16330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we perform case-insensitive matching of codec names. 16340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) { 16350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 16370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 16380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 16390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn16000Codec); 16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kCn8000Codec); 16420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kTelephoneEventCodec); 16430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 16440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].name = "iSaC"; 16450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 96; 16460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[2].id = 97; // wideband CN 16470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[4].id = 98; // DTMF 16480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 16500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 16520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 16530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 165407617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 16550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false)); 16560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true)); 16570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num)); 16580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 166007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly as caller. 1661952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) { 16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 16650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 16660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 16670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 16680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 16690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params[""] = "96/96"; 16700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 16710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 16720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 16730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 16740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 16750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 167607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(voe_.GetRED(channel_num)); 167707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num)); 16780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 168007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly as callee. 1681952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) { 16822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 1683952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org channel_ = engine_.CreateChannel(); 1684952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_ != NULL); 1685952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 1686952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org int channel_num = voe_.GetLastChannel(); 1687952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 1688952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kRedCodec); 1689952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kIsacCodec); 1690952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs.push_back(kPcmuCodec); 1691952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[0].id = 127; 1692952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[0].params[""] = "96/96"; 1693952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org codecs[1].id = 96; 1694952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1695952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1696952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 1697952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org webrtc::CodecInst gcodec; 1698952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1699952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_EQ(96, gcodec.pltype); 1700952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 170107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(voe_.GetRED(channel_num)); 170207617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num)); 1703952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 1704952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 170507617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org// Test that we set up RED correctly if params are omitted. 17060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) { 17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 17090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 17100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 17140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 17160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 17170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 172007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_TRUE(voe_.GetRED(channel_num)); 172107617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num)); 17220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if the parameters aren't named the way we expect. 17250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) { 17260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 17270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 17280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 17290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 17300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 17310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 17320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 17330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params["ABC"] = "96/96"; 17340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 17350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 17360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 17370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 17380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 17390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 174007617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 17410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it uses different primary/secondary encoding. 17440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) { 17450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 17460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 17470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 17480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 17490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 17500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 17510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 17520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params[""] = "96/0"; 17530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 17540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 17550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 17560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 17570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 17580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 175907617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 17600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it uses more than 2 encodings. 17630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) { 17640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 17650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 17660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 17670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 17680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 17690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 17700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 17710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params[""] = "96/96/96"; 17720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 17730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 17740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 17750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 17760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 17770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 177807617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 17790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 17810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it has bogus codec ids. 17820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) { 17830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 17840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 17850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 17860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 17870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 17880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 17890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 17900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params[""] = "ABC/ABC"; 17910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 17920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 17930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 17940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 17950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 17960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 179707617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 17980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 17990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we ignore RED if it refers to a codec that is not present. 18010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) { 18020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 18030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 18040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 18050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kRedCodec); 18060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 18070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 18080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].id = 127; 18090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[0].params[""] = "97/97"; 18100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs[1].id = 96; 18110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 18120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 18130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 18140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(96, gcodec.pltype); 18150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 181607617d70029b9232bf7a5d8af375a3ac18a03836buildbot@webrtc.org EXPECT_FALSE(voe_.GetRED(channel_num)); 18170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18192ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org// Test support for audio level header extension. 18202ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) { 18212ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension); 18222ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org} 18232ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) { 18242ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension); 18250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18272ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org// Test support for absolute send time header extension. 18282ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) { 18292ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension); 18302ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org} 18312ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) { 18322ccf00b08449e81bc72367010d65f4210f7fb60ebuildbot@webrtc.org TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension); 18330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel and start sending/playing out on it. 18360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) { 18370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 18380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 18390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 18400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 18410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 18420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 18430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 18440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 18450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 18460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING)); 18470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 18480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(false)); 18490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num)); 18500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 18510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1852f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test that we can add and remove send streams. 1853f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) { 1854f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org SetupForMultiSendStream(); 1855f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1856f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org static const uint32 kSsrcs4[] = {1, 2, 3, 4}; 1857f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1858f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Set the global state for sending. 1859f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 1860f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1861f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1862f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1863f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); 1864f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1865f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify that we are in a sending state for all the created streams. 1866f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]); 1867f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 1868f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1869f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1870f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Remove the first send channel, which is the default channel. It will only 1871f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // recycle the default channel but not delete it. 1872f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0])); 1873f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Stream should already be Removed from the send stream list. 1874f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0])); 1875f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // But the default still exists. 1876f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0])); 1877f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1878f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Delete the rest of send channel streams. 1879f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) { 1880f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i])); 1881f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Stream should already be deleted. 1882f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i])); 1883f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i])); 1884f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1885f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org} 1886f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1887f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test SetSendCodecs correctly configure the codecs in all send streams. 1888f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) { 1889f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org SetupForMultiSendStream(); 1890f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1891f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org static const uint32 kSsrcs4[] = {1, 2, 3, 4}; 1892f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Create send streams. 1893f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1894f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1895f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); 1896f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1897f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1898f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 1899f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Set ISAC(16K) and CN(16K). VAD should be activated. 1900f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org codecs.push_back(kIsacCodec); 1901f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org codecs.push_back(kCn16000Codec); 1902f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org codecs[1].id = 97; 1903f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1904f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1905f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify ISAC and VAD are corrected configured on all send channels. 1906f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org webrtc::CodecInst gcodec; 1907f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1908f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]); 1909f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1910f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_STREQ("ISAC", gcodec.plname); 1911f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(voe_.GetVAD(channel_num)); 1912f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true)); 1913f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1914f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1915f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Change to PCMU(8K) and CN(16K). VAD should not be activated. 1916f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org codecs[0] = kPcmuCodec; 1917f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1918f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1919f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]); 1920f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); 1921f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_STREQ("PCMU", gcodec.plname); 1922f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_FALSE(voe_.GetVAD(channel_num)); 1923f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1924f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org} 1925f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1926f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test we can SetSend on all send streams correctly. 1927f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) { 1928f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org SetupForMultiSendStream(); 1929f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1930f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org static const uint32 kSsrcs4[] = {1, 2, 3, 4}; 1931f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Create the send channels and they should be a SEND_NOTHING date. 1932f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1933f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1934f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); 1935f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetLastChannel(); 1936f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 1937f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1938f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1939f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Set the global state for starting sending. 1940f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 1941f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1942f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify that we are in a sending state for all the send streams. 1943f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]); 1944f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 1945f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1946f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1947f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Set the global state for stopping sending. 1948f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING)); 1949f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) { 1950f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify that we are in a stop state for all the send streams. 1951f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]); 1952f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 1953f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1954f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org} 1955f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1956f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test we can set the correct statistics on all send streams. 1957f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) { 1958f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org SetupForMultiSendStream(); 1959f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1960f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org static const uint32 kSsrcs4[] = {1, 2, 3, 4}; 1961f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Create send streams. 1962f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 1963f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 1964f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); 1965f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1966ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org // Create a receive stream to check that none of the send streams end up in 1967ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org // the receive stream stats. 1968ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 1969ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc2))); 1970f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // We need send codec to be set to get all stats. 1971f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org std::vector<cricket::AudioCodec> codecs; 1972f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org codecs.push_back(kPcmuCodec); 1973f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 1974ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 1975f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1976f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org cricket::VoiceMediaInfo info; 1977f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(true, channel_->GetStats(&info)); 1978f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size()); 1979f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1980f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org // Verify the statistic information is correct. 1981f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) { 198297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc()); 1983f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name); 1984f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent); 1985f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent); 1986f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost); 1987f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost); 1988f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum); 1989f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms); 1990f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms); 1991ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name); 1992f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } 1993f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 1994ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(0u, info.receivers.size()); 1995ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); 1996ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(true, channel_->GetStats(&info)); 1997ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org 1998f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(1u, info.receivers.size()); 1999ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd); 2000ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd); 2001ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost); 2002ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum); 2003ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name); 2004f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org} 2005f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org 2006f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// Test that we can add and remove receive streams, and do proper send/playout. 2007f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org// We can receive on multiple streams while sending one stream. 2008f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) { 20090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 20100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num1 = voe_.GetLastChannel(); 20110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Start playout on the default channel. 20130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 20140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 20150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num1)); 20160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adding another stream should disable playout on the default channel. 20180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 20190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 20200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 20210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 20220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 20230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 20240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num1)); 20250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num2)); 20260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Make sure only the new channel is played out. 20280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num1)); 20290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num2)); 20300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adding yet another stream should have stream 2 and 3 enabled for playout. 20320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3))); 20330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num3 = voe_.GetLastChannel(); 20340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num1)); 20350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num2)); 20360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num3)); 20370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num3)); 20380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Stop sending. 20400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING)); 20410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num1)); 20420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num2)); 20430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num3)); 20440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Stop playout. 20460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(false)); 20470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num1)); 20480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num2)); 20490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num3)); 20500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Restart playout and make sure the default channel still is not played out. 20520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 20530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num1)); 20540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num2)); 20550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num3)); 20560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now remove the new streams and verify that the default channel is 20580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // played out again. 20590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(3)); 20600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(2)); 20610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num1)); 20630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 20640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the devices to use. 20660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetDevices) { 20670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 20680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 20690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 20700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 20710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 20720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Device default_dev(cricket::kFakeDefaultDeviceName, 20740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kFakeDefaultDeviceId); 20750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Device dev(cricket::kFakeDeviceName, 20760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kFakeDeviceId); 20770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test SetDevices() while not sending or playing. 20790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev)); 20800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test SetDevices() while sending and playing. 20820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetLocalMonitor(true)); 20830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 20840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 20850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetRecordingMicrophone()); 20860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 20870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 20880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetDevices(&dev, &dev)); 20900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetRecordingMicrophone()); 20920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 20930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 20940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 20950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that failure to open newly selected devices does not prevent opening 20960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ones after that. 20970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_start_recording_microphone(true); 20980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_playout_fail_channel(channel_num); 20990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_send_fail_channel(channel_num); 21000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev)); 21020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetRecordingMicrophone()); 21040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 21050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num)); 21060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_start_recording_microphone(false); 21080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_playout_fail_channel(-1); 21090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_send_fail_channel(-1); 21100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetDevices(&dev, &dev)); 21120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetRecordingMicrophone()); 21140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 21150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 21160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the devices to use even if we failed to 21190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// open the initial ones. 21200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) { 21210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 21220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 21230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 21240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 21250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 21260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Device default_dev(cricket::kFakeDefaultDeviceName, 21280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kFakeDefaultDeviceId); 21290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::Device dev(cricket::kFakeDeviceName, 21300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::kFakeDeviceId); 21310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that failure to open devices selected before starting 21330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // send/play does not prevent opening newly selected ones after that. 21340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_start_recording_microphone(true); 21350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_playout_fail_channel(channel_num); 21360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_send_fail_channel(channel_num); 21370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev)); 21390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.SetLocalMonitor(true)); 21410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE)); 21420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetPlayout(true)); 21430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetRecordingMicrophone()); 21440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 21450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num)); 21460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_start_recording_microphone(false); 21480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_playout_fail_channel(-1); 21490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_send_fail_channel(-1); 21500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.SetDevices(&dev, &dev)); 21520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetRecordingMicrophone()); 21540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 21550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 21560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel configured for multi-point conferences, 21590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and start sending/playing out on it. 21600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) { 21610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 21620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 21630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 21640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 21650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 21660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 21670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 21680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 21690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can create a channel configured for Codian bridges, 21720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and start sending/playing out on it. 21730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) { 21740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 21750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 21760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcConfig agc_config; 21770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 21780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 21790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_adjust_agc_)); 21800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 21810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 21820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 21830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 21840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetSend(channel_num)); 21850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 21860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated 21870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 21880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.GetPlayout(channel_num)); 21890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING)); 21900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetSend(channel_num)); 21910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 21920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored 21930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(false)); 21940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.GetPlayout(channel_num)); 21950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 21960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 21975c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) { 21985c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(SetupEngine()); 21995c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org webrtc::AgcConfig agc_config; 22005c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 22015c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 22025c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22035c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org cricket::AudioOptions options; 22045c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.tx_agc_target_dbov.Set(3); 22055c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.tx_agc_digital_compression_gain.Set(9); 22065c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.tx_agc_limiter.Set(true); 22075c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.auto_gain_control.Set(true); 22085c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(engine_.SetOptions(options)); 22095c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22105c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 22115c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(3, agc_config.targetLeveldBOv); 22125c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(9, agc_config.digitalCompressionGaindB); 22135c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(agc_config.limiterEnable); 22145c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22155c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // Check interaction with adjust_agc_delta. Both should be respected, for 22165c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // backwards compatibility. 22175c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.adjust_agc_delta.Set(-10); 22185c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(engine_.SetOptions(options)); 22195c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22205c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(agc_config)); 22215c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(13, agc_config.targetLeveldBOv); 22225c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org} 22235c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22245c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) { 22255c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(SetupEngine()); 22265c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org int channel_num = voe_.GetLastChannel(); 22275c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org cricket::AudioOptions options; 22285c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.rx_agc_target_dbov.Set(6); 22295c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.rx_agc_digital_compression_gain.Set(0); 22305c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.rx_agc_limiter.Set(true); 22315c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.rx_auto_gain_control.Set(true); 22325c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(channel_->SetOptions(options)); 22335c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22345c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org webrtc::AgcConfig agc_config; 22355c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig( 22365c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org channel_num, agc_config)); 22375c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(6, agc_config.targetLeveldBOv); 22385c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, agc_config.digitalCompressionGaindB); 22395c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(agc_config.limiterEnable); 22405c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org} 22415c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22425c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) { 22435c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(SetupEngine()); 22445c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org cricket::AudioOptions options; 22455c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.recording_sample_rate.Set(48000u); 22465c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org options.playout_sample_rate.Set(44100u); 22475c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(engine_.SetOptions(options)); 22485c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22495c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org unsigned int recording_sample_rate, playout_sample_rate; 22505c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate)); 22515c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate)); 22525c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(48000u, recording_sample_rate); 22535c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(44100u, playout_sample_rate); 22545c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org} 22555c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22565c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) { 22575c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_TRUE(SetupEngine()); 22582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org engine_.SetLogging(rtc::LS_INFO, ""); 22595c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ( 22605c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // Info: 22615c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org webrtc::kTraceStateInfo | webrtc::kTraceInfo | 22625c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // Warning: 22635c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org webrtc::kTraceTerseInfo | webrtc::kTraceWarning | 22645c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // Error: 22655c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org webrtc::kTraceError | webrtc::kTraceCritical, 22665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org static_cast<int>(trace_wrapper_->filter_)); 22675c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org // Now set it explicitly 22685c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org std::string filter = 22692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org "tracefilter " + rtc::ToString(webrtc::kTraceDefault); 22702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str()); 22715c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault), 22725c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org trace_wrapper_->filter_); 22735c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org} 22745c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org 22750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the outgoing SSRC properly. 22760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SSRC is set in SetupEngine by calling AddSendStream. 22770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) { 22780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 22790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 22800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned int send_ssrc; 22810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc)); 22820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0U, send_ssrc); 22830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc)); 22840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kSsrc1, send_ssrc); 22850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 22860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, GetStats) { 22880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Setup. We need send codec to be set to get all stats. 22890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 2290ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org // SetupEngine adds a send stream with kSsrc1, so the receive stream has to 2291ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org // use a different SSRC. 2292ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 2293ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc2))); 22940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 22950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 22960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 2297ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 22980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 22990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaInfo info; 23000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(true, channel_->GetStats(&info)); 23010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, info.senders.size()); 230297fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org EXPECT_EQ(kSsrc1, info.senders[0].ssrc()); 23030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name); 23040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent); 23050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent); 23060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost); 23070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost); 23080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum); 23090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms); 23100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms); 2311ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name); 23120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(sriniv): Add testing for more fields. These are not populated 23130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // in FakeWebrtcVoiceEngine yet. 23140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level); 23150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms); 23160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms); 23170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss); 23180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // EXPECT_EQ(cricket::kIntStatValue, 23190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // info.senders[0].echo_return_loss_enhancement); 23200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2321ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(0u, info.receivers.size()); 2322ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); 2323ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(true, channel_->GetStats(&info)); 23240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, info.receivers.size()); 2325ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org 2326ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd); 2327ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd); 2328ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost); 2329ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum); 2330ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name); 2331ec0b1b83d70e08f3bd47940d33ad69cb8bb0878fbuildbot@webrtc.org // TODO(sriniv): Add testing for more receiver fields. 23320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set the outgoing SSRC properly with multiple streams. 23350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SSRC is set in SetupEngine by calling AddSendStream. 23360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) { 23370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 23380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 23390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num1 = voe_.GetLastChannel(); 23400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned int send_ssrc; 23410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc)); 23420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kSsrc1, send_ssrc); 23430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 23450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 23460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc)); 23470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(kSsrc1, send_ssrc); 23480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the local SSRC is the same on sending and receiving channels if the 23510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// receive channel is created before the send channel. 23520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) { 23532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 23540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_ = engine_.CreateChannel(); 23550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 23560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 23580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int receive_channel_num = voe_.GetLastChannel(); 23590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddSendStream( 23600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(1234))); 23610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int send_channel_num = voe_.GetLastChannel(); 23620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned int ssrc = 0; 23640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc)); 23650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1234U, ssrc); 23660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc = 0; 23670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc)); 23680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1234U, ssrc); 23690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can properly receive packets. 23720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, Recv) { 23730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 23740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 23750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); 23760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, 23770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kPcmuFrame))); 23780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 23790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 23800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can properly receive packets on multiple streams. 23810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) { 23820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 23830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 23840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 23850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num1 = voe_.GetLastChannel(); 23860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 23870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 23880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3))); 23890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num3 = voe_.GetLastChannel(); 23900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create packets with the right SSRCs. 23910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char packets[4][sizeof(kPcmuFrame)]; 23920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) { 23930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame)); 23942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE32(packets[i] + 8, static_cast<uint32>(i)); 23950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 23960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num1)); 23970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num2)); 23980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num3)); 23990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(packets[0], sizeof(packets[0])); 24000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num1)); 24010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num2)); 24020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num3)); 24030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(packets[1], sizeof(packets[1])); 24040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], 24050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(packets[1]))); 24060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num2)); 24070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num3)); 24080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(packets[2], sizeof(packets[2])); 24090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num1)); 24100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], 24110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(packets[2]))); 24120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num3)); 24130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(packets[3], sizeof(packets[3])); 24140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num1)); 24150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckNoPacket(channel_num2)); 24160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], 24170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(packets[3]))); 24180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(3)); 24190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(2)); 24200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(1)); 24210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we properly handle failures to add a stream. 24240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) { 24250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 24260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_fail_create_channel(true); 24270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 24280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 24290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // In 1:1 call, we should not try to create a new channel. 24310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_no_conference_; 24320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_no_conference_.conference_mode.Set(false); 24330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_no_conference_)); 24340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 24350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that AddRecvStream doesn't create new channel for 1:1 call. 24380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) { 24390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 24400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 24410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 24420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(channel_num, voe_.GetLastChannel()); 24430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that after adding a recv stream, we do not decode more codecs than 24460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// those previously passed into SetRecvCodecs. 24470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) { 24480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 24490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 24500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 24510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kIsacCodec); 24520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 24530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetRecvCodecs(codecs)); 24540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 24550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc1))); 24560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num2 = voe_.GetLastChannel(); 24570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::CodecInst gcodec; 24582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "CELT"); 24590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.plfreq = 32000; 24600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org gcodec.channels = 2; 24610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec)); 24620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 24640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we properly clean up any streams that were added, even if 24650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// not explicitly removed. 24660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) { 24670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 24680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 24690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 24700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 24710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added 24720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete channel_; 24730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel_ = NULL; 24740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetNumChannels()); 24750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 24760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2477861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) { 2478861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_TRUE(SetupEngine()); 2479861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0))); 2480861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org} 2481861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2482861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) { 2483861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_TRUE(SetupEngine()); 2484861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // Stream 1 reuses default channel. 2485861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 2486861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // Manually delete default channel to simulate a failure. 2487861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org int default_channel = voe_.GetLastChannel(); 2488861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_EQ(0, voe_.DeleteChannel(default_channel)); 2489861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // Add recv stream 2 should fail because default channel is gone. 2490861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 2491861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org int new_channel = voe_.GetLastChannel(); 2492861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_NE(default_channel, new_channel); 2493861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org // The last created channel should have already been deleted. 2494861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org EXPECT_EQ(-1, voe_.DeleteChannel(new_channel)); 2495861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org} 2496861d07361a4559a72e96236f27b758a56f6f59f0wu@webrtc.org 2497952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on default send stream as caller. 2498952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) { 2499952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org TestInsertDtmf(0, true); 25000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2502952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on default send stream as callee 2503952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) { 2504952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org TestInsertDtmf(0, false); 2505952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 2506952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 2507952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on specified send stream as caller. 2508952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) { 2509952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org TestInsertDtmf(kSsrc1, true); 2510952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org} 2511952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org 2512952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org// Test the InsertDtmf on specified send stream as callee. 2513952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) { 2514952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org TestInsertDtmf(kSsrc1, false); 25150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can play a ringback tone properly in a single-stream call. 25180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayRingback) { 25190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 25200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 25210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we fail if no ringback tone specified. 25230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->PlayRingbackTone(0, true, true)); 25240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we can set and play a ringback tone. 2526cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org EXPECT_TRUE(channel_->SetRingbackTone( 2527cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org kRingbackTone, static_cast<int>(strlen(kRingbackTone)))); 25280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true)); 25290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num)); 25300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we can stop the tone manually. 25310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(0, false, false)); 25320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we stop the tone if a packet arrives. 25340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true)); 25350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num)); 25360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); 25370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can play a ringback tone properly in a multi-stream call. 25410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlayRingbackWithMultipleStreams) { 25420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 25430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 25440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 25450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 25460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_.GetLastChannel(); 25470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we fail if no ringback tone specified. 25490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->PlayRingbackTone(2, true, true)); 25500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we can set and play a ringback tone on the correct ssrc. 2552cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org EXPECT_TRUE(channel_->SetRingbackTone( 2553cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org kRingbackTone, static_cast<int>(strlen(kRingbackTone)))); 25540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->PlayRingbackTone(77, true, true)); 25550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true)); 25560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num)); 25570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we can stop the tone manually. 25580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(2, false, false)); 25590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check we stop the tone if a packet arrives, but only with the right SSRC. 25610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true)); 25620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num)); 25630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Send a packet with SSRC 1; the tone should not stop. 25640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); 25650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num)); 25660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Send a packet with SSRC 2; the tone should stop. 25670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char packet[sizeof(kPcmuFrame)]; 25680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame)); 25692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE32(packet + 8, 2); 25700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeliverPacket(packet, sizeof(packet)); 25710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num)); 25720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests creating soundclips, and make sure they come from the right engine. 25750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, CreateSoundclip) { 25762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 257762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org EXPECT_FALSE(voe_sc_.IsInited()); 25780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org soundclip_ = engine_.CreateSoundclip(); 257962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org EXPECT_TRUE(voe_sc_.IsInited()); 25800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(soundclip_ != NULL); 25810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetNumChannels()); 25820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, voe_sc_.GetNumChannels()); 25830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int channel_num = voe_sc_.GetLastChannel(); 25840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_sc_.GetPlayout(channel_num)); 25850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete soundclip_; 25860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org soundclip_ = NULL; 25870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_sc_.GetNumChannels()); 258862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org // Make sure the soundclip engine is uninitialized on shutdown, now that 258962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org // we've initialized it by creating a soundclip. 259062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org engine_.Terminate(); 259162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org EXPECT_FALSE(voe_sc_.IsInited()); 25920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 25930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 25940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests playing out a fake sound. 25950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, PlaySoundclip) { 25960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const char kZeroes[16000] = {}; 25972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 25980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org soundclip_ = engine_.CreateSoundclip(); 25990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(soundclip_ != NULL); 26000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(soundclip_->PlaySound(kZeroes, sizeof(kZeroes), 0)); 26010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, MediaEngineCallbackOnError) { 26042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<ChannelErrorListener> listener; 26050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel; 26060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned int ssrc = 0; 26070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 26090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 26100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 26110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_channel = static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 26130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener.reset(new ChannelErrorListener(channel_)); 26140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test on WebRtc VoE channel. 26160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerCallbackOnError(media_channel->voe_channel(), 26170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VE_SATURATION_WARNING); 26180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION, 26190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->error()); 26200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(-1, voe_.GetLocalSSRC(voe_.GetLastChannel(), ssrc)); 26210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ssrc, listener->ssrc()); 26220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->Reset(); 26240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerCallbackOnError(-1, VE_TYPING_NOISE_WARNING); 26250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED, 26260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->error()); 26270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, listener->ssrc()); 26280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Add another stream and test on that. 26300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++ssrc; 26310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy( 26320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc))); 26330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->Reset(); 26340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerCallbackOnError(voe_.GetLastChannel(), 26350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VE_SATURATION_WARNING); 26360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION, 26370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->error()); 26380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ssrc, listener->ssrc()); 26390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Testing a non-existing channel. 26410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener->Reset(); 26420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerCallbackOnError(voe_.GetLastChannel() + 2, 26430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VE_SATURATION_WARNING); 26440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, listener->error()); 26450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) { 26480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 26490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 26500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::AudioCodec> codecs; 26510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org codecs.push_back(kPcmuCodec); 26520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSendCodecs(codecs)); 26530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE)); 26540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2))); 26550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3))); 26560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(true)); 26570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1); 26580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetPlayout(false)); 26590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetPlayout(true)); 26600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 26610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that the Registering/Unregistering with the 26630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// webrtcvoiceengine works as expected 26640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, RegisterVoiceProcessor) { 26650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 26660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 26670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream( 26680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams::CreateLegacy(kSsrc2))); 26690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeMediaProcessor vp_1; 26700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::FakeMediaProcessor vp_2; 26710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_TX)); 26730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX)); 26740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_2, cricket::MPD_RX)); 26750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_RX); 26760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_TX); 26770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered()); 26790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, vp_1.voice_frame_count()); 26800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, vp_2.voice_frame_count()); 26810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2, 26830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_2, 26840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 26850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_RX); 26860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered()); 26870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1, vp_2.voice_frame_count()); 26880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, vp_1.voice_frame_count()); 26890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2, 26910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 26920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 26930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_RX); 26940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered()); 26950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2, vp_1.voice_frame_count()); 26960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 26970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_RX)); 26980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_TX)); 26990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_RX); 27000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_TX); 27010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered()); 27020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(3, vp_1.voice_frame_count()); 27030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc1, 27050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX_AND_TX)); 27070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_TX); 27080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered()); 27090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(3, vp_1.voice_frame_count()); 27100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2)); 27110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX)); 27120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered()); 27130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that we can register a processor on the receive channel on SSRC 0. 27150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This tests the 1:1 case when the receive SSRC is unknown. 27160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.RegisterProcessor(0, &vp_1, cricket::MPD_RX)); 27170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.TriggerProcessPacket(cricket::MPD_RX); 27180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered()); 27190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(4, vp_1.voice_frame_count()); 27200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.UnregisterProcessor(0, 27210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 27230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The following tests test that FindChannelNumFromSsrc is doing 27250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // what we expect. 27260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // pick an invalid ssrc and make sure we can't register 27270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.RegisterProcessor(99, 27280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 27300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1))); 27310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.RegisterProcessor(1, 27320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 27340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine_.UnregisterProcessor(1, 27350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_RX)); 27370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine_.RegisterProcessor(1, 27380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &vp_1, 27390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MPD_TX)); 27400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->RemoveRecvStream(1)); 27410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 27420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) { 27440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 27450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ec_enabled; 27470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::EcModes ec_mode; 27480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ec_metrics_enabled; 27490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AecmModes aecm_mode; 27500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool cng_enabled; 27510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool agc_enabled; 27520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcModes agc_mode; 27530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcConfig agc_config; 27540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ns_enabled; 27550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::NsModes ns_mode; 27560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool highpass_filter_enabled; 27570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool stereo_swapping_enabled; 27580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool typing_detection_enabled; 27590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 27600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcMetricsStatus(ec_metrics_enabled); 27610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAecmMode(aecm_mode, cng_enabled); 27620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 27630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcConfig(agc_config); 27640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 27650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org highpass_filter_enabled = voe_.IsHighPassFilterEnabled(); 27660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled(); 27670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetTypingDetectionStatus(typing_detection_enabled); 27680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 27690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_metrics_enabled); 27700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(cng_enabled); 27710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 27720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 27730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 27740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(highpass_filter_enabled); 27750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stereo_swapping_enabled); 27760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(typing_detection_enabled); 27770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ec_mode, webrtc::kEcConference); 27780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression); 27790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 27800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Nothing set, so all ignored. 27810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options; 27825528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 27830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 27840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcMetricsStatus(ec_metrics_enabled); 27850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAecmMode(aecm_mode, cng_enabled); 27860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 27870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcConfig(agc_config); 27880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 27890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org highpass_filter_enabled = voe_.IsHighPassFilterEnabled(); 27900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled(); 27910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetTypingDetectionStatus(typing_detection_enabled); 27920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 27930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_metrics_enabled); 27940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(cng_enabled); 27950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 27960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 27970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 27980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(highpass_filter_enabled); 27990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stereo_swapping_enabled); 28000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(typing_detection_enabled); 28010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ec_mode, webrtc::kEcConference); 28020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression); 28030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn echo cancellation off 28050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.echo_cancellation.Set(false); 28065528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 28080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ec_enabled); 28090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn echo cancellation back on, with settings, and make sure 28110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // nothing else changed. 28120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.echo_cancellation.Set(true); 28135528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 28150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcMetricsStatus(ec_metrics_enabled); 28160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAecmMode(aecm_mode, cng_enabled); 28170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 28180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcConfig(agc_config); 28190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 28200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org highpass_filter_enabled = voe_.IsHighPassFilterEnabled(); 28210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled(); 28220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetTypingDetectionStatus(typing_detection_enabled); 28230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 28240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_metrics_enabled); 28250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 28260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 28270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 28280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(highpass_filter_enabled); 28290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stereo_swapping_enabled); 28300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(typing_detection_enabled); 28310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ec_mode, webrtc::kEcConference); 28320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression); 28330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn off AGC 28350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.auto_gain_control.Set(false); 28365528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 28380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(agc_enabled); 28390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn AGC back on 28410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.auto_gain_control.Set(true); 28420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.adjust_agc_delta.Clear(); 28435528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 28450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 28460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcConfig(agc_config); 28470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, agc_config.targetLeveldBOv); 28480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn off other options (and stereo swapping on). 28500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.noise_suppression.Set(false); 28510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.highpass_filter.Set(false); 28520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.typing_detection.Set(false); 28530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.stereo_swapping.Set(true); 28545528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 28560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org highpass_filter_enabled = voe_.IsHighPassFilterEnabled(); 28570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled(); 28580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetTypingDetectionStatus(typing_detection_enabled); 28590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ns_enabled); 28600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(highpass_filter_enabled); 28610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(typing_detection_enabled); 28620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stereo_swapping_enabled); 28630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Turn on "conference mode" to ensure it has no impact. 28650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options.conference_mode.Set(true); 28665528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options)); 28670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 28680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 28690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 28700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::kEcConference, ec_mode); 28710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ns_enabled); 28720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode); 28730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 28740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28755528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) { 28760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 28770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ec_enabled; 28790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::EcModes ec_mode; 28800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ec_metrics_enabled; 28810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool agc_enabled; 28820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcModes agc_mode; 28830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ns_enabled; 28840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::NsModes ns_mode; 28850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool highpass_filter_enabled; 28860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool stereo_swapping_enabled; 28870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool typing_detection_enabled; 28880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 28900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcMetricsStatus(ec_metrics_enabled); 28910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 28920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 28930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org highpass_filter_enabled = voe_.IsHighPassFilterEnabled(); 28940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled(); 28950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetTypingDetectionStatus(typing_detection_enabled); 28960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 28970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 28980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 28990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(highpass_filter_enabled); 29000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(typing_detection_enabled); 29010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stereo_swapping_enabled); 29020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 29030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) { 29050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcConfig set_config = {0}; 29060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_config.targetLeveldBOv = 3; 29070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_config.digitalCompressionGaindB = 9; 29080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_config.limiterEnable = true; 29090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.SetAgcConfig(set_config)); 29102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine_.Init(rtc::Thread::Current())); 29110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcConfig config = {0}; 29130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, voe_.GetAgcConfig(config)); 29140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv); 29150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(set_config.digitalCompressionGaindB, 29160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org config.digitalCompressionGaindB); 29170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(set_config.limiterEnable, config.limiterEnable); 29180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 29190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) { 29210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 29222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::VoiceMediaChannel> channel1( 29230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.CreateChannel()); 29242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::VoiceMediaChannel> channel2( 29250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_.CreateChannel()); 29260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Have to add a stream to make SetSend work. 29280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams stream1; 29290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream1.ssrcs.push_back(1); 29300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel1->AddSendStream(stream1); 29310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams stream2; 29320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream2.ssrcs.push_back(2); 29330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel2->AddSendStream(stream2); 29340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // AEC and AGC and NS 29360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_all; 29370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_all.echo_cancellation.Set(true); 29380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_all.auto_gain_control.Set(true); 29390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_all.noise_suppression.Set(true); 29400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel1->SetOptions(options_all)); 29420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions expected_options = options_all; 29430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions actual_options; 29440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel1->GetOptions(&actual_options)); 29450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_options, actual_options); 29460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel2->SetOptions(options_all)); 29470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel2->GetOptions(&actual_options)); 29480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_options, actual_options); 29490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // unset NS 29510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_no_ns; 29520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_no_ns.noise_suppression.Set(false); 29530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel1->SetOptions(options_no_ns)); 29540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.echo_cancellation.Set(true); 29560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.auto_gain_control.Set(true); 29570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.noise_suppression.Set(false); 29580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel1->GetOptions(&actual_options)); 29590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_options, actual_options); 29600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // unset AGC 29620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_no_agc; 29630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_no_agc.auto_gain_control.Set(false); 29640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel2->SetOptions(options_no_agc)); 29650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.echo_cancellation.Set(true); 29670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.auto_gain_control.Set(false); 29680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.noise_suppression.Set(true); 29690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel2->GetOptions(&actual_options)); 29700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_options, actual_options); 29710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29725528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options_all)); 29730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ec_enabled; 29740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::EcModes ec_mode; 29750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool agc_enabled; 29760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::AgcModes agc_mode; 29770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ns_enabled; 29780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org webrtc::NsModes ns_mode; 29790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 29800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 29810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 29820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 29830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 29840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 29850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel1->SetSend(cricket::SEND_MICROPHONE); 29870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 29880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 29890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 29900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 29910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 29920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ns_enabled); 29930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 29940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel1->SetSend(cricket::SEND_NOTHING); 29950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 29960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 29970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 29980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 29990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 30000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 30010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel2->SetSend(cricket::SEND_MICROPHONE); 30030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 30040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 30050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 30060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 30070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(agc_enabled); 30080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 30090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel2->SetSend(cricket::SEND_NOTHING); 30110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 30120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 30130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 30140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 30150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(agc_enabled); 30160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ns_enabled); 30170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Make sure settings take effect while we are sending. 30195528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org ASSERT_TRUE(engine_.SetOptions(options_all)); 30200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options_no_agc_nor_ns; 30210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_no_agc_nor_ns.auto_gain_control.Set(false); 30220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options_no_agc_nor_ns.noise_suppression.Set(false); 30230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel2->SetSend(cricket::SEND_MICROPHONE); 30240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel2->SetOptions(options_no_agc_nor_ns); 30250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.echo_cancellation.Set(true); 30270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.auto_gain_control.Set(false); 30280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_options.noise_suppression.Set(false); 30290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(channel2->GetOptions(&actual_options)); 30300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_options, actual_options); 30310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetEcStatus(ec_enabled, ec_mode); 30320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetAgcStatus(agc_enabled, agc_mode); 30330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voe_.GetNsStatus(ns_enabled, ns_mode); 30340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(ec_enabled); 30350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(agc_enabled); 30360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(ns_enabled); 30370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 303980303b162fe139828d0661df23e03f09126508acwu@webrtc.org// This test verifies DSCP settings are properly applied on voice media channel. 304080303b162fe139828d0661df23e03f09126508acwu@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { 304180303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(SetupEngine()); 30422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::VoiceMediaChannel> channel( 304380303b162fe139828d0661df23e03f09126508acwu@webrtc.org engine_.CreateChannel()); 30442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface( 304580303b162fe139828d0661df23e03f09126508acwu@webrtc.org new cricket::FakeNetworkInterface); 304680303b162fe139828d0661df23e03f09126508acwu@webrtc.org channel->SetInterface(network_interface.get()); 304780303b162fe139828d0661df23e03f09126508acwu@webrtc.org cricket::AudioOptions options; 304880303b162fe139828d0661df23e03f09126508acwu@webrtc.org options.dscp.Set(true); 304980303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(channel->SetOptions(options)); 30502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp()); 30518485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org // Verify previous value is not modified if dscp option is not set. 30528485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org cricket::AudioOptions options1; 30538485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org EXPECT_TRUE(channel->SetOptions(options1)); 30542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp()); 305580303b162fe139828d0661df23e03f09126508acwu@webrtc.org options.dscp.Set(false); 305680303b162fe139828d0661df23e03f09126508acwu@webrtc.org EXPECT_TRUE(channel->SetOptions(options)); 30572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp()); 305880303b162fe139828d0661df23e03f09126508acwu@webrtc.org} 305980303b162fe139828d0661df23e03f09126508acwu@webrtc.org 3060cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.orgTEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) { 3061cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org cricket::WebRtcVoiceEngine engine; 3062cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org cricket::AudioOptions options = engine.GetOptions(); 3063cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org // The default options should have at least a few things set. We purposefully 3064cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org // don't check the option values here, though. 3065cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(options.echo_cancellation.IsSet()); 3066cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(options.auto_gain_control.IsSet()); 3067cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org EXPECT_TRUE(options.noise_suppression.IsSet()); 3068cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org} 3069cc712021a90cc93a68b4e65930cd0a0ad0a88d4ewu@webrtc.org 30700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that GetReceiveChannelNum returns the default channel for the first 30710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// recv stream in 1-1 calls. 30720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) { 30730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 30740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel = 30750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 30760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that GetChannelNum returns the default channel if the SSRC is unknown. 30770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(media_channel->voe_channel(), 30780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_channel->GetReceiveChannelNum(0)); 30790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams stream; 30800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrcs.push_back(kSsrc2); 30810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(stream)); 30820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(media_channel->voe_channel(), 30830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_channel->GetReceiveChannelNum(kSsrc2)); 30840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that GetReceiveChannelNum doesn't return the default channel for the 30870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// first recv stream in conference calls. 30880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) { 30890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 30900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOptions(options_conference_)); 30910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams stream; 30920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrcs.push_back(kSsrc2); 30930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(stream)); 30940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel = 30950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 30960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_LT(media_channel->voe_channel(), 30970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_channel->GetReceiveChannelNum(kSsrc2)); 30980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 30990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) { 31010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(SetupEngine()); 31020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org double left, right; 31030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2)); 31040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->GetOutputScaling(0, &left, &right)); 31050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_DOUBLE_EQ(1, left); 31060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_DOUBLE_EQ(2, right); 31070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2)); 31090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams stream; 31100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrcs.push_back(kSsrc2); 31110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->AddRecvStream(stream)); 31120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1)); 31140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel_->GetOutputScaling(kSsrc2, &left, &right)); 31150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_DOUBLE_EQ(2, left); 31160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_DOUBLE_EQ(1, right); 31170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests for the actual WebRtc VoE library. 31200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the library initializes and shuts down properly. 31220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, StartupShutdown) { 31230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 31242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 31250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel* channel = engine.CreateChannel(); 31260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel != NULL); 31270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete channel; 31280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 31290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Reinit to catch regression where VoiceEngineObserver reference is lost 31312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 31320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 31330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the logging from the library is cleartext. 31360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, DISABLED_HasUnencryptedLogging) { 31370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 31382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::MemoryStream> stream( 31392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org new rtc::MemoryStream); 31400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t size = 0; 31410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool cleartext = true; 31422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::LogMessage::AddLogToStream(stream.get(), rtc::LS_VERBOSE); 31432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org engine.SetLogging(rtc::LS_VERBOSE, ""); 31442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 31450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream->GetSize(&size)); 31460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GT(size, 0U); 31470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 31482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::LogMessage::RemoveLogToStream(stream.get()); 31490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const char* buf = stream->GetBuffer(); 31500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < size && cleartext; ++i) { 31510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int ch = static_cast<int>(buf[i]); 31520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_GE(ch, 0) << "Out of bounds character in WebRtc VoE log: " 31530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << std::hex << ch; 31540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cleartext = (isprint(ch) || isspace(ch)); 31550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 31560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cleartext); 31570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests we do not see any references to a monitor thread being spun up 31600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// when initiating the engine. 31610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, HasNoMonitorThread) { 31620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 31632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::MemoryStream> stream( 31642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org new rtc::MemoryStream); 31652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::LogMessage::AddLogToStream(stream.get(), rtc::LS_VERBOSE); 31662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org engine.SetLogging(rtc::LS_VERBOSE, ""); 31672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 31680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 31692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::LogMessage::RemoveLogToStream(stream.get()); 31700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t size = 0; 31720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream->GetSize(&size)); 31730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_GT(size, 0U); 3174cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org const std::string logs(stream->GetBuffer(), size); 31750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(std::string::npos, logs.find("ProcessThread")); 31760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 31770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that the library is configured with the codecs we want. 31790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { 31800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 31810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check codecs by name. 31820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0))); 31840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0))); 31860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0))); 31880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check that name matching is case-insensitive. 31890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0))); 31910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0))); 31930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0))); 31950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0))); 31970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 31980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "G722", 16000, 0, 1, 0))); 31990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "red", 8000, 0, 1, 0))); 32010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "CN", 32000, 0, 1, 0))); 32030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "CN", 16000, 0, 1, 0))); 32050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "CN", 8000, 0, 1, 0))); 32070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0))); 32090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check codecs with an id by id. 32100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU 32120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA 32140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(9, "", 16000, 0, 1, 0))); // G722 32160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN 32180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check sample/bitrate matching. 32190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(engine.FindCodec( 32200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0))); 32210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Check that bad codecs fail. 32220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0))); 32230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0))); 32240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0))); 32250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0))); 32260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0))); 32270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify the payload id of common audio codecs, including CN, ISAC, and G722. 32280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (std::vector<cricket::AudioCodec>::const_iterator it = 32290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.codecs().begin(); it != engine.codecs().end(); ++it) { 32300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (it->name == "CN" && it->clockrate == 16000) { 32310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(105, it->id); 32320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "CN" && it->clockrate == 32000) { 32330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(106, it->id); 32340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "ISAC" && it->clockrate == 16000) { 32350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(103, it->id); 32360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "ISAC" && it->clockrate == 32000) { 32370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(104, it->id); 32380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "G722" && it->clockrate == 16000) { 32390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(9, it->id); 32400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "telephone-event") { 32410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(126, it->id); 32420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "red") { 32430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(127, it->id); 32440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (it->name == "opus") { 32450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(111, it->id); 3246cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org ASSERT_TRUE(it->params.find("minptime") != it->params.end()); 32470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("10", it->params.find("minptime")->second); 3248cfd624796c7321c5ffac2249b407cdd0d496e00awu@webrtc.org ASSERT_TRUE(it->params.find("maxptime") != it->params.end()); 32490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("60", it->params.find("maxptime")->second); 32500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 32510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 32520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 32540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 32550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Tests that VoE supports at least 32 channels 32570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, Has32Channels) { 32580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 32592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 32600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel* channels[32]; 32620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int num_channels = 0; 32630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (num_channels < ARRAY_SIZE(channels)) { 32650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::VoiceMediaChannel* channel = engine.CreateChannel(); 32660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!channel) 32670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 32680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channels[num_channels++] = channel; 32700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 32710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int expected = ARRAY_SIZE(channels); 32730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected, num_channels); 32740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (num_channels > 0) { 32760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete channels[--num_channels]; 32770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 32780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine.Terminate(); 32800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 32810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we set our preferred codecs properly. 32830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, SetRecvCodecs) { 32840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine engine; 32852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine.Init(rtc::Thread::Current())); 32860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceMediaChannel channel(&engine); 32870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(channel.SetRecvCodecs(engine.codecs())); 32880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 32890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef WIN32 32910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test our workarounds to WebRtc VoE' munging of the coinit count 32920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(WebRtcVoiceEngineTest, CoInitialize) { 32930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WebRtcVoiceEngine* engine = new cricket::WebRtcVoiceEngine(); 32940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Initial refcount should be 0. 32960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED)); 32970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 32980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Engine should start even with COM already inited. 32992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine->Init(rtc::Thread::Current())); 33000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine->Terminate(); 33012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org EXPECT_TRUE(engine->Init(rtc::Thread::Current())); 33020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine->Terminate(); 33030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 33040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Refcount after terminate should be 1 (in reality 3); test if it is nonzero. 33050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(S_FALSE, CoInitializeEx(NULL, COINIT_MULTITHREADED)); 33060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Decrement refcount to (hopefully) 0. 33070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CoUninitialize(); 33080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CoUninitialize(); 33090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete engine; 33100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 33110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Ensure refcount is 0. 33120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED)); 33130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CoUninitialize(); 33140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 33150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 33165462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33175462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ChangeCombinedAudioVideoBweOption) { 33185462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Test that changing the combined_audio_video_bwe option results in the 33195462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // expected state changes in VoiceEngine. 33205462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::ViEWrapper vie; 33215462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org const int kVieCh = 667; 33225462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33235462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 33245462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel = 33255462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 33265462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(), 33275462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org kVieCh)); 33285462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->AddRecvStream( 33295462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::StreamParams::CreateLegacy(2))); 33305462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org int recv_ch = voe_.GetLastChannel(); 33315462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33325462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Combined BWE should not be set up yet. 33335462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); 33345462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); 33355462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33365462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Enable combined BWE option - now it should be set up. 33375462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::AudioOptions options; 33385462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org options.combined_audio_video_bwe.Set(true); 33395462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetOptions(options)); 33405462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch)); 33415462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch)); 33425462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33435462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Disable combined BWE option - should be disabled again. 33445462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org options.combined_audio_video_bwe.Set(false); 33455462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetOptions(options)); 33465462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); 33475462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); 33485462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33495462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); 33505462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org} 33515462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33525462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, SetupSharedBandwidthEstimation) { 33535462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Test that calling SetupSharedBandwidthEstimation() on the voice media 33545462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // channel results in the expected state changes in VoiceEngine. 33555462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::ViEWrapper vie1; 33565462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::ViEWrapper vie2; 33575462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org const int kVieCh1 = 667; 33585462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org const int kVieCh2 = 70; 33595462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33605462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 33615462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel = 33625462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 33635462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::AudioOptions options; 33645462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org options.combined_audio_video_bwe.Set(true); 33655462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetOptions(options)); 33665462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->AddRecvStream( 33675462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::StreamParams::CreateLegacy(2))); 33685462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org int recv_ch = voe_.GetLastChannel(); 33695462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33705462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Combined BWE should not be set up yet. 33715462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); 33725462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); 33735462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33745462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Register - should be enabled. 33755462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie1.engine(), 33765462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org kVieCh1)); 33775462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(vie1.network(), voe_.GetViENetwork(recv_ch)); 33785462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(kVieCh1, voe_.GetVideoChannel(recv_ch)); 33795462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33805462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Re-register - should still be enabled. 33815462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie2.engine(), 33825462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org kVieCh2)); 33835462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(vie2.network(), voe_.GetViENetwork(recv_ch)); 33845462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(kVieCh2, voe_.GetVideoChannel(recv_ch)); 33855462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33865462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Unregister - should be disabled again. 33875462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); 33885462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); 33895462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); 33905462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org} 33915462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33925462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.orgTEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) { 33935462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // Test that adding receive streams after enabling combined bandwidth 33945462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org // estimation will correctly configure each channel. 33955462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::ViEWrapper vie; 33965462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org const int kVieCh = 667; 33975462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 33985462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(SetupEngine()); 33995462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::WebRtcVoiceMediaChannel* media_channel = 34005462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); 34015462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(), 34025462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org kVieCh)); 34035462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::AudioOptions options; 34045462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org options.combined_audio_video_bwe.Set(true); 34055462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetOptions(options)); 34065462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 34075462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org static const uint32 kSsrcs[] = {1, 2, 3, 4}; 34085462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org int voe_channels[ARRAY_SIZE(kSsrcs)] = {0}; 34095462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) { 34105462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->AddRecvStream( 34115462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org cricket::StreamParams::CreateLegacy(kSsrcs[i]))); 34125462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org int recv_ch = media_channel->GetReceiveChannelNum(kSsrcs[i]); 34135462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_NE(-1, recv_ch); 34145462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org voe_channels[i] = recv_ch; 34155462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch)); 34165462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch)); 34175462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org } 34185462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 34195462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); 34205462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org 34215462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org for (unsigned int i = 0; i < ARRAY_SIZE(voe_channels); ++i) { 34225462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(NULL, voe_.GetViENetwork(voe_channels[i])); 34235462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org EXPECT_EQ(-1, voe_.GetVideoChannel(voe_channels[i])); 34245462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org } 34255462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org} 3426