Browse Source

New JackNetExt class to factorize some code in NetJack2.

tags/v1.9.10
Stephane Letz 12 years ago
parent
commit
f116ca5517
2 changed files with 99 additions and 159 deletions
  1. +97
    -159
      common/JackNetAPI.cpp
  2. +2
    -0
      common/JackNetInterface.h

+ 97
- 159
common/JackNetAPI.cpp View File

@@ -141,7 +141,7 @@ extern "C"
namespace Jack namespace Jack
{ {


struct JackNetExtMaster : public JackNetMasterInterface {
struct JackNetExt {


// Data buffers // Data buffers
float** fAudioCaptureBuffer; float** fAudioCaptureBuffer;
@@ -149,6 +149,89 @@ struct JackNetExtMaster : public JackNetMasterInterface {


JackMidiBuffer** fMidiCaptureBuffer; JackMidiBuffer** fMidiCaptureBuffer;
JackMidiBuffer** fMidiPlaybackBuffer; JackMidiBuffer** fMidiPlaybackBuffer;
JackNetExt():fAudioCaptureBuffer(NULL), fAudioPlaybackBuffer(NULL), fMidiCaptureBuffer(NULL), fMidiPlaybackBuffer(NULL)
{}
virtual~ JackNetExt()
{}
void AllocPorts(JackNetInterface* net)
{
// Set buffers
if (net->fParams.fSendAudioChannels > 0) {
fAudioCaptureBuffer = new float*[net->fParams.fSendAudioChannels];
for (int audio_port_index = 0; audio_port_index < net->fParams.fSendAudioChannels; audio_port_index++) {
fAudioCaptureBuffer[audio_port_index] = new float[net->fParams.fPeriodSize];
memset(fAudioCaptureBuffer[audio_port_index], 0, sizeof(float) * net->fParams.fPeriodSize);
net->fNetAudioCaptureBuffer->SetBuffer(audio_port_index, fAudioCaptureBuffer[audio_port_index]);
}
}

if (net->fParams.fSendMidiChannels > 0) {
fMidiCaptureBuffer = new JackMidiBuffer*[net->fParams.fSendMidiChannels];
for (int midi_port_index = 0; midi_port_index < net->fParams.fSendMidiChannels; midi_port_index++) {
fMidiCaptureBuffer[midi_port_index] = (JackMidiBuffer*)new float[net->fParams.fPeriodSize];
memset(fMidiCaptureBuffer[midi_port_index], 0, sizeof(float) * net->fParams.fPeriodSize);
net->fNetMidiCaptureBuffer->SetBuffer(midi_port_index, fMidiCaptureBuffer[midi_port_index]);
}
}

if (net->fParams.fReturnAudioChannels > 0) {
fAudioPlaybackBuffer = new float*[net->fParams.fReturnAudioChannels];
for (int audio_port_index = 0; audio_port_index < net->fParams.fReturnAudioChannels; audio_port_index++) {
fAudioPlaybackBuffer[audio_port_index] = new float[net->fParams.fPeriodSize];
memset(fAudioPlaybackBuffer[audio_port_index], 0, sizeof(float) * net->fParams.fPeriodSize);
net->fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, fAudioPlaybackBuffer[audio_port_index]);
}
}

if (net->fParams.fReturnMidiChannels > 0) {
fMidiPlaybackBuffer = new JackMidiBuffer*[net->fParams.fReturnMidiChannels];
for (int midi_port_index = 0; midi_port_index < net->fParams.fReturnMidiChannels; midi_port_index++) {
fMidiPlaybackBuffer[midi_port_index] = (JackMidiBuffer*)new float[net->fParams.fPeriodSize];
memset(fMidiPlaybackBuffer[midi_port_index], 0, sizeof(float) * net->fParams.fPeriodSize);
net->fNetMidiPlaybackBuffer->SetBuffer(midi_port_index, fMidiPlaybackBuffer[midi_port_index]);
}
}
}

void FreePorts(JackNetInterface* net)
{
if (fAudioCaptureBuffer) {
for (int audio_port_index = 0; audio_port_index < net->fParams.fSendAudioChannels; audio_port_index++) {
delete[] fAudioCaptureBuffer[audio_port_index];
}
delete[] fAudioCaptureBuffer;
fAudioCaptureBuffer = NULL;
}
if (fMidiCaptureBuffer) {
for (int midi_port_index = 0; midi_port_index < net->fParams.fSendMidiChannels; midi_port_index++) {
delete[] fMidiCaptureBuffer[midi_port_index];
}
delete[] fMidiCaptureBuffer;
fMidiCaptureBuffer = NULL;
}
if (fAudioPlaybackBuffer) {
for (int audio_port_index = 0; audio_port_index < net->fParams.fReturnAudioChannels; audio_port_index++) {
delete[] fAudioPlaybackBuffer[audio_port_index];
}
delete[] fAudioPlaybackBuffer;
fAudioPlaybackBuffer = NULL;
}

if (fMidiPlaybackBuffer) {
for (int midi_port_index = 0; midi_port_index < net->fParams.fReturnMidiChannels; midi_port_index++) {
delete[] (fMidiPlaybackBuffer[midi_port_index]);
}
delete[] fMidiPlaybackBuffer;
fMidiPlaybackBuffer = NULL;
}
}
};

struct JackNetExtMaster : public JackNetMasterInterface, public JackNetExt {


jack_master_t fRequest; jack_master_t fRequest;
@@ -158,6 +241,7 @@ struct JackNetExtMaster : public JackNetMasterInterface {
int port, int port,
const char* name, const char* name,
jack_master_t* request) jack_master_t* request)
:JackNetExt()
{ {
fRunning = true; fRunning = true;
assert(strlen(ip) < 32); assert(strlen(ip) < 32);
@@ -168,10 +252,6 @@ struct JackNetExtMaster : public JackNetMasterInterface {
fRequest.audio_input = request->audio_input; fRequest.audio_input = request->audio_input;
fRequest.audio_output = request->audio_output; fRequest.audio_output = request->audio_output;
fRequest.time_out = request->time_out; fRequest.time_out = request->time_out;
fAudioCaptureBuffer = NULL;
fAudioPlaybackBuffer = NULL;
fMidiCaptureBuffer = NULL;
fMidiPlaybackBuffer = NULL;
} }


virtual ~JackNetExtMaster() virtual ~JackNetExtMaster()
@@ -334,88 +414,17 @@ struct JackNetExtMaster : public JackNetMasterInterface {
return -1; return -1;
} }


AllocPorts();
AllocPorts(this);
return 0; return 0;
} }


int Close() int Close()
{ {
fSocket.Close(); fSocket.Close();
FreePorts();
FreePorts(this);
return 0; return 0;
} }

void AllocPorts()
{
// Set buffers
if (fParams.fSendAudioChannels > 0) {
fAudioCaptureBuffer = new float*[fParams.fSendAudioChannels];
for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) {
fAudioCaptureBuffer[audio_port_index] = new float[fParams.fPeriodSize];
fNetAudioCaptureBuffer->SetBuffer(audio_port_index, fAudioCaptureBuffer[audio_port_index]);
}
}

if (fParams.fSendMidiChannels > 0) {
fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels];
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) {
fMidiCaptureBuffer[midi_port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
fNetMidiCaptureBuffer->SetBuffer(midi_port_index, fMidiCaptureBuffer[midi_port_index]);
}
}

