INET Framework for OMNeT++/OMNEST
inet::SimpleVoipReceiver Class Reference

Implements a simple VoIP source. More...

#include <SimpleVoipReceiver.h>

Inheritance diagram for inet::SimpleVoipReceiver:
inet::LifecycleUnsupported inet::UdpSocket::ICallback inet::ILifecycle

Classes

class  TalkspurtInfo
 
class  VoipPacketInfo
 

Public Member Functions

 SimpleVoipReceiver ()
 
 ~SimpleVoipReceiver ()
 
- Public Member Functions inherited from inet::LifecycleUnsupported
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 
- Public Member Functions inherited from inet::UdpSocket::ICallback
virtual ~ICallback ()
 

Protected Member Functions

virtual int numInitStages () const override
 
void initialize (int stage) override
 
void handleMessage (cMessage *msg) override
 
virtual void finish () override
 
virtual void socketDataArrived (UdpSocket *socket, Packet *packet) override
 Notifies about data arrival, packet ownership is transferred to the callee. More...
 
virtual void socketErrorArrived (UdpSocket *socket, Indication *indication) override
 Notifies about error indication arrival, indication ownership is transferred to the callee. More...
 
virtual void socketClosed (UdpSocket *socket) override
 Notifies about socket closed, indication ownership is transferred to the callee. More...
 

Private Types

typedef std::list< VoipPacketInfo * > PacketsList
 
typedef std::vector< VoipPacketInfoPacketsVector
 

Private Member Functions

double eModel (double delay, double loss)
 
void evaluateTalkspurt (bool finish)
 
void startTalkspurt (Packet *packet)
 

Private Attributes

double emodelRo = NaN
 
unsigned int bufferSpace = 0
 
int emodelIe = -1
 
int emodelBpl = -1
 
int emodelA = -1
 
simtime_t playoutDelay
 
simtime_t mosSpareTime
 
UdpSocket socket
 
cMessage * selfTalkspurtFinished = nullptr
 
TalkspurtInfo currentTalkspurt
 

Static Private Attributes

static simsignal_t voipPacketLossRateSignal = registerSignal("voipPacketLossRate")
 
static simsignal_t voipPacketDelaySignal = registerSignal("voipPacketDelay")
 
static simsignal_t voipPlayoutDelaySignal = registerSignal("voipPlayoutDelay")
 
static simsignal_t voipPlayoutLossRateSignal = registerSignal("voipPlayoutLossRate")
 
static simsignal_t voipMosRateSignal = registerSignal("voipMosRate")
 
static simsignal_t voipTaildropLossRateSignal = registerSignal("voipTaildropLossRate")
 

Detailed Description

Implements a simple VoIP source.

See the NED file for more information.

Member Typedef Documentation

◆ PacketsList

◆ PacketsVector

Constructor & Destructor Documentation

◆ SimpleVoipReceiver()

inet::SimpleVoipReceiver::SimpleVoipReceiver ( )
53 {
54 }

◆ ~SimpleVoipReceiver()

inet::SimpleVoipReceiver::~SimpleVoipReceiver ( )
57 {
58  cancelAndDelete(selfTalkspurtFinished);
59 }

Member Function Documentation

◆ eModel()

double inet::SimpleVoipReceiver::eModel ( double  delay,
double  loss 
)
private
289 {
290  static const double alpha3 = 177.3; // ms
291  double delayms = 1000.0 * delay;
292 
293  // Compute the Id parameter
294  int u = (delayms - alpha3) > 0 ? 1 : 0;
295  double id = 0.024 * delayms + 0.11 * (delayms - alpha3) * u;
296 
297  // p: Packet loss rate in %
298  double p = lossRate * 100;
299  // Compute the Ie,eff parameter
300  double ie_eff = emodelIe + (95 - emodelIe) * p / (p + emodelBpl);
301 
302  // Compute the R factor
303  double Rfactor = emodelRo - id - ie_eff + emodelA;
304 
305  // Compute the MOS value
306  double mos = 0.0;
307 
308  if (Rfactor < 0.0) {
309  mos = 1.0;
310  }
311  else if (Rfactor > 100.0) {
312  mos = 4.5;
313  }
314  else {
315  mos = 1.0 + 0.035 * Rfactor + 7.0 * 1E-6 * Rfactor * (Rfactor - 60.0) * (100.0 - Rfactor);
316  }
317 
318  mos = (mos < 1.0) ? 1.0 : mos;
319 
320  return mos;
321 }

