diff --git a/common/JackCallbackNetIOAdapter.cpp b/common/JackCallbackNetIOAdapter.cpp index 374b67db..0d3089c0 100644 --- a/common/JackCallbackNetIOAdapter.cpp +++ b/common/JackCallbackNetIOAdapter.cpp @@ -38,6 +38,8 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) if (!adapter->fIOAdapter->IsRunning()) return 0; + + adapter->fIOAdapter->SetCallbackTime(jack_get_time()); for (i = 0; i < adapter->fCaptureChannels; i++) { @@ -45,7 +47,7 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) size_t len = jack_ringbuffer_read_space(adapter->fCaptureRingBuffer); if (len < frames * sizeof(float)) { - jack_error("JackCallbackNetIOAdapter::Process : consumer too slow, skip frames = %d", (frames * sizeof(float)) - len); + jack_error("JackCallbackNetIOAdapter::Process : consumer too slow, skip frames = %d", frames - len / sizeof(float)); jack_ringbuffer_read(adapter->fCaptureRingBuffer, buffer, len); } else { jack_ringbuffer_read(adapter->fCaptureRingBuffer, buffer, frames * sizeof(float)); @@ -58,7 +60,7 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) size_t len = jack_ringbuffer_write_space(adapter->fPlaybackRingBuffer); if (len < frames * sizeof(float)) { - jack_error("JackCallbackNetIOAdapter::Process : producer too slow, missing frames = %d", (frames * sizeof(float)) - len); + jack_error("JackCallbackNetIOAdapter::Process : producer too slow, missing frames = %d", frames - len / sizeof(float)); jack_ringbuffer_write(adapter->fPlaybackRingBuffer, buffer, len); } else { jack_ringbuffer_write(adapter->fPlaybackRingBuffer, buffer, frames * sizeof(float)); diff --git a/common/JackIOAdapter.h b/common/JackIOAdapter.h index 211e194a..96f3af9e 100644 --- a/common/JackIOAdapter.h +++ b/common/JackIOAdapter.h @@ -21,6 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define __JackIOAdapter__ #include "ringbuffer.h" +#include "jack.h" +#include "JackError.h" namespace Jack { @@ -34,6 +36,8 @@ namespace Jack int fPlaybackChannels; int fBufferSize; float fSampleRate; + jack_time_t fCallbackTime; + jack_time_t fFirstCallbackTime; jack_ringbuffer_t* fCaptureRingBuffer; jack_ringbuffer_t* fPlaybackRingBuffer; @@ -46,6 +50,7 @@ namespace Jack fPlaybackChannels(output), fBufferSize(buffer_size), fSampleRate(sample_rate), + fCallbackTime(0), fRunning(false) {} virtual ~JackIOAdapterInterface() @@ -66,6 +71,11 @@ namespace Jack { fBufferSize = buffer_size; } + + virtual void SetCallbackTime(jack_time_t usec) + { + fCallbackTime = usec; + } }; } diff --git a/windows/JackPortAudioIOAdapter.cpp b/windows/JackPortAudioIOAdapter.cpp index 268bccf0..c8987ea3 100644 --- a/windows/JackPortAudioIOAdapter.cpp +++ b/windows/JackPortAudioIOAdapter.cpp @@ -34,7 +34,12 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, float** paBuffer; char* buffer; - adapter->fRunning = true; + if (!adapter->fRunning) { + adapter->fRunning = true; + adapter->fFirstCallbackTime = jack_get_time(); + } + + jack_log("Coef %f", double(jack_get_time() - adapter->fFirstCallbackTime) / double( adapter->fCallbackTime - adapter->fFirstCallbackTime)); paBuffer = (float**)inputBuffer; for (int i = 0; i < adapter->fCaptureChannels; i++) { @@ -43,7 +48,7 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, size_t len = jack_ringbuffer_write_space(adapter->fCaptureRingBuffer); if (len < framesPerBuffer * sizeof(float)) { - jack_error("JackPortAudioIOAdapter::Process : producer too slow, missing frames = %d", (framesPerBuffer * sizeof(float)) - len); + jack_error("JackPortAudioIOAdapter::Process : producer too slow, missing frames = %d", framesPerBuffer - len / sizeof(float)); jack_ringbuffer_write(adapter->fCaptureRingBuffer, buffer, len); } else { jack_ringbuffer_write(adapter->fCaptureRingBuffer, buffer, framesPerBuffer * sizeof(float)); @@ -57,7 +62,7 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, size_t len = jack_ringbuffer_read_space(adapter->fPlaybackRingBuffer); if (len < framesPerBuffer * sizeof(float)) { - jack_error("JackPortAudioIOAdapter::Process : consumer too slow, skip frames = %d", (framesPerBuffer * sizeof(float)) - len); + jack_error("JackPortAudioIOAdapter::Process : consumer too slow, skip frames = %d", framesPerBuffer - len / sizeof(float)); jack_ringbuffer_read(adapter->fPlaybackRingBuffer, buffer, len); } else { jack_ringbuffer_read(adapter->fPlaybackRingBuffer, buffer, framesPerBuffer * sizeof(float));