From b4a0c1e95a95cae8087d5dc1814084af6297b98f Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 20 Apr 2011 08:49:14 +0000 Subject: [PATCH] Add XRun detection in PortAudio driver. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4332 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 4 ++++ common/JackNetTool.h | 14 ++++++++------ windows/portaudio/JackPortAudioDriver.cpp | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 31928bb8..b4e0be9c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,10 @@ Valerio Pilo Jackdmp changes log --------------------------- +2011-04-20 Stephane Letz + + * Add XRun detection in PortAudio driver. + 2011-04-18 Stephane Letz * JackWeakAPI.cpp renamed in JackWeakAPI.c. diff --git a/common/JackNetTool.h b/common/JackNetTool.h index b854230e..585ec9f1 100644 --- a/common/JackNetTool.h +++ b/common/JackNetTool.h @@ -417,21 +417,23 @@ namespace Jack //network<->buffer int RenderFromNetwork(char* net_buffer, int cycle, int subcycle, size_t copy_size) { - for ( int port_index = 0; port_index < fNPorts; port_index++ ) { + for (int port_index = 0; port_index < fNPorts; port_index++) { float* src = (float*)(net_buffer + port_index * fSubPeriodBytesSize); float* dst = (float*)(fPortBuffer[port_index] + subcycle * fSubPeriodSize); for (unsigned int sample = 0; sample < fSubPeriodBytesSize / sizeof(float); sample++) { dst[sample] = SwapFloat(src[sample]); } } - + if (subcycle != fLastSubCycle + 1) { + jack_error("Packet(s) missing from... %d %d", fLastSubCycle, subcycle); + } + fLastSubCycle = subcycle; return copy_size; } int RenderToNetwork(char* net_buffer, int subcycle, size_t total_size) { - - for ( int port_index = 0; port_index < fNPorts; port_index++ ) { + for (int port_index = 0; port_index < fNPorts; port_index++) { float* src = (float*)(fPortBuffer[port_index] + subcycle * fSubPeriodSize); float* dst = (float*)(net_buffer + port_index * fSubPeriodBytesSize); for (unsigned int sample = 0; sample < fSubPeriodBytesSize / sizeof(float); sample++) { @@ -444,12 +446,12 @@ namespace Jack #else - int RenderFromJackPorts () + int RenderFromJackPorts() { return fNPorts * fSubPeriodBytesSize; // in bytes } - int RenderToJackPorts () + int RenderToJackPorts() { fLastSubCycle = -1; return fPeriodSize * sizeof(sample_t); // in bytes; TODO diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index 1cacd7f2..5582b374 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -40,6 +40,25 @@ namespace Jack JackPortAudioDriver* driver = (JackPortAudioDriver*)userData; driver->fInputBuffer = (jack_default_audio_sample_t**)inputBuffer; driver->fOutputBuffer = (jack_default_audio_sample_t**)outputBuffer; + + if (statusFlags) { + if (statusFlags & paOutputUnderflow) + jack_error("JackPortAudioDriver::Render paOutputUnderflow"); + if (statusFlags & paInputUnderflow) + jack_error("JackPortAudioDriver::Render paInputUnderflow"); + if (statusFlags & paOutputOverflow) + jack_error("JackPortAudioDriver::Render paOutputOverflow"); + if (statusFlags & paInputOverflow) + jack_error("JackPortAudioDriver::Render paInputOverflow"); + if (statusFlags & paPrimingOutput) + jack_error("JackPortAudioDriver::Render paOutputUnderflow"); + + if (statusFlags != paPrimingOutput) { + jack_time_t cur_time = GetMicroSeconds(); + driver->NotifyXRun(cur_time, float(cur_time - driver->fBeginDateUst)); // Better this value than nothing... + } + } + // Setup threadded based log function set_threaded_log_function(); driver->CycleTakeBeginTime();