From 4d4721f984e0a22a9874b5d4c4c9ee6674fca856 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 20 Mar 2017 02:07:19 +0100 Subject: Fix event timing with PortAudio driver --- src/server/PortAudioDriver.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'src/server/PortAudioDriver.cpp') diff --git a/src/server/PortAudioDriver.cpp b/src/server/PortAudioDriver.cpp index 396ec4d4..5ceb0aa8 100644 --- a/src/server/PortAudioDriver.cpp +++ b/src/server/PortAudioDriver.cpp @@ -34,6 +34,7 @@ #include "GraphImpl.hpp" #include "PortAudioDriver.hpp" #include "PortImpl.hpp" +#include "FrameTimer.hpp" #include "ThreadManager.hpp" #include "util.hpp" @@ -53,12 +54,13 @@ pa_error(const char* msg, PaError err) PortAudioDriver::PortAudioDriver(Engine& engine) : _engine(engine) , _sem(0) - , _flag(false) + , _stream(nullptr) , _seq_size(4096) - , _block_length(4096) + , _block_length(1024) , _sample_rate(48000) , _n_inputs(0) , _n_outputs(0) + , _flag(false) , _is_activated(false) { } @@ -86,11 +88,18 @@ PortAudioDriver::attach() return pa_error("No default output device", paDeviceUnavailable); } - const PaDeviceInfo* in_dev = Pa_GetDeviceInfo(_inputParameters.device); + const PaDeviceInfo* in_dev = Pa_GetDeviceInfo(_inputParameters.device); + + /* TODO: It looks like it is somehow actually impossible to request the + best/native buffer size then retrieve what it actually is with + PortAudio. How such a glaring useless flaw exists in such a widespread + library is beyond me... */ + + _sample_rate = in_dev->defaultSampleRate; + + _timer = std::unique_ptr( + new FrameTimer(_block_length, _sample_rate)); - _sample_rate = in_dev->defaultSampleRate; - _block_length = 4096; // FIXME - _seq_size = 4096; return true; } @@ -152,7 +161,7 @@ PortAudioDriver::deactivate() SampleCount PortAudioDriver::frame_time() const { - return _engine.run_context().start(); + return _timer->frame_time(_engine.current_time()) + _engine.block_length(); } EnginePort* @@ -268,6 +277,7 @@ PortAudioDriver::process_cb(const void* inputs, PaStreamCallbackFlags flags) { _engine.advance(nframes); + _timer->update(_engine.current_time(), _engine.run_context().start()); // Read input for (auto& p : _ports) { -- cgit v1.2.1