blob: bd2b94e8c7325f79188c239972dd8c6096b7702f [file] [log] [blame]
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/event_wrapper.h"
#include "webrtc/system_wrappers/interface/sleep.h"
#include "webrtc/system_wrappers/interface/thread_wrapper.h"
#include "webrtc/voice_engine/include/voe_network.h"
#include "webrtc/voice_engine/test/auto_test/fakes/fake_external_transport.h"
#include "webrtc/voice_engine/voice_engine_defines.h"
FakeExternalTransport::FakeExternalTransport(webrtc::VoENetwork* ptr)
: my_network_(ptr),
thread_(NULL),
lock_(NULL),
event_(NULL),
length_(0),
channel_(0),
delay_is_enabled_(0),
delay_time_in_ms_(0) {
const char* thread_name = "external_thread";
lock_ = webrtc::CriticalSectionWrapper::CreateCriticalSection();
event_ = webrtc::EventWrapper::Create();
thread_ = webrtc::ThreadWrapper::CreateThread(
Run, this, webrtc::kHighPriority, thread_name);
if (thread_) {
unsigned int id;
thread_->Start(id);
}
}
FakeExternalTransport::~FakeExternalTransport() {
if (thread_) {
thread_->SetNotAlive();
event_->Set();
if (thread_->Stop()) {
delete thread_;
thread_ = NULL;
delete event_;
event_ = NULL;
delete lock_;
lock_ = NULL;
}
}
}
bool FakeExternalTransport::Run(void* ptr) {
return static_cast<FakeExternalTransport*> (ptr)->Process();
}
bool FakeExternalTransport::Process() {
switch (event_->Wait(500)) {
case webrtc::kEventSignaled:
lock_->Enter();
my_network_->ReceivedRTPPacket(channel_, packet_buffer_, length_,
webrtc::PacketTime());
lock_->Leave();
return true;
case webrtc::kEventTimeout:
return true;
case webrtc::kEventError:
break;
}
return true;
}
int FakeExternalTransport::SendPacket(int channel,
const void *data,
size_t len) {
lock_->Enter();
if (len < 1612) {
memcpy(packet_buffer_, (const unsigned char*) data, len);
length_ = len;
channel_ = channel;
}
lock_->Leave();
event_->Set(); // Triggers ReceivedRTPPacket() from worker thread.
return static_cast<int>(len);
}
int FakeExternalTransport::SendRTCPPacket(int channel,
const void *data,
size_t len) {
if (delay_is_enabled_) {
webrtc::SleepMs(delay_time_in_ms_);
}
my_network_->ReceivedRTCPPacket(channel, data, len);
return static_cast<int>(len);
}
void FakeExternalTransport::SetDelayStatus(bool enable,
unsigned int delayInMs) {
delay_is_enabled_ = enable;
delay_time_in_ms_ = delayInMs;
}