From c6955d4994e7b699e69227b17d8b74aefe0f5028 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 19 Oct 2018 18:10:19 +0200 Subject: [PATCH] Allow Lua DSP processors to report latency --- libs/ardour/ardour/luaproc.h | 6 +++++- libs/ardour/luaproc.cc | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h index 8ac27095ab..45b730ff73 100644 --- a/libs/ardour/ardour/luaproc.h +++ b/libs/ardour/ardour/luaproc.h @@ -85,7 +85,7 @@ public: void cleanup () { } int set_block_size (pframes_t /*nframes*/) { return 0; } - samplecnt_t signal_latency() const { return 0; } + samplecnt_t signal_latency() const { return _signal_latency; } int connect_and_run (BufferSet& bufs, samplepos_t start, samplepos_t end, double speed, @@ -148,6 +148,7 @@ private: #endif LuaState lua; luabridge::LuaRef * _lua_dsp; + luabridge::LuaRef * _lua_latency; std::string _script; std::string _origin; std::string _docs; @@ -176,6 +177,8 @@ private: std::map _param_doc; uint32_t _designated_bypass_port; + samplecnt_t _signal_latency; + float* _control_data; float* _shadow_data; @@ -192,6 +195,7 @@ private: bool _has_midi_input; bool _has_midi_output; + #ifdef WITH_LUAPROC_STATS int64_t _stats_avg[2]; int64_t _stats_max[2]; diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index 4e2b32c838..ec13efb1bf 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -54,10 +54,12 @@ LuaProc::LuaProc (AudioEngine& engine, , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool)) #endif , _lua_dsp (0) + , _lua_latency (0) , _script (script) , _lua_does_channelmapping (false) , _lua_has_inline_display (false) , _designated_bypass_port (UINT32_MAX) + , _signal_latency (0) , _control_data (0) , _shadow_data (0) , _configured (false) @@ -85,11 +87,13 @@ LuaProc::LuaProc (const LuaProc &other) , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool)) #endif , _lua_dsp (0) + , _lua_latency (0) , _script (other.script ()) , _origin (other._origin) , _lua_does_channelmapping (false) , _lua_has_inline_display (false) , _designated_bypass_port (UINT32_MAX) + , _signal_latency (0) , _control_data (0) , _shadow_data (0) , _configured (false) @@ -125,6 +129,7 @@ LuaProc::~LuaProc () { #endif lua.do_command ("collectgarbage();"); delete (_lua_dsp); + delete (_lua_latency); delete [] _control_data; delete [] _shadow_data; } @@ -236,6 +241,11 @@ LuaProc::load_script () assert (0); } + luabridge::LuaRef lua_dsp_latency = luabridge::getGlobal (L, "dsp_latency"); + if (lua_dsp_latency.type () == LUA_TFUNCTION) { + _lua_latency = new luabridge::LuaRef (lua_dsp_latency); + } + // initialize the DSP if needed luabridge::LuaRef lua_dsp_init = luabridge::getGlobal (L, "dsp_init"); if (lua_dsp_init.type () == LUA_TFUNCTION) { @@ -735,6 +745,11 @@ LuaProc::connect_and_run (BufferSet& bufs, } } } + + if (_lua_latency) { + _signal_latency = (*_lua_latency)(); + } + } catch (luabridge::LuaException const& e) { PBD::error << "LuaException: " << e.what () << "\n"; #ifndef NDEBUG