Referenced by evaluateTalkspurt().

◆ evaluateTalkspurt()

void inet::SimpleVoipReceiver::evaluateTalkspurt ( bool  finish)
private
162 {
163  ASSERT(!currentTalkspurt.packets.empty());
164  ASSERT(currentTalkspurt.isActive());
165 
166  VoipPacketInfo firstPacket = currentTalkspurt.packets.front();
167 
168  simtime_t firstPlayoutTime = firstPacket.arrivalTime + playoutDelay;
169  simtime_t mouthToEarDelay = firstPlayoutTime - firstPacket.creationTime;
170  unsigned int firstPacketId = firstPacket.packetID;
171  unsigned int talkspurtNumPackets = currentTalkspurt.talkspurtNumPackets;
172  unsigned int playoutLoss = 0;
173  unsigned int tailDropLoss = 0;
174  unsigned int channelLoss;
175 
176  if (finish) {
177  unsigned int maxId = 0;
178  for (auto& elem : currentTalkspurt.packets)
179  maxId = std::max(maxId, (elem).packetID);
180  channelLoss = maxId + 1 - currentTalkspurt.packets.size();
181  }
182  else
184 
185  // Note: duplicate packets may shadow lost packets in the above channel loss calculation,
186  // we'll correct that in the code below when we detect duplicates.
187 
188  double packetLossRate = ((double)channelLoss / (double)talkspurtNumPackets);
189  emit(voipPacketLossRateSignal, packetLossRate);
190 
191  // vector to manage duplicated packets
192  bool *isArrived = new bool[talkspurtNumPackets];
193  for (unsigned int y = 0; y < talkspurtNumPackets; y++)
194  isArrived[y] = false;
195 
196  simtime_t lastLateness = -playoutDelay; // arrival time - playout time
197  simtime_t maxLateness = -playoutDelay;
198 
199  // compute channelLoss, playoutLoss and tailDropLoss, needed for MOS and statistics
200  PacketsList playoutQueue;
201  for (auto& elem : currentTalkspurt.packets) {
202  elem.playoutTime = (firstPlayoutTime + ((int)elem.packetID - (int)firstPacketId) * currentTalkspurt.voiceDuration);
203 
204  lastLateness = elem.arrivalTime - elem.playoutTime; // >0: packet is too late (missed its playout time)
205  if (maxLateness < lastLateness)
206  maxLateness = lastLateness;
207 
208  EV_DEBUG << "MEASURED PACKET LATENESS: " << lastLateness << " TALK " << currentTalkspurt.talkspurtID << " PACKET " << elem.packetID << "\n\n";
209 
210  // Management of duplicated packets
211  if (isArrived[elem.packetID]) {
212  ++channelLoss; // duplicate packets may shadow lost packets in the channel loss calculation above, we correct that here.
213  EV_DEBUG << "DUPLICATED PACKET: TALK " << currentTalkspurt.talkspurtID << " PACKET " << elem.packetID << "\n\n";
214  }
215  else if (lastLateness > 0.0) {
216  ++playoutLoss;
217  EV_DEBUG << "REMOVED LATE PACKET: TALK " << currentTalkspurt.talkspurtID << " PACKET " << elem.packetID << ", LATENESS " << lastLateness * 1000.0 << "ms\n\n";
218  }
219  else {
220  // insert packet into playout buffer (if there is room in it)
221 
222  // remove packets from queue
223  auto qi = playoutQueue.begin();
224  while (qi != playoutQueue.end()) {
225  if ((*qi)->playoutTime < elem.arrivalTime) {
226 // EV_DEBUG << "REPRODUCED AND EXTRACT FROM BUFFER: TALK " << currentTalkspurt.talkspurtID << " PACKET " << (*qi)->packetID << "\n";
227  qi = playoutQueue.erase(qi);
228  }
229  else
230  ++qi;
231  }
232 
233  if (playoutQueue.size() < bufferSpace) {
234  EV_DEBUG << "PACKET INSERTED INTO PLAYOUT BUFFER: TALK "
235  << currentTalkspurt.talkspurtID << " PACKET " << elem.packetID << ", "
236  << "ARRIVAL TIME " << elem.arrivalTime << "s, "
237  << "PLAYOUT TIME " << elem.playoutTime << "s\n\n";
238 
239  isArrived[elem.packetID] = true; // isArrived[] is needed for detecting duplicate packets
240 
241  playoutQueue.push_back(&(elem));
242  }
243  else {
244  // buffer full
245  ++tailDropLoss;
246  EV_DEBUG << "BUFFER FULL, PACKET DISCARDED: TALK " << currentTalkspurt.talkspurtID << " PACKET "
247  << elem.packetID << " ARRIVAL TIME " << elem.arrivalTime << "s\n\n";
248  }
249  }
250  }
251 
252  double proportionalLossRate = (double)(tailDropLoss + playoutLoss + channelLoss) / (double)talkspurtNumPackets;
253  EV_DEBUG << "proportionalLossRate " << proportionalLossRate << "(tailDropLoss=" << tailDropLoss
254  << " - playoutLoss=" << playoutLoss << " - channelLoss=" << channelLoss << ")\n\n";
255 
256  double mos = eModel(SIMTIME_DBL(mouthToEarDelay), proportionalLossRate);
257 
259  double lossRate = ((double)playoutLoss / (double)talkspurtNumPackets);
260  emit(voipPlayoutLossRateSignal, lossRate);
261  emit(voipMosRateSignal, mos);
262 
263  // add calculated MOS value to fingerprint
265 
266  double tailDropRate = ((double)tailDropLoss / (double)talkspurtNumPackets);
267  emit(voipTaildropLossRateSignal, tailDropRate);
268 
269  EV_DEBUG << "CALCULATED MOS: eModel( " << playoutDelay << " , " << tailDropLoss << "+" << playoutLoss << "+" << channelLoss << " ) = " << mos << "\n\n";
270 
271  EV_DEBUG << "PLAYOUT DELAY ADAPTATION \n" << "OLD PLAYOUT DELAY: " << playoutDelay << "\nMAX LATENESS MEASURED: " << maxLateness << "\n\n";
272 
273  if (par("adaptivePlayoutDelay")) {
274  playoutDelay += maxLateness;
275  if (playoutDelay < 0.0)
276  playoutDelay = 0.0;
277  EV_DEBUG << "NEW PLAYOUT DELAY: " << playoutDelay << "\n\n";
278  }
279 
280  delete[] isArrived;
282 }

