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"
50class JackTrip; // Forward Declaration
51
52
54struct HeaderStruct{};
55
58{
59public:
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/************************************************************************/
83const unsigned short ETX_RSVD = (0<<15);
84const unsigned short ETX_XTND = (1<<14);
85const unsigned short ETX_STEREO = (1<<13);
86const unsigned short ETX_MONO = (0<<13);
87const unsigned short ETX_16BIT = (0<<12);
88//inline unsigned short ETX_RATE_MASK(const unsigned short a) { a&(0x7<<9); }
89const unsigned short ETX_48KHZ = (0<<9);
90const unsigned short ETX_44KHZ = (1<<9);
91const unsigned short ETX_32KHZ = (2<<9);
92const unsigned short ETX_24KHZ = (3<<9);
93const unsigned short ETX_22KHZ = (4<<9);
94const unsigned short ETX_16KHZ = (5<<9);
95const unsigned short ETX_11KHZ = (6<<9);
96const 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//#######################################################################
117class PacketHeader : public QObject
118{
119 Q_OBJECT;
120
121public:
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
148 { mSeqNumber++; }
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
167signals:
168 void signalError(const QString &error_message);
169
170
171private:
172 uint16_t mSeqNumber;
173 JackTrip* mJackTrip;
174};
175
176
177
178
179//#######################################################################
180//####################### DefaultHeader #################################
181//#######################################################################
185{
186public:
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);
195 { mHeader.SeqNumber++; }
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
217private:
218 DefaultHeaderStruct mHeader;
219 JackTrip* mJackTrip;
220};
221
222
223
224
225//#######################################################################
226//####################### JamLinkHeader #################################
227//#######################################################################
228
232{
233public:
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
255private:
256 JamLinkHeaderStuct mHeader;
257 JackTrip* mJackTrip;
258};
259
260
261
262//#######################################################################
263//####################### EmptyHeader #################################
264//#######################################################################
265
269{
270public:
271
272 EmptyHeader(JackTrip* jacktrip);
273 virtual ~EmptyHeader() {}
274
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
291private:
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
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
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
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