1 /*
2  * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3  *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
4  *
5  * This file is part of lsp-plugins
6  * Created on: 07 апр. 2016 г.
7  *
8  * lsp-plugins is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * any later version.
12  *
13  * lsp-plugins is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with lsp-plugins. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #ifndef METADATA_PORTS_H_
23 #define METADATA_PORTS_H_
24 
25 // Port definitions for metadata
26 #define AUDIO_INPUT(id, label) \
27     { id, label, U_NONE, R_AUDIO, F_IN, 0, 0, 0, 0, NULL, NULL    }
28 #define AUDIO_OUTPUT(id, label) \
29     { id, label, U_NONE, R_AUDIO, F_OUT, 0, 0, 0, 0, NULL, NULL    }
30 #define MIDI_CHANNEL(id, direction, label) \
31     { id, label, U_NONE, R_MIDI, direction, 0, 0, 0, 0, NULL, NULL    }
32 #define OSC_CHANNEL(id, direction, label) \
33     { id, label, U_NONE, R_OSC, direction, 0, 0, 0, 0, NULL, NULL    }
34 #define FILE_CHANNEL(id, label) \
35     { id, label, U_ENUM, R_CONTROL, F_IN | F_INT, 0, 0, 0, 0, file_channels, NULL }
36 #define AMP_GAIN(id, label, dfl, max) \
37     { id, label, U_GAIN_AMP, R_CONTROL, F_IN | F_LOG | F_UPPER | F_LOWER | F_STEP, 0, max, dfl, GAIN_AMP_S_0_5_DB, NULL, NULL }
38 #define AMP_GAIN1(id, label, dfl)  AMP_GAIN(id, label, dfl, 1.0f)
39 #define AMP_GAIN10(id, label, dfl)  AMP_GAIN(id, label, dfl, 10.0f)
40 #define AMP_GAIN100(id, label, dfl)  AMP_GAIN(id, label, dfl, 100.0f)
41 #define AMP_GAIN1000(id, label, dfl)  AMP_GAIN(id, label, dfl, 1000.0f)
42 #define AMP_GAIN_RANGE(id, label, dfl, min, max) \
43     { id, label, U_GAIN_AMP, R_CONTROL, F_IN | F_LOG | F_UPPER | F_LOWER | F_STEP, min, max, dfl, GAIN_AMP_S_0_5_DB, NULL, NULL }
44 #define STATUS(id, label) \
45     { id, label, U_NONE, R_METER, F_OUT | F_INT | F_UPPER | F_LOWER, 0, STATUS_MAX, STATUS_UNSPECIFIED, 0, NULL, NULL }
46 #define MESH(id, label, dim, points) \
47     { id, label, U_NONE, R_MESH, F_OUT, 0.0, 0.0, points, dim, NULL, NULL }
48 #define STREAM(id, label, dim, frames, capacity) \
49     { id, label, U_NONE, R_STREAM, F_OUT, dim, frames, capacity, 0.0f, NULL, NULL }
50 #define FBUFFER(id, label, rows, cols) \
51     { id, label, U_NONE, R_FBUFFER, F_OUT, 0.0, 0.0, rows, cols, NULL, NULL }
52 #define PATH(id, label) \
53     { id, label, U_STRING, R_PATH, F_IN, 0, 0, 0, 0, NULL, NULL }
54 #define TRIGGER(id, label)  \
55     { id, label, U_BOOL, R_CONTROL, F_IN | F_TRG, 0, 0, 0.0f, 0, NULL, NULL }
56 #define SWITCH(id, label, dfl)  \
57     { id, label, U_BOOL, R_CONTROL, F_IN, 0, 0, dfl, 0, NULL, NULL }
58 #define COMBO(id, label, dfl, list) \
59     { id, label, U_ENUM, R_CONTROL, F_IN, 0, 0, dfl, 0, list, NULL }
60 #define COMBO_START(id, label, dfl, list, min) \
61     { id, label, U_ENUM, R_CONTROL, F_IN | F_MIN, min, 0, dfl, 0, list, NULL }
62 #define BLINK(id, label) \
63     { id, label, U_BOOL, R_METER, F_OUT, 0, 0, 0, 0, NULL, NULL }
64 #define KNOB(id, label, units, min, max, dfl, step) \
65     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, \
66         min, max, dfl, step, NULL, NULL }
67 #define CKNOB(id, label, units, min, max, dfl, step) \
68     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, \
69         min, max, dfl, step, NULL, NULL }
70 #define CONTROL(id, label, units, limits) \
71     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, \
72         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
73 #define CONTROL_DFL(id, label, units, limits, dfl) \
74     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, \
75         limits ## _MIN, limits ## _MAX, dfl, limits ## _STEP, NULL, NULL }
76 #define INT_CONTROL(id, label, units, limits) \
77     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_INT, \
78         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
79 #define HUE_CTL(id, label, dfl) \
80     { id, label, U_NONE, R_CONTROL, F_IN | F_UPPER | F_LOWER | F_STEP | F_CYCLIC, 0.0f, 1.0f, (dfl), 0.25f/360.0f, NULL     }
81 #define CYC_CONTROL(id, label, units, limits) \
82     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, \
83         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
84 
85 #define UNLIMITED_METER(id, label, units, dfl) \
86     { id, label, units, R_METER, F_OUT, 0.0f, 0.0f, dfl, 0.0f, NULL, NULL }
87 #define METER(id, label, units, limits) \
88     { id, label, units, R_METER, F_OUT | F_LOWER | F_UPPER | F_STEP, \
89         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
90 #define METER_MINMAX(id, label, units, min, max) \
91     { id, label, units, R_METER, F_OUT | F_LOWER | F_UPPER | F_STEP, \
92         min, max, min, 0.0f, NULL, NULL }
93 #define LOG_CONTROL(id, label, units, limits) \
94     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_LOG, \
95         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
96 #define EXT_LOG_CONTROL(id, label, units, limits) \
97     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_LOG | F_EXT, \
98         limits ## _MIN, limits ## _MAX, limits ## _DFL, limits ## _STEP, NULL, NULL }
99 #define LOG_CONTROL_DFL(id, label, units, limits, dfl) \
100     { id, label, units, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_LOG, \
101         limits ## _MIN, limits ## _MAX, dfl, limits ## _STEP, NULL, NULL }
102 #define PORT_SET(id, label, keys, ports)  \
103     { id, label, U_ENUM, R_PORT_SET, F_IN, 0, 0, 0, 0, keys, ports }
104 #define PAN_CTL(id, label, dfl) \
105     { id, label, U_PERCENT, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, -100.0f, 100.0f, dfl, 0.1, NULL, NULL }
106 #define PERCENTS(id, label, dfl, step) \
107     { id, label, U_PERCENT, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, 0, 100, dfl, step, NULL, NULL }
108 #define OUT_PERCENTS(id, label) \
109     { id, label, U_PERCENT, R_METER, F_OUT | F_LOWER | F_UPPER, 0, 100, 0, 0, NULL, NULL }
110 #define METER_GAIN(id, label, max) \
111     { id, label, U_GAIN_AMP, R_METER, F_OUT | F_LOG | F_UPPER | F_LOWER | F_PEAK, 0, max, 0.0f, 0, NULL, NULL }
112 #define METER_GAIN_DFL(id, label, max, dfl) \
113     { id, label, U_GAIN_AMP, R_METER, F_OUT | F_LOG | F_UPPER | F_LOWER | F_PEAK, 0, max, dfl, 0, NULL, NULL }
114 #define METER_OUT_GAIN(id, label, max) \
115     { id, label, U_GAIN_AMP, R_METER, F_OUT | F_LOG | F_UPPER | F_LOWER, 0, max, 0.0f, 0, NULL, NULL }
116 #define METER_GAIN10(id, label)  METER_GAIN(id, label, 10.0f)
117 #define METER_GAIN20(id, label)  METER_GAIN(id, label, 20.0f)
118 #define METER_PERCENT(id, label)  { id, label, U_PERCENT, R_METER, F_OUT | F_UPPER | F_LOWER, 0.0f, 100.0f, 0.0f, 0.1f, NULL, NULL }
119 
120 #define PORTS_END   \
121     { NULL, NULL }
122 
123 // Reduced ports
124 #define AUDIO_INPUT_MONO    AUDIO_INPUT(PORT_NAME_INPUT, "Input")
125 #define AUDIO_INPUT_LEFT    AUDIO_INPUT(PORT_NAME_INPUT_L, "Input L")
126 #define AUDIO_INPUT_RIGHT   AUDIO_INPUT(PORT_NAME_INPUT_R, "Input R")
127 #define AUDIO_INPUT_A       AUDIO_INPUT("in_a", "Input A")
128 #define AUDIO_INPUT_B       AUDIO_INPUT("in_b", "Input B")
129 #define AUDIO_INPUT_N(n)    AUDIO_INPUT("in" #n, "Input " #n)
130 
131 #define AUDIO_OUTPUT_MONO   AUDIO_OUTPUT(PORT_NAME_OUTPUT, "Output")
132 #define AUDIO_OUTPUT_LEFT   AUDIO_OUTPUT(PORT_NAME_OUTPUT_L, "Output L")
133 #define AUDIO_OUTPUT_RIGHT  AUDIO_OUTPUT(PORT_NAME_OUTPUT_R, "Output R")
134 #define AUDIO_OUTPUT_A      AUDIO_OUTPUT("out_a", "Output A")
135 #define AUDIO_OUTPUT_B      AUDIO_OUTPUT("out_b", "Output B")
136 #define AUDIO_OUTPUT_N(n)   AUDIO_OUTPUT("out" #n, "Output " #n)
137 
138 #define MIDI_INPUT          MIDI_CHANNEL(LSP_LV2_MIDI_PORT_IN, F_IN, "Midi input")
139 #define MIDI_OUTPUT         MIDI_CHANNEL(LSP_LV2_MIDI_PORT_OUT, F_OUT, "Midi output")
140 
141 #define OSC_INPUT           OSC_CHANNEL(LSP_LV2_OSC_PORT_IN, F_IN, "OSC input")
142 #define OSC_OUTPUT          OSC_CHANNEL(LSP_LV2_OSC_PORT_OUT, F_OUT, "OSC output")
143 
144 #define IN_GAIN             AMP_GAIN("g_in", "Input gain", GAIN_AMP_0_DB, GAIN_AMP_P_60_DB)
145 #define OUT_GAIN            AMP_GAIN("g_out", "Output gain", GAIN_AMP_0_DB, GAIN_AMP_P_60_DB)
146 
147 #define DRY_GAIN(g)         AMP_GAIN10("dry", "Dry amount", g)
148 #define DRY_GAIN_L(g)       AMP_GAIN10("dry_l", "Dry amount L", g)
149 #define DRY_GAIN_R(g)       AMP_GAIN10("dry_r", "Dry amount R", g)
150 
151 #define WET_GAIN(g)         AMP_GAIN10("wet", "Wet amount", g)
152 #define WET_GAIN_L(g)       AMP_GAIN10("wet_l", "Wet amount L", g)
153 #define WET_GAIN_R(g)       AMP_GAIN10("wet_r", "Wet amount R", g)
154 
155 #define BYPASS              { PORT_NAME_BYPASS, "Bypass", U_BOOL, R_BYPASS, F_IN | F_UPPER | F_LOWER, 0, 1, 0, 0, NULL, NULL }
156 
157 
158 // Port configurations
159 #define PORTS_MONO_PLUGIN   \
160     AUDIO_INPUT_MONO,       \
161     AUDIO_OUTPUT_MONO       \
162 
163 #define PORTS_MONO_SIDECHAIN        AUDIO_INPUT(PORT_NAME_SIDECHAIN, "Sidechain input")
164 #define PORTS_STEREO_SIDECHAIN      AUDIO_INPUT(PORT_NAME_SIDECHAIN_L, "Sidechain input Left"), AUDIO_INPUT(PORT_NAME_SIDECHAIN_R, "Sidechain input Right")
165 
166 #define PORTS_STEREO_PLUGIN \
167     AUDIO_INPUT_LEFT,       \
168     AUDIO_INPUT_RIGHT,      \
169     AUDIO_OUTPUT_LEFT,      \
170     AUDIO_OUTPUT_RIGHT
171 
172 #define PORTS_MIDI_CHANNEL  \
173     MIDI_INPUT,             \
174     MIDI_OUTPUT
175 
176 #define PORTS_OSC_CHANNEL   \
177     OSC_INPUT,              \
178     OSC_OUTPUT
179 
180 // Port groups
181 #define MAIN_MONO_PORT_GROUPS \
182     { "mono_in",        "Mono Input",       GRP_MONO,       PGF_IN | PGF_MAIN,          mono_in_group_ports         }, \
183     { "mono_out",       "Mono Output",      GRP_MONO,       PGF_OUT | PGF_MAIN,         mono_out_group_ports        }
184 
185 #define MAIN_SC_MONO_PORT_GROUPS \
186     { "mono_in",        "Mono Input",       GRP_MONO,       PGF_IN | PGF_MAIN,          mono_in_group_ports         }, \
187     { "mono_out",       "Mono Output",      GRP_MONO,       PGF_OUT | PGF_MAIN,         mono_out_group_ports        }, \
188     { "sidechain_in",   "Sidechain Input",  GRP_MONO,       PGF_IN | PGF_SIDECHAIN,     mono_sidechain_group_ports, "mono_in"  }
189 
190 #define MAIN_MONO2STEREO_PORT_GROUPS \
191     { "mono_in",        "Mono Input",       GRP_MONO,       PGF_IN | PGF_MAIN,          mono_in_group_ports         }, \
192     { "stereo_out",     "Stereo Output",    GRP_STEREO,     PGF_OUT | PGF_MAIN,         stereo_out_group_ports      }
193 
194 #define MAIN_STEREO_PORT_GROUPS \
195     { "stereo_in",      "Stereo Input",     GRP_STEREO,     PGF_IN | PGF_MAIN,          stereo_in_group_ports       }, \
196     { "stereo_out",     "Stereo Output",    GRP_STEREO,     PGF_OUT | PGF_MAIN,         stereo_out_group_ports      }
197 
198 #define MAIN_SC_STEREO_PORT_GROUPS \
199     { "stereo_in",      "Stereo Input",     GRP_STEREO,     PGF_IN | PGF_MAIN,          stereo_in_group_ports       }, \
200     { "stereo_out",     "Stereo Output",    GRP_STEREO,     PGF_OUT | PGF_MAIN,         stereo_out_group_ports      }, \
201     { "sidechain_in",   "Sidechain Input",  GRP_STEREO,     PGF_IN | PGF_SIDECHAIN,     stereo_sidechain_group_portss, "stereo_in" }
202 
203 #define MONO_PORT_GROUP_PORT(id, a) \
204     static const port_group_item_t id ## _ports[] = \
205     { \
206         { a, PGR_CENTER     }, \
207         { NULL              } \
208     }
209 
210 #define STEREO_PORT_GROUP_PORTS(id, a, b) \
211     static const port_group_item_t id ## _ports[] = \
212     { \
213         { a, PGR_LEFT       }, \
214         { b, PGR_RIGHT      }, \
215         { NULL } \
216     }
217 
218 #define MS_PORT_GROUP_PORTS(id, a, b) \
219     static const port_group_item_t id ## _ports[] = \
220     { \
221         { a, PGR_MS_MIDDLE  }, \
222         { b, PGR_MS_SIDE    }, \
223         { NULL } \
224     }
225 
226 #define PORT_GROUPS_END     { NULL, NULL }
227 
228 namespace lsp
229 {
230     // Common stereo port names
231     extern const char PORT_NAME_BYPASS[];
232     extern const char PORT_NAME_INPUT[];
233     extern const char PORT_NAME_OUTPUT[];
234     extern const char PORT_NAME_SIDECHAIN[];
235     extern const char PORT_NAME_INPUT_L[];
236     extern const char PORT_NAME_INPUT_R[];
237     extern const char PORT_NAME_OUTPUT_L[];
238     extern const char PORT_NAME_OUTPUT_R[];
239     extern const char PORT_NAME_SIDECHAIN_L[];
240     extern const char PORT_NAME_SIDECHAIN_R[];
241 
242     // Port groups
243     extern const port_group_item_t mono_in_group_ports[];
244     extern const port_group_item_t mono_sidechain_group_ports[];
245     extern const port_group_item_t mono_out_group_ports[];
246 
247     extern const port_group_item_t stereo_in_group_ports[];
248     extern const port_group_item_t stereo_sidechain_group_ports[];
249     extern const port_group_item_t stereo_out_group_ports[];
250 
251     extern const port_group_t mono_plugin_port_groups[];
252     extern const port_group_t mono_plugin_sidechain_port_groups[];
253 
254     extern const port_group_t mono_to_stereo_plugin_port_groups[];
255     extern const port_group_t stereo_plugin_port_groups[];
256     extern const port_group_t stereo_plugin_sidechain_port_groups[];
257 
258     // Miscellaneous lists
259     extern const port_item_t file_channels[];
260     extern const port_item_t midi_channels[];
261     extern const port_item_t octaves[];
262     extern const port_item_t notes[];
263     extern const port_item_t fft_windows[];
264     extern const port_item_t fft_envelopes[];
265 }
266 
267 
268 #endif /* METADATA_PORTS_H_ */
269