Referenced by finish(), handleMessage(), and socketDataArrived().

◆ finish()

void inet::SimpleVoipReceiver::finish ( )
overrideprotectedvirtual
324 {
325  // evaluate last talkspurt
326  cancelEvent(selfTalkspurtFinished);
328  evaluateTalkspurt(true);
329 }

Referenced by evaluateTalkspurt().

◆ handleMessage()

void inet::SimpleVoipReceiver::handleMessage ( cMessage *  msg)
overrideprotected
105 {
106  if (msg->isSelfMessage()) {
107  // selfTalkspurtFinished
108  evaluateTalkspurt(false);
109  }
110  else if (msg->arrivedOn("socketIn")) {
111  socket.processMessage(msg);
112  }
113  else
114  throw cRuntimeError("Unknown incoming gate: '%s'", msg->getArrivalGate()->getFullName());
115 }

◆ initialize()

void inet::SimpleVoipReceiver::initialize ( int  stage)
overrideprotected
62 {
63  cSimpleModule::initialize(stage);
64 
65  if (stage == INITSTAGE_LOCAL) {
66  emodelIe = par("emodelIe");
67  emodelBpl = par("emodelBpl");
68  emodelA = par("emodelA");
69  emodelRo = par("emodelRo");
70 
71  bufferSpace = par("bufferSpace");
72  playoutDelay = par("playoutDelay");
73  mosSpareTime = par("mosSpareTime");
74 
76  }
77  else if (stage == INITSTAGE_APPLICATION_LAYER) {
78  cModule *node = findContainingNode(this);
79  NodeStatus *nodeStatus = node ? check_and_cast_nullable<NodeStatus *>(node->getSubmodule("status")) : nullptr;
80  bool isOperational = (!nodeStatus) || nodeStatus->getState() == NodeStatus::UP;
81  if (!isOperational)
82  throw cRuntimeError("This module doesn't support starting in node DOWN state");
83 
84  int port = par("localPort");
85  EV_INFO << "VoIPReceiver::initialize - binding to port: local:" << port << endl;
86  if (port != -1) {
87  socket.setOutputGate(gate("socketOut"));
88  socket.bind(port);
89  }
90  socket.setCallback(this);
91 
92  selfTalkspurtFinished = new cMessage("selfTalkspurtFinished");
93  }
94 }