if (fParams.fReturnAudioChannels > 0) {
fAudioPlaybackBuffer = new float*[fParams.fReturnAudioChannels];
for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) {
fAudioPlaybackBuffer[audio_port_index] = new float[fParams.fPeriodSize];
fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, fAudioPlaybackBuffer[audio_port_index]);
}
}

if (fParams.fReturnMidiChannels > 0) {
fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels];
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) {
fMidiPlaybackBuffer[midi_port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
fNetMidiPlaybackBuffer->SetBuffer(midi_port_index, fMidiPlaybackBuffer[midi_port_index]);
}
}
}

void FreePorts()
{
if (fAudioCaptureBuffer) {
for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) {
delete[] fAudioCaptureBuffer[audio_port_index];
}
delete[] fAudioCaptureBuffer;
fAudioCaptureBuffer = NULL;
}
if (fMidiCaptureBuffer) {
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) {
delete[] fMidiCaptureBuffer[midi_port_index];
}
delete[] fMidiCaptureBuffer;
fMidiCaptureBuffer = NULL;
}
if (fAudioPlaybackBuffer) {
for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) {
delete[] fAudioPlaybackBuffer[audio_port_index];
}
delete[] fAudioPlaybackBuffer;
fAudioPlaybackBuffer = NULL;
}

if (fMidiPlaybackBuffer) {
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) {
delete[] (fMidiPlaybackBuffer[midi_port_index]);
}
delete[] fMidiPlaybackBuffer;
fMidiPlaybackBuffer = NULL;
}
}

