rt-vamp-plugin-sdk 0.3.1
Real-time Vamp plugin SDK for C++20
Loading...
Searching...
No Matches
PluginExt.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm> // clamp
4#include <array>
5#include <cassert>
6#include <cmath> // round
7#include <cstdint>
8#include <optional>
9#include <string_view>
10#include <vector>
11
13
14namespace rtvamp::pluginsdk {
15
27template <typename Self, uint32_t NOutputs>
28class PluginExt : public Plugin<NOutputs> {
29public:
30 explicit PluginExt(float inputSampleRate) : Plugin<NOutputs>(inputSampleRate) {}
31
32 std::optional<float> getParameter(std::string_view id) const final;
33 bool setParameter(std::string_view id, float value) final;
34
35 std::string_view getCurrentProgram() const final;
36 bool selectProgram(std::string_view name) final;
37
38 // custom logic can be implemented with following callbacks
39 virtual void onParameterChange(std::string_view id, float newValue) {}
40 virtual void onProgramChange(std::string_view newProgram) {}
41
42private:
43 static std::vector<float> defaultParameterValues();
44 static constexpr std::optional<size_t> findParameterIndex(std::string_view id);
45 static constexpr std::optional<size_t> findProgramIndex(std::string_view name);
46
47 std::vector<float> parameterValues_{defaultParameterValues()};
48 size_t programIndex_{0};
49};
50
51/* --------------------------------------- Implementation --------------------------------------- */
52
53template <typename Self, uint32_t NOutputs>
54std::optional<float> PluginExt<Self, NOutputs>::getParameter(std::string_view id) const {
55 if (const auto index = findParameterIndex(id)) {
56 return parameterValues_[index.value()];
57 }
58 return {};
59}
60
61template <typename Self, uint32_t NOutputs>
62bool PluginExt<Self, NOutputs>::setParameter(std::string_view id, float value) {
63 if (const auto index = findParameterIndex(id)) {
64 const auto& descriptor = Self::parameters[index.value()];
65
66 if (descriptor.quantizeStep) {
67 const auto quantizeStep = descriptor.quantizeStep.value();
68 value = std::round(value / quantizeStep) * quantizeStep;
69 }
70 value = std::clamp(value, descriptor.minValue, descriptor.maxValue);
71
72 parameterValues_[index.value()] = value;
73 onParameterChange(id, value);
74 return true;
75 }
76 return false;
77}
78
79template <typename Self, uint32_t NOutputs>
81 assert(programIndex_ < Self::programs.size());
82 return Self::programs[programIndex_];
83}
84
85template <typename Self, uint32_t NOutputs>
86bool PluginExt<Self, NOutputs>::selectProgram(std::string_view name) {
87 if (const auto index = findProgramIndex(name)) {
88 programIndex_ = index.value();
89 onProgramChange(name);
90 return true;
91 }
92 return false;
93}
94
95template <typename Self, uint32_t NOutputs>
97 std::vector<float> values(Self::parameters.size());
98 for (size_t i = 0; i < Self::parameters.size(); ++i) {
99 values[i] = Self::parameters[i].defaultValue;
100 }
101 return values;
102}
103
104template <typename Self, uint32_t NOutputs>
105constexpr std::optional<size_t> PluginExt<Self, NOutputs>::findParameterIndex(std::string_view id) {
106 for (size_t i = 0; i < Self::parameters.size(); ++i) {
107 if (Self::parameters[i].identifier == id) {
108 return i;
109 }
110 }
111 return {};
112}
113
114template <typename Self, uint32_t NOutputs>
115constexpr std::optional<size_t> PluginExt<Self, NOutputs>::findProgramIndex(std::string_view name) {
116 for (size_t i = 0; i < Self::programs.size(); ++i) {
117 if (Self::programs[i] == name) {
118 return i;
119 }
120 }
121 return {};
122}
123
124} // namespace rtvamp::pluginsdk
Extended plugin base class with automatic parameter / program handling.
Definition PluginExt.hpp:28
bool selectProgram(std::string_view name) final
Definition PluginExt.hpp:86
bool setParameter(std::string_view id, float value) final
Definition PluginExt.hpp:62
virtual void onParameterChange(std::string_view id, float newValue)
Definition PluginExt.hpp:39
PluginExt(float inputSampleRate)
Definition PluginExt.hpp:30
std::string_view getCurrentProgram() const final
Definition PluginExt.hpp:80
std::optional< float > getParameter(std::string_view id) const final
Definition PluginExt.hpp:54
virtual void onProgramChange(std::string_view newProgram)
Definition PluginExt.hpp:40
Base class to implement feature extraction plugins.
Definition Plugin.hpp:80
Definition EntryPoint.hpp:8