◆ numInitStages()

virtual int inet::SimpleVoipReceiver::numInitStages ( ) const
inlineoverrideprotectedvirtual
89 { return NUM_INIT_STAGES; }

◆ socketClosed()

virtual void inet::SimpleVoipReceiver::socketClosed ( UdpSocket socket)
inlineoverrideprotectedvirtual

Notifies about socket closed, indication ownership is transferred to the callee.

Implements inet::UdpSocket::ICallback.

97 {}

◆ socketDataArrived()

void inet::SimpleVoipReceiver::socketDataArrived ( UdpSocket socket,
Packet packet 
)
overrideprotectedvirtual

Notifies about data arrival, packet ownership is transferred to the callee.

Implements inet::UdpSocket::ICallback.

118 {
119  // process incoming packet
120  const auto& voice = packet->peekAtFront<SimpleVoipPacket>();
121 
123  // first talkspurt
124  startTalkspurt(packet);
125  }
126  else if (voice->getTalkspurtID() > currentTalkspurt.talkspurtID) {
127  // old talkspurt finished, new talkspurt started
128  if (currentTalkspurt.isActive()) {
129  cancelEvent(selfTalkspurtFinished);
130  evaluateTalkspurt(false);
131  }
132  startTalkspurt(packet);
133  }
134  else if (currentTalkspurt.talkspurtID == voice->getTalkspurtID() && currentTalkspurt.status == TalkspurtInfo::ACTIVE) {
135  // talkspurt continued
136  if (!currentTalkspurt.checkPacket(voice.get()))
137  throw cRuntimeError("Talkspurt parameters not equals");
138  currentTalkspurt.addPacket(voice.get());
139  }
140  else {
141  // packet from older talkspurt, ignore
142  EV_DEBUG << "PACKET ARRIVED TOO LATE: TALKSPURT " << voice->getTalkspurtID() << " PACKET " << voice->getPacketID() << ", IGNORED\n\n";
143  delete packet;
144  return;
145  }
146 
147  EV_DEBUG << "PACKET ARRIVED: TALKSPURT " << voice->getTalkspurtID() << " PACKET " << voice->getPacketID() << "\n\n";
148 
149  simtime_t delay = packet->getArrivalTime() - voice->getVoipTimestamp();
150  emit(voipPacketDelaySignal, delay);
151 
152  delete packet;
153 }

◆ socketErrorArrived()

void inet::SimpleVoipReceiver::socketErrorArrived ( UdpSocket socket,
Indication indication 
)
overrideprotectedvirtual

Notifies about error indication arrival, indication ownership is transferred to the callee.

Implements inet::UdpSocket::ICallback.

156 {
157  EV_WARN << "Unknown message '" << indication->getName() << "', kind = " << indication->getKind() << ", discarding it." << endl;
158  delete indication;
159 }

◆ startTalkspurt()

void inet::SimpleVoipReceiver::startTalkspurt ( Packet packet)
private
97 {
98  const auto& voice = packet->peekAtFront<SimpleVoipPacket>();
99  currentTalkspurt.startTalkspurt(voice.get());
100  simtime_t endTime = simTime() + playoutDelay + (currentTalkspurt.talkspurtNumPackets - voice->getPacketID()) * currentTalkspurt.voiceDuration + mosSpareTime;
101  scheduleAt(endTime, selfTalkspurtFinished);
102 }

Referenced by socketDataArrived().

Member Data Documentation

◆ bufferSpace

unsigned int inet::SimpleVoipReceiver::bufferSpace = 0
private

Referenced by evaluateTalkspurt(), and initialize().

◆ currentTalkspurt

TalkspurtInfo inet::SimpleVoipReceiver::currentTalkspurt
private

◆ emodelA

