JackTrip
PacketHeader.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 __PACKETHEADER_H__
39 #define __PACKETHEADER_H__
40 
41 #include <iostream>
42 //#include <tr1/memory> // for shared_ptr
43 #include <cstring>
44 
45 #include <QObject>
46 #include <QString>
47 
48 #include "jacktrip_types.h"
49 #include "jacktrip_globals.h"
50 class JackTrip; // Forward Declaration
51 
52 
54 struct HeaderStruct{};
55 
58 {
59 public:
60  // watch out for alignment...
61  uint64_t TimeStamp;
66  //uint8_t NumInChannels; ///< Number of Input Channels
67  //uint8_t NumOutChannels; ///< Number of Output Channels
70 };
71 
72 //---------------------------------------------------------
73 //JamLink UDP Header:
74 /************************************************************************/
75 /* values for the UDP stream type */
76 /* streamType is a 16-bit value at the head of each UDP stream */
77 /* Its bit map is as follows: (b15-msb) */
78 /* B15:reserved, B14:extended header, B13 Stereo, B12 not 16-bit */
79 /* B11-B9: 0-48 Khz, 1-44 Khz, 2-32 Khz, 3-24 Khz, */
80 /* 4-22 Khz, 5-16 Khz, 6-11 Khz, 7-8 Khz */
81 /* B8-0: Samples in packet */
82 /************************************************************************/
83 const unsigned short ETX_RSVD = (0<<15);
84 const unsigned short ETX_XTND = (1<<14);
85 const unsigned short ETX_STEREO = (1<<13);
86 const unsigned short ETX_MONO = (0<<13);
87 const unsigned short ETX_16BIT = (0<<12);
88 //inline unsigned short ETX_RATE_MASK(const unsigned short a) { a&(0x7<<9); }
89 const unsigned short ETX_48KHZ = (0<<9);
90 const unsigned short ETX_44KHZ = (1<<9);
91 const unsigned short ETX_32KHZ = (2<<9);
92 const unsigned short ETX_24KHZ = (3<<9);
93 const unsigned short ETX_22KHZ = (4<<9);
94 const unsigned short ETX_16KHZ = (5<<9);
95 const unsigned short ETX_11KHZ = (6<<9);
96 const unsigned short ETX_8KHZ = (7<<9);
97 // able to express up to 512 SPP
98 //inline unsigned short ETX_SPP(const unsigned short a) { (a&0x01FF); }
99 
102 {
103  // watch out for alignment -- need to be on 4 byte chunks
107 };
108 
109 
110 
111 //#######################################################################
112 //####################### PacketHeader ##################################
113 //#######################################################################
117 class PacketHeader : public QObject
118 {
119  Q_OBJECT;
120 
121 public:
123  PacketHeader(JackTrip* jacktrip);
125  virtual ~PacketHeader() {}
126 
129  static uint64_t usecTime();
132  virtual void fillHeaderCommonFromAudio() = 0;
135  virtual void parseHeader() = 0;
136  virtual void checkPeerSettings(int8_t* full_packet) = 0;
137 
138  virtual uint64_t getPeerTimeStamp(int8_t* full_packet) const = 0;
139  virtual uint16_t getPeerSequenceNumber(int8_t* full_packet) const = 0;
140  virtual uint16_t getPeerBufferSize(int8_t* full_packet) const = 0;
141  virtual uint8_t getPeerSamplingRate(int8_t* full_packet) const = 0;
142  virtual uint8_t getPeerBitResolution(int8_t* full_packet) const = 0;
143  virtual uint8_t getPeerNumChannels(int8_t* full_packet) const = 0;
144  virtual uint8_t getPeerConnectionMode(int8_t* full_packet) const = 0;
145 
147  virtual void increaseSequenceNumber()
148  { mSeqNumber++; }
151  virtual uint16_t getSequenceNumber() const
152  { return mSeqNumber; }
154  virtual int getHeaderSizeInBytes() const = 0;
155  virtual void putHeaderInPacketBaseClass(int8_t* full_packet,
156  const HeaderStruct& header_struct)
157  {
158  std::memcpy(full_packet, reinterpret_cast<const void*>(&header_struct),
160  }
164  virtual void putHeaderInPacket(int8_t* full_packet) = 0;
165 
166 
167 signals:
168  void signalError(const char* error_message);
169 
170 
171 private:
172  uint16_t mSeqNumber;
173  JackTrip* mJackTrip;
174 };
175 
176 
177 
178 
179 //#######################################################################
180 //####################### DefaultHeader #################################
181 //#######################################################################
185 {
186 public:
187 
188  DefaultHeader(JackTrip* jacktrip);
189  virtual ~DefaultHeader() {}
190 
191  virtual void fillHeaderCommonFromAudio();
192  virtual void parseHeader() {}
193  virtual void checkPeerSettings(int8_t* full_packet);
194  virtual void increaseSequenceNumber()
195  { mHeader.SeqNumber++; }
196  virtual uint16_t getSequenceNumber() const
197  { return mHeader.SeqNumber; }
198  virtual int getHeaderSizeInBytes() const { return sizeof(mHeader); }
199  virtual void putHeaderInPacket(int8_t* full_packet)
200  { putHeaderInPacketBaseClass(full_packet, mHeader); }
201  void printHeader() const;
203  { return mHeader.ConnectionMode; }
205  { return mHeader.NumChannels; }
206 
207 
208  virtual uint64_t getPeerTimeStamp(int8_t* full_packet) const;
209  virtual uint16_t getPeerSequenceNumber(int8_t* full_packet) const;
210  virtual uint16_t getPeerBufferSize(int8_t* full_packet) const;
211  virtual uint8_t getPeerSamplingRate(int8_t* full_packet) const;
212  virtual uint8_t getPeerBitResolution(int8_t* full_packet) const;
213  virtual uint8_t getPeerNumChannels(int8_t* full_packet) const;
214  virtual uint8_t getPeerConnectionMode(int8_t* full_packet) const;
215 
216 
217 private:
218  DefaultHeaderStruct mHeader;
219  JackTrip* mJackTrip;
220 };
221 
222 
223 
224 
225 //#######################################################################
226 //####################### JamLinkHeader #################################
227 //#######################################################################
228 
232 {
233 public:
234 
235  JamLinkHeader(JackTrip* jacktrip);
236  virtual ~JamLinkHeader() {}
237 
238  virtual void fillHeaderCommonFromAudio();
239  virtual void parseHeader() {}
240  virtual void checkPeerSettings(int8_t* /*full_packet*/) {}
241 
242  virtual uint64_t getPeerTimeStamp(int8_t* /*full_packet*/) const { return 0; }
243  virtual uint16_t getPeerSequenceNumber(int8_t* /*full_packet*/) const { return 0; }
244  virtual uint16_t getPeerBufferSize(int8_t* /*full_packet*/) const { return 0; }
245  virtual uint8_t getPeerSamplingRate(int8_t* /*full_packet*/) const { return 0; }
246  virtual uint8_t getPeerBitResolution(int8_t* /*full_packet*/) const { return 0; }
247  virtual uint8_t getPeerNumChannels(int8_t* /*full_packet*/) const { return 0; }
248  virtual uint8_t getPeerConnectionMode(int8_t* /*full_packet*/) const { return 0; }
249 
250  virtual void increaseSequenceNumber() {}
251  virtual int getHeaderSizeInBytes() const { return sizeof(mHeader); }
252  virtual void putHeaderInPacket(int8_t* full_packet)
253  { putHeaderInPacketBaseClass(full_packet, mHeader); }
254 
255 private:
256  JamLinkHeaderStuct mHeader;
257  JackTrip* mJackTrip;
258 };
259 
260 
261 
262 //#######################################################################
263 //####################### EmptyHeader #################################
264 //#######################################################################
265 
268 class EmptyHeader : public PacketHeader
269 {
270 public:
271 
272  EmptyHeader(JackTrip* jacktrip);
273  virtual ~EmptyHeader() {}
274 
275  virtual void fillHeaderCommonFromAudio() {}
276  virtual void parseHeader() {}
277  virtual void checkPeerSettings(int8_t* /*full_packet*/) {}
278  virtual void increaseSequenceNumber() {}
279  virtual int getHeaderSizeInBytes() const { return 0; }
280 
281  virtual uint64_t getPeerTimeStamp(int8_t* /*full_packet*/) const { return 0; }
282  virtual uint16_t getPeerSequenceNumber(int8_t* /*full_packet*/) const { return 0; }
283  virtual uint16_t getPeerBufferSize(int8_t* /*full_packet*/) const { return 0; }
284  virtual uint8_t getPeerSamplingRate(int8_t* /*full_packet*/) const { return 0; }
285  virtual uint8_t getPeerBitResolution(int8_t* /*full_packet*/) const { return 0; }
286  virtual uint8_t getPeerNumChannels(int8_t* /*full_packet*/) const { return 0; }
287  virtual uint8_t getPeerConnectionMode(int8_t* /*full_packet*/) const { return 0; }
288 
289  virtual void putHeaderInPacket(int8_t* /*full_packet*/) {}
290 
291 private:
292  JackTrip* mJackTrip;
293 };
294 
295 
296 #endif //__PACKETHEADER_H__
DefaultHeader::increaseSequenceNumber
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:194
EmptyHeader::parseHeader
virtual void parseHeader()
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
Definition: PacketHeader.h:276
DefaultHeader::fillHeaderCommonFromAudio
virtual void fillHeaderCommonFromAudio()
Definition: PacketHeader.cpp:113
DefaultHeader::printHeader
void printHeader() const
Definition: PacketHeader.cpp:182
PacketHeader::PacketHeader
PacketHeader(JackTrip *jacktrip)
The class Constructor.
Definition: PacketHeader.cpp:76
uint8_t
quint8 uint8_t
Typedef for unsigned char. This type is guaranteed to be 8-bit.
Definition: jacktrip_types.h:69
DefaultHeaderStruct::SeqNumber
uint16_t SeqNumber
Sequence Number.
Definition: PacketHeader.h:62
DefaultHeader::getPeerBitResolution
virtual uint8_t getPeerBitResolution(int8_t *full_packet) const
Definition: PacketHeader.cpp:241
uint16_t
quint16 uint16_t
Typedef for unsigned short. This type is guaranteed to be 16-bit.
Definition: jacktrip_types.h:71
PacketHeader::getSequenceNumber
virtual uint16_t getSequenceNumber() const
Returns the current sequence number.
Definition: PacketHeader.h:151
PacketHeader::~PacketHeader
virtual ~PacketHeader()
The class Destructor.
Definition: PacketHeader.h:125
EmptyHeader::EmptyHeader
EmptyHeader(JackTrip *jacktrip)
Definition: PacketHeader.cpp:348
JackTrip
Main class to creates a SERVER (to listen) or a CLIENT (to connect to a listening server) to send aud...
Definition: JackTrip.h:68
int8_t
qint8 int8_t
Typedef for unsigned long long int. This type is guaranteed to be 64-bit.
Definition: jacktrip_types.h:78
ETX_MONO
const unsigned short ETX_MONO
Definition: PacketHeader.h:86
DefaultHeader::getPeerBufferSize
virtual uint16_t getPeerBufferSize(int8_t *full_packet) const
Definition: PacketHeader.cpp:223
ETX_XTND
const unsigned short ETX_XTND
Definition: PacketHeader.h:84
DefaultHeader::getHeaderSizeInBytes
virtual int getHeaderSizeInBytes() const
Get the header size in bytes.
Definition: PacketHeader.h:198
DefaultHeader::parseHeader
virtual void parseHeader()
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
Definition: PacketHeader.h:192
EmptyHeader::increaseSequenceNumber
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:278
ETX_22KHZ
const unsigned short ETX_22KHZ
Definition: PacketHeader.h:93
EmptyHeader
Empty Header to use with systems that don't include a header.
Definition: PacketHeader.h:269
DefaultHeaderStruct::ConnectionMode
uint8_t ConnectionMode
Definition: PacketHeader.h:69
EmptyHeader::getPeerBitResolution
virtual uint8_t getPeerBitResolution(int8_t *) const
Definition: PacketHeader.h:285
DefaultHeaderStruct::BufferSize
uint16_t BufferSize
Buffer Size in Samples.
Definition: PacketHeader.h:63
PacketHeader::usecTime
static uint64_t usecTime()
Return a time stamp in microseconds.
Definition: PacketHeader.cpp:82
EmptyHeader::checkPeerSettings
virtual void checkPeerSettings(int8_t *)
Definition: PacketHeader.h:277
DefaultHeaderStruct
Default Header Struct.
Definition: PacketHeader.h:58
EmptyHeader::getPeerNumChannels
virtual uint8_t getPeerNumChannels(int8_t *) const
Definition: PacketHeader.h:286
ETX_8KHZ
const unsigned short ETX_8KHZ
Definition: PacketHeader.h:96
EmptyHeader::~EmptyHeader
virtual ~EmptyHeader()
Definition: PacketHeader.h:273
ETX_48KHZ
const unsigned short ETX_48KHZ
Definition: PacketHeader.h:89
EmptyHeader::getPeerTimeStamp
virtual uint64_t getPeerTimeStamp(int8_t *) const
Definition: PacketHeader.h:281
DefaultHeader::getPeerNumChannels
virtual uint8_t getPeerNumChannels(int8_t *full_packet) const
Definition: PacketHeader.cpp:250
DefaultHeader::getPeerSequenceNumber
virtual uint16_t getPeerSequenceNumber(int8_t *full_packet) const
Definition: PacketHeader.cpp:214
EmptyHeader::getPeerBufferSize
virtual uint16_t getPeerBufferSize(int8_t *) const
Definition: PacketHeader.h:283
ETX_44KHZ
const unsigned short ETX_44KHZ
Definition: PacketHeader.h:90
DefaultHeader::putHeaderInPacket
virtual void putHeaderInPacket(int8_t *full_packet)
Put the header in buffer pointed by full_packet.
Definition: PacketHeader.h:199
ETX_11KHZ
const unsigned short ETX_11KHZ
Definition: PacketHeader.h:95
PacketHeader::putHeaderInPacketBaseClass
virtual void putHeaderInPacketBaseClass(int8_t *full_packet, const HeaderStruct &header_struct)
Definition: PacketHeader.h:155
PacketHeader::signalError
void signalError(const char *error_message)
EmptyHeader::getHeaderSizeInBytes
virtual int getHeaderSizeInBytes() const
Get the header size in bytes.
Definition: PacketHeader.h:279
EmptyHeader::getPeerSamplingRate
virtual uint8_t getPeerSamplingRate(int8_t *) const
Definition: PacketHeader.h:284
DefaultHeader::getPeerSamplingRate
virtual uint8_t getPeerSamplingRate(int8_t *full_packet) const
Definition: PacketHeader.cpp:232
PacketHeader::getHeaderSizeInBytes
virtual int getHeaderSizeInBytes() const =0
Get the header size in bytes.
uint32_t
quint32 uint32_t
Typedef for unsigned int. This type is guaranteed to be 32-bit.
Definition: jacktrip_types.h:73
EmptyHeader::getPeerConnectionMode
virtual uint8_t getPeerConnectionMode(int8_t *) const
Definition: PacketHeader.h:287
DefaultHeader::~DefaultHeader
virtual ~DefaultHeader()
Definition: PacketHeader.h:189
ETX_STEREO
const unsigned short ETX_STEREO
Definition: PacketHeader.h:85
PacketHeader::fillHeaderCommonFromAudio
virtual void fillHeaderCommonFromAudio()=0
DefaultHeader
Default Header.
Definition: PacketHeader.h:185
DefaultHeaderStruct::BitResolution
uint8_t BitResolution
Audio Bit Resolution.
Definition: PacketHeader.h:65
jacktrip_globals.h
PacketHeader::getPeerBufferSize
virtual uint16_t getPeerBufferSize(int8_t *full_packet) const =0
PacketHeader::getPeerTimeStamp
virtual uint64_t getPeerTimeStamp(int8_t *full_packet) const =0
EmptyHeader::putHeaderInPacket
virtual void putHeaderInPacket(int8_t *)
Put the header in buffer pointed by full_packet.
Definition: PacketHeader.h:289
DefaultHeader::getConnectionMode
uint8_t getConnectionMode() const
Definition: PacketHeader.h:202
DefaultHeaderStruct::SamplingRate
uint8_t SamplingRate
Sampling Rate in JackAudioInterface::samplingRateT.
Definition: PacketHeader.h:64
EmptyHeader::getPeerSequenceNumber
virtual uint16_t getPeerSequenceNumber(int8_t *) const
Definition: PacketHeader.h:282
PacketHeader::getPeerNumChannels
virtual uint8_t getPeerNumChannels(int8_t *full_packet) const =0
PacketHeader::getPeerConnectionMode
virtual uint8_t getPeerConnectionMode(int8_t *full_packet) const =0
PacketHeader::getPeerBitResolution
virtual uint8_t getPeerBitResolution(int8_t *full_packet) const =0
DefaultHeader::getPeerConnectionMode
virtual uint8_t getPeerConnectionMode(int8_t *full_packet) const
Definition: PacketHeader.cpp:259
DefaultHeader::getNumChannels
uint8_t getNumChannels() const
Definition: PacketHeader.h:204
ETX_32KHZ
const unsigned short ETX_32KHZ
Definition: PacketHeader.h:91
ETX_24KHZ
const unsigned short ETX_24KHZ
Definition: PacketHeader.h:92
PacketHeader
Base class for header type. Subclass this struct to create a new header.
Definition: PacketHeader.h:118
DefaultHeader::checkPeerSettings
virtual void checkPeerSettings(int8_t *full_packet)
Definition: PacketHeader.cpp:126
HeaderStruct
Abstract Header Struct, Header Stucts should subclass it.
Definition: PacketHeader.h:54
DefaultHeader::DefaultHeader
DefaultHeader(JackTrip *jacktrip)
Definition: PacketHeader.cpp:97
jacktrip_types.h
PacketHeader::increaseSequenceNumber
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:147
PacketHeader::parseHeader
virtual void parseHeader()=0
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
PacketHeader::getPeerSamplingRate
virtual uint8_t getPeerSamplingRate(int8_t *full_packet) const =0
ETX_16KHZ
const unsigned short ETX_16KHZ
Definition: PacketHeader.h:94
DefaultHeaderStruct::NumChannels
uint8_t NumChannels
Number of Channels, we assume input and outputs are the same.
Definition: PacketHeader.h:68
ETX_16BIT
const unsigned short ETX_16BIT
Definition: PacketHeader.h:87
ETX_RSVD
const unsigned short ETX_RSVD
Definition: PacketHeader.h:83
DefaultHeaderStruct::TimeStamp
uint64_t TimeStamp
Time Stamp.
Definition: PacketHeader.h:61
PacketHeader::getPeerSequenceNumber
virtual uint16_t getPeerSequenceNumber(int8_t *full_packet) const =0
DefaultHeader::getPeerTimeStamp
virtual uint64_t getPeerTimeStamp(int8_t *full_packet) const
Definition: PacketHeader.cpp:205
PacketHeader::checkPeerSettings
virtual void checkPeerSettings(int8_t *full_packet)=0
EmptyHeader::fillHeaderCommonFromAudio
virtual void fillHeaderCommonFromAudio()
Definition: PacketHeader.h:275
DefaultHeader::getSequenceNumber
virtual uint16_t getSequenceNumber() const
Returns the current sequence number.
Definition: PacketHeader.h:196
PacketHeader::putHeaderInPacket
virtual void putHeaderInPacket(int8_t *full_packet)=0
Put the header in buffer pointed by full_packet.