diff --git a/common/JackCallbackNetIOAdapter.cpp b/common/JackCallbackNetIOAdapter.cpp index dee51b4f..2f7c862c 100644 --- a/common/JackCallbackNetIOAdapter.cpp +++ b/common/JackCallbackNetIOAdapter.cpp @@ -33,6 +33,7 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) { JackCallbackNetIOAdapter* adapter = static_cast(arg); float* buffer; + bool failure = false; int i; if (!adapter->fIOAdapter->IsRunning()) @@ -41,16 +42,34 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) // DLL adapter->fIOAdapter->SetCallbackTime(jack_get_time()); + // Push/pull from ringbuffer for (i = 0; i < adapter->fCaptureChannels; i++) { buffer = static_cast(jack_port_get_buffer(adapter->fCapturePortList[i], frames)); - adapter->fCaptureRingBuffer[i]->Read(buffer, frames); + if (adapter->fCaptureRingBuffer[i]->Read(buffer, frames) == 0) + failure = true; } for (i = 0; i < adapter->fPlaybackChannels; i++) { buffer = static_cast(jack_port_get_buffer(adapter->fPlaybackPortList[i], frames)); - adapter->fPlaybackRingBuffer[i]->Write(buffer, frames); + if (adapter->fPlaybackRingBuffer[i]->Write(buffer, frames) == 0) + failure = true; } + // Reset all ringbuffers in case of failure + if (failure) { + + jack_error("JackCallbackNetIOAdapter::Process ringbuffer failure... reset"); + + for (i = 0; i < adapter->fCaptureChannels; i++) { + adapter->fCaptureRingBuffer[i]->Reset(); + } + + for (i = 0; i < adapter->fPlaybackChannels; i++) { + adapter->fPlaybackRingBuffer[i]->Reset(); + } + + adapter->fIOAdapter->Reset(); + } return 0; } diff --git a/common/JackIOAdapter.h b/common/JackIOAdapter.h index ca391e10..79a608c7 100644 --- a/common/JackIOAdapter.h +++ b/common/JackIOAdapter.h @@ -79,6 +79,8 @@ namespace Jack bool IsRunning() {return fRunning;} + virtual void Reset() {fRunning = false;} + virtual int Open(); virtual int Close(); diff --git a/common/JackResampler.cpp b/common/JackResampler.cpp index aaef95f3..b7bf91e8 100644 --- a/common/JackResampler.cpp +++ b/common/JackResampler.cpp @@ -26,7 +26,7 @@ JackResampler::JackResampler():fNum(1),fDenom(1) { fRingBuffer = jack_ringbuffer_create(sizeof(float) * DEFAULT_RB_SIZE); jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2); - } +} JackResampler::~JackResampler() { @@ -34,6 +34,11 @@ JackResampler::~JackResampler() jack_ringbuffer_free(fRingBuffer); } +void JackResampler::Reset() +{ + jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2); +} + unsigned int JackResampler::ReadSpace() { return jack_ringbuffer_read_space(fRingBuffer); diff --git a/common/JackResampler.h b/common/JackResampler.h index 7d6865e9..68177205 100644 --- a/common/JackResampler.h +++ b/common/JackResampler.h @@ -43,6 +43,8 @@ namespace Jack JackResampler(); virtual ~JackResampler(); + virtual void Reset(); + virtual int ReadResample(float* buffer, unsigned int frames); virtual int WriteResample(float* buffer, unsigned int frames);