int inet::SimpleVoipReceiver::emodelA = -1
private

Referenced by eModel(), and initialize().

◆ emodelBpl

int inet::SimpleVoipReceiver::emodelBpl = -1
private

Referenced by eModel(), and initialize().

◆ emodelIe

int inet::SimpleVoipReceiver::emodelIe = -1
private

Referenced by eModel(), and initialize().

◆ emodelRo

double inet::SimpleVoipReceiver::emodelRo = NaN
private

Referenced by eModel(), and initialize().

◆ mosSpareTime

simtime_t inet::SimpleVoipReceiver::mosSpareTime
private

Referenced by initialize(), and startTalkspurt().

◆ playoutDelay

simtime_t inet::SimpleVoipReceiver::playoutDelay
private

◆ selfTalkspurtFinished

cMessage* inet::SimpleVoipReceiver::selfTalkspurtFinished = nullptr
private

◆ socket

UdpSocket inet::SimpleVoipReceiver::socket
private

Referenced by handleMessage(), and initialize().

◆ voipMosRateSignal

simsignal_t inet::SimpleVoipReceiver::voipMosRateSignal = registerSignal("voipMosRate")
staticprivate

Referenced by evaluateTalkspurt().

◆ voipPacketDelaySignal

simsignal_t inet::SimpleVoipReceiver::voipPacketDelaySignal = registerSignal("voipPacketDelay")
staticprivate

Referenced by socketDataArrived().

◆ voipPacketLossRateSignal

simsignal_t inet::SimpleVoipReceiver::voipPacketLossRateSignal = registerSignal("voipPacketLossRate")
staticprivate

Referenced by evaluateTalkspurt().

◆ voipPlayoutDelaySignal

simsignal_t inet::SimpleVoipReceiver::voipPlayoutDelaySignal = registerSignal("voipPlayoutDelay")
staticprivate

Referenced by evaluateTalkspurt().

◆ voipPlayoutLossRateSignal

simsignal_t inet::SimpleVoipReceiver::voipPlayoutLossRateSignal = registerSignal("voipPlayoutLossRate")
staticprivate

Referenced by evaluateTalkspurt().

◆ voipTaildropLossRateSignal

simsignal_t inet::SimpleVoipReceiver::voipTaildropLossRateSignal = registerSignal("voipTaildropLossRate")
staticprivate

Referenced by evaluateTalkspurt().