int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer) int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer)
{ {
try { try {
@@ -498,7 +507,7 @@ struct JackNetExtMaster : public JackNetMasterInterface {


}; };


struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterface {
struct JackNetExtSlave : public JackNetSlaveInterface, public JackNetExt, public JackRunnableInterface {


JackThread fThread; JackThread fThread;


@@ -520,29 +529,21 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf
JackNetSlaveSampleRateCallback fSampleRateCallback; JackNetSlaveSampleRateCallback fSampleRateCallback;
void* fSampleRateArg; void* fSampleRateArg;


//sample buffers
float** fAudioCaptureBuffer;
float** fAudioPlaybackBuffer;

JackMidiBuffer** fMidiCaptureBuffer;
JackMidiBuffer** fMidiPlaybackBuffer;

int fConnectTimeOut; int fConnectTimeOut;
JackNetExtSlave(const char* ip, JackNetExtSlave(const char* ip,
int port, int port,
const char* name, const char* name,
jack_slave_t* request) jack_slave_t* request)
:fThread(this),
:JackNetExt(),
fThread(this),
fProcessCallback(NULL),fProcessArg(NULL), fProcessCallback(NULL),fProcessArg(NULL),
fShutdownCallback(NULL), fShutdownArg(NULL), fShutdownCallback(NULL), fShutdownArg(NULL),
fRestartCallback(NULL), fRestartArg(NULL), fRestartCallback(NULL), fRestartArg(NULL),
fErrorCallback(NULL), fErrorArg(NULL), fErrorCallback(NULL), fErrorArg(NULL),
fBufferSizeCallback(NULL), fBufferSizeArg(NULL), fBufferSizeCallback(NULL), fBufferSizeArg(NULL),
fSampleRateCallback(NULL), fSampleRateArg(NULL),
fAudioCaptureBuffer(NULL), fAudioPlaybackBuffer(NULL),
fMidiCaptureBuffer(NULL), fMidiPlaybackBuffer(NULL)
{
fSampleRateCallback(NULL), fSampleRateArg(NULL)
{
char host_name[JACK_CLIENT_NAME_SIZE]; char host_name[JACK_CLIENT_NAME_SIZE];


// Request parameters // Request parameters
@@ -621,7 +622,7 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf
strcpy(result->master_name, fParams.fMasterNetName); strcpy(result->master_name, fParams.fMasterNetName);
} }


AllocPorts();
AllocPorts(this);
return 0; return 0;
} }


@@ -675,80 +676,17 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf
} }
} }


AllocPorts();
AllocPorts(this);
return 0; return 0;
} }


int Close() int Close()
{ {
fSocket.Close(); fSocket.Close();
FreePorts();
FreePorts(this);
return 0; return 0;
} }


void AllocPorts()
{
// Set buffers
fAudioCaptureBuffer = new float*[fParams.fSendAudioChannels];
for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) {
fAudioCaptureBuffer[audio_port_index] = new float[fParams.fPeriodSize];
fNetAudioCaptureBuffer->SetBuffer(audio_port_index, fAudioCaptureBuffer[audio_port_index]);
}

fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels];
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) {
fMidiCaptureBuffer[midi_port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
fNetMidiCaptureBuffer->SetBuffer(midi_port_index, fMidiCaptureBuffer[midi_port_index]);
}

fAudioPlaybackBuffer = new float*[fParams.fReturnAudioChannels];
for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) {
fAudioPlaybackBuffer[audio_port_index] = new float[fParams.fPeriodSize];
fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, fAudioPlaybackBuffer[audio_port_index]);
}

fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels];
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) {
fMidiPlaybackBuffer[midi_port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
fNetMidiPlaybackBuffer->SetBuffer(midi_port_index, fMidiPlaybackBuffer[midi_port_index]);
}
}

void FreePorts()
{
if (fAudioCaptureBuffer) {
for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) {
delete[] fAudioCaptureBuffer[audio_port_index];
}
delete[] fAudioCaptureBuffer;
fAudioCaptureBuffer = NULL;
}

if (fMidiCaptureBuffer) {
for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) {
delete[] (fMidiCaptureBuffer[midi_port_index]);
}
delete[] fMidiCaptureBuffer;
fMidiCaptureBuffer = NULL;
}

if (fAudioPlaybackBuffer) {
for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) {
delete[] fAudioPlaybackBuffer[audio_port_index];
}
delete[] fAudioPlaybackBuffer;
fAudioPlaybackBuffer = NULL;
}

if (fMidiPlaybackBuffer) {
for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) {
delete[] fMidiPlaybackBuffer[midi_port_index];
}
delete[] fMidiPlaybackBuffer;
fMidiPlaybackBuffer = NULL;
}
}

// Transport // Transport
void EncodeTransportData() void EncodeTransportData()
{} {}
@@ -794,7 +732,7 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf
jack_info("NetSlave is restarted"); jack_info("NetSlave is restarted");
fThread.DropRealTime(); fThread.DropRealTime();
fThread.SetStatus(JackThread::kIniting); fThread.SetStatus(JackThread::kIniting);
FreePorts();
FreePorts(this);
if (Restart() == 0 && Init()) { if (Restart() == 0 && Init()) {
fThread.SetStatus(JackThread::kRunning); fThread.SetStatus(JackThread::kRunning);
return true; return true;


+ 2
- 0
common/JackNetInterface.h View File

@@ -46,6 +46,8 @@ namespace Jack
class SERVER_EXPORT JackNetInterface class SERVER_EXPORT JackNetInterface
{ {


friend class JackNetExt;
protected: protected:
bool fSetTimeOut; bool fSetTimeOut;


Loading…
Cancel
Save