00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00038 #ifndef __JACKTRIP_H__
00039 #define __JACKTRIP_H__
00040
00041 #include <tr1/memory>
00042
00043 #include <QObject>
00044 #include <QString>
00045
00046 #include "DataProtocol.h"
00047 #include "AudioInterface.h"
00048 #include "JackAudioInterface.h"
00049 #include "RtAudioInterface.h"
00050 #include "PacketHeader.h"
00051 #include "RingBuffer.h"
00052
00053
00061 class JackTrip : public QThread
00062 {
00063 Q_OBJECT;
00064
00065 public:
00066
00067
00069 enum dataProtocolT {
00070 UDP,
00071 TCP,
00072 SCTP
00073 };
00074
00076 enum jacktripModeT {
00077 SERVER,
00078 CLIENT,
00079 CLIENTTOPINGSERVER
00080 };
00081
00083 enum underrunModeT {
00084 WAVETABLE,
00085 ZEROS
00086 };
00087
00089 enum audiointerfaceModeT {
00090 JACK,
00091 RTAUDIO
00092 };
00093
00094
00095
00104 JackTrip(jacktripModeT JacktripMode = CLIENT,
00105 dataProtocolT DataProtocolType = UDP,
00106 int NumChans = 2,
00107 int BufferQueueLength = 8,
00108 unsigned int redundancy = 1,
00109 AudioInterface::audioBitResolutionT AudioBitResolution =
00110 AudioInterface::BIT16,
00111 DataProtocol::packetHeaderTypeT PacketHeaderType =
00112 DataProtocol::DEFAULT,
00113 underrunModeT UnderRunMode = WAVETABLE,
00114 int receiver_bind_port = gDefaultPort,
00115 int sender_bind_port = gDefaultPort,
00116 int receiver_peer_port = gDefaultPort,
00117 int sender_peer_port = gDefaultPort);
00118
00120 virtual ~JackTrip();
00121
00123 virtual void setPeerAddress(const char* PeerHostOrIP);
00124
00128
00129 virtual void appendProcessPlugin(ProcessPlugin* plugin);
00130
00132 virtual void start();
00133
00135 virtual void stop();
00136
00139 virtual void wait();
00140
00143 virtual void checkIfPortIsBinded(int port);
00144
00145
00147
00148
00150 virtual void setJackTripMode(jacktripModeT JacktripMode)
00151 { mJackTripMode = JacktripMode; }
00153 virtual void setDataProtocoType(dataProtocolT DataProtocolType)
00154 { mDataProtocol = DataProtocolType; }
00156 virtual void setPacketHeaderType(DataProtocol::packetHeaderTypeT PacketHeaderType)
00157 {
00158 mPacketHeaderType = PacketHeaderType;
00159 delete mPacketHeader;
00160 mPacketHeader = NULL;
00161 createHeader(mPacketHeaderType);
00162 }
00165
00166
00168 virtual void setBufferQueueLength(int BufferQueueLength)
00169 { mBufferQueueLength = BufferQueueLength; }
00171 virtual void setAudioBitResolution(AudioInterface::audioBitResolutionT AudioBitResolution)
00172 { mAudioBitResolution = AudioBitResolution; }
00174 virtual void setUnderRunMode(underrunModeT UnderRunMode)
00175 { mUnderRunMode = UnderRunMode; }
00178 virtual void setAllPorts(int port)
00179 {
00180 mReceiverBindPort = port;
00181 mSenderPeerPort = port;
00182 mSenderBindPort = port;
00183 mReceiverPeerPort = port;
00184 }
00186 virtual void setBindPorts(int port)
00187 {
00188 mReceiverBindPort = port;
00189 mSenderBindPort = port;
00190 }
00192 virtual void setPeerPorts(int port)
00193 {
00194 mSenderPeerPort = port;
00195 mReceiverPeerPort = port;
00196 }
00198 virtual void setClientName(const char* ClientName)
00199 { mJackClientName = ClientName; }
00201 virtual void setNumChannels(int num_chans)
00202 { mNumChans = num_chans; }
00203
00204 virtual int getReceiverBindPort() const
00205 { return mReceiverBindPort; }
00206 virtual int getSenderPeerPort() const
00207 { return mSenderPeerPort; }
00208 virtual int getSenderBindPort() const
00209 { return mSenderBindPort; }
00210 virtual int getReceiverPeerPort() const
00211 { return mReceiverPeerPort; }
00212
00213 virtual DataProtocol* getDataProtocolSender() const
00214 { return mDataProtocolSender; }
00215 virtual DataProtocol* getDataProtocolReceiver() const
00216 { return mDataProtocolReceiver; }
00217 virtual void setDataProtocolSender(DataProtocol* const DataProtocolSender)
00218 { mDataProtocolSender = DataProtocolSender; }
00219 virtual void setDataProtocolReceiver(DataProtocol* const DataProtocolReceiver)
00220 { mDataProtocolReceiver = DataProtocolReceiver; }
00221
00222 virtual RingBuffer* getSendRingBuffer() const
00223 { return mSendRingBuffer; }
00224 virtual RingBuffer* getReceiveRingBuffer() const
00225 { return mReceiveRingBuffer; }
00226 virtual void setSendRingBuffer(RingBuffer* const SendRingBuffer)
00227 { mSendRingBuffer = SendRingBuffer; }
00228 virtual void setReceiveRingBuffer(RingBuffer* const ReceiveRingBuffer)
00229 { mReceiveRingBuffer = ReceiveRingBuffer; }
00230
00231 virtual void setPacketHeader(PacketHeader* const PacketHeader)
00232 { mPacketHeader = PacketHeader; }
00233
00234 virtual int getRingBuffersSlotSize()
00235 { return getTotalAudioPacketSizeInBytes(); }
00236
00237 virtual void setAudiointerfaceMode(JackTrip::audiointerfaceModeT audiointerface_mode)
00238 { mAudiointerfaceMode = audiointerface_mode; }
00240
00241
00242
00243
00245
00246
00247 virtual void createHeader(const DataProtocol::packetHeaderTypeT headertype);
00248 void putHeaderInPacket(int8_t* full_packet, int8_t* audio_packet);
00249 virtual int getPacketSizeInBytes();
00250 void parseAudioPacket(int8_t* full_packet, int8_t* audio_packet);
00251 virtual void sendNetworkPacket(const int8_t* ptrToSlot)
00252 { mSendRingBuffer->insertSlotNonBlocking(ptrToSlot); }
00253 virtual void receiveNetworkPacket(int8_t* ptrToReadSlot)
00254 { mReceiveRingBuffer->readSlotNonBlocking(ptrToReadSlot); }
00255 virtual void readAudioBuffer(int8_t* ptrToReadSlot)
00256 { mSendRingBuffer->readSlotBlocking(ptrToReadSlot); }
00257 virtual void writeAudioBuffer(const int8_t* ptrToSlot)
00258 { mReceiveRingBuffer->insertSlotNonBlocking(ptrToSlot); }
00259 uint32_t getBufferSizeInSamples() const
00260 { return mAudioInterface->getBufferSizeInSamples(); }
00261 RtAudioInterface::samplingRateT getSampleRateType() const
00262 { return mAudioInterface->getSampleRateType(); }
00263 int getSampleRate() const
00264 { return mAudioInterface->getSampleRate(); }
00265 uint8_t getAudioBitResolution() const
00266 { return mAudioInterface->getAudioBitResolution(); }
00267 int getNumInputChannels() const
00268 { return mAudioInterface->getNumInputChannels(); }
00269 int getNumOutputChannels() const
00270 { return mAudioInterface->getNumOutputChannels(); }
00271 virtual void checkPeerSettings(int8_t* full_packet);
00272 void increaseSequenceNumber()
00273 { mPacketHeader->increaseSequenceNumber(); }
00274 int getSequenceNumber() const
00275 { return mPacketHeader->getSequenceNumber(); }
00276 int getPeerSequenceNumber(int8_t* full_packet) const
00277 { return mPacketHeader->getPeerSequenceNumber(full_packet); }
00278 uint64_t getPeerTimeStamp(int8_t* full_packet) const
00279 { return mPacketHeader->getPeerTimeStamp(full_packet); }
00280 size_t getSizeInBytesPerChannel() const
00281 { return mAudioInterface->getSizeInBytesPerChannel(); }
00282 int getHeaderSizeInBytes() const
00283 { return mPacketHeader->getHeaderSizeInBytes(); }
00284 virtual int getTotalAudioPacketSizeInBytes() const
00285 { return mAudioInterface->getSizeInBytesPerChannel() * mNumChans; }
00287
00288
00289 void printTextTest() {std::cout << "=== JackTrip PRINT ===" << std::endl;}
00290 void printTextTest2() {std::cout << "=== JackTrip PRINT2 ===" << std::endl;}
00291
00292 public slots:
00294 void slotStopProcesses()
00295 {
00296 std::cout << "Stopping JackTrip..." << std::endl;
00297 stop();
00298 }
00299
00305 void slotUdpWatingTooLong(int wait_msec)
00306 {
00307 int wait_time = 30000;
00308 if ( !(wait_msec%wait_time) ) {
00309 std::cerr << "UDP WAITED MORE THAN 30 seconds." << std::endl;
00310 emit signalNoUdpPacketsForSeconds();
00311 }
00312 }
00313
00314
00315 signals:
00317 void signalProcessesStopped();
00319 void signalNoUdpPacketsForSeconds();
00320
00321
00322 public:
00323
00325 virtual void setupJackAudio();
00327 void closeJackAudio();
00329 virtual void setupDataProtocol();
00331 void setupRingBuffers();
00333 void clientStart();
00335 void serverStart();
00337 void clientPingToServerStart();
00338
00339
00340 private:
00341
00342 jacktripModeT mJackTripMode;
00343 dataProtocolT mDataProtocol;
00344 DataProtocol::packetHeaderTypeT mPacketHeaderType;
00345 JackTrip::audiointerfaceModeT mAudiointerfaceMode;
00346
00347 int mNumChans;
00348 int mBufferQueueLength;
00349 uint32_t mSampleRate;
00350
00351 AudioInterface::audioBitResolutionT mAudioBitResolution;
00352 QString mPeerAddress;
00353
00355 DataProtocol* mDataProtocolSender;
00357 DataProtocol* mDataProtocolReceiver;
00358 AudioInterface* mAudioInterface;
00359 PacketHeader* mPacketHeader;
00360 underrunModeT mUnderRunMode;
00361
00363 RingBuffer* mSendRingBuffer;
00365 RingBuffer* mReceiveRingBuffer;
00366
00367 int mReceiverBindPort;
00368 int mSenderPeerPort;
00369 int mSenderBindPort;
00370 int mReceiverPeerPort;
00371
00372 unsigned int mRedundancy;
00373 const char* mJackClientName;
00374
00375 QVector<ProcessPlugin*> mProcessPlugins;
00376 };
00377
00378 #endif