The documentation for this class was generated from the following files:
inet::SimpleVoipReceiver::TalkspurtInfo::status
Status status
Definition: SimpleVoipReceiver.h:48
inet::UdpSocket::setOutputGate
void setOutputGate(cGate *toUdp)
Sets the gate on which to send to UDP.
Definition: UdpSocket.h:117
inet::findContainingNode
cModule * findContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:31
inet::SimpleVoipReceiver::bufferSpace
unsigned int bufferSpace
Definition: SimpleVoipReceiver.h:65
inet::SimpleVoipReceiver::voipMosRateSignal
static simsignal_t voipMosRateSignal
Definition: SimpleVoipReceiver.h:81
inet::UdpSocket::bind
void bind(int localPort)
Bind the socket to a local port number.
Definition: UdpSocket.cc:34
inet::SimpleVoipReceiver::emodelIe
int emodelIe
Definition: SimpleVoipReceiver.h:66
inet::SimpleVoipReceiver::voipPacketDelaySignal
static simsignal_t voipPacketDelaySignal
Definition: SimpleVoipReceiver.h:78
inet::SimpleVoipReceiver::voipTaildropLossRateSignal
static simsignal_t voipTaildropLossRateSignal
Definition: SimpleVoipReceiver.h:82
inet::SimpleVoipReceiver::mosSpareTime
simtime_t mosSpareTime
Definition: SimpleVoipReceiver.h:70
inet::SimpleVoipReceiver::emodelA
int emodelA
Definition: SimpleVoipReceiver.h:68
inet::SimpleVoipReceiver::socket
UdpSocket socket
Definition: SimpleVoipReceiver.h:73
inet::SimpleVoipReceiver::emodelBpl
int emodelBpl
Definition: SimpleVoipReceiver.h:67
inet::SimpleVoipReceiver::TalkspurtInfo::finishTalkspurt
void finishTalkspurt()
Definition: SimpleVoipReceiver.h:57
inet::SimpleVoipReceiver::voipPlayoutDelaySignal
static simsignal_t voipPlayoutDelaySignal
Definition: SimpleVoipReceiver.h:79
inet::SimpleVoipReceiver::TalkspurtInfo::checkPacket
bool checkPacket(const SimpleVoipPacket *pk)
Definition: SimpleVoipReceiver.cc:36
inet::SimpleVoipReceiver::evaluateTalkspurt
void evaluateTalkspurt(bool finish)
Definition: SimpleVoipReceiver.cc:161
inet::SimpleVoipReceiver::TalkspurtInfo::ACTIVE
@ ACTIVE
Definition: SimpleVoipReceiver.h:45
inet::UdpSocket::setCallback
void setCallback(ICallback *cb)
Sets a callback object, to be used with processMessage().
Definition: UdpSocket.cc:338
inet::SimpleVoipReceiver::TalkspurtInfo::addPacket
void addPacket(const SimpleVoipPacket *pk)
Definition: SimpleVoipReceiver.cc:43
inet::SimpleVoipReceiver::finish
virtual void finish() override
Definition: SimpleVoipReceiver.cc:323
inet::SimpleVoipReceiver::TalkspurtInfo::talkspurtNumPackets
unsigned int talkspurtNumPackets
Definition: SimpleVoipReceiver.h:50
inet::UdpSocket::processMessage
virtual void processMessage(cMessage *msg) override
Examines the message, takes ownership, and updates socket state.
Definition: UdpSocket.cc:343
inet::SimpleVoipReceiver::TalkspurtInfo::packets
PacketsVector packets
Definition: SimpleVoipReceiver.h:52
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::SimpleVoipReceiver::PacketsList
std::list< VoipPacketInfo * > PacketsList
Definition: SimpleVoipReceiver.h:38
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::SimpleVoipReceiver::TalkspurtInfo::EMPTY
@ EMPTY
Definition: SimpleVoipReceiver.h:44
inet::SimpleVoipReceiver::playoutDelay
simtime_t playoutDelay
Definition: SimpleVoipReceiver.h:69
inet::SimpleVoipReceiver::TalkspurtInfo::talkspurtID
unsigned int talkspurtID
Definition: SimpleVoipReceiver.h:49
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::SimpleVoipReceiver::TalkspurtInfo::startTalkspurt
void startTalkspurt(const SimpleVoipPacket *pk)
Definition: SimpleVoipReceiver.cc:25
inet::SimpleVoipReceiver::eModel
double eModel(double delay, double loss)
Definition: SimpleVoipReceiver.cc:288
inet::SimpleVoipReceiver::currentTalkspurt
TalkspurtInfo currentTalkspurt
Definition: SimpleVoipReceiver.h:75
inet::SimpleVoipReceiver::TalkspurtInfo::isActive
bool isActive()
Definition: SimpleVoipReceiver.h:60
inet::INITSTAGE_APPLICATION_LAYER
INET_API InitStage INITSTAGE_APPLICATION_LAYER
Initialization of applications.
inet::NodeStatus::UP
@ UP
Definition: NodeStatus.h:28
FINGERPRINT_ADD_EXTRA_DATA
#define FINGERPRINT_ADD_EXTRA_DATA(x)
Definition: INETDefs.h:84
inet::SimpleVoipReceiver::selfTalkspurtFinished
cMessage * selfTalkspurtFinished
Definition: SimpleVoipReceiver.h:74
inet::SimpleVoipReceiver::voipPacketLossRateSignal
static simsignal_t voipPacketLossRateSignal
Definition: SimpleVoipReceiver.h:77
inet::SimpleVoipReceiver::startTalkspurt
void startTalkspurt(Packet *packet)
Definition: SimpleVoipReceiver.cc:96
inet::SimpleVoipReceiver::emodelRo
double emodelRo
Definition: SimpleVoipReceiver.h:64
inet::SimpleVoipReceiver::voipPlayoutLossRateSignal
static simsignal_t voipPlayoutLossRateSignal
Definition: SimpleVoipReceiver.h:80
inet::SimpleVoipReceiver::TalkspurtInfo::voiceDuration
simtime_t voiceDuration
Definition: SimpleVoipReceiver.h:51