LMMS
Loading...
Searching...
No Matches
plugin_tools.h
Go to the documentation of this file.
1/* Calf DSP plugin pack
2 * Tools to use in plugins
3 *
4 * Copyright (C) 2001-2010 Krzysztof Foltman, Markus Schmidt, Thor Harald Johansen and others
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02111-1307, USA.
20 */
21#ifndef CALF_PLUGIN_TOOLS_H
22#define CALF_PLUGIN_TOOLS_H
23
24#include <config.h>
25
26#include "giface.h"
27#include "vumeter.h"
28
29namespace calf_plugins {
30
32{
33public:
40
41 std::vector<meter_data> meters;
42 float *const *params;
43
44 void init(float *const *prms, int *lvls, int *clps, int length, uint32_t srate) {
45 meters.resize(length);
46 for (int i = 0; i < length; i++) {
48 md.level_idx = lvls[i];
49 md.clip_idx = clps[i];
50 md.meter.set_reverse(lvls[i] < -1);
51 md.meter.set_falloff(1.f, srate);
52 }
53 params = prms;
54 }
55 void process(float *values) {
56 for (size_t i = 0; i < meters.size(); ++i) {
58 if ((md.level_idx != -1 && params[(int)abs(md.level_idx)] != NULL) ||
59 (md.clip_idx != -1 && params[(int)abs(md.clip_idx)] != NULL))
60 {
61 md.meter.process(values[i]);
62 if (md.level_idx != -1 && params[(int)abs(md.level_idx)])
63 *params[(int)abs(md.level_idx)] = md.meter.level;
64 if (md.clip_idx != -1 && params[(int)abs(md.clip_idx)])
65 *params[(int)abs(md.clip_idx)] = md.meter.clip > 0 ? 1.f : 0.f;
66 }
67 }
68 }
69 void fall(unsigned int numsamples) {
70 for (size_t i = 0; i < meters.size(); ++i)
71 if (meters[i].level_idx != -1)
72 meters[i].meter.fall(numsamples);
73 }
74};
75
77{
78 void send_configure(const char *key, const char *value)
79 {
80 printf("send_configure key=%s value=%s\n", key, value);
81 }
82};
83
84template<class Meter>
86{
87 typedef Meter meter;
90 {
91 reset();
92 }
93 void reset()
94 {
95 vumeter_in.reset();
96 vumeter_out.reset();
97 }
98 void set_sample_rate(double sample_rate)
99 {
100 vumeter_in.set_falloff(0.f, sample_rate);
101 vumeter_out.copy_falloff(vumeter_in);
102 }
103};
104
106template<class Metadata>
108{
109public:
110 inline void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
111 {
112 if (params[Metadata::param_meter_in] || params[Metadata::param_clip_in]) {
113 if (inputs)
114 vumeter_in.update_stereo(inputs[0] ? inputs[0] + offset : NULL, inputs[1] ? inputs[1] + offset : NULL, nsamples);
115 else
116 vumeter_in.update_zeros(nsamples);
117 if (params[Metadata::param_meter_in])
118 *params[Metadata::param_meter_in] = vumeter_in.level;
119 if (params[Metadata::param_clip_in])
120 *params[Metadata::param_clip_in] = vumeter_in.clip > 0 ? 1.f : 0.f;
121 }
122 if (params[Metadata::param_meter_out] || params[Metadata::param_clip_out]) {
123 if (outputs)
124 vumeter_out.update_stereo(outputs[0] ? outputs[0] + offset : NULL, outputs[1] ? outputs[1] + offset : NULL, nsamples);
125 else
126 vumeter_out.update_zeros(nsamples);
127 if (params[Metadata::param_meter_out])
128 *params[Metadata::param_meter_out] = vumeter_out.level;
129 if (params[Metadata::param_clip_out])
130 *params[Metadata::param_clip_out] = vumeter_out.clip > 0 ? 1.f : 0.f;
131 }
132 }
133 void bypassed(float *const *params, unsigned int nsamples)
134 {
135 reset();
136 process(params, NULL, NULL, 0, nsamples);
137 }
138};
139
141template<class Metadata>
143{
144public:
145 inline void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
146 {
147 if (params[Metadata::param_meter_in] || params[Metadata::param_clip_in]) {
148 if (inputs)
149 vumeter_in.update_stereo(inputs[0] ? inputs[0] + offset : NULL, NULL, nsamples);
150 else
151 vumeter_in.update_zeros(nsamples);
152 if (params[Metadata::param_meter_in])
153 *params[Metadata::param_meter_in] = vumeter_in.level;
154 if (params[Metadata::param_clip_in])
155 *params[Metadata::param_clip_in] = vumeter_in.clip > 0 ? 1.f : 0.f;
156 }
157 if (params[Metadata::param_meter_out] || params[Metadata::param_clip_out]) {
158 if (outputs)
159 vumeter_out.update_stereo(outputs[0] ? outputs[0] + offset : NULL, NULL, nsamples);
160 else
161 vumeter_out.update_zeros(nsamples);
162 if (params[Metadata::param_meter_out])
163 *params[Metadata::param_meter_out] = vumeter_out.level;
164 if (params[Metadata::param_clip_out])
165 *params[Metadata::param_clip_out] = vumeter_out.clip > 0 ? 1.f : 0.f;
166 }
167 }
168 void bypassed(float *const *params, unsigned int nsamples)
169 {
170 reset();
171 process(params, NULL, NULL, 0, nsamples);
172 }
173};
174
175
177template<class Metadata>
178class dual_in_out_metering: public in_out_metering_base<dsp::dual_vumeter>
179{
180public:
181 inline void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
182 {
183 if (params[Metadata::param_meter_inL] || params[Metadata::param_clip_inL] || params[Metadata::param_meter_inR] || params[Metadata::param_clip_inR]) {
184 if (inputs)
185 vumeter_in.update_stereo(inputs[0] ? inputs[0] + offset : NULL, inputs[1] ? inputs[1] + offset : NULL, nsamples);
186 else
187 vumeter_in.update_zeros(nsamples);
188 if (params[Metadata::param_meter_inL])
189 *params[Metadata::param_meter_inL] = vumeter_in.left.level;
190 if (params[Metadata::param_meter_inR])
191 *params[Metadata::param_meter_inR] = vumeter_in.right.level;
192 if (params[Metadata::param_clip_inL])
193 *params[Metadata::param_clip_inL] = vumeter_in.left.clip > 0 ? 1.f : 0.f;
194 if (params[Metadata::param_clip_inR])
195 *params[Metadata::param_clip_inR] = vumeter_in.right.clip > 0 ? 1.f : 0.f;
196 }
197 if (params[Metadata::param_meter_outL] || params[Metadata::param_clip_outL] || params[Metadata::param_meter_outR] || params[Metadata::param_clip_outR]) {
198 if (outputs)
199 vumeter_out.update_stereo(outputs[0] ? outputs[0] + offset : NULL, outputs[1] ? outputs[1] + offset : NULL, nsamples);
200 else
201 vumeter_out.update_zeros(nsamples);
202 if (params[Metadata::param_meter_outL])
203 *params[Metadata::param_meter_outL] = vumeter_out.left.level;
204 if (params[Metadata::param_meter_outR])
205 *params[Metadata::param_meter_outR] = vumeter_out.right.level;
206 if (params[Metadata::param_clip_outL])
207 *params[Metadata::param_clip_outL] = vumeter_out.left.clip > 0 ? 1.f : 0.f;
208 if (params[Metadata::param_clip_outR])
209 *params[Metadata::param_clip_outR] = vumeter_out.right.clip > 0 ? 1.f : 0.f;
210 }
211 }
212 void bypassed(float *const *params, unsigned int nsamples)
213 {
214 reset();
215 process(params, NULL, NULL, 0, nsamples);
216 }
217};
218
219};
220
221#endif
#define NULL
Definition CarlaBridgeFormat.cpp:30
float abs(const fft_t *freqs, off_t x)
Definition OscilGen.cpp:52
Universal dual level metering for a specific plugin.
Definition plugin_tools.h:179
void bypassed(float *const *params, unsigned int nsamples)
Definition plugin_tools.h:212
void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
Definition plugin_tools.h:181
Universal single stereo level metering for a specific plugin.
Definition plugin_tools.h:143
void bypassed(float *const *params, unsigned int nsamples)
Definition plugin_tools.h:168
void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
Definition plugin_tools.h:145
Universal single stereo level metering for a specific plugin.
Definition plugin_tools.h:108
void process(float *const *params, const float *const *inputs, const float *const *outputs, unsigned int offset, unsigned int nsamples)
Definition plugin_tools.h:110
void bypassed(float *const *params, unsigned int nsamples)
Definition plugin_tools.h:133
Definition plugin_tools.h:32
std::vector< meter_data > meters
Definition plugin_tools.h:41
void init(float *const *prms, int *lvls, int *clps, int length, uint32_t srate)
Definition plugin_tools.h:44
void fall(unsigned int numsamples)
Definition plugin_tools.h:69
float *const * params
Definition plugin_tools.h:42
void process(float *values)
Definition plugin_tools.h:55
unsigned md
Definition inflate.c:944
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
unsigned int uint32_t
Definition mid.cpp:100
Definition benchmark.cpp:53
png_uint_32 length
Definition png.c:2247
Definition plugin_tools.h:77
void send_configure(const char *key, const char *value)
Definition plugin_tools.h:78
meter vumeter_in
Definition plugin_tools.h:88
void set_sample_rate(double sample_rate)
Definition plugin_tools.h:98
Meter meter
Definition plugin_tools.h:87
in_out_metering_base()
Definition plugin_tools.h:89
void reset()
Definition plugin_tools.h:93
meter vumeter_out
Definition plugin_tools.h:88
'may receive configure variables' interface
Definition giface.h:291
Definition plugin_tools.h:35
dsp::vumeter meter
Definition plugin_tools.h:38
int level_idx
Definition plugin_tools.h:36
int clip_idx
Definition plugin_tools.h:37
Peak meter class.
Definition vumeter.h:30
ZCONST char * key
Definition crypt.c:587
typedef int(UZ_EXP MsgFn)()