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__
virtual void checkPeerSettings(int8_t *full_packet)=0
PacketHeader(JackTrip *jacktrip)
The class Constructor.
Definition: PacketHeader.cpp:76
uint8_t getNumChannels() const
Definition: PacketHeader.h:204
uint16_t SeqNumber
Sequence Number.
Definition: PacketHeader.h:62
const unsigned short ETX_MONO
Definition: PacketHeader.h:86
const unsigned short ETX_8KHZ
Definition: PacketHeader.h:96
virtual uint16_t getPeerSequenceNumber(int8_t *full_packet) const =0
virtual uint8_t getPeerBitResolution(int8_t *full_packet) const =0
uint8_t getConnectionMode() const
Definition: PacketHeader.h:202
void signalError(const char *error_message)
Definition: moc_PacketHeader.cpp:123
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:194
virtual uint16_t getSequenceNumber() const
Returns the current sequence number.
Definition: PacketHeader.h:196
virtual uint8_t getPeerNumChannels(int8_t *full_packet) const =0
virtual uint16_t getPeerBufferSize(int8_t *full_packet) const
Definition: PacketHeader.cpp:223
virtual ~PacketHeader()
The class Destructor.
Definition: PacketHeader.h:125
virtual void putHeaderInPacket(int8_t *full_packet)=0
Put the header in buffer pointed by full_packet.
quint32 uint32_t
Typedef for unsigned int. This type is guaranteed to be 32-bit.
Definition: jacktrip_types.h:73
virtual uint64_t getPeerTimeStamp(int8_t *full_packet) const =0
uint16_t BufferSize
Buffer Size in Samples.
Definition: PacketHeader.h:63
EmptyHeader(JackTrip *jacktrip)
Definition: PacketHeader.cpp:348
virtual uint8_t getPeerBitResolution(int8_t *full_packet) const
Definition: PacketHeader.cpp:241
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:278
virtual void fillHeaderCommonFromAudio()
Definition: PacketHeader.h:275
virtual void fillHeaderCommonFromAudio()=0
virtual void parseHeader()
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
Definition: PacketHeader.h:192
virtual uint8_t getPeerSamplingRate(int8_t *) const
Definition: PacketHeader.h:284
virtual void checkPeerSettings(int8_t *full_packet)
Definition: PacketHeader.cpp:126
virtual int getHeaderSizeInBytes() const
Get the header size in bytes.
Definition: PacketHeader.h:279
Base class for header type. Subclass this struct to create a new header.
Definition: PacketHeader.h:117
DefaultHeader(JackTrip *jacktrip)
Definition: PacketHeader.cpp:97
virtual int getHeaderSizeInBytes() const =0
Get the header size in bytes.
Default Header Struct.
Definition: PacketHeader.h:57
virtual uint64_t getPeerTimeStamp(int8_t *) const
Definition: PacketHeader.h:281
uint8_t ConnectionMode
Definition: PacketHeader.h:69
virtual ~DefaultHeader()
Definition: PacketHeader.h:189
virtual void putHeaderInPacketBaseClass(int8_t *full_packet, const HeaderStruct &header_struct)
Definition: PacketHeader.h:155
static uint64_t usecTime()
Return a time stamp in microseconds.
Definition: PacketHeader.cpp:82
virtual int getHeaderSizeInBytes() const
Get the header size in bytes.
Definition: PacketHeader.h:198
const unsigned short ETX_11KHZ
Definition: PacketHeader.h:95
virtual void putHeaderInPacket(int8_t *)
Put the header in buffer pointed by full_packet.
Definition: PacketHeader.h:289
qint8 int8_t
Typedef for unsigned long long int. This type is guaranteed to be 64-bit.
Definition: jacktrip_types.h:78
const unsigned short ETX_22KHZ
Definition: PacketHeader.h:93
virtual uint16_t getPeerBufferSize(int8_t *full_packet) const =0
virtual uint8_t getPeerConnectionMode(int8_t *full_packet) const
Definition: PacketHeader.cpp:259
const unsigned short ETX_16BIT
Definition: PacketHeader.h:87
Empty Header to use with systems that don't include a header.
Definition: PacketHeader.h:268
virtual uint8_t getPeerSamplingRate(int8_t *full_packet) const
Definition: PacketHeader.cpp:232
void printHeader() const
Definition: PacketHeader.cpp:182
const unsigned short ETX_RSVD
Definition: PacketHeader.h:83
const unsigned short ETX_48KHZ
Definition: PacketHeader.h:89
virtual void checkPeerSettings(int8_t *)
Definition: PacketHeader.h:277
virtual uint16_t getPeerSequenceNumber(int8_t *) const
Definition: PacketHeader.h:282
virtual uint8_t getPeerNumChannels(int8_t *full_packet) const
Definition: PacketHeader.cpp:250
const unsigned short ETX_44KHZ
Definition: PacketHeader.h:90
virtual void fillHeaderCommonFromAudio()
Definition: PacketHeader.cpp:113
virtual uint8_t getPeerNumChannels(int8_t *) const
Definition: PacketHeader.h:286
virtual uint8_t getPeerConnectionMode(int8_t *) const
Definition: PacketHeader.h:287
virtual uint16_t getPeerSequenceNumber(int8_t *full_packet) const
Definition: PacketHeader.cpp:214
virtual uint64_t getPeerTimeStamp(int8_t *full_packet) const
Definition: PacketHeader.cpp:205
uint8_t BitResolution
Audio Bit Resolution.
Definition: PacketHeader.h:65
virtual void parseHeader()=0
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
Default Header.
Definition: PacketHeader.h:184
virtual uint8_t getPeerConnectionMode(int8_t *full_packet) const =0
Abstract Header Struct, Header Stucts should subclass it.
Definition: PacketHeader.h:54
const unsigned short ETX_STEREO
Definition: PacketHeader.h:85
Main class to creates a SERVER (to listen) or a CLIENT (to connect to a listening server) to send aud...
Definition: JackTrip.h:67
uint8_t SamplingRate
Sampling Rate in JackAudioInterface::samplingRateT.
Definition: PacketHeader.h:64
virtual void putHeaderInPacket(int8_t *full_packet)
Put the header in buffer pointed by full_packet.
Definition: PacketHeader.h:199
const unsigned short ETX_16KHZ
Definition: PacketHeader.h:94
virtual uint8_t getPeerBitResolution(int8_t *) const
Definition: PacketHeader.h:285
virtual ~EmptyHeader()
Definition: PacketHeader.h:273
const unsigned short ETX_XTND
Definition: PacketHeader.h:84
virtual void increaseSequenceNumber()
Increase sequence number for counter, a 16bit number.
Definition: PacketHeader.h:147
virtual uint16_t getPeerBufferSize(int8_t *) const
Definition: PacketHeader.h:283
virtual void parseHeader()
Parse the packet header and take appropriate measures (like change settings, or quit the program if p...
Definition: PacketHeader.h:276
quint16 uint16_t
Typedef for unsigned short. This type is guaranteed to be 16-bit.
Definition: jacktrip_types.h:71
uint8_t NumChannels
Number of Channels, we assume input and outputs are the same.
Definition: PacketHeader.h:68
const unsigned short ETX_32KHZ
Definition: PacketHeader.h:91
virtual uint8_t getPeerSamplingRate(int8_t *full_packet) const =0
uint64_t TimeStamp
Time Stamp.
Definition: PacketHeader.h:61
quint8 uint8_t
Typedef for unsigned char. This type is guaranteed to be 8-bit.
Definition: jacktrip_types.h:69
const unsigned short ETX_24KHZ
Definition: PacketHeader.h:92
virtual uint16_t getSequenceNumber() const
Returns the current sequence number.
Definition: PacketHeader.h:151