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