git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3952 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
@@ -257,21 +257,27 @@ namespace Jack | |||||
ratio = fPIControler.GetRatio(fPlaybackRingBuffer[0]->GetError() - delta_frames); | ratio = fPIControler.GetRatio(fPlaybackRingBuffer[0]->GetError() - delta_frames); | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
if (fCaptureRingBuffer[0] != NULL) | |||||
if (fCaptureRingBuffer && fCaptureRingBuffer[0] != NULL) | |||||
fTable.Write(fCaptureRingBuffer[0]->GetError(), fCaptureRingBuffer[0]->GetError() - delta_frames, ratio, 1/ratio, fCaptureRingBuffer[0]->ReadSpace(), fCaptureRingBuffer[0]->ReadSpace()); | fTable.Write(fCaptureRingBuffer[0]->GetError(), fCaptureRingBuffer[0]->GetError() - delta_frames, ratio, 1/ratio, fCaptureRingBuffer[0]->ReadSpace(), fCaptureRingBuffer[0]->ReadSpace()); | ||||
#endif | #endif | ||||
// Push/pull from ringbuffer | // Push/pull from ringbuffer | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
fCaptureRingBuffer[i]->SetRatio(ratio); | fCaptureRingBuffer[i]->SetRatio(ratio); | ||||
if (fCaptureRingBuffer[i]->WriteResample(inputBuffer[i], frames) < frames) | |||||
failure = true; | |||||
if (inputBuffer[i]) { | |||||
if (fCaptureRingBuffer[i]->WriteResample(inputBuffer[i], frames) < frames) { | |||||
failure = true; | |||||
} | |||||
} | |||||
} | } | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
fPlaybackRingBuffer[i]->SetRatio(1/ratio); | fPlaybackRingBuffer[i]->SetRatio(1/ratio); | ||||
if (fPlaybackRingBuffer[i]->ReadResample(outputBuffer[i], frames) < frames) | |||||
failure = true; | |||||
if (outputBuffer[i]) { | |||||
if (fPlaybackRingBuffer[i]->ReadResample(outputBuffer[i], frames) < frames) { | |||||
failure = true; | |||||
} | |||||
} | |||||
} | } | ||||
// Reset all ringbuffers in case of failure | // Reset all ringbuffers in case of failure | ||||
if (failure) { | if (failure) { | ||||
@@ -297,13 +303,19 @@ namespace Jack | |||||
// Push/pull from ringbuffer | // Push/pull from ringbuffer | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
if (fCaptureRingBuffer[i]->Read(inputBuffer[i], frames) < frames) | |||||
res = -1; | |||||
if (inputBuffer[i]) { | |||||
if (fCaptureRingBuffer[i]->Read(inputBuffer[i], frames) < frames) { | |||||
res = -1; | |||||
} | |||||
} | |||||
} | } | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
if (fPlaybackRingBuffer[i]->Write(outputBuffer[i], frames) < frames) | |||||
res = -1; | |||||
if (outputBuffer[i]) { | |||||
if (fPlaybackRingBuffer[i]->Write(outputBuffer[i], frames) < frames) { | |||||
res = -1; | |||||
} | |||||
} | |||||
} | } | ||||
return res; | return res; | ||||
@@ -748,8 +748,11 @@ struct JackNetAdapter : public JackAudioAdapterInterface { | |||||
void Create() | void Create() | ||||
{ | { | ||||
//ringbuffers | //ringbuffers | ||||
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; | |||||
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; | |||||
if (fCaptureChannels > 0) | |||||
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; | |||||
if (fPlaybackChannels > 0) | |||||
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; | |||||
if (fAdaptative) { | if (fAdaptative) { | ||||
AdaptRingBufferSize(); | AdaptRingBufferSize(); | ||||
@@ -234,26 +234,27 @@ namespace Jack | |||||
try { | try { | ||||
//audio net buffers | //audio net buffers | ||||
#ifdef CELT | #ifdef CELT | ||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
if (fParams.fSendAudioChannels) | |||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
if (fParams.fReturnAudioChannels) | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
//fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | //fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | ||||
//fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | //fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | ||||
#else | #else | ||||
fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
#endif | #endif | ||||
//fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
//fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
} catch (exception&) { | } catch (exception&) { | ||||
jack_error("NetAudioBuffer allocation error..."); | jack_error("NetAudioBuffer allocation error..."); | ||||
return false; | return false; | ||||
} | } | ||||
//fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData ); | |||||
//fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData ); | |||||
assert(fNetAudioCaptureBuffer); | |||||
assert(fNetAudioPlaybackBuffer); | |||||
//set the new timeout for the socket | //set the new timeout for the socket | ||||
if (SetRxTimeout() == SOCKET_ERROR) { | if (SetRxTimeout() == SOCKET_ERROR) { | ||||
jack_error("Can't set rx timeout : %s", StrError(NET_ERROR_CODE)); | jack_error("Can't set rx timeout : %s", StrError(NET_ERROR_CODE)); | ||||
@@ -741,19 +742,23 @@ namespace Jack | |||||
assert ( fNetMidiPlaybackBuffer ); | assert ( fNetMidiPlaybackBuffer ); | ||||
//audio net buffers | //audio net buffers | ||||
//fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
//fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
//fNetAudioCaptureBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
//fNetAudioPlaybackBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
try { | try { | ||||
#ifdef CELT | #ifdef CELT | ||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
if (fParams.fSendAudioChannels) | |||||
fNetAudioCaptureBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
if (fParams.fReturnAudioChannels) | |||||
fNetAudioPlaybackBuffer = new NetCeltAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
// fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | // fNetAudioCaptureBuffer = new NetIntAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | ||||
// fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | // fNetAudioPlaybackBuffer = new NetIntAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | ||||
#else | #else | ||||
fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
fNetAudioCaptureBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | |||||
fNetAudioPlaybackBuffer = new NetFloatAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | |||||
//fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData ); | ||||
//fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData ); | ||||
#endif | #endif | ||||
@@ -762,10 +767,7 @@ namespace Jack | |||||
return false; | return false; | ||||
} | } | ||||
assert ( fNetAudioCaptureBuffer ); | |||||
assert ( fNetAudioPlaybackBuffer ); | |||||
//set the new buffer sizes | |||||
//set the new buffer sizes | |||||
if ( SetNetBufferSize() == SOCKET_ERROR ) { | if ( SetNetBufferSize() == SOCKET_ERROR ) { | ||||
jack_error ( "Can't set net buffer sizes : %s", StrError ( NET_ERROR_CODE ) ); | jack_error ( "Can't set net buffer sizes : %s", StrError ( NET_ERROR_CODE ) ); | ||||
goto error; | goto error; | ||||
@@ -207,45 +207,45 @@ namespace Jack | |||||
// net audio buffer ********************************************************************************* | // net audio buffer ********************************************************************************* | ||||
NetSingleAudioBuffer::NetSingleAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ) | |||||
NetFloatAudioBuffer::NetFloatAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ) | |||||
: fPortBuffer(params, nports), fNetBuffer(net_buffer) | : fPortBuffer(params, nports), fNetBuffer(net_buffer) | ||||
{} | {} | ||||
NetSingleAudioBuffer::~NetSingleAudioBuffer() | |||||
NetFloatAudioBuffer::~NetFloatAudioBuffer() | |||||
{} | {} | ||||
size_t NetSingleAudioBuffer::GetCycleSize() | |||||
size_t NetFloatAudioBuffer::GetCycleSize() | |||||
{ | { | ||||
return fPortBuffer.GetCycleSize(); | return fPortBuffer.GetCycleSize(); | ||||
} | } | ||||
void NetSingleAudioBuffer::SetBuffer ( int index, sample_t* buffer ) | |||||
void NetFloatAudioBuffer::SetBuffer ( int index, sample_t* buffer ) | |||||
{ | { | ||||
fPortBuffer.SetBuffer(index, buffer); | fPortBuffer.SetBuffer(index, buffer); | ||||
} | } | ||||
sample_t* NetSingleAudioBuffer::GetBuffer ( int index ) | |||||
sample_t* NetFloatAudioBuffer::GetBuffer ( int index ) | |||||
{ | { | ||||
return fPortBuffer.GetBuffer(index); | return fPortBuffer.GetBuffer(index); | ||||
} | } | ||||
int NetSingleAudioBuffer::RenderFromJackPorts () | |||||
int NetFloatAudioBuffer::RenderFromJackPorts () | |||||
{ | { | ||||
return fPortBuffer.RenderFromJackPorts(); | return fPortBuffer.RenderFromJackPorts(); | ||||
} | } | ||||
int NetSingleAudioBuffer::RenderToJackPorts () | |||||
int NetFloatAudioBuffer::RenderToJackPorts () | |||||
{ | { | ||||
return fPortBuffer.RenderToJackPorts(); | return fPortBuffer.RenderToJackPorts(); | ||||
} | } | ||||
//network<->buffer | //network<->buffer | ||||
int NetSingleAudioBuffer::RenderFromNetwork ( int cycle, int subcycle, size_t copy_size ) | |||||
int NetFloatAudioBuffer::RenderFromNetwork ( int cycle, int subcycle, size_t copy_size ) | |||||
{ | { | ||||
return fPortBuffer.RenderFromNetwork(fNetBuffer, cycle, subcycle, copy_size); | return fPortBuffer.RenderFromNetwork(fNetBuffer, cycle, subcycle, copy_size); | ||||
} | } | ||||
int NetSingleAudioBuffer::RenderToNetwork (int subcycle, size_t total_size ) | |||||
int NetFloatAudioBuffer::RenderToNetwork (int subcycle, size_t total_size ) | |||||
{ | { | ||||
return fPortBuffer.RenderToNetwork(fNetBuffer, subcycle, total_size); | return fPortBuffer.RenderToNetwork(fNetBuffer, subcycle, total_size); | ||||
} | } | ||||
@@ -457,7 +457,6 @@ namespace Jack | |||||
#endif | #endif | ||||
NetIntAudioBuffer::NetIntAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ) | NetIntAudioBuffer::NetIntAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ) | ||||
: fNetBuffer(net_buffer) | : fNetBuffer(net_buffer) | ||||
{ | { | ||||
@@ -511,7 +511,7 @@ namespace Jack | |||||
}; | }; | ||||
class SERVER_EXPORT NetSingleAudioBuffer : public NetAudioBuffer | |||||
class SERVER_EXPORT NetFloatAudioBuffer : public NetAudioBuffer | |||||
{ | { | ||||
private: | private: | ||||
@@ -520,8 +520,8 @@ namespace Jack | |||||
public: | public: | ||||
NetSingleAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ); | |||||
~NetSingleAudioBuffer(); | |||||
NetFloatAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer ); | |||||
~NetFloatAudioBuffer(); | |||||
// needed size in bytes for an entire cycle | // needed size in bytes for an entire cycle | ||||
size_t GetCycleSize(); | size_t GetCycleSize(); | ||||
@@ -44,10 +44,10 @@ extern "C" | |||||
typedef struct { | typedef struct { | ||||
int audio_input; | |||||
int audio_output; | |||||
int midi_input; | |||||
int midi_ouput; | |||||
int audio_input; // from master or to slave | |||||
int audio_output; // to master or from slave | |||||
int midi_input; // from master or to slave | |||||
int midi_output; // to master or from slave | |||||
int mtu; | int mtu; | ||||
int time_out; // in millisecond, -1 means in infinite | int time_out; // in millisecond, -1 means in infinite | ||||
char mode; | char mode; | ||||
@@ -59,6 +59,9 @@ class TiPhoneCoreAudioRenderer | |||||
TiPhoneCoreAudioRenderer(int input, int output) | TiPhoneCoreAudioRenderer(int input, int output) | ||||
:fDevNumInChans(input), fDevNumOutChans(output), fAudioCallback(NULL), fCallbackArg(NULL) | :fDevNumInChans(input), fDevNumOutChans(output), fAudioCallback(NULL), fCallbackArg(NULL) | ||||
{ | { | ||||
memset(fInChannel, 0, sizeof(float*) * MAX_CHANNELS); | |||||
memset(fOutChannel, 0, sizeof(float*) * MAX_CHANNELS); | |||||
for (int i = 0; i < fDevNumInChans; i++) { | for (int i = 0; i < fDevNumInChans; i++) { | ||||
fInChannel[i] = new float[8192]; | fInChannel[i] = new float[8192]; | ||||
} | } | ||||
@@ -11,7 +11,7 @@ | |||||
#include "TiPhoneCoreAudioRenderer.h" | #include "TiPhoneCoreAudioRenderer.h" | ||||
#define NUM_INPUT 2 | |||||
#define NUM_INPUT 0 | |||||
#define NUM_OUTPUT 2 | #define NUM_OUTPUT 2 | ||||
jack_net_slave_t* net; | jack_net_slave_t* net; | ||||
@@ -20,6 +20,7 @@ jack_adapter_t* adapter; | |||||
int buffer_size; | int buffer_size; | ||||
int sample_rate; | int sample_rate; | ||||
static int net_process(jack_nframes_t buffer_size, | static int net_process(jack_nframes_t buffer_size, | ||||
int audio_input, | int audio_input, | ||||
float** audio_input_buffer, | float** audio_input_buffer, | ||||
@@ -32,6 +33,7 @@ static int net_process(jack_nframes_t buffer_size, | |||||
void* data) | void* data) | ||||
{ | { | ||||
//printf("audio_input %d audio_output %d \n", audio_input, audio_output); | |||||
jack_adapter_pull_and_push(adapter, audio_output_buffer, audio_input_buffer, buffer_size); | jack_adapter_pull_and_push(adapter, audio_output_buffer, audio_input_buffer, buffer_size); | ||||
// Process input, produce output | // Process input, produce output | ||||
@@ -57,7 +59,7 @@ int main(int argc, char *argv[]) { | |||||
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; | NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; | ||||
jack_slave_t request = { NUM_INPUT, NUM_OUTPUT, 0, 0, WIFI_MTU, -1, JackSlowMode }; | |||||
jack_slave_t request = { NUM_OUTPUT, NUM_INPUT, 0, 0, WIFI_MTU, -1, JackSlowMode }; | |||||
jack_master_t result; | jack_master_t result; | ||||
//if ((net = jack_net_slave_open("169.254.112.119", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | //if ((net = jack_net_slave_open("169.254.112.119", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | ||||
@@ -73,9 +75,10 @@ int main(int argc, char *argv[]) { | |||||
result.sample_rate)) == 0) { | result.sample_rate)) == 0) { | ||||
return -1; | return -1; | ||||
} | } | ||||
TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT); | TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT); | ||||
jack_set_net_slave_process_callback(net, net_process, NULL); | jack_set_net_slave_process_callback(net, net_process, NULL); | ||||
if (jack_net_slave_activate(net) != 0) { | if (jack_net_slave_activate(net) != 0) { | ||||
return -1; | return -1; | ||||