diff --git a/linux/alsa/JackAlsaIOAdapter.cpp b/linux/alsa/JackAlsaIOAdapter.cpp index cdb4ca1d..e2bbb097 100644 --- a/linux/alsa/JackAlsaIOAdapter.cpp +++ b/linux/alsa/JackAlsaIOAdapter.cpp @@ -55,17 +55,20 @@ bool JackAlsaIOAdapter::Execute() if (fAudioInterface.read() < 0) return false; + bool failure = false; jack_nframes_t time1, time2; ResampleFactor(time1, time2); for (int i = 0; i < fCaptureChannels; i++) { fCaptureRingBuffer[i]->SetRatio(time1, time2); - fCaptureRingBuffer[i]->WriteResample(fAudioInterface.fInputSoftChannels[i], fBufferSize); - } + if (fCaptureRingBuffer[i]->WriteResample(fAudioInterface.fInputSoftChannels[i], fBufferSize) < fBufferSize) + failure = true; + } for (int i = 0; i < fPlaybackChannels; i++) { fPlaybackRingBuffer[i]->SetRatio(time2, time1); - fPlaybackRingBuffer[i]->ReadResample(fAudioInterface.fOutputSoftChannels[i], fBufferSize); + if (fPlaybackRingBuffer[i]->ReadResample(fAudioInterface.fOutputSoftChannels[i], fBufferSize) < fBufferSize) + failure = true; } #ifdef DEBUG @@ -75,7 +78,12 @@ bool JackAlsaIOAdapter::Execute() if (fAudioInterface.write() < 0) return false; - + + // Reset all ringbuffers in case of failure + if (failure) { + jack_error("JackAlsaIOAdapter::Execute ringbuffer failure... reset"); + adapter->ResetRingBuffers(); + } return true; }