From e63c93e146d919c21eb0d4e506b4583a8c23f42c Mon Sep 17 00:00:00 2001 From: zetaPRIME Date: Wed, 23 Mar 2022 18:44:04 -0400 Subject: [PATCH] ParameterPort --- xybrid/data/node.cpp | 1 + xybrid/data/porttypes.cpp | 30 ++++++++++++++++++++++++++++++ xybrid/data/porttypes.h | 16 ++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/xybrid/data/node.cpp b/xybrid/data/node.cpp index 4d6b4e1..8f5f0db 100644 --- a/xybrid/data/node.cpp +++ b/xybrid/data/node.cpp @@ -81,6 +81,7 @@ void Port::cleanConnections() { std::shared_ptr Port::makePort(DataType dt) { if (dt == Audio) return std::make_shared(); if (dt == Command) return std::make_shared(); + if (dt == Parameter) return std::make_shared(); // fallback return std::make_shared(); } diff --git a/xybrid/data/porttypes.cpp b/xybrid/data/porttypes.cpp index 51ca3c9..a41e6e8 100644 --- a/xybrid/data/porttypes.cpp +++ b/xybrid/data/porttypes.cpp @@ -87,3 +87,33 @@ void CommandPort::push(std::vector v) { data = static_cast(audioEngine->tickAlloc(dataSize)); memcpy(data, v.data(), dataSize); } + +void ParameterPort::pull() { + auto t = audioEngine->curTickId(); + if (tickUpdatedOn == t) return; + lock.lock(); + if (tickUpdatedOn == t) { lock.unlock(); return; } // someone else got here before us + + buf = nullptr; + if (type == Input) { + if (isConnected()) { + if (auto p = std::static_pointer_cast(connections[0].lock()); p) { + p->pull(); + buf = p->buf; + size = p->size; + } + } + } else if (auto pt = std::static_pointer_cast(passthroughTo.lock()); pt && pt->dataType() == Parameter) { + pt->pull(); + buf = pt->buf; + size = pt->size; + } + if (!buf) { // no buffer pulled from input or passthrough; create a new one + size = audioEngine->curTickSize(); + buf = static_cast(audioEngine->tickAlloc(size * sizeof(double))); + std::fill_n(buf, size, std::numeric_limits::quiet_NaN()); + } + + tickUpdatedOn = t; + lock.unlock(); +} diff --git a/xybrid/data/porttypes.h b/xybrid/data/porttypes.h index 2cb356a..a3fd79e 100644 --- a/xybrid/data/porttypes.h +++ b/xybrid/data/porttypes.h @@ -57,4 +57,20 @@ namespace Xybrid::Data { /// Push a data buffer void push(std::vector); }; + + class ParameterPort : public Port { + public: + double* buf; + size_t size; + + ParameterPort() = default; + ~ParameterPort() override = default; + + double& operator[](size_t at) { return buf[at]; } + double& at(size_t at) { return buf[at]; } + + Port::DataType dataType() const override { return Port::Parameter; } + + void pull() override; + }; }