diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index 0412ae6f..080d4596 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -102,7 +102,7 @@ namespace Jack public: - JackAudioAdapterInterface ( jack_nframes_t buffer_size, jack_nframes_t sample_rate ): + JackAudioAdapterInterface ( jack_nframes_t buffer_size, jack_nframes_t sample_rate, jack_nframes_t ring_buffer_size = DEFAULT_ADAPTATIVE_SIZE): fCaptureChannels ( 0 ), fPlaybackChannels ( 0 ), fHostBufferSize ( buffer_size ), @@ -112,7 +112,7 @@ namespace Jack fPIControler(sample_rate / sample_rate, 256), fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL), fQuality(0), - fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE), + fRingbufferCurSize(ring_buffer_size), fPullAndPushTime(0), fRunning(false), fAdaptative(true) @@ -120,7 +120,8 @@ namespace Jack JackAudioAdapterInterface ( jack_nframes_t host_buffer_size, jack_nframes_t host_sample_rate, jack_nframes_t adapted_buffer_size, - jack_nframes_t adapted_sample_rate ) : + jack_nframes_t adapted_sample_rate, + jack_nframes_t ring_buffer_size = DEFAULT_ADAPTATIVE_SIZE ) : fCaptureChannels ( 0 ), fPlaybackChannels ( 0 ), fHostBufferSize ( host_buffer_size ), @@ -129,7 +130,7 @@ namespace Jack fAdaptedSampleRate ( adapted_sample_rate ), fPIControler(host_sample_rate / host_sample_rate, 256), fQuality(0), - fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE), + fRingbufferCurSize(ring_buffer_size), fPullAndPushTime(0), fRunning(false), fAdaptative(true) diff --git a/common/JackNetAPI.cpp b/common/JackNetAPI.cpp index 745e1a62..ec811555 100644 --- a/common/JackNetAPI.cpp +++ b/common/JackNetAPI.cpp @@ -111,6 +111,7 @@ extern "C" jack_nframes_t adapted_buffer_size, jack_nframes_t adapted_sample_rate); SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter); + SERVER_EXPORT void jack_flush_adapter(jack_adapter_t* adapter); SERVER_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); SERVER_EXPORT int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); @@ -485,7 +486,7 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf return 0; } - int Restart() + int Restart() { // If shutdown cb is set, then call it if (fShutdownCallback) @@ -782,6 +783,16 @@ struct JackNetAdapter : public JackAudioAdapterInterface { { Destroy(); } + + int Flush() + { + for (int i = 0; i < fCaptureChannels; i++ ) { + fCaptureRingBuffer[i]->Reset(fRingbufferCurSize); + } + for (int i = 0; i < fPlaybackChannels; i++ ) { + fPlaybackRingBuffer[i]->Reset(fRingbufferCurSize); + } + } }; @@ -894,6 +905,12 @@ SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter) return 0; } +SERVER_EXPORT void jack_flush_adapter(jack_adapter_t* adapter) +{ + JackNetAdapter* slave = (JackNetAdapter*)adapter; + slave->Flush(); +} + SERVER_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) { JackNetAdapter* slave = (JackNetAdapter*)adapter; diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index 7446a08d..6b4fec0e 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -436,13 +436,15 @@ namespace Jack // - this mode will skip the two first cycles, thus it lets time for data to be processed and queued on the socket rx buffer //the slow mode is the safest mode because it wait twice the bandwidth relative time (send/return + process) + /* if (fCycleOffset < CYCLE_OFFSET_SLOW) { return 0; } else { rx_bytes = Recv ( rx_head->fPacketSize, 0 ); } + */ - //rx_bytes = Recv ( rx_head->fPacketSize, 0 ); + rx_bytes = Recv ( rx_head->fPacketSize, 0 ); if (fCycleOffset != fLastfCycleOffset) jack_info("Warning : '%s' runs in slow network mode, but data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); diff --git a/common/JackResampler.cpp b/common/JackResampler.cpp index b6c1917c..b9a26f44 100644 --- a/common/JackResampler.cpp +++ b/common/JackResampler.cpp @@ -39,6 +39,7 @@ JackResampler::~JackResampler() void JackResampler::Reset(unsigned int new_size) { fRingBufferSize = new_size; + jack_ringbuffer_reset(fRingBuffer); jack_ringbuffer_reset_size(fRingBuffer, sizeof(float) * fRingBufferSize); jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize / 2)); } diff --git a/common/jack/net.h b/common/jack/net.h index 1bce751d..91688a83 100644 --- a/common/jack/net.h +++ b/common/jack/net.h @@ -268,6 +268,9 @@ jack_adapter_t* jack_create_adapter(int input, int output, */ int jack_destroy_adapter(jack_adapter_t* adapter); + +void jack_flush_adapter(jack_adapter_t* adapter); + /** * Push input to and pull output from ringbuffer * diff --git a/common/ringbuffer.c b/common/ringbuffer.c index 45ee27b3..c6237f5e 100644 --- a/common/ringbuffer.c +++ b/common/ringbuffer.c @@ -126,6 +126,7 @@ jack_ringbuffer_reset (jack_ringbuffer_t * rb) { rb->read_ptr = 0; rb->write_ptr = 0; + memset(rb->buf, 0, rb->size); } /* Reset the read and write pointers to zero. This is not thread diff --git a/macosx/iphone/main_slave.mm b/macosx/iphone/main_slave.mm index aec9beb1..289d643c 100644 --- a/macosx/iphone/main_slave.mm +++ b/macosx/iphone/main_slave.mm @@ -14,13 +14,12 @@ #define NUM_INPUT 0 #define NUM_OUTPUT 2 -jack_net_slave_t* net; -jack_adapter_t* adapter; +jack_net_slave_t* net = NULL; +jack_adapter_t* adapter = NULL; int buffer_size; int sample_rate; - static int net_process(jack_nframes_t buffer_size, int audio_input, float** audio_input_buffer, @@ -46,6 +45,13 @@ static int net_process(jack_nframes_t buffer_size, return 0; } +static void net_shutdown(void *arg) +{ + if (adapter) + jack_flush_adapter(adapter); +} + + static void SlaveAudioCallback(int frames, float** inputs, float** outputs, void* arg) { jack_adapter_push_and_pull(adapter, inputs, outputs, frames); @@ -80,6 +86,8 @@ int main(int argc, char *argv[]) { jack_set_net_slave_process_callback(net, net_process, NULL); + jack_set_net_slave_shutdown_callback(net, net_shutdown, NULL); + if (jack_net_slave_activate(net) != 0) { return -1; }