JackTrip
UdpDataProtocol.h
Go to the documentation of this file.
1//*****************************************************************
2/*
3 JackTrip: A System for High-Quality Audio Network Performance
4 over the Internet
5
6 Copyright (c) 2008 Juan-Pablo Caceres, Chris Chafe.
7 SoundWIRE group at CCRMA, Stanford University.
8
9 Permission is hereby granted, free of charge, to any person
10 obtaining a copy of this software and associated documentation
11 files (the "Software"), to deal in the Software without
12 restriction, including without limitation the rights to use,
13 copy, modify, merge, publish, distribute, sublicense, and/or sell
14 copies of the Software, and to permit persons to whom the
15 Software is furnished to do so, subject to the following
16 conditions:
17
18 The above copyright notice and this permission notice shall be
19 included in all copies or substantial portions of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28 OTHER DEALINGS IN THE SOFTWARE.
29*/
30//*****************************************************************
31
38#ifndef __UDPDATAPROTOCOL_H__
39#define __UDPDATAPROTOCOL_H__
40
41#include <stdexcept>
42
43#include <QThread>
44#include <QHostAddress>
45#include <QMutex>
46#include <vector>
47#include <random>
48
49#include "DataProtocol.h"
50#include "jacktrip_types.h"
51#include "jacktrip_globals.h"
52
68{
69 Q_OBJECT;
70
71public:
72
80 UdpDataProtocol(JackTrip* jacktrip, const runModeT runmode,
81 int bind_port, int peer_port,
82 unsigned int udp_redundancy_factor = 1);
83
86 virtual ~UdpDataProtocol();
87
91 void setPeerAddress(const char* peerHostOrIP);
92
93#if defined (__WIN_32__)
94 void setSocket(SOCKET &socket);
95#else
96 void setSocket(int &socket);
97#endif
98
107 //virtual int receivePacket(char* buf, const size_t n);
108 virtual int receivePacket(char* buf, const size_t n);
109
118 virtual int sendPacket(const char* buf, const size_t n);
119
125 virtual void getPeerAddressFromFirstPacket(QHostAddress& peerHostAddress,
126 uint16_t& port);
127
130 void setBindPort(int port)
131 { mBindPort = port; }
132
135 void setPeerPort(int port)
136 { mPeerPort = port; mPeerAddr.sin_port = htons(mPeerPort); mPeerAddr6.sin6_port = htons(mPeerPort); }
137
143 virtual void run();
144
145 virtual bool getStats(PktStat* stat);
146 virtual void setIssueSimulation(double loss, double jitter, double max_delay);
147
148private slots:
149 void printUdpWaitedTooLong(int wait_msec);
150
151
152signals:
153
156 void signalWaitingTooLong(int wait_msec);
158
159 //private:
160protected:
161
164#if defined (__WIN_32__)
165 SOCKET bindSocket();
166#else
167 int bindSocket();
168#endif
169
179 void waitForReady(int timeout_msec);
180
183 virtual void receivePacketRedundancy(int8_t* full_redundant_packet,
184 int full_redundant_packet_size,
185 int full_packet_size,
186 uint16_t& current_seq_num,
187 uint16_t& last_seq_num,
188 uint16_t& newer_seq_num);
189
192 virtual void sendPacketRedundancy(int8_t* full_redundant_packet,
193 int full_redundant_packet_size,
194 int full_packet_size);
195
196private:
197 bool datagramAvailable();
198
199 int mBindPort;
200 int mPeerPort;
201 const runModeT mRunMode;
202 bool mIPv6;
203
204 QHostAddress mPeerAddress;
205 struct sockaddr_in mPeerAddr;
206 struct sockaddr_in6 mPeerAddr6;
207#if defined (__WIN_32__)
208 SOCKET mSocket;
209#else
210 int mSocket;
211#endif
212
213 int8_t* mAudioPacket;
214 int8_t* mFullPacket;
215 std::vector<int8_t> mBuffer;
216 int mChans;
217 int mSmplSize;
218 int mLastOutOfOrderCount;
219 bool mInitialState;
220
221 unsigned int mUdpRedundancyFactor;
222 static QMutex sUdpMutex;
223
224 std::atomic<uint32_t> mTotCount;
225 std::atomic<uint32_t> mLostCount;
226 std::atomic<uint32_t> mOutOfOrderCount;
227 std::atomic<uint32_t> mRevivedCount;
228 uint32_t mStatCount;
229
230 uint8_t mControlPacketSize;
231 bool mStopSignalSent;
232
233 // packet loss/jitter simulation
234 double mSimulatedLossRate;
235 double mSimulatedJitterRate;
236 double mSimulatedJitterMaxDelay;
237 std::default_random_engine mRndEngine;
238 std::uniform_real_distribution<double> mUniformDist;
239};
240
241#endif // __UDPDATAPROTOCOL_H__
Base class that defines the transmission protocol.
Definition: DataProtocol.h:94
runModeT
Enum to define class modes, SENDER or RECEIVER.
Definition: DataProtocol.h:108
Main class to creates a SERVER (to listen) or a CLIENT (to connect to a listening server) to send aud...
Definition: JackTrip.h:72
UDP implementation of DataProtocol class.
Definition: UdpDataProtocol.h:68
int bindSocket()
Binds the UDP socket to the available address and specified port.
Definition: UdpDataProtocol.cpp:195
void waitForReady(int timeout_msec)
This function blocks until data is available for reading in the socket. The function will timeout aft...
Definition: UdpDataProtocol.cpp:667
void setBindPort(int port)
Sets the bind port number.
Definition: UdpDataProtocol.h:130
virtual void getPeerAddressFromFirstPacket(QHostAddress &peerHostAddress, uint16_t &port)
Obtains the peer address from the first UDP packet received. This address is used by the SERVER mode ...
Definition: UdpDataProtocol.cpp:393
virtual int receivePacket(char *buf, const size_t n)
Receives a packet. It blocks until a packet is received.
Definition: UdpDataProtocol.cpp:333
virtual void receivePacketRedundancy(int8_t *full_redundant_packet, int full_redundant_packet_size, int full_packet_size, uint16_t &current_seq_num, uint16_t &last_seq_num, uint16_t &newer_seq_num)
Redundancy algorythm at the receiving end.
Definition: UdpDataProtocol.cpp:707
virtual ~UdpDataProtocol()
The class destructor.
Definition: UdpDataProtocol.cpp:99
void setSocket(int &socket)
Definition: UdpDataProtocol.cpp:170
virtual bool getStats(PktStat *stat)
Definition: UdpDataProtocol.cpp:813
virtual void sendPacketRedundancy(int8_t *full_redundant_packet, int full_redundant_packet_size, int full_packet_size)
Redundancy algorythm at the sender's end.
Definition: UdpDataProtocol.cpp:844
virtual void run()
Implements the Thread Loop. To start the thread, call start() ( DO NOT CALL run() )
Definition: UdpDataProtocol.cpp:415
virtual int sendPacket(const char *buf, const size_t n)
Sends a packet.
Definition: UdpDataProtocol.cpp:361
void signalUdpWaitingTooLong()
void signalWaitingTooLong(int wait_msec)
Signals when waiting every 10 milliseconds, with the total wait on wait_msec.
virtual void setIssueSimulation(double loss, double jitter, double max_delay)
Definition: UdpDataProtocol.cpp:829
void setPeerPort(int port)
Sets the peer port number.
Definition: UdpDataProtocol.h:135
void setPeerAddress(const char *peerHostOrIP)
Set the Peer address to connect to.
Definition: UdpDataProtocol.cpp:115
quint8 uint8_t
Typedef for unsigned char. This type is guaranteed to be 8-bit.
Definition: jacktrip_types.h:69
quint16 uint16_t
Typedef for unsigned short. This type is guaranteed to be 16-bit.
Definition: jacktrip_types.h:71
quint32 uint32_t
Typedef for unsigned int. This type is guaranteed to be 32-bit.
Definition: jacktrip_types.h:73
qint8 int8_t
Typedef for unsigned long long int. This type is guaranteed to be 64-bit.
Definition: jacktrip_types.h:78