1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 12143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h" 13143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h" 14143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/thread_wrapper.h" 15143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/voice_engine/include/voe_network.h" 16143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/voice_engine/test/auto_test/fakes/fake_external_transport.h" 17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_defines.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFakeExternalTransport::FakeExternalTransport(webrtc::VoENetwork* ptr) 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : my_network_(ptr), 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org thread_(NULL), 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_(NULL), 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org event_(NULL), 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org length_(0), 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_(0), 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delay_is_enabled_(0), 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delay_time_in_ms_(0) { 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const char* thread_name = "external_thread"; 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_ = webrtc::CriticalSectionWrapper::CreateCriticalSection(); 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org event_ = webrtc::EventWrapper::Create(); 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org thread_ = webrtc::ThreadWrapper::CreateThread( 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Run, this, webrtc::kHighPriority, thread_name); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (thread_) { 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int id; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org thread_->Start(id); 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFakeExternalTransport::~FakeExternalTransport() { 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (thread_) { 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org thread_->SetNotAlive(); 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org event_->Set(); 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (thread_->Stop()) { 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete thread_; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org thread_ = NULL; 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete event_; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org event_ = NULL; 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete lock_; 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_ = NULL; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FakeExternalTransport::Run(void* ptr) { 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return static_cast<FakeExternalTransport*> (ptr)->Process(); 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FakeExternalTransport::Process() { 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (event_->Wait(500)) { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case webrtc::kEventSignaled: 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_->Enter(); 62fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org my_network_->ReceivedRTPPacket(channel_, packet_buffer_, length_, 63fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org webrtc::PacketTime()); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_->Leave(); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case webrtc::kEventTimeout: 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case webrtc::kEventError: 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint FakeExternalTransport::SendPacket(int channel, const void *data, int len) { 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_->Enter(); 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (len < 1612) { 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memcpy(packet_buffer_, (const unsigned char*) data, len); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org length_ = len; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channel_ = channel; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lock_->Leave(); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org event_->Set(); // Triggers ReceivedRTPPacket() from worker thread. 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return len; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint FakeExternalTransport::SendRTCPPacket(int channel, 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const void *data, 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int len) { 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (delay_is_enabled_) { 90143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org webrtc::SleepMs(delay_time_in_ms_); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org my_network_->ReceivedRTCPPacket(channel, data, len); 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return len; 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid FakeExternalTransport::SetDelayStatus(bool enable, 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int delayInMs) { 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delay_is_enabled_ = enable; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delay_time_in_ms_ = delayInMs; 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 101