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