git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3953 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
| @@ -102,7 +102,7 @@ namespace Jack | |||||
| public: | 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 ), | fCaptureChannels ( 0 ), | ||||
| fPlaybackChannels ( 0 ), | fPlaybackChannels ( 0 ), | ||||
| fHostBufferSize ( buffer_size ), | fHostBufferSize ( buffer_size ), | ||||
| @@ -112,7 +112,7 @@ namespace Jack | |||||
| fPIControler(sample_rate / sample_rate, 256), | fPIControler(sample_rate / sample_rate, 256), | ||||
| fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL), | fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL), | ||||
| fQuality(0), | fQuality(0), | ||||
| fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE), | |||||
| fRingbufferCurSize(ring_buffer_size), | |||||
| fPullAndPushTime(0), | fPullAndPushTime(0), | ||||
| fRunning(false), | fRunning(false), | ||||
| fAdaptative(true) | fAdaptative(true) | ||||
| @@ -120,7 +120,8 @@ namespace Jack | |||||
| JackAudioAdapterInterface ( jack_nframes_t host_buffer_size, | JackAudioAdapterInterface ( jack_nframes_t host_buffer_size, | ||||
| jack_nframes_t host_sample_rate, | jack_nframes_t host_sample_rate, | ||||
| jack_nframes_t adapted_buffer_size, | 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 ), | fCaptureChannels ( 0 ), | ||||
| fPlaybackChannels ( 0 ), | fPlaybackChannels ( 0 ), | ||||
| fHostBufferSize ( host_buffer_size ), | fHostBufferSize ( host_buffer_size ), | ||||
| @@ -129,7 +130,7 @@ namespace Jack | |||||
| fAdaptedSampleRate ( adapted_sample_rate ), | fAdaptedSampleRate ( adapted_sample_rate ), | ||||
| fPIControler(host_sample_rate / host_sample_rate, 256), | fPIControler(host_sample_rate / host_sample_rate, 256), | ||||
| fQuality(0), | fQuality(0), | ||||
| fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE), | |||||
| fRingbufferCurSize(ring_buffer_size), | |||||
| fPullAndPushTime(0), | fPullAndPushTime(0), | ||||
| fRunning(false), | fRunning(false), | ||||
| fAdaptative(true) | fAdaptative(true) | ||||
| @@ -111,6 +111,7 @@ extern "C" | |||||
| jack_nframes_t adapted_buffer_size, | jack_nframes_t adapted_buffer_size, | ||||
| jack_nframes_t adapted_sample_rate); | jack_nframes_t adapted_sample_rate); | ||||
| SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter); | 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_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); | 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; | return 0; | ||||
| } | } | ||||
| int Restart() | |||||
| int Restart() | |||||
| { | { | ||||
| // If shutdown cb is set, then call it | // If shutdown cb is set, then call it | ||||
| if (fShutdownCallback) | if (fShutdownCallback) | ||||
| @@ -782,6 +783,16 @@ struct JackNetAdapter : public JackAudioAdapterInterface { | |||||
| { | { | ||||
| Destroy(); | 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; | 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) | SERVER_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) | ||||
| { | { | ||||
| JackNetAdapter* slave = (JackNetAdapter*)adapter; | JackNetAdapter* slave = (JackNetAdapter*)adapter; | ||||
| @@ -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 | // - 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) | //the slow mode is the safest mode because it wait twice the bandwidth relative time (send/return + process) | ||||
| /* | |||||
| if (fCycleOffset < CYCLE_OFFSET_SLOW) { | if (fCycleOffset < CYCLE_OFFSET_SLOW) { | ||||
| return 0; | return 0; | ||||
| } else { | } else { | ||||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | ||||
| } | } | ||||
| */ | |||||
| //rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||||
| rx_bytes = Recv ( rx_head->fPacketSize, 0 ); | |||||
| if (fCycleOffset != fLastfCycleOffset) | if (fCycleOffset != fLastfCycleOffset) | ||||
| jack_info("Warning : '%s' runs in slow network mode, but data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); | jack_info("Warning : '%s' runs in slow network mode, but data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset); | ||||
| @@ -39,6 +39,7 @@ JackResampler::~JackResampler() | |||||
| void JackResampler::Reset(unsigned int new_size) | void JackResampler::Reset(unsigned int new_size) | ||||
| { | { | ||||
| fRingBufferSize = new_size; | fRingBufferSize = new_size; | ||||
| jack_ringbuffer_reset(fRingBuffer); | |||||
| jack_ringbuffer_reset_size(fRingBuffer, sizeof(float) * fRingBufferSize); | jack_ringbuffer_reset_size(fRingBuffer, sizeof(float) * fRingBufferSize); | ||||
| jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize / 2)); | jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize / 2)); | ||||
| } | } | ||||
| @@ -268,6 +268,9 @@ jack_adapter_t* jack_create_adapter(int input, int output, | |||||
| */ | */ | ||||
| int jack_destroy_adapter(jack_adapter_t* adapter); | int jack_destroy_adapter(jack_adapter_t* adapter); | ||||
| void jack_flush_adapter(jack_adapter_t* adapter); | |||||
| /** | /** | ||||
| * Push input to and pull output from ringbuffer | * Push input to and pull output from ringbuffer | ||||
| * | * | ||||
| @@ -126,6 +126,7 @@ jack_ringbuffer_reset (jack_ringbuffer_t * rb) | |||||
| { | { | ||||
| rb->read_ptr = 0; | rb->read_ptr = 0; | ||||
| rb->write_ptr = 0; | rb->write_ptr = 0; | ||||
| memset(rb->buf, 0, rb->size); | |||||
| } | } | ||||
| /* Reset the read and write pointers to zero. This is not thread | /* Reset the read and write pointers to zero. This is not thread | ||||
| @@ -14,13 +14,12 @@ | |||||
| #define NUM_INPUT 0 | #define NUM_INPUT 0 | ||||
| #define NUM_OUTPUT 2 | #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 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, | ||||
| @@ -46,6 +45,13 @@ static int net_process(jack_nframes_t buffer_size, | |||||
| return 0; | 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) | static void SlaveAudioCallback(int frames, float** inputs, float** outputs, void* arg) | ||||
| { | { | ||||
| jack_adapter_push_and_pull(adapter, inputs, outputs, frames); | 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_process_callback(net, net_process, NULL); | ||||
| jack_set_net_slave_shutdown_callback(net, net_shutdown, NULL); | |||||
| if (jack_net_slave_activate(net) != 0) { | if (jack_net_slave_activate(net) != 0) { | ||||
| return -1; | return -1; | ||||
| } | } | ||||