diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index fdf94fa1..a1feb272 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -20,6 +20,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackException.h" #include "JackError.h" +#if HAVE_OPUS +#include "JackNetOpus.h" +#endif + #include using namespace std; diff --git a/common/JackNetOneDriver.cpp b/common/JackNetOneDriver.cpp index a7fc083e..89dd9262 100644 --- a/common/JackNetOneDriver.cpp +++ b/common/JackNetOneDriver.cpp @@ -40,8 +40,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #endif #if HAVE_OPUS -#include -#include +#include +#include #endif #define MIN(x,y) ((x)<(y) ? (x) : (y)) diff --git a/common/JackNetOpus.cpp b/common/JackNetOpus.cpp new file mode 100644 index 00000000..1d595d23 --- /dev/null +++ b/common/JackNetOpus.cpp @@ -0,0 +1,243 @@ +/* +Copyright (C) 2008-2011 Romain Moret at Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "JackNetOpus.h" +#include "JackError.h" + +namespace Jack +{ +#define CDO (sizeof(short)) ///< compressed data offset (first 2 bytes are length) + NetOpusAudioBuffer::NetOpusAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps) + :NetAudioBuffer(params, nports, net_buffer) + { + fOpusMode = new OpusCustomMode*[fNPorts]; + fOpusEncoder = new OpusCustomEncoder*[fNPorts]; + fOpusDecoder = new OpusCustomDecoder*[fNPorts]; + fCompressedSizesByte = new unsigned short[fNPorts]; + + memset(fOpusMode, 0, fNPorts * sizeof(OpusCustomMode*)); + memset(fOpusEncoder, 0, fNPorts * sizeof(OpusCustomEncoder*)); + memset(fOpusDecoder, 0, fNPorts * sizeof(OpusCustomDecoder*)); + memset(fCompressedSizesByte, 0, fNPorts * sizeof(short)); + + int error = OPUS_OK; + + for (int i = 0; i < fNPorts; i++) { + /* Allocate en/decoders */ + fOpusMode[i] = opus_custom_mode_create(params->fSampleRate, params->fPeriodSize, &error); + if (error != OPUS_OK) { + jack_log("NetOpusAudioBuffer opus_custom_mode_create err = %d", error); + goto error; + } + + fOpusEncoder[i] = opus_custom_encoder_create(fOpusMode[i], 1, &error); + if (error != OPUS_OK) { + jack_log("NetOpusAudioBuffer opus_custom_encoder_create err = %d", error); + goto error; + } + + fOpusDecoder[i] = opus_custom_decoder_create(fOpusMode[i], 1, &error); + if (error != OPUS_OK) { + jack_log("NetOpusAudioBuffer opus_custom_decoder_create err = %d", error); + goto error; + } + + opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_BITRATE(kbps*1024)); // bits per second + opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_COMPLEXITY(10)); + opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); + opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_SIGNAL(OPUS_APPLICATION_RESTRICTED_LOWDELAY)); + } + + { + fCompressedMaxSizeByte = (kbps * params->fPeriodSize * 1024) / (params->fSampleRate * 8); + fPeriodSize = params->fPeriodSize; + jack_log("NetOpusAudioBuffer fCompressedMaxSizeByte %d", fCompressedMaxSizeByte); + + fCompressedBuffer = new unsigned char* [fNPorts]; + for (int port_index = 0; port_index < fNPorts; port_index++) { + fCompressedBuffer[port_index] = new unsigned char[fCompressedMaxSizeByte]; + memset(fCompressedBuffer[port_index], 0, fCompressedMaxSizeByte * sizeof(char)); + } + + int res1 = (fNPorts * fCompressedMaxSizeByte + CDO) % PACKET_AVAILABLE_SIZE(params); + int res2 = (fNPorts * fCompressedMaxSizeByte + CDO) / PACKET_AVAILABLE_SIZE(params); + + fNumPackets = (res1) ? (res2 + 1) : res2; + + jack_log("NetOpusAudioBuffer res1 = %d res2 = %d", res1, res2); + + fSubPeriodBytesSize = (fCompressedMaxSizeByte + CDO) / fNumPackets; + fLastSubPeriodBytesSize = fSubPeriodBytesSize + (fCompressedMaxSizeByte + CDO) % fNumPackets; + + if (fNumPackets == 1) { + fSubPeriodBytesSize = fLastSubPeriodBytesSize; + } + + jack_log("NetOpusAudioBuffer fNumPackets = %d fSubPeriodBytesSize = %d, fLastSubPeriodBytesSize = %d", fNumPackets, fSubPeriodBytesSize, fLastSubPeriodBytesSize); + + fCycleDuration = float(fSubPeriodBytesSize / sizeof(sample_t)) / float(params->fSampleRate); + fCycleBytesSize = params->fMtu * fNumPackets; + + fLastSubCycle = -1; + return; + } + + error: + + FreeOpus(); + throw std::bad_alloc(); + } + + NetOpusAudioBuffer::~NetOpusAudioBuffer() + { + FreeOpus(); + + for (int port_index = 0; port_index < fNPorts; port_index++) { + delete [] fCompressedBuffer[port_index]; + } + + delete [] fCompressedBuffer; + delete [] fCompressedSizesByte; + } + + void NetOpusAudioBuffer::FreeOpus() + { + for (int i = 0; i < fNPorts; i++) { + if (fOpusEncoder[i]) { + opus_custom_encoder_destroy(fOpusEncoder[i]); + fOpusEncoder[i] = 0; + } + if (fOpusDecoder[i]) { + opus_custom_decoder_destroy(fOpusDecoder[i]); + fOpusDecoder[i] = 0; + } + if (fOpusMode[i]) { + opus_custom_mode_destroy(fOpusMode[i]); + fOpusMode[i] = 0; + } + } + + delete [] fOpusEncoder; + delete [] fOpusDecoder; + delete [] fOpusMode; + } + + size_t NetOpusAudioBuffer::GetCycleSize() + { + return fCycleBytesSize; + } + + float NetOpusAudioBuffer::GetCycleDuration() + { + return fCycleDuration; + } + + int NetOpusAudioBuffer::GetNumPackets(int active_ports) + { + return fNumPackets; + } + + int NetOpusAudioBuffer::RenderFromJackPorts(int nframes) + { + float buffer[BUFFER_SIZE_MAX]; + + for (int port_index = 0; port_index < fNPorts; port_index++) { + if (fPortBuffer[port_index]) { + memcpy(buffer, fPortBuffer[port_index], fPeriodSize * sizeof(sample_t)); + } else { + memset(buffer, 0, fPeriodSize * sizeof(sample_t)); + } + int res = opus_custom_encode_float(fOpusEncoder[port_index], buffer, ((nframes == -1) ? fPeriodSize : nframes), fCompressedBuffer[port_index], fCompressedMaxSizeByte); + if (res < 0 || res >= 65535) { + jack_error("opus_custom_encode_float error res = %d", res); + fCompressedSizesByte[port_index] = 0; + } else { + fCompressedSizesByte[port_index] = res; + } + } + + // All ports active + return fNPorts; + } + + void NetOpusAudioBuffer::RenderToJackPorts(int nframes) + { + for (int port_index = 0; port_index < fNPorts; port_index++) { + if (fPortBuffer[port_index]) { + int res = opus_custom_decode_float(fOpusDecoder[port_index], fCompressedBuffer[port_index], fCompressedSizesByte[port_index], fPortBuffer[port_index], ((nframes == -1) ? fPeriodSize : nframes)); + if (res < 0 || res != ((nframes == -1) ? fPeriodSize : nframes)) { + jack_error("opus_custom_decode_float error fCompressedSizeByte = %d res = %d", fCompressedSizesByte[port_index], res); + } + } + } + + NextCycle(); + } + + //network<->buffer + int NetOpusAudioBuffer::RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num) + { + // Cleanup all JACK ports at the beginning of the cycle + if (sub_cycle == 0) { + Cleanup(); + } + + if (port_num > 0) { + if (sub_cycle == 0) { + for (int port_index = 0; port_index < fNPorts; port_index++) { + size_t len = *((size_t*)(fNetBuffer + port_index * fSubPeriodBytesSize)); + fCompressedSizesByte[port_index] = ntohs(len); + memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize, fNetBuffer + CDO + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize - CDO); + } + } else if (sub_cycle == fNumPackets - 1) { + for (int port_index = 0; port_index < fNPorts; port_index++) { + memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fNetBuffer + port_index * fLastSubPeriodBytesSize, fLastSubPeriodBytesSize); + } + } else { + for (int port_index = 0; port_index < fNPorts; port_index++) { + memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fNetBuffer + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize); + } + } + } + + return CheckPacket(cycle, sub_cycle); + } + + int NetOpusAudioBuffer::RenderToNetwork(int sub_cycle, uint32_t port_num) + { + if (sub_cycle == 0) { + for (int port_index = 0; port_index < fNPorts; port_index++) { + unsigned short len = htons(fCompressedSizesByte[port_index]); + memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, &len, CDO); + memcpy(fNetBuffer + port_index * fSubPeriodBytesSize + CDO, fCompressedBuffer[port_index], fSubPeriodBytesSize - CDO); + } + return fNPorts * fSubPeriodBytesSize; + } else if (sub_cycle == fNumPackets - 1) { + for (int port_index = 0; port_index < fNPorts; port_index++) { + memcpy(fNetBuffer + port_index * fLastSubPeriodBytesSize, fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fLastSubPeriodBytesSize); + } + return fNPorts * fLastSubPeriodBytesSize; + } else { + for (int port_index = 0; port_index < fNPorts; port_index++) { + memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fSubPeriodBytesSize); + } + return fNPorts * fSubPeriodBytesSize; + } + } +} diff --git a/common/JackNetOpus.h b/common/JackNetOpus.h new file mode 100644 index 00000000..cc3dac44 --- /dev/null +++ b/common/JackNetOpus.h @@ -0,0 +1,68 @@ +/* +Copyright (C) 2008-2011 Romain Moret at Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __JackNetOpus__ +#define __JackNetOpus__ + +#include "JackNetTool.h" + +#include +#include + +namespace Jack +{ + class SERVER_EXPORT NetOpusAudioBuffer : public NetAudioBuffer + { + private: + + OpusCustomMode** fOpusMode; + OpusCustomEncoder** fOpusEncoder; + OpusCustomDecoder** fOpusDecoder; + + int fCompressedMaxSizeByte; + unsigned short* fCompressedSizesByte; + + size_t fLastSubPeriodBytesSize; + + unsigned char** fCompressedBuffer; + void FreeOpus(); + + public: + + NetOpusAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps); + virtual ~NetOpusAudioBuffer(); + + // needed size in bytes for an entire cycle + size_t GetCycleSize(); + + // cycle duration in sec + float GetCycleDuration(); + int GetNumPackets(int active_ports); + + //jack<->buffer + int RenderFromJackPorts(int nframes); + void RenderToJackPorts(int nframes); + + //network<->buffer + int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num); + int RenderToNetwork(int sub_cycle, uint32_t port_num); + }; +} + +#endif diff --git a/common/JackNetTool.cpp b/common/JackNetTool.cpp index 077b8cb2..8201f421 100644 --- a/common/JackNetTool.cpp +++ b/common/JackNetTool.cpp @@ -724,228 +724,6 @@ namespace Jack #endif -#if HAVE_OPUS -#define CDO (sizeof(short)) ///< compressed data offset (first 2 bytes are length) - NetOpusAudioBuffer::NetOpusAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps) - :NetAudioBuffer(params, nports, net_buffer) - { - fOpusMode = new OpusCustomMode*[fNPorts]; - fOpusEncoder = new OpusCustomEncoder*[fNPorts]; - fOpusDecoder = new OpusCustomDecoder*[fNPorts]; - fCompressedSizesByte = new unsigned short[fNPorts]; - - memset(fOpusMode, 0, fNPorts * sizeof(OpusCustomMode*)); - memset(fOpusEncoder, 0, fNPorts * sizeof(OpusCustomEncoder*)); - memset(fOpusDecoder, 0, fNPorts * sizeof(OpusCustomDecoder*)); - memset(fCompressedSizesByte, 0, fNPorts * sizeof(short)); - - int error = OPUS_OK; - - for (int i = 0; i < fNPorts; i++) { - /* Allocate en/decoders */ - fOpusMode[i] = opus_custom_mode_create(params->fSampleRate, params->fPeriodSize, &error); - if (error != OPUS_OK) { - jack_log("NetOpusAudioBuffer opus_custom_mode_create err = %d", error); - goto error; - } - - fOpusEncoder[i] = opus_custom_encoder_create(fOpusMode[i], 1, &error); - if (error != OPUS_OK) { - jack_log("NetOpusAudioBuffer opus_custom_encoder_create err = %d", error); - goto error; - } - - fOpusDecoder[i] = opus_custom_decoder_create(fOpusMode[i], 1, &error); - if (error != OPUS_OK) { - jack_log("NetOpusAudioBuffer opus_custom_decoder_create err = %d", error); - goto error; - } - - opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_BITRATE(kbps*1024)); // bits per second - opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_COMPLEXITY(10)); - opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); - opus_custom_encoder_ctl(fOpusEncoder[i], OPUS_SET_SIGNAL(OPUS_APPLICATION_RESTRICTED_LOWDELAY)); - } - - { - fCompressedMaxSizeByte = (kbps * params->fPeriodSize * 1024) / (params->fSampleRate * 8); - fPeriodSize = params->fPeriodSize; - jack_log("NetOpusAudioBuffer fCompressedMaxSizeByte %d", fCompressedMaxSizeByte); - - fCompressedBuffer = new unsigned char* [fNPorts]; - for (int port_index = 0; port_index < fNPorts; port_index++) { - fCompressedBuffer[port_index] = new unsigned char[fCompressedMaxSizeByte]; - memset(fCompressedBuffer[port_index], 0, fCompressedMaxSizeByte * sizeof(char)); - } - - int res1 = (fNPorts * fCompressedMaxSizeByte + CDO) % PACKET_AVAILABLE_SIZE(params); - int res2 = (fNPorts * fCompressedMaxSizeByte + CDO) / PACKET_AVAILABLE_SIZE(params); - - fNumPackets = (res1) ? (res2 + 1) : res2; - - jack_log("NetOpusAudioBuffer res1 = %d res2 = %d", res1, res2); - - fSubPeriodBytesSize = (fCompressedMaxSizeByte + CDO) / fNumPackets; - fLastSubPeriodBytesSize = fSubPeriodBytesSize + (fCompressedMaxSizeByte + CDO) % fNumPackets; - - if (fNumPackets == 1) { - fSubPeriodBytesSize = fLastSubPeriodBytesSize; - } - - jack_log("NetOpusAudioBuffer fNumPackets = %d fSubPeriodBytesSize = %d, fLastSubPeriodBytesSize = %d", fNumPackets, fSubPeriodBytesSize, fLastSubPeriodBytesSize); - - fCycleDuration = float(fSubPeriodBytesSize / sizeof(sample_t)) / float(params->fSampleRate); - fCycleBytesSize = params->fMtu * fNumPackets; - - fLastSubCycle = -1; - return; - } - - error: - - FreeOpus(); - throw std::bad_alloc(); - } - - NetOpusAudioBuffer::~NetOpusAudioBuffer() - { - FreeOpus(); - - for (int port_index = 0; port_index < fNPorts; port_index++) { - delete [] fCompressedBuffer[port_index]; - } - - delete [] fCompressedBuffer; - delete [] fCompressedSizesByte; - } - - void NetOpusAudioBuffer::FreeOpus() - { - for (int i = 0; i < fNPorts; i++) { - if (fOpusEncoder[i]) { - opus_custom_encoder_destroy(fOpusEncoder[i]); - fOpusEncoder[i] = 0; - } - if (fOpusDecoder[i]) { - opus_custom_decoder_destroy(fOpusDecoder[i]); - fOpusDecoder[i] = 0; - } - if (fOpusMode[i]) { - opus_custom_mode_destroy(fOpusMode[i]); - fOpusMode[i] = 0; - } - } - - delete [] fOpusEncoder; - delete [] fOpusDecoder; - delete [] fOpusMode; - } - - size_t NetOpusAudioBuffer::GetCycleSize() - { - return fCycleBytesSize; - } - - float NetOpusAudioBuffer::GetCycleDuration() - { - return fCycleDuration; - } - - int NetOpusAudioBuffer::GetNumPackets(int active_ports) - { - return fNumPackets; - } - - int NetOpusAudioBuffer::RenderFromJackPorts(int nframes) - { - float buffer[BUFFER_SIZE_MAX]; - - for (int port_index = 0; port_index < fNPorts; port_index++) { - if (fPortBuffer[port_index]) { - memcpy(buffer, fPortBuffer[port_index], fPeriodSize * sizeof(sample_t)); - } else { - memset(buffer, 0, fPeriodSize * sizeof(sample_t)); - } - int res = opus_custom_encode_float(fOpusEncoder[port_index], buffer, ((nframes == -1) ? fPeriodSize : nframes), fCompressedBuffer[port_index], fCompressedMaxSizeByte); - if (res < 0 || res >= 65535) { - jack_error("opus_custom_encode_float error res = %d", res); - fCompressedSizesByte[port_index] = 0; - } else { - fCompressedSizesByte[port_index] = res; - } - } - - // All ports active - return fNPorts; - } - - void NetOpusAudioBuffer::RenderToJackPorts(int nframes) - { - for (int port_index = 0; port_index < fNPorts; port_index++) { - if (fPortBuffer[port_index]) { - int res = opus_custom_decode_float(fOpusDecoder[port_index], fCompressedBuffer[port_index], fCompressedSizesByte[port_index], fPortBuffer[port_index], ((nframes == -1) ? fPeriodSize : nframes)); - if (res < 0 || res != ((nframes == -1) ? fPeriodSize : nframes)) { - jack_error("opus_custom_decode_float error fCompressedSizeByte = %d res = %d", fCompressedSizesByte[port_index], res); - } - } - } - - NextCycle(); - } - - //network<->buffer - int NetOpusAudioBuffer::RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num) - { - // Cleanup all JACK ports at the beginning of the cycle - if (sub_cycle == 0) { - Cleanup(); - } - - if (port_num > 0) { - if (sub_cycle == 0) { - for (int port_index = 0; port_index < fNPorts; port_index++) { - size_t len = *((size_t*)(fNetBuffer + port_index * fSubPeriodBytesSize)); - fCompressedSizesByte[port_index] = ntohs(len); - memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize, fNetBuffer + CDO + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize - CDO); - } - } else if (sub_cycle == fNumPackets - 1) { - for (int port_index = 0; port_index < fNPorts; port_index++) { - memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fNetBuffer + port_index * fLastSubPeriodBytesSize, fLastSubPeriodBytesSize); - } - } else { - for (int port_index = 0; port_index < fNPorts; port_index++) { - memcpy(fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fNetBuffer + port_index * fSubPeriodBytesSize, fSubPeriodBytesSize); - } - } - } - - return CheckPacket(cycle, sub_cycle); - } - - int NetOpusAudioBuffer::RenderToNetwork(int sub_cycle, uint32_t port_num) - { - if (sub_cycle == 0) { - for (int port_index = 0; port_index < fNPorts; port_index++) { - unsigned short len = htons(fCompressedSizesByte[port_index]); - memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, &len, CDO); - memcpy(fNetBuffer + port_index * fSubPeriodBytesSize + CDO, fCompressedBuffer[port_index], fSubPeriodBytesSize - CDO); - } - return fNPorts * fSubPeriodBytesSize; - } else if (sub_cycle == fNumPackets - 1) { - for (int port_index = 0; port_index < fNPorts; port_index++) { - memcpy(fNetBuffer + port_index * fLastSubPeriodBytesSize, fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fLastSubPeriodBytesSize); - } - return fNPorts * fLastSubPeriodBytesSize; - } else { - for (int port_index = 0; port_index < fNPorts; port_index++) { - memcpy(fNetBuffer + port_index * fSubPeriodBytesSize, fCompressedBuffer[port_index] + sub_cycle * fSubPeriodBytesSize - CDO, fSubPeriodBytesSize); - } - return fNPorts * fSubPeriodBytesSize; - } - } - -#endif - NetIntAudioBuffer::NetIntAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer) : NetAudioBuffer(params, nports, net_buffer) { diff --git a/common/JackNetTool.h b/common/JackNetTool.h index 33d586d2..8b1a76ac 100644 --- a/common/JackNetTool.h +++ b/common/JackNetTool.h @@ -17,6 +17,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef __JackNetTool__ +#define __JackNetTool__ + #include "JackMidiPort.h" #include "JackTools.h" #include "types.h" @@ -406,50 +409,6 @@ namespace Jack int RenderToNetwork(int sub_cycle, uint32_t port_num); }; -#endif - -#if HAVE_OPUS - -#include -#include - - class SERVER_EXPORT NetOpusAudioBuffer : public NetAudioBuffer - { - private: - - OpusCustomMode** fOpusMode; - OpusCustomEncoder** fOpusEncoder; - OpusCustomDecoder** fOpusDecoder; - - int fCompressedMaxSizeByte; - unsigned short* fCompressedSizesByte; - - size_t fLastSubPeriodBytesSize; - - unsigned char** fCompressedBuffer; - void FreeOpus(); - - public: - - NetOpusAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps); - virtual ~NetOpusAudioBuffer(); - - // needed size in bytes for an entire cycle - size_t GetCycleSize(); - - // cycle duration in sec - float GetCycleDuration(); - int GetNumPackets(int active_ports); - - //jack<->buffer - int RenderFromJackPorts(int nframes); - void RenderToJackPorts(int nframes); - - //network<->buffer - int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num); - int RenderToNetwork(int sub_cycle, uint32_t port_num); - }; - #endif class SERVER_EXPORT NetIntAudioBuffer : public NetAudioBuffer @@ -509,3 +468,5 @@ namespace Jack SERVER_EXPORT const char* GetTransportState(int transport_state); SERVER_EXPORT void NetTransportDataDisplay(net_transport_data_t* data); } + +#endif diff --git a/common/netjack.h b/common/netjack.h index 45ebe372..b2bd1ce5 100644 --- a/common/netjack.h +++ b/common/netjack.h @@ -33,8 +33,8 @@ #endif #if HAVE_OPUS -#include -#include +#include +#include #endif #ifdef __cplusplus diff --git a/common/netjack_packet.c b/common/netjack_packet.c index cd3a8d6d..777e2f6f 100644 --- a/common/netjack_packet.c +++ b/common/netjack_packet.c @@ -73,8 +73,8 @@ #endif #if HAVE_OPUS -#include -#include +#include +#include #endif #include "netjack_packet.h" diff --git a/common/wscript b/common/wscript index fcf1d495..0c92939c 100644 --- a/common/wscript +++ b/common/wscript @@ -244,6 +244,9 @@ def build(bld): 'JackMidiWriteQueue.cpp' ] + if bld.env['OPUS']: + serverlib.source += ['JackNetOpus.cpp'] + if bld.env['IS_LINUX']: serverlib.source += [ '../posix/JackSocketServerChannel.cpp', @@ -317,6 +320,9 @@ def build(bld): 'JackGlobals.cpp', 'ringbuffer.c'] + if bld.env['OPUS']: + netlib.source += ['JackNetOpus.cpp'] + if bld.env['IS_LINUX']: netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../linux/JackLinuxTime.c'] netlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") diff --git a/example-clients/netsource.c b/example-clients/netsource.c index 9386aecc..6d286e58 100644 --- a/example-clients/netsource.c +++ b/example-clients/netsource.c @@ -63,8 +63,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #endif #if HAVE_OPUS -#include -#include +#include +#include #endif #include diff --git a/linux/wscript b/linux/wscript index 968839ba..3ec6d8f9 100644 --- a/linux/wscript +++ b/linux/wscript @@ -89,6 +89,6 @@ def build(bld): create_jack_driver_obj(bld, 'netone', [ '../common/JackNetOneDriver.cpp', '../common/netjack.c', - '../common/netjack_packet.c' ], ["SAMPLERATE", "CELT"]) + '../common/netjack_packet.c' ], ["SAMPLERATE", "CELT", "OPUS"]) create_jack_driver_obj(bld, 'proxy', '../common/JackProxyDriver.cpp')