git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3949 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
| @@ -243,9 +243,19 @@ namespace Jack | |||
| assert ( fNetMidiCaptureBuffer ); | |||
| assert ( fNetMidiPlaybackBuffer ); | |||
| try { | |||
| //audio net buffers | |||
| fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||
| fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||
| #ifdef CELT | |||
| fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||
| fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||
| #else | |||
| fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||
| fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||
| #endif | |||
| } catch (exception&) { | |||
| jack_error("NetAudioBuffer allocation error..."); | |||
| return false; | |||
| } | |||
| //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||
| //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||
| @@ -500,7 +510,7 @@ namespace Jack | |||
| switch ( rx_head->fDataType ) | |||
| { | |||
| case 'm': //midi | |||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||
| rx_bytes = Recv(rx_head->fPacketSize, 0); | |||
| fRxHeader.fCycle = rx_head->fCycle; | |||
| fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | |||
| fNetMidiPlaybackBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); | |||
| @@ -510,13 +520,13 @@ namespace Jack | |||
| break; | |||
| case 'a': //audio | |||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||
| rx_bytes = Recv(rx_head->fPacketSize, 0); | |||
| fRxHeader.fCycle = rx_head->fCycle; | |||
| fRxHeader.fSubCycle = rx_head->fSubCycle; | |||
| fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | |||
| fNetAudioPlaybackBuffer->RenderFromNetwork (rx_head->fCycle, rx_head->fSubCycle, rx_bytes - HEADER_SIZE); | |||
| // Last audio packet is received, so finish rendering... | |||
| if (fRxHeader.fIsLastPckt) | |||
| fNetAudioPlaybackBuffer->RenderFromNetwork (rx_head->fCycle, rx_head->fSubCycle, rx_bytes - HEADER_SIZE); | |||
| // Last audio packet is received, so finish rendering... | |||
| if (fRxHeader.fIsLastPckt) | |||
| fNetAudioPlaybackBuffer->RenderToJackPorts(); | |||
| break; | |||
| @@ -647,9 +657,7 @@ namespace Jack | |||
| //utility | |||
| session_params_t host_params; | |||
| int rx_bytes = 0; | |||
| jack_log ( "sizeof (session_params_t) %d", sizeof (session_params_t) ); | |||
| //socket | |||
| if ( fSocket.NewSocket() == SOCKET_ERROR ) { | |||
| jack_error ( "Fatal error : network unreachable - %s", StrError ( NET_ERROR_CODE ) ); | |||
| @@ -738,12 +746,24 @@ namespace Jack | |||
| assert ( fNetMidiPlaybackBuffer ); | |||
| //audio net buffers | |||
| fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| //fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| //fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| try { | |||
| #ifdef CELT | |||
| fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| #else | |||
| fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||
| //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||
| #endif | |||
| } catch (exception&) { | |||
| jack_error("NetAudioBuffer allocation error..."); | |||
| return false; | |||
| } | |||
| assert ( fNetAudioCaptureBuffer ); | |||
| assert ( fNetAudioPlaybackBuffer ); | |||
| @@ -830,7 +850,6 @@ namespace Jack | |||
| int JackNetSlaveInterface::DataRecv() | |||
| { | |||
| int rx_bytes = 0; | |||
| //int last_cycle = 0; | |||
| uint recvd_midi_pckt = 0; | |||
| uint recvd_audio_pckt = 0; | |||
| @@ -850,24 +869,24 @@ namespace Jack | |||
| switch ( rx_head->fDataType ) | |||
| { | |||
| case 'm': //midi | |||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||
| rx_bytes = Recv(rx_head->fPacketSize, 0); | |||
| fRxHeader.fCycle = rx_head->fCycle; | |||
| fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | |||
| fNetMidiCaptureBuffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); | |||
| // Last midi packet is received, so finish rendering... | |||
| if ( ++recvd_midi_pckt == rx_head->fNumPacket ) | |||
| if (++recvd_midi_pckt == rx_head->fNumPacket) | |||
| fNetMidiCaptureBuffer->RenderToJackPorts(); | |||
| break; | |||
| case 'a': //audio | |||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||
| rx_bytes = Recv(rx_head->fPacketSize, 0); | |||
| fRxHeader.fCycle = rx_head->fCycle; | |||
| fRxHeader.fSubCycle = rx_head->fSubCycle; | |||
| fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; | |||
| fNetAudioCaptureBuffer->RenderFromNetwork (rx_head->fCycle, rx_head->fSubCycle, rx_bytes - HEADER_SIZE); | |||
| if (fRxHeader.fIsLastPckt) { | |||
| // Last audio packet is received, so finish rendering... | |||
| if (fRxHeader.fIsLastPckt) | |||
| fNetAudioCaptureBuffer->RenderToJackPorts(); | |||
| } | |||
| break; | |||
| case 's': //sync | |||
| @@ -201,7 +201,6 @@ namespace Jack | |||
| } | |||
| } | |||
| //midi | |||
| for ( i = 0; i < fParams.fSendMidiChannels; i++ ) | |||
| { | |||
| @@ -602,8 +601,6 @@ namespace Jack | |||
| if ( fSocket.SetTimeOut ( 2000000 ) == SOCKET_ERROR ) | |||
| jack_error ( "Can't set timeout : %s", StrError ( NET_ERROR_CODE ) ); | |||
| jack_log ( "sizeof (session_params_t) %d", sizeof (session_params_t) ); | |||
| //main loop, wait for data, deal with it and wait again | |||
| do | |||
| { | |||
| @@ -19,6 +19,72 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
| #include "JackNetTool.h" | |||
| #ifdef __APPLE__ | |||
| #include <mach/mach_time.h> | |||
| class HardwareClock | |||
| { | |||
| public: | |||
| HardwareClock(); | |||
| void Reset(); | |||
| void Update(); | |||
| float GetDeltaTime() const; | |||
| double GetTime() const; | |||
| private: | |||
| double m_clockToSeconds; | |||
| uint64_t m_startAbsTime; | |||
| uint64_t m_lastAbsTime; | |||
| double m_time; | |||
| float m_deltaTime; | |||
| }; | |||
| HardwareClock::HardwareClock() | |||
| { | |||
| mach_timebase_info_data_t info; | |||
| mach_timebase_info(&info); | |||
| m_clockToSeconds = (double)info.numer/info.denom/1000000000.0; | |||
| Reset(); | |||
| } | |||
| void HardwareClock::Reset() | |||
| { | |||
| m_startAbsTime = mach_absolute_time(); | |||
| m_lastAbsTime = m_startAbsTime; | |||
| m_time = m_startAbsTime*m_clockToSeconds; | |||
| m_deltaTime = 1.0f/60.0f; | |||
| } | |||
| void HardwareClock::Update() | |||
| { | |||
| const uint64_t currentTime = mach_absolute_time(); | |||
| const uint64_t dt = currentTime - m_lastAbsTime; | |||
| m_time = currentTime*m_clockToSeconds; | |||
| m_deltaTime = (double)dt*m_clockToSeconds; | |||
| m_lastAbsTime = currentTime; | |||
| } | |||
| float HardwareClock::GetDeltaTime() const | |||
| { | |||
| return m_deltaTime; | |||
| } | |||
| double HardwareClock::GetTime() const | |||
| { | |||
| return m_time; | |||
| } | |||
| #endif | |||
| using namespace std; | |||
| namespace Jack | |||
| @@ -46,11 +112,6 @@ namespace Jack | |||
| delete[] fPortBuffer; | |||
| } | |||
| size_t NetMidiBuffer::GetSize() | |||
| { | |||
| return fMaxBufsize; | |||
| } | |||
| size_t NetMidiBuffer::GetCycleSize() | |||
| { | |||
| return fCycleSize; | |||
| @@ -153,11 +214,6 @@ namespace Jack | |||
| NetSingleAudioBuffer::~NetSingleAudioBuffer() | |||
| {} | |||
| size_t NetSingleAudioBuffer::GetSize() | |||
| { | |||
| return fPortBuffer.GetSize(); | |||
| } | |||
| size_t NetSingleAudioBuffer::GetCycleSize() | |||
| { | |||
| return fPortBuffer.GetCycleSize(); | |||
| @@ -193,6 +249,212 @@ namespace Jack | |||
| { | |||
| return fPortBuffer.RenderToNetwork(fNetBuffer, subcycle, total_size); | |||
| } | |||
| // Celt audio buffer ********************************************************************************* | |||
| #ifdef CELT | |||
| #define KPS 32 | |||
| #define KPS_DIV 8 | |||
| NetCeltAudioBuffer::NetCeltAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ) | |||
| : fNetBuffer(net_buffer) | |||
| { | |||
| int res1, res2; | |||
| jack_nframes_t period; | |||
| fNPorts = nports; | |||
| fPeriodSize = params->fPeriodSize; | |||
| fCeltMode = new CELTMode *[fNPorts]; | |||
| fCeltEncoder = new CELTEncoder *[fNPorts]; | |||
| fCeltDecoder = new CELTDecoder *[fNPorts]; | |||
| memset(fCeltMode, 0, fNPorts * sizeof(CELTMode*)); | |||
| memset(fCeltEncoder, 0, fNPorts * sizeof(CELTEncoder*)); | |||
| memset(fCeltDecoder, 0, fNPorts * sizeof(CELTDecoder*)); | |||
| int error = CELT_OK; | |||
| for (int i = 0; i < fNPorts; i++) { | |||
| fCeltMode[i] = celt_mode_create(params->fSampleRate, params->fPeriodSize, &error); | |||
| if (error != CELT_OK) | |||
| goto error; | |||
| fCeltEncoder[i] = celt_encoder_create(fCeltMode[i], 1, &error); | |||
| if (error != CELT_OK) | |||
| goto error; | |||
| celt_encoder_ctl(fCeltEncoder[i], CELT_SET_COMPLEXITY(0)); | |||
| fCeltDecoder[i] = celt_decoder_create(fCeltMode[i], 1, &error); | |||
| if (error != CELT_OK) | |||
| goto error; | |||
| celt_decoder_ctl(fCeltDecoder[i], CELT_SET_COMPLEXITY(0)); | |||
| } | |||
| fPortBuffer = new sample_t* [fNPorts]; | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| fPortBuffer[port_index] = NULL; | |||
| /* | |||
| celt_int32 lookahead; | |||
| celt_mode_info( celt_mode, CELT_GET_LOOKAHEAD, &lookahead ); | |||
| */ | |||
| //fCompressedSizeByte = (KPS * params->fPeriodSize * 1024 / params->fSampleRate / 8)&(~1); | |||
| fCompressedSizeByte = (params->fPeriodSize * sizeof(sample_t)) / KPS_DIV; // TODO | |||
| fCompressedBuffer = new unsigned char* [fNPorts]; | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| fCompressedBuffer[port_index] = new unsigned char[fCompressedSizeByte]; | |||
| jack_log("fCompressedSizeByte %d", fCompressedSizeByte); | |||
| res1 = (fNPorts * fCompressedSizeByte) % (params->fMtu - sizeof(packet_header_t)); | |||
| res2 = (fNPorts * fCompressedSizeByte) / (params->fMtu - sizeof(packet_header_t)); | |||
| jack_log("res1 = %d res2 = %d", res1, res2); | |||
| fNumPackets = (res1) ? (res2 + 1) : res2; | |||
| fSubPeriodBytesSize = fCompressedSizeByte / fNumPackets; | |||
| fLastSubPeriodBytesSize = fSubPeriodBytesSize + (fCompressedSizeByte - (fSubPeriodBytesSize * fNumPackets)); | |||
| jack_log("fNumPackets = %d fSubPeriodBytesSize = %d, fLastSubPeriodBytesSize = %d", fNumPackets, fSubPeriodBytesSize, fLastSubPeriodBytesSize); | |||
| fCycleDuration = float(fSubPeriodBytesSize / sizeof(sample_t)) / float(params->fSampleRate); | |||
| fCycleSize = params->fMtu * fNumPackets; | |||
| fLastSubCycle = -1; | |||
| return; | |||
| error: | |||
| FreeCelt(); | |||
| throw std::bad_alloc(); | |||
| } | |||
| NetCeltAudioBuffer::~NetCeltAudioBuffer() | |||
| { | |||
| FreeCelt(); | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| delete [] fCompressedBuffer[port_index]; | |||
| delete [] fCompressedBuffer; | |||
| delete [] fPortBuffer; | |||
| } | |||
| void NetCeltAudioBuffer::FreeCelt() | |||
| { | |||
| for (int i = 0; i < fNPorts; i++) { | |||
| if (fCeltEncoder[i]) | |||
| celt_encoder_destroy(fCeltEncoder[i]); | |||
| if (fCeltDecoder[i]) | |||
| celt_decoder_destroy(fCeltDecoder[i]); | |||
| if (fCeltMode[i]) | |||
| celt_mode_destroy(fCeltMode[i]); | |||
| } | |||
| delete [] fCeltMode; | |||
| delete [] fCeltEncoder; | |||
| delete [] fCeltDecoder; | |||
| } | |||
| size_t NetCeltAudioBuffer::GetCycleSize() | |||
| { | |||
| return fCycleSize; | |||
| } | |||
| float NetCeltAudioBuffer::GetCycleDuration() | |||
| { | |||
| return fCycleDuration; | |||
| } | |||
| int NetCeltAudioBuffer::GetNumPackets() | |||
| { | |||
| return fNumPackets; | |||
| } | |||
| void NetCeltAudioBuffer::SetBuffer(int index, sample_t* buffer) | |||
| { | |||
| fPortBuffer[index] = buffer; | |||
| } | |||
| sample_t* NetCeltAudioBuffer::GetBuffer(int index) | |||
| { | |||
| return fPortBuffer[index]; | |||
| } | |||
| int NetCeltAudioBuffer::RenderFromJackPorts() | |||
| { | |||
| float floatbuf[fPeriodSize]; | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) { | |||
| memcpy(floatbuf, fPortBuffer[port_index], fPeriodSize * sizeof(float)); | |||
| int res = celt_encode_float(fCeltEncoder[port_index], floatbuf, NULL, fCompressedBuffer[port_index], fCompressedSizeByte); | |||
| if (res != fCompressedSizeByte) { | |||
| jack_error("celt_encode_float error fCompressedSizeByte = %d res = %d", fCompressedSizeByte, res); | |||
| } | |||
| } | |||
| return fNPorts * fCompressedSizeByte; // in bytes | |||
| } | |||
| int NetCeltAudioBuffer::RenderToJackPorts() | |||
| { | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) { | |||
| int res = celt_decode_float(fCeltDecoder[port_index], fCompressedBuffer[port_index], fCompressedSizeByte, fPortBuffer[port_index]); | |||
| if (res != CELT_OK) { | |||
| jack_error("celt_decode_float error res = %d", fCompressedSizeByte, res); | |||
| } | |||
| } | |||
| fLastSubCycle = -1; | |||
| //return fPeriodSize * sizeof(sample_t); // in bytes; TODO | |||
| return 0; | |||
| } | |||
| HardwareClock clock; | |||
| //network<->buffer | |||
| int NetCeltAudioBuffer::RenderFromNetwork(int cycle, int subcycle, size_t copy_size) | |||
| { | |||
| //clock.Update(); | |||
| if (subcycle == fNumPackets - 1) { | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(fCompressedBuffer[port_index] + subcycle * fSubPeriodBytesSize, fNetBuffer + port_index * fSubPeriodBytesSize, fLastSubPeriodBytesSize); | |||
| } else { | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(fCompressedBuffer[port_index] + subcycle * fSubPeriodBytesSize, fNetBuffer + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize); | |||
| } | |||
| if (subcycle != fLastSubCycle + 1) | |||
| jack_error("Packet(s) missing from... %d %d", fLastSubCycle, subcycle); | |||
| fLastSubCycle = subcycle; | |||
| //clock.Update(); | |||
| //const float dt = clock.GetDeltaTime(); | |||
| //printf("Delta: %f s\n", dt); | |||
| return copy_size; | |||
| } | |||
| int NetCeltAudioBuffer::RenderToNetwork(int subcycle, size_t total_size) | |||
| { | |||
| if (subcycle == fNumPackets - 1) { | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, fCompressedBuffer[port_index] + subcycle * fSubPeriodBytesSize, fLastSubPeriodBytesSize); | |||
| } else { | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, fCompressedBuffer[port_index] + subcycle * fSubPeriodBytesSize, fSubPeriodBytesSize); | |||
| } | |||
| return fNPorts * fSubPeriodBytesSize; | |||
| } | |||
| #endif | |||
| // Buffered | |||
| @@ -216,11 +478,6 @@ namespace Jack | |||
| delete [] fJackPortBuffer; | |||
| } | |||
| size_t NetBufferedAudioBuffer::GetSize() | |||
| { | |||
| return fPortBuffer[0].GetSize(); | |||
| } | |||
| size_t NetBufferedAudioBuffer::GetCycleSize() | |||
| { | |||
| return fPortBuffer[0].GetCycleSize(); | |||
| @@ -216,6 +216,7 @@ namespace Jack | |||
| class SERVER_EXPORT NetMidiBuffer | |||
| { | |||
| private: | |||
| int fNPorts; | |||
| size_t fMaxBufsize; | |||
| int fMaxPcktSize; | |||
| @@ -226,11 +227,11 @@ namespace Jack | |||
| size_t fCycleSize; // needed size in bytes ofr an entire cycle | |||
| public: | |||
| NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ); | |||
| ~NetMidiBuffer(); | |||
| void Reset(); | |||
| size_t GetSize(); | |||
| // needed size in bytes for an entire cycle | |||
| size_t GetCycleSize(); | |||
| @@ -258,13 +259,12 @@ namespace Jack | |||
| { | |||
| public: | |||
| NetAudioBuffer () | |||
| {} | |||
| ~NetAudioBuffer() | |||
| virtual ~NetAudioBuffer() | |||
| {} | |||
| virtual size_t GetSize() = 0; | |||
| // needed syze in bytes ofr an entire cycle | |||
| virtual size_t GetCycleSize() = 0; | |||
| @@ -303,7 +303,7 @@ namespace Jack | |||
| sample_t** fPortBuffer; | |||
| int fNPorts; | |||
| size_t fCycleSize; // needed size in bytes for an entire cycle | |||
| float fCycleDuration; // in dec | |||
| float fCycleDuration; // in sec | |||
| int fLastSubCycle; | |||
| @@ -312,22 +312,22 @@ namespace Jack | |||
| fNPorts = nports; | |||
| fPeriodSize = params->fPeriodSize; | |||
| if (params->fSendAudioChannels == 0 && params->fReturnAudioChannels == 0) { | |||
| if (params->fSendAudioChannels == 0 && params->fReturnAudioChannels == 0) { | |||
| fSubPeriodSize = params->fPeriodSize; | |||
| } else { | |||
| jack_nframes_t period = ( int ) powf ( 2.f, ( int ) ( log (float ((params->fMtu - sizeof(packet_header_t))) | |||
| / ( max ( params->fReturnAudioChannels, params->fSendAudioChannels ) * sizeof ( sample_t ) ) ) / log ( 2. ) ) ); | |||
| fSubPeriodSize = ( period > params->fPeriodSize ) ? params->fPeriodSize : period; | |||
| jack_nframes_t period = (int) powf(2.f, (int) (log (float ((params->fMtu - sizeof(packet_header_t))) | |||
| / (max(params->fReturnAudioChannels, params->fSendAudioChannels) * sizeof(sample_t))) / log(2.))); | |||
| fSubPeriodSize = (period > params->fPeriodSize) ? params->fPeriodSize : period; | |||
| } | |||
| fSubPeriodBytesSize = fSubPeriodSize * sizeof ( sample_t ); | |||
| fSubPeriodBytesSize = fSubPeriodSize * sizeof(sample_t); | |||
| fPortBuffer = new sample_t* [fNPorts]; | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| fPortBuffer[port_index] = NULL; | |||
| fCycleDuration = float(fSubPeriodSize) / float(params->fSampleRate); | |||
| fCycleSize = params->fMtu * ( fPeriodSize / fSubPeriodBytesSize ); | |||
| fCycleSize = params->fMtu * (fPeriodSize / fSubPeriodSize); | |||
| fLastSubCycle = -1; | |||
| } | |||
| @@ -363,15 +363,10 @@ namespace Jack | |||
| void Copy(sample_t** buffers) | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(buffers[port_index], fPortBuffer[port_index], fPeriodSize * sizeof(float)); | |||
| } | |||
| size_t GetSize() | |||
| { | |||
| return fNPorts * fSubPeriodBytesSize; | |||
| } | |||
| // needed syze in bytes ofr an entire cycle | |||
| size_t GetCycleSize() | |||
| { | |||
| @@ -413,7 +408,7 @@ namespace Jack | |||
| } | |||
| //network<->buffer | |||
| int RenderFromNetwork (char* net_buffer, int cycle, int subcycle, size_t copy_size ) | |||
| int RenderFromNetwork(char* net_buffer, int cycle, int subcycle, size_t copy_size) | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) { | |||
| float* src = (float*)(net_buffer + port_index * fSubPeriodBytesSize); | |||
| @@ -426,7 +421,7 @@ namespace Jack | |||
| return copy_size; | |||
| } | |||
| int RenderToNetwork (char* net_buffer, int subcycle, size_t total_size ) | |||
| int RenderToNetwork(char* net_buffer, int subcycle, size_t total_size) | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) { | |||
| @@ -454,10 +449,10 @@ namespace Jack | |||
| } | |||
| //network<->buffer | |||
| int RenderFromNetwork (char* net_buffer, int cycle, int subcycle, size_t copy_size ) | |||
| int RenderFromNetwork(char* net_buffer, int cycle, int subcycle, size_t copy_size) | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) | |||
| memcpy ( fPortBuffer[port_index] + subcycle * fSubPeriodSize, net_buffer + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize ); | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(fPortBuffer[port_index] + subcycle * fSubPeriodSize, net_buffer + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize); | |||
| if (subcycle != fLastSubCycle + 1) { | |||
| jack_error("Packet(s) missing from... %d %d", fLastSubCycle, subcycle); | |||
| } | |||
| @@ -465,10 +460,10 @@ namespace Jack | |||
| return copy_size; | |||
| } | |||
| int RenderToNetwork (char* net_buffer,int subcycle, size_t total_size ) | |||
| int RenderToNetwork(char* net_buffer,int subcycle, size_t total_size) | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) | |||
| memcpy ( net_buffer + port_index * fSubPeriodBytesSize, fPortBuffer[port_index] + subcycle * fSubPeriodSize, fSubPeriodBytesSize ); | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| memcpy(net_buffer + port_index * fSubPeriodBytesSize, fPortBuffer[port_index] + subcycle * fSubPeriodSize, fSubPeriodBytesSize); | |||
| return fNPorts * fSubPeriodBytesSize; | |||
| } | |||
| @@ -490,7 +485,7 @@ namespace Jack | |||
| ~JackPortListAllocate() | |||
| { | |||
| for ( int port_index = 0; port_index < fNPorts; port_index++ ) | |||
| for (int port_index = 0; port_index < fNPorts; port_index++) | |||
| delete [] fPortBuffer[port_index]; | |||
| delete [] fPortBuffer; | |||
| } | |||
| @@ -519,15 +514,15 @@ namespace Jack | |||
| class SERVER_EXPORT NetSingleAudioBuffer : public NetAudioBuffer | |||
| { | |||
| private: | |||
| JackPortList fPortBuffer; | |||
| char* fNetBuffer; | |||
| public: | |||
| NetSingleAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ); | |||
| ~NetSingleAudioBuffer(); | |||
| size_t GetSize(); | |||
| // needed size in bytes for an entire cycle | |||
| size_t GetCycleSize(); | |||
| @@ -554,6 +549,66 @@ namespace Jack | |||
| int RenderToNetwork (int subcycle, size_t total_size ); | |||
| }; | |||
| #define CELT 1 | |||
| #ifdef CELT | |||
| #include <celt/celt.h> | |||
| class SERVER_EXPORT NetCeltAudioBuffer : public NetAudioBuffer | |||
| { | |||
| private: | |||
| CELTMode ** fCeltMode; | |||
| CELTEncoder ** fCeltEncoder; | |||
| CELTDecoder ** fCeltDecoder; | |||
| int fCompressedSizeByte; | |||
| jack_nframes_t fPeriodSize; | |||
| int fNumPackets; | |||
| float fCycleDuration; // in sec | |||
| size_t fCycleSize; // needed size in bytes for an entire cycle | |||
| size_t fSubPeriodBytesSize; | |||
| size_t fLastSubPeriodBytesSize; | |||
| sample_t** fPortBuffer; | |||
| char* fNetBuffer; | |||
| unsigned char ** fCompressedBuffer; | |||
| int fNPorts; | |||
| int fLastSubCycle; | |||
| void FreeCelt(); | |||
| public: | |||
| NetCeltAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer); | |||
| ~NetCeltAudioBuffer(); | |||
| // needed size in bytes for an entire cycle | |||
| size_t GetCycleSize(); | |||
| // cycle duration in sec | |||
| float GetCycleDuration(); | |||
| int GetNumPackets(); | |||
| void SetBuffer(int index, sample_t* buffer); | |||
| sample_t* GetBuffer(int index); | |||
| //jack<->buffer | |||
| int RenderFromJackPorts(); | |||
| int RenderToJackPorts(); | |||
| //network<->buffer | |||
| int RenderFromNetwork(int cycle, int subcycle, size_t copy_size); | |||
| int RenderToNetwork(int subcycle, size_t total_size); | |||
| }; | |||
| #endif | |||
| #define AUDIO_BUFFER_SIZE 8 | |||
| /* | |||
| @@ -570,7 +625,6 @@ namespace Jack | |||
| NetBufferedAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ); | |||
| ~NetBufferedAudioBuffer(); | |||
| size_t GetSize(); | |||
| // needed syze in bytes ofr an entire cycle | |||
| size_t GetCycleSize(); | |||
| @@ -8801,6 +8801,7 @@ | |||
| ); | |||
| OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1 = "-DADDON_DIR=\\\"/usr/local/lib/jackmp\\\""; | |||
| OTHER_LDFLAGS = ( | |||
| libcelt.a, | |||
| "-framework", | |||
| Carbon, | |||
| "-framework", | |||
| @@ -8869,6 +8870,7 @@ | |||
| OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1 = "-DADDON_DIR=\\\"/usr/local/lib/jackmp\\\""; | |||
| OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2 = "-DLIB_DIR=\\\"lib\\\""; | |||
| OTHER_LDFLAGS = ( | |||
| libcelt.a, | |||
| "-framework", | |||
| Carbon, | |||
| "-framework", | |||
| @@ -780,6 +780,7 @@ | |||
| GCC_PRECOMPILE_PREFIX_HEADER = YES; | |||
| GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch; | |||
| HEADER_SEARCH_PATHS = ( | |||
| /usr/local/include, | |||
| ../../macosx/coreaudio, | |||
| ../../macosx, | |||
| ../../posix, | |||
| @@ -791,7 +792,7 @@ | |||
| "$(inherited)", | |||
| "\"$(SRCROOT)/build/Debug-iphonesimulator\"", | |||
| ); | |||
| OTHER_LDFLAGS = ""; | |||
| OTHER_LDFLAGS = libcelt.a; | |||
| PRODUCT_NAME = iPhoneNetSlave; | |||
| SDKROOT = iphoneos3.1.3; | |||
| }; | |||
| @@ -802,9 +803,13 @@ | |||
| buildSettings = { | |||
| ALWAYS_SEARCH_USER_PATHS = NO; | |||
| COPY_PHASE_STRIP = YES; | |||
| GCC_OPTIMIZATION_LEVEL = 3; | |||
| GCC_PRECOMPILE_PREFIX_HEADER = YES; | |||
| GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch; | |||
| GCC_THUMB_SUPPORT = NO; | |||
| HEADER_SEARCH_PATHS = ( | |||
| ., | |||
| /usr/local/include, | |||
| ../../macosx/coreaudio, | |||
| ../../common/jack, | |||
| ../../common, | |||
| @@ -816,7 +821,9 @@ | |||
| "$(inherited)", | |||
| "\"$(SRCROOT)/build/Debug-iphonesimulator\"", | |||
| ); | |||
| OTHER_LDFLAGS = libcelt.a; | |||
| PRODUCT_NAME = NetJackSlave; | |||
| SDKROOT = iphoneos3.1.3; | |||
| }; | |||
| name = Release; | |||
| }; | |||
| @@ -11,8 +11,8 @@ | |||
| #include "TiPhoneCoreAudioRenderer.h" | |||
| #define NUM_INPUT 1 | |||
| #define NUM_OUTPUT 1 | |||
| #define NUM_INPUT 2 | |||
| #define NUM_OUTPUT 2 | |||
| jack_net_slave_t* net; | |||
| jack_adapter_t* adapter; | |||
| @@ -62,7 +62,7 @@ int main(int argc, char *argv[]) { | |||
| jack_slave_t request = { NUM_INPUT, NUM_OUTPUT, 0, 0, WIFI_MTU, -1, JackSlowMode }; | |||
| jack_master_t result; | |||
| if ((net = jack_net_slave_open("169.254.46.132", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | |||
| if ((net = jack_net_slave_open("169.254.126.231", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | |||
| //if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | |||
| return -1; | |||
| } | |||
| @@ -85,6 +85,7 @@ int main(int argc, char *argv[]) { | |||
| return -1; | |||
| } | |||
| if (audio_device.Open(result.buffer_size, result.sample_rate) < 0) { | |||
| return -1; | |||
| } | |||
| @@ -95,6 +96,7 @@ int main(int argc, char *argv[]) { | |||
| return -1; | |||
| } | |||
| int retVal = UIApplicationMain(argc, argv, nil, nil); | |||
| [pool release]; | |||