JackTrip
|
00001 //***************************************************************** 00002 /* 00003 JackTrip: A System for High-Quality Audio Network Performance 00004 over the Internet 00005 00006 Copyright (c) 2008 Juan-Pablo Caceres, Chris Chafe. 00007 SoundWIRE group at CCRMA, Stanford University. 00008 00009 Permission is hereby granted, free of charge, to any person 00010 obtaining a copy of this software and associated documentation 00011 files (the "Software"), to deal in the Software without 00012 restriction, including without limitation the rights to use, 00013 copy, modify, merge, publish, distribute, sublicense, and/or sell 00014 copies of the Software, and to permit persons to whom the 00015 Software is furnished to do so, subject to the following 00016 conditions: 00017 00018 The above copyright notice and this permission notice shall be 00019 included in all copies or substantial portions of the Software. 00020 00021 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00022 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 00023 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00024 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 00025 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 00026 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00027 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 00028 OTHER DEALINGS IN THE SOFTWARE. 00029 */ 00030 //***************************************************************** 00031 00038 #ifndef __UDPDATAPROTOCOL_H__ 00039 #define __UDPDATAPROTOCOL_H__ 00040 00041 #include <QThread> 00042 #include <QUdpSocket> 00043 #include <QHostAddress> 00044 00045 #include "DataProtocol.h" 00046 #include "jacktrip_types.h" 00047 #include "jacktrip_globals.h" 00048 00063 class UdpDataProtocol : public DataProtocol 00064 { 00065 Q_OBJECT; 00066 00067 public: 00068 00076 UdpDataProtocol(JackTrip* jacktrip, const runModeT runmode, 00077 int bind_port, int peer_port, 00078 unsigned int udp_redundancy_factor = 1); 00079 00082 virtual ~UdpDataProtocol(); 00083 00087 void setPeerAddress(const char* peerHostOrIP); 00088 00097 //virtual int receivePacket(char* buf, const size_t n); 00098 virtual int receivePacket(QUdpSocket& UdpSocket, char* buf, const size_t n); 00099 00108 virtual int sendPacket(QUdpSocket& UdpSocket, const QHostAddress& PeerAddress, 00109 const char* buf, const size_t n); 00110 00116 virtual void getPeerAddressFromFirstPacket(QUdpSocket& UdpSocket, 00117 QHostAddress& peerHostAddress, 00118 uint16_t& port); 00119 00122 void setBindPort(int port) 00123 { mBindPort = port; } 00124 00127 void setPeerPort(int port) 00128 { mPeerPort = port; } 00129 00135 virtual void run(); 00136 00137 00138 private slots: 00139 void printUdpWaitedTooLong(int wait_msec); 00140 00141 00142 signals: 00143 00146 void signalWatingTooLong(int wait_msec); 00147 00148 00149 private: 00150 00153 void bindSocket(QUdpSocket& UdpSocket); 00154 00164 bool waitForReady(QUdpSocket& UdpSocket, int timeout_msec); 00165 00168 void receivePacketRedundancy(QUdpSocket& UdpSocket, 00169 int8_t* full_redundant_packet, 00170 int full_redundant_packet_size, 00171 int full_packet_size, 00172 uint16_t& current_seq_num, 00173 uint16_t& last_seq_num, 00174 uint16_t& newer_seq_num); 00175 00178 void sendPacketRedundancy(QUdpSocket& UdpSocket, 00179 QHostAddress& PeerAddress, 00180 int8_t* full_redundant_packet, 00181 int full_redundant_packet_size, 00182 int full_packet_size); 00183 00184 int mBindPort; 00185 int mPeerPort; 00186 const runModeT mRunMode; 00187 00188 QHostAddress mPeerAddress; 00189 00190 int8_t* mAudioPacket; 00191 int8_t* mFullPacket; 00192 00193 unsigned int mUdpRedundancyFactor; 00194 static QMutex sUdpMutex; 00195 }; 00196 00197 #endif // __UDPDATAPROTOCOL_H__