JackTrip
JackTrip.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 __JACKTRIP_H__
39 #define __JACKTRIP_H__
40 
41 #include <tr1/memory> //for shared_ptr
42 
43 #include <QObject>
44 #include <QString>
45 
46 #include "DataProtocol.h"
47 #include "JackAudioInterface.h"
48 #include "PacketHeader.h"
49 #include "RingBuffer.h"
50 
51 
59 class JackTrip : public QThread
60 {
61  Q_OBJECT;
62 
63 public:
64 
65  //----------ENUMS------------------------------------------
68  UDP,
69  TCP,
71  };
72 
78  };
79 
84  };
85  //---------------------------------------------------------
86 
87 
96  JackTrip(jacktripModeT JacktripMode = CLIENT,
97  dataProtocolT DataProtocolType = UDP,
98  int NumChans = 2,
99  int BufferQueueLength = 8,
100  unsigned int redundancy = 1,
101  JackAudioInterface::audioBitResolutionT AudioBitResolution =
103  DataProtocol::packetHeaderTypeT PacketHeaderType =
105  underrunModeT UnderRunMode = WAVETABLE,
106  int receiver_bind_port = gDefaultPort,
107  int sender_bind_port = gDefaultPort,
108  int receiver_peer_port = gDefaultPort,
109  int sender_peer_port = gDefaultPort);
110 
112  virtual ~JackTrip();
113 
115  void setPeerAddress(const char* PeerHostOrIP);
116 
120  //void appendProcessPlugin(const std::tr1::shared_ptr<ProcessPlugin> plugin);
121  void appendProcessPlugin(ProcessPlugin* plugin);
122 
124  void start();
125 
127  void stop();
128 
131  void wait();
132 
135  void checkIfPortIsBinded(int port);
136 
137  //------------------------------------------------------------------------------------
139 
140  //
142  void setJackTripMode(jacktripModeT JacktripMode)
143  { mJackTripMode = JacktripMode; }
145  void setDataProtocoType(dataProtocolT DataProtocolType)
146  { mDataProtocol = DataProtocolType; }
149  {
150  mPacketHeaderType = PacketHeaderType;
151  delete mPacketHeader;
152  mPacketHeader = NULL;
154  }
157  //void setNumChannels(int NumChans)
158  //{ mNumChans=NumChans; }
160  void setBufferQueueLength(int BufferQueueLength)
161  { mBufferQueueLength = BufferQueueLength; }
164  { mAudioBitResolution = AudioBitResolution; }
166  void setUnderRunMode(underrunModeT UnderRunMode)
167  { mUnderRunMode = UnderRunMode; }
170  void setAllPorts(int port)
171  {
172  mReceiverBindPort = port;
173  mSenderPeerPort = port;
174  mSenderBindPort = port;
175  mReceiverPeerPort = port;
176  }
178  void setBindPorts(int port)
179  {
180  mReceiverBindPort = port;
181  mSenderBindPort = port;
182  }
184  void setPeerPorts(int port)
185  {
186  mSenderPeerPort = port;
187  mReceiverPeerPort = port;
188  }
190  void setClientName(char* ClientName)
191  { mJackClientName = ClientName; }
193  //------------------------------------------------------------------------------------
194 
195 
196  //------------------------------------------------------------------------------------
198 
199  void createHeader(const DataProtocol::packetHeaderTypeT headertype);
201  void putHeaderInPacket(int8_t* full_packet, int8_t* audio_packet);
202  int getPacketSizeInBytes() const;
203  void parseAudioPacket(int8_t* full_packet, int8_t* audio_packet);
204  void sendNetworkPacket(const int8_t* ptrToSlot)
205  { mSendRingBuffer->insertSlotNonBlocking(ptrToSlot); }
206  void receiveNetworkPacket(int8_t* ptrToReadSlot)
207  { mReceiveRingBuffer->readSlotNonBlocking(ptrToReadSlot); }
208  void readAudioBuffer(int8_t* ptrToReadSlot)
209  { mSendRingBuffer->readSlotBlocking(ptrToReadSlot); }
210  void writeAudioBuffer(const int8_t* ptrToSlot)
213  { return mJackAudio->getBufferSizeInSamples(); }
215  { return mJackAudio->getSampleRateType(); }
217  { return mJackAudio->getAudioBitResolution(); }
219  { return mJackAudio->getNumInputChannels(); }
221  {return mJackAudio->getNumOutputChannels(); }
222  void checkPeerSettings(int8_t* full_packet);
225  int getSequenceNumber() const
226  { return mPacketHeader->getSequenceNumber(); }
227  int getPeerSequenceNumber(int8_t* full_packet) const
228  { return mPacketHeader->getPeerSequenceNumber(full_packet); }
230  //------------------------------------------------------------------------------------
231 
232 
233 public slots:
236  {
237  std::cout << "Stopping JackTrip..." << std::endl;
238  stop();
239  };
240 
246  void slotUdpWatingTooLong(int wait_msec)
247  {
248  int wait_time = 30000; // msec
249  if ( !(wait_msec%wait_time) ) {
250  std::cerr << "UDP WAITED MORE THAN 30 seconds." << std::endl;
252  }
253  }
254 
255 
256 signals:
258  void signalProcessesStopped();
261 
262 
263 private:
264 
266  void setupJackAudio();
268  void setupDataProtocol();
270  void setupRingBuffers();
272  void clientStart();
274  void serverStart();
277 
281 
282  int mNumChans;
287  QString mPeerAddress;
288 
296 
301 
306 
307  unsigned int mRedundancy;
308  const char* mJackClientName;
309 
310  QVector<ProcessPlugin*> mProcessPlugins;
311 };
312 
313 #endif
void sendNetworkPacket(const int8_t *ptrToSlot)
Definition: JackTrip.h:204
samplingRateT getSampleRateType() const
Get the Jack Server Sampling Rate Enum Type samplingRateT.
Definition: JackAudioInterface.cpp:211
int mReceiverPeerPort
Outgoing (sending) port for peer machine.
Definition: JackTrip.h:305
uint32_t getBufferSizeInSamples() const
Definition: JackTrip.h:212
Use UDP (User Datagram Protocol)
Definition: JackTrip.h:68
DataProtocol * mDataProtocolReceiver
Definition: JackTrip.h:292
JackTrip(jacktripModeT JacktripMode=CLIENT, dataProtocolT DataProtocolType=UDP, int NumChans=2, int BufferQueueLength=8, unsigned int redundancy=1, JackAudioInterface::audioBitResolutionT AudioBitResolution=JackAudioInterface::BIT16, DataProtocol::packetHeaderTypeT PacketHeaderType=DataProtocol::DEFAULT, underrunModeT UnderRunMode=WAVETABLE, int receiver_bind_port=gDefaultPort, int sender_bind_port=gDefaultPort, int receiver_peer_port=gDefaultPort, int sender_peer_port=gDefaultPort)
The class Constructor with Default Parameters.
Definition: JackTrip.cpp:56
void setDataProtocoType(dataProtocolT DataProtocolType)
Sets (override) DataProtocol Type after construction.
Definition: JackTrip.h:145
int getAudioBitResolution() const
Get the Audio Bit Resolution, in bits.
Definition: JackAudioInterface.cpp:284
void checkIfPortIsBinded(int port)
Check if UDP port is already binded.
Definition: JackTrip.cpp:454
void createHeader(const DataProtocol::packetHeaderTypeT headertype)
Definition: JackTrip.cpp:395
virtual uint16_t getPeerSequenceNumber(int8_t *full_packet) const =0
Loops on the last received packet.
Definition: JackTrip.h:82
void appendProcessPlugin(ProcessPlugin *plugin)
Append a process plugin. Processes will be appended in order.
Definition: JackTrip.cpp:194
void setAudioBitResolution(JackAudioInterface::audioBitResolutionT AudioBitResolution)
Sets (override) Audio Bit Resolution after construction.
Definition: JackTrip.h:163
void checkPeerSettings(int8_t *full_packet)
Definition: JackTrip.cpp:447
void start()
Start the processing threads.
Definition: JackTrip.cpp:202
int mSenderPeerPort
Incoming (receiving) port for peer machine.
Definition: JackTrip.h:303
int mBufferQueueLength
Audio Buffer from network queue length.
Definition: JackTrip.h:283
void serverStart()
Starts for the SERVER mode.
Definition: JackTrip.cpp:289
virtual ~JackTrip()
The class destructor.
Definition: JackTrip.cpp:91
void setupJackAudio()
Set the JackAudioInteface object.
Definition: JackTrip.cpp:103
DataProtocol::packetHeaderTypeT mPacketHeaderType
Packet Header Type.
Definition: JackTrip.h:280
void slotStopProcesses()
Slot to stop all the processes and threads.
Definition: JackTrip.h:235
void signalNoUdpPacketsForSeconds()
Signal emitted when no UDP Packets have been received for a while
Definition: moc_JackTrip.cpp:111
void setPeerAddress(const char *PeerHostOrIP)
Set the Peer Address for jacktripModeT::CLIENT mode only.
Definition: JackTrip.cpp:187
int getPacketSizeInBytes() const
Definition: JackTrip.cpp:428
PacketHeader * mPacketHeader
Pointer to Packet Header.
Definition: JackTrip.h:294
Class that provides an interface with the Jack Audio Server.
Definition: JackAudioInterface.h:63
uint32_t mAudioBufferSize
Audio buffer size to process on each callback.
Definition: JackTrip.h:285
underrunModeT
Enum for the JackTrip Underrun Mode, when packets.
Definition: JackTrip.h:81
void increaseSequenceNumber()
Definition: JackTrip.h:223
dataProtocolT mDataProtocol
Data Protocol Tipe.
Definition: JackTrip.h:279
quint32 uint32_t
Typedef for unsigned int. This type is guaranteed to be 32-bit.
Definition: jacktrip_types.h:69
jacktripModeT mJackTripMode
JackTrip::jacktripModeT.
Definition: JackTrip.h:278
void setUnderRunMode(underrunModeT UnderRunMode)
Sets (override) Underrun Mode.
Definition: JackTrip.h:166
const char * mJackClientName
JackAudio Client Name.
Definition: JackTrip.h:308
packetHeaderTypeT
Enum to define packet header types.
Definition: DataProtocol.h:89
unsigned int mRedundancy
Redundancy factor in network data.
Definition: JackTrip.h:307
void setClientName(char *ClientName)
Set Client Name to something different that the default (JackTrip)
Definition: JackTrip.h:190
int mNumChans
Number of Channels (inputs = outputs)
Definition: JackTrip.h:282
void setAllPorts(int port)
Sets port numbers for the local and peer machine. Receive port is port
Definition: JackTrip.h:170
void parseAudioPacket(int8_t *full_packet, int8_t *audio_packet)
Definition: JackTrip.cpp:437
Base class for header type. Subclass this struct to create a new header.
Definition: PacketHeader.h:112
int mSenderBindPort
Outgoing (sending) port for local machine.
Definition: JackTrip.h:304
Run in Server Mode.
Definition: JackTrip.h:75
int getNumInputChannels() const
Get Number of Input Channels.
Definition: JackAudioInterface.cpp:291
const int gDefaultPort
Default JackTrip Port.
Definition: jacktrip_globals.h:63
void putHeaderInPacket(int8_t *full_packet, int8_t *audio_packet)
Definition: JackTrip.cpp:415
Interface for the process plugins to add to the JACK callback process in JackAudioInterface.
Definition: ProcessPlugin.h:52
void stop()
Stop the processing threads.
Definition: JackTrip.cpp:243
void setJackTripMode(jacktripModeT JacktripMode)
Sets (override) JackTrip Mode after construction.
Definition: JackTrip.h:142
uint32_t mSampleRate
Sample Rate.
Definition: JackTrip.h:284
int getNumOutputChannels() const
Get Number of Output Channels.
Definition: JackAudioInterface.cpp:298
void setBindPorts(int port)
Sets port numbers to bind in RECEIVER and SENDER sockets.
Definition: JackTrip.h:178
int getSequenceNumber() const
Definition: JackTrip.h:225
audioBitResolutionT
Enum for Audio Resolution in bits.
Definition: JackAudioInterface.h:69
16 bits (default)
Definition: JackAudioInterface.h:71
QString mPeerAddress
Peer Address to use in jacktripModeT::CLIENT Mode.
Definition: JackTrip.h:287
qint8 int8_t
Typedef for unsigned long long int. This type is guaranteed to be 64-bit.
Definition: jacktrip_types.h:74
int getNumInputChannels() const
Definition: JackTrip.h:218
NOT IMPLEMENTED: Use SCTP (Stream Control Transmission Protocol)
Definition: JackTrip.h:70
underrunModeT mUnderRunMode
underrunModeT Mode
Definition: JackTrip.h:295
void clientPingToServerStart()
Stats for the Client to Ping Server.
Definition: JackTrip.cpp:336
Base class that defines the transmission protocol.
Definition: DataProtocol.h:83
void writeAudioBuffer(const int8_t *ptrToSlot)
Definition: JackTrip.h:210
JackAudioInterface::audioBitResolutionT mAudioBitResolution
Audio Bit Resolutions.
Definition: JackTrip.h:286
JackAudioInterface::samplingRateT getSampleRateType() const
Definition: JackTrip.h:214
Default application header.
Definition: DataProtocol.h:90
DataProtocol * mDataProtocolSender
Pointer to Abstract Type DataProtocol that sends packets.
Definition: JackTrip.h:290
Provides a ring-buffer (or circular-buffer) that can be written to and read from asynchronously (bloc...
Definition: RingBuffer.h:55
samplingRateT
Sampling Rates supported by JACK.
Definition: JackAudioInterface.h:77
void setPacketHeaderType(DataProtocol::packetHeaderTypeT PacketHeaderType)
Sets the Packet header type.
Definition: JackTrip.h:148
uint32_t getBufferSizeInSamples() const
Get the Jack Server Buffer Size, in samples.
Definition: JackAudioInterface.cpp:277
void readAudioBuffer(int8_t *ptrToReadSlot)
Definition: JackTrip.h:208
jacktripModeT
Enum for the JackTrip mode.
Definition: JackTrip.h:74
void clientStart()
Starts for the CLIENT mode.
Definition: JackTrip.cpp:272
void wait()
Wait for all the threads to finish. This functions is used when JackTrip is run as a thread...
Definition: JackTrip.cpp:264
Set new buffers to zero if there are no new ones.
Definition: JackTrip.h:83
dataProtocolT
Enum for the data Protocol. At this time only UDP is implemented.
Definition: JackTrip.h:67
JackAudioInterface * mJackAudio
Interface to Jack Client.
Definition: JackTrip.h:293
QVector< ProcessPlugin * > mProcessPlugins
Vector of ProcesPlugins
Definition: JackTrip.h:310
void setBufferQueueLength(int BufferQueueLength)
Sets (override) Number of Channels after construction.
Definition: JackTrip.h:160
void readSlotNonBlocking(int8_t *ptrToReadSlot)
Same as readSlotBlocking but non-blocking (asynchronous)
Definition: RingBuffer.cpp:175
Main class to creates a SERVER (to listen) or a CLIENT (to connect to a listening server) to send aud...
Definition: JackTrip.h:59
void signalProcessesStopped()
Signal emitted when all the processes and threads are stopped
Definition: moc_JackTrip.cpp:105
void setPeerPorts(int port)
Sets port numbers for the peer (remote) machine.
Definition: JackTrip.h:184
RingBuffer * mReceiveRingBuffer
Pointer for the Receive RingBuffer.
Definition: JackTrip.h:300
NOT IMPLEMENTED: Use TCP (Transmission Control Protocol)
Definition: JackTrip.h:69
uint8_t getAudioBitResolution() const
Definition: JackTrip.h:216
Client of the Ping Server Mode.
Definition: JackTrip.h:77
void insertSlotNonBlocking(const int8_t *ptrToSlot)
Same as insertSlotBlocking but non-blocking (asynchronous)
Definition: RingBuffer.cpp:149
void receiveNetworkPacket(int8_t *ptrToReadSlot)
Definition: JackTrip.h:206
virtual void increaseSequenceNumber()
Definition: PacketHeader.h:139
void slotUdpWatingTooLong(int wait_msec)
This slot emits in turn the signal signalNoUdpPacketsForSeconds when UDP is waited for more than 30 s...
Definition: JackTrip.h:246
RingBuffer * mSendRingBuffer
Pointer for the Send RingBuffer.
Definition: JackTrip.h:298
void setupDataProtocol()
Set the DataProtocol objects.
Definition: JackTrip.cpp:125
Run in Client Mode.
Definition: JackTrip.h:76
int getPeerSequenceNumber(int8_t *full_packet) const
Definition: JackTrip.h:227
void setupRingBuffers()
Set the RingBuffer objects.
Definition: JackTrip.cpp:161
void readSlotBlocking(int8_t *ptrToReadSlot)
Read a slot from the RingBuffer into ptrToReadSlot. This method will block until there's space in the...
Definition: RingBuffer.cpp:125
quint8 uint8_t
Typedef for unsigned char. This type is guaranteed to be 8-bit.
Definition: jacktrip_types.h:65
int mReceiverBindPort
Incoming (receiving) port for local machine.
Definition: JackTrip.h:302
virtual uint16_t getSequenceNumber() const
Definition: PacketHeader.h:147
int getNumOutputChannels() const
Definition: JackTrip.h:220