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
{

struct JackNetExtMaster : public JackNetMasterInterface {
struct JackNetExt {

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

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

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

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

int Close()
{
fSocket.Close();
FreePorts();
FreePorts(this);
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)
{
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;

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

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

JackMidiBuffer** fMidiCaptureBuffer;
JackMidiBuffer** fMidiPlaybackBuffer;

int fConnectTimeOut;
JackNetExtSlave(const char* ip,
int port,
const char* name,
jack_slave_t* request)
:fThread(this),
:JackNetExt(),
fThread(this),
fProcessCallback(NULL),fProcessArg(NULL),
fShutdownCallback(NULL), fShutdownArg(NULL),
fRestartCallback(NULL), fRestartArg(NULL),
fErrorCallback(NULL), fErrorArg(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];

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

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

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

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

int Close()
{
fSocket.Close();
FreePorts();
FreePorts(this);
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
void EncodeTransportData()
{}
@@ -794,7 +732,7 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf
jack_info("NetSlave is restarted");
fThread.DropRealTime();
fThread.SetStatus(JackThread::kIniting);
FreePorts();
FreePorts(this);
if (Restart() == 0 && Init()) {
fThread.SetStatus(JackThread::kRunning);
return true;


+ 2
- 0
common/JackNetInterface.h View File

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

friend class JackNetExt;
protected:
bool fSetTimeOut;


Loading…
Cancel
Save