JackTrip
Main Page
Related Pages
Classes
Files
File List
File Members
src
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 "
jacktrip_types.h
"
46
#include "
jacktrip_globals.h
"
47
class
JackTrip
;
// Forward Declaration
48
49
51
struct
HeaderStruct
{};
52
54
struct
DefaultHeaderStruct
:
public
HeaderStruct
55
{
56
public
:
57
// watch out for alignment...
58
uint64_t
TimeStamp
;
59
uint16_t
SeqNumber
;
60
uint16_t
BufferSize
;
61
uint8_t
SamplingRate
;
62
uint8_t
BitResolution
;
63
uint8_t
NumInChannels
;
64
uint8_t
NumOutChannels
;
65
//uint8_t Dummy; ///< Dummy value to byte padding alignment
66
};
67
68
//---------------------------------------------------------
69
//JamLink UDP Header:
70
/************************************************************************/
71
/* values for the UDP stream type */
72
/* streamType is a 16-bit value at the head of each UDP stream */
73
/* Its bit map is as follows: (b15-msb) */
74
/* B15:reserved, B14:extended header, B13 Stereo, B12 not 16-bit */
75
/* B11-B9: 0-48 Khz, 1-44 Khz, 2-32 Khz, 3-24 Khz, */
76
/* 4-22 Khz, 5-16 Khz, 6-11 Khz, 7-8 Khz */
77
/* B8-0: Samples in packet */
78
/************************************************************************/
79
const
unsigned
short
ETX_RSVD
= (0<<15);
80
const
unsigned
short
ETX_XTND
= (1<<14);
81
const
unsigned
short
ETX_STEREO
= (1<<13);
82
const
unsigned
short
ETX_MONO
= (0<<13);
83
const
unsigned
short
ETX_16BIT
= (0<<12);
84
//inline unsigned short ETX_RATE_MASK(const unsigned short a) { a&(0x7<<9); }
85
const
unsigned
short
ETX_48KHZ
= (0<<9);
86
const
unsigned
short
ETX_44KHZ
= (1<<9);
87
const
unsigned
short
ETX_32KHZ
= (2<<9);
88
const
unsigned
short
ETX_24KHZ
= (3<<9);
89
const
unsigned
short
ETX_22KHZ
= (4<<9);
90
const
unsigned
short
ETX_16KHZ
= (5<<9);
91
const
unsigned
short
ETX_11KHZ
= (6<<9);
92
const
unsigned
short
ETX_8KHZ
= (7<<9);
93
// able to express up to 512 SPP
94
//inline unsigned short ETX_SPP(const unsigned short a) { (a&0x01FF); }
95
97
struct
JamLinkHeaderStuct
:
public
HeaderStruct
98
{
99
// watch out for alignment -- need to be on 4 byte chunks
100
uint16_t
Common
;
101
uint16_t
SeqNumber
;
102
uint32_t
TimeStamp
;
103
};
104
105
106
//#######################################################################
107
//####################### PacketHeader ##################################
108
//#######################################################################
112
class
PacketHeader
113
{
114
public
:
116
PacketHeader
(
JackTrip
* jacktrip);
118
virtual
~PacketHeader
() {};
119
123
static
uint64_t
usecTime
();
124
127
virtual
void
fillHeaderCommonFromAudio
() = 0;
128
129
/* \brief Parse the packet header and take appropriate measures (like change settings, or
130
* quit the program if peer settings don't match)
131
*/
132
virtual
void
parseHeader
() = 0;
133
134
virtual
void
checkPeerSettings
(
int8_t
* full_packet) = 0;
135
virtual
uint16_t
getPeerSequenceNumber
(
int8_t
* full_packet)
const
= 0;
136
137
/* \brief Increase sequence number for counter, a 16bit number
138
*/
139
virtual
void
increaseSequenceNumber
()
140
{
141
mSeqNumber
++;
142
};
143
144
/* \brief Returns the current sequence number
145
* \return 16bit Sequence number
146
*/
147
virtual
uint16_t
getSequenceNumber
()
const
148
{
149
return
mSeqNumber
;
150
}
151
152
/* \brief Get the header size in bytes
153
*/
154
virtual
int
getHeaderSizeInBytes
()
const
= 0;
155
156
157
virtual
void
putHeaderInPacketBaseClass
(
int8_t
* full_packet,
158
const
HeaderStruct
& header_struct)
159
{
160
std::memcpy(full_packet, reinterpret_cast<const void*>(&header_struct),
161
getHeaderSizeInBytes
() );
162
};
163
164
/* \brief Put the header in buffer pointed by full_packet
165
* \param full_packet Pointer to full packet (audio+header). Size must be
166
* sizeof(header part) + sizeof(audio part)
167
*/
168
virtual
void
putHeaderInPacket
(
int8_t
* full_packet) = 0;
169
170
private
:
171
uint16_t
mSeqNumber
;
172
JackTrip
*
mJackTrip
;
173
};
174
175
176
177
178
//#######################################################################
179
//####################### DefaultHeader #################################
180
//#######################################################################
183
class
DefaultHeader
:
public
PacketHeader
184
{
185
public
:
186
/*
187
//----------STRUCT-----------------------------------------
189
struct DefaultHeaderStruct
190
{
191
// watch out for alignment...
192
uint64_t TimeStamp; ///< Time Stamp
193
uint16_t SeqNumber; ///< Sequence Number
194
uint16_t BufferSize; ///< Buffer Size in Samples
195
uint8_t SamplingRate; ///< Sampling Rate in JackAudioInterface::samplingRateT
196
uint8_t NumInChannels; ///< Number of Input Channels
197
uint8_t NumOutChannels; ///< Number of Output Channels
198
// uint8_t BitResolution; ///< \todo implement this part
199
};
200
//---------------------------------------------------------
201
*/
202
DefaultHeader
(
JackTrip
* jacktrip);
203
virtual
~DefaultHeader
() {};
204
virtual
void
fillHeaderCommonFromAudio
();
205
virtual
void
parseHeader
() {};
206
virtual
void
checkPeerSettings
(
int8_t
* full_packet);
207
virtual
void
increaseSequenceNumber
()
208
{
209
mHeader
.
SeqNumber
++;
210
//std::cout << "Sequence Number = " << static_cast<int>(mHeader.SeqNumber) << std::endl;
211
};
212
virtual
uint16_t
getSequenceNumber
()
const
213
{
214
return
mHeader
.
SeqNumber
;
215
}
216
virtual
uint16_t
getPeerSequenceNumber
(
int8_t
* full_packet)
const
;
217
virtual
int
getHeaderSizeInBytes
()
const
{
return
sizeof
(
mHeader
); };
218
virtual
void
putHeaderInPacket
(
int8_t
* full_packet)
219
{
220
putHeaderInPacketBaseClass
(full_packet,
mHeader
);
221
//std::memcpy(full_packet, reinterpret_cast<const void*>(&mHeader),
222
// getHeaderSizeInBytes() );
223
};
224
void
printHeader
()
const
;
225
226
private
:
227
//DefaultHeaderStruct mHeader; ///< Header Struct
228
DefaultHeaderStruct
mHeader
;
229
JackTrip
*
mJackTrip
;
230
};
231
232
233
234
235
//#######################################################################
236
//####################### JamLinkHeader #################################
237
//#######################################################################
238
241
class
JamLinkHeader
:
public
PacketHeader
242
{
243
public
:
244
245
JamLinkHeader
(
JackTrip
* jacktrip);
246
virtual
~JamLinkHeader
() {};
247
248
virtual
void
fillHeaderCommonFromAudio
();
249
virtual
void
parseHeader
() {};
250
virtual
void
checkPeerSettings
(
int8_t
*
/*full_packet*/
) {}
251
virtual
uint16_t
getPeerSequenceNumber
(
int8_t
*
/*full_packet*/
)
const
{
/*\todo IMPLEMENT*/
return
0; }
252
virtual
void
increaseSequenceNumber
() {};
253
virtual
int
getHeaderSizeInBytes
()
const
{
return
sizeof
(
mHeader
); };
254
virtual
void
putHeaderInPacket
(
int8_t
* full_packet)
255
{
256
putHeaderInPacketBaseClass
(full_packet,
mHeader
);
257
};
258
259
private
:
260
JamLinkHeaderStuct
mHeader
;
261
JackTrip
*
mJackTrip
;
262
};
263
264
265
266
//#######################################################################
267
//####################### EmptyHeader #################################
268
//#######################################################################
269
272
class
EmptyHeader
:
public
PacketHeader
273
{
274
public
:
275
276
EmptyHeader
(
JackTrip
* jacktrip);
277
virtual
~EmptyHeader
() {};
278
279
virtual
void
fillHeaderCommonFromAudio
() {};
280
virtual
void
parseHeader
() {};
281
virtual
void
checkPeerSettings
(
int8_t
*
/*full_packet*/
) {}
282
virtual
uint16_t
getPeerSequenceNumber
(
int8_t
*
/*full_packet*/
)
const
{
return
0;
/*\todo IMPLEMENT*/
}
283
virtual
void
increaseSequenceNumber
() {};
284
virtual
int
getHeaderSizeInBytes
()
const
{
return
0; };
285
virtual
void
putHeaderInPacket
(
int8_t
*
/*full_packet*/
) {};
286
287
private
:
288
JackTrip
*
mJackTrip
;
289
};
290
291
292
#endif //__PACKETHEADER_H__