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 "jacktrip_types.h"
46 #include "jacktrip_globals.h"
47 class JackTrip; // Forward Declaration
48 
49 
51 struct HeaderStruct{};
52 
55 {
56 public:
57  // watch out for alignment...
58  uint64_t TimeStamp;
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 
98 {
99  // watch out for alignment -- need to be on 4 byte chunks
103 };
104 
105 
106 //#######################################################################
107 //####################### PacketHeader ##################################
108 //#######################################################################
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),
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:
173 };
174 
175 
176 
177 
178 //#######################################################################
179 //####################### DefaultHeader #################################
180 //#######################################################################
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
230 };
231 
232 
233 
234 
235 //#######################################################################
236 //####################### JamLinkHeader #################################
237 //#######################################################################
238 
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:
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:
289 };
290 
291 
292 #endif //__PACKETHEADER_H__