clap

CLAP Audio Plugin API
Log | Files | Refs | README | LICENSE

commit 8a28dc58aa077b6c517c62b6ba0e0a00660b7d85
parent 906fd06eb2bbee2f736a83cc773423cc1c481cf9
Author: Alexandre BIQUE <bique.alexandre@gmail.com>
Date:   Tue, 14 Sep 2021 21:33:45 +0200

Add a param queue

Diffstat:
Aexamples/common/param-queue.hh | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+), 0 deletions(-)

diff --git a/examples/common/param-queue.hh b/examples/common/param-queue.hh @@ -0,0 +1,51 @@ +#pragma once + +#include <array> +#include <atomic> +#include <functional> + +#include <clap/all.h> + +template <typename T, size_t CAPACITY> +class ParamQueue { +public: + using value_type = T; + + ParamQueue() = default; + + void push(const T &value) { + int w; // write element + int wn; // next write element + + do { + w = _writeOffset.load(); + wn = (w + 1) % CAPACITY; + } while (wn == _readOffset); // wait until there is space + + _data[w] = value; + _writeOffset = wn; + } + + bool tryPop(T& value) { + int r = _readOffset; + + if (r == _writeOffset) + return false; // empty + + int rn = (r + 1) % CAPACITY; + value = _data[r]; + _readOffset = rn; + return true; + } + + void reset() + { + _writeOffset = 0; + _readOffset = 0; + } + +private: + std::array<T, CAPACITY> _data; + std::atomic<int> _writeOffset = {0}; + std::atomic<int> _readOffset = {0}; +}; +\ No newline at end of file