Fix build with gcc 4.7
[cadence.git] / src / carla / carla_backend.cpp
blob010873ea385ecd12191551021b226401a964759d
1 /* JACK Backend code for Carla */
3 #include "carla_backend.h"
4 #include "audio_plugin.h"
5 #include "misc.h"
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
11 #include <QtGui/QApplication>
12 #include <QtCore/QMutex>
14 // Global variables
15 CallbackFunc Callback = nullptr;
16 const char* last_error = nullptr;
17 const char* carla_client_name = nullptr;
19 QMutex carla_proc_lock_var;
20 QMutex carla_midi_lock_var;
21 CarlaCheckThread check_thread;
23 // Global variables (shared)
24 const char* unique_names[MAX_PLUGINS] = { nullptr };
25 AudioPlugin* AudioPlugins[MAX_PLUGINS] = { nullptr };
26 ExternalMidiNote ExternalMidiNotes[MAX_MIDI_EVENTS];
28 volatile double ains_peak[MAX_PLUGINS*2] = { 0.0 };
29 volatile double aouts_peak[MAX_PLUGINS*2] = { 0.0 };
31 // Global JACK client
32 jack_client_t* carla_jack_client = nullptr;
33 jack_nframes_t carla_buffer_size = 512;
34 jack_nframes_t carla_sample_rate = 48000;
36 // Global OSC stuff
37 lo_server_thread global_osc_server_thread = nullptr;
38 const char* global_osc_server_path = nullptr;
39 OscData global_osc_data = { nullptr, nullptr, nullptr };
41 // Global options
42 carla_options_t carla_options = {
43 /* _initiated */ false,
44 /* global_jack_client */ false,
45 /* bridge_path_lv2_gtk2 */ nullptr,
46 /* bridge_path_lv2_qt4 */ nullptr,
47 /* bridge_path_lv2_x11 */ nullptr,
48 /* bridge_path_vst_qt4 */ nullptr,
49 /* bridge_path_winvst */ nullptr
52 // jack.cpp
53 int carla_jack_process_callback(jack_nframes_t nframes, void* arg);
54 int carla_jack_bufsize_callback(jack_nframes_t new_buffer_size, void* arg);
55 int carla_jack_srate_callback(jack_nframes_t new_sample_rate, void* arg);
56 void carla_jack_shutdown_callback(void* arg);
58 // plugin specific
59 short add_plugin_ladspa(const char* filename, const char* label, void* extra_stuff);
60 short add_plugin_dssi(const char* filename, const char* label, void* extra_stuff);
61 short add_plugin_lv2(const char* filename, const char* label, void* extra_stuff);
62 short add_plugin_vst(const char* filename, const char* label);
63 short add_plugin_winvst(const char* filename, const char* label, void* extra_stuff);
64 short add_plugin_sf2(const char* filename, const char* label);
66 // -------------------------------------------------------------------------------------------------------------------
67 // Exported symbols (API)
68 bool carla_init(const char* client_name)
70 qDebug("carla_init(%s)", client_name);
72 carla_options._initiated = true;
74 bool started = false;
75 carla_jack_client = jack_client_open(client_name, JackNullOption, 0x0);
77 if (carla_jack_client)
79 carla_buffer_size = jack_get_buffer_size(carla_jack_client);
80 carla_sample_rate = jack_get_sample_rate(carla_jack_client);
82 if (carla_options.global_jack_client)
83 jack_set_process_callback(carla_jack_client, carla_jack_process_callback, nullptr);
85 jack_set_buffer_size_callback(carla_jack_client, carla_jack_bufsize_callback, nullptr);
86 jack_set_sample_rate_callback(carla_jack_client, carla_jack_srate_callback, nullptr);
87 jack_on_shutdown(carla_jack_client, carla_jack_shutdown_callback, nullptr);
89 if (jack_activate(carla_jack_client))
91 set_last_error("Failed to activate the JACK client");
92 carla_jack_client = nullptr;
94 else
95 started = true;
97 else
99 set_last_error("Failed to create new JACK client");
100 carla_jack_client = nullptr;
103 if (started)
105 client_name = jack_get_client_name(carla_jack_client);
107 // Fix name for OSC usage
108 char* fixed_name = strdup(client_name);
109 for (size_t i=0; i < strlen(fixed_name); i++)
111 if (!std::isalpha(fixed_name[i]) && !std::isdigit(fixed_name[i]))
112 fixed_name[i] = '_';
115 carla_client_name = strdup(fixed_name);
116 free((void*)fixed_name);
118 for (unsigned short i=0; i<MAX_MIDI_EVENTS; i++)
119 ExternalMidiNotes[i].valid = false;
121 osc_init();
123 check_thread.start();
125 set_last_error("no error");
128 return started;
131 bool carla_close()
133 qDebug("carla_close()");
135 bool closed = false;
137 if (jack_deactivate(carla_jack_client))
138 set_last_error("Failed to deactivate the JACK client");
139 else
141 if (jack_client_close(carla_jack_client))
142 set_last_error("Failed to close the JACK client");
143 else
144 closed = true;
147 carla_jack_client = nullptr;
149 for (unsigned short i=0; i<MAX_PLUGINS; i++)
151 AudioPlugin* plugin = AudioPlugins[i];
152 if (plugin && plugin->id >= 0)
153 remove_plugin(i);
156 check_thread.quit();
158 if (!check_thread.wait(1000000)) // 1 sec
159 qWarning("Failed to properly stop global check thread");
161 osc_send_exit(&global_osc_data);
162 osc_close();
164 if (carla_client_name)
165 free((void*)carla_client_name);
167 if (last_error)
168 free((void*)last_error);
170 if (carla_options._initiated)
172 if (carla_options.bridge_path_lv2_gtk2)
173 free((void*)carla_options.bridge_path_lv2_gtk2);
175 if (carla_options.bridge_path_lv2_qt4)
176 free((void*)carla_options.bridge_path_lv2_qt4);
178 if (carla_options.bridge_path_lv2_x11)
179 free((void*)carla_options.bridge_path_lv2_x11);
181 if (carla_options.bridge_path_vst_qt4)
182 free((void*)carla_options.bridge_path_vst_qt4);
184 if (carla_options.bridge_path_winvst)
185 free((void*)carla_options.bridge_path_winvst);
188 // cleanup static data
189 get_plugin_info(0);
190 get_parameter_info(0, 0);
191 get_scalepoint_info(0, 0, 0);
192 get_chunk_data(0);
193 get_real_plugin_name(0);
195 return closed;
198 bool carla_is_engine_running()
200 return bool(carla_jack_client);
203 short add_plugin(PluginType ptype, const char* filename, const char* label, void* extra_stuff)
205 qDebug("add_plugin(%s, %s, %i, %p)", filename, label, ptype, extra_stuff);
207 switch (ptype)
209 case PLUGIN_LADSPA:
210 return add_plugin_ladspa(filename, label, extra_stuff);
211 case PLUGIN_DSSI:
212 return add_plugin_dssi(filename, label, extra_stuff);
213 case PLUGIN_LV2:
214 return add_plugin_lv2(filename, label, extra_stuff);
215 case PLUGIN_VST:
216 return add_plugin_vst(filename, label);
217 case PLUGIN_WINVST:
218 return add_plugin_winvst(filename, label, extra_stuff);
219 case PLUGIN_SF2:
220 return add_plugin_sf2(filename, label);
221 default:
222 set_last_error("Unknown plugin type");
223 return -1;
227 bool remove_plugin(unsigned short plugin_id)
229 qDebug("remove_plugin(%i)", plugin_id);
231 for (unsigned short i=0; i<MAX_PLUGINS; i++)
233 AudioPlugin* plugin = AudioPlugins[i];
234 if (plugin && plugin->id == plugin_id)
236 osc_send_remove_plugin(&global_osc_data, plugin->id);
238 carla_proc_lock();
239 plugin->id = -1;
240 carla_proc_unlock();
242 plugin->delete_me();
244 AudioPlugins[i] = nullptr;
245 unique_names[i] = nullptr;
247 return true;
251 set_last_error("Could not find plugin to remove");
252 return false;
255 PluginInfo* get_plugin_info(unsigned short plugin_id)
257 qDebug("get_plugin_info(%i)", plugin_id);
259 static PluginInfo info = { false, PLUGIN_NONE, PLUGIN_CATEGORY_NONE, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0 };
261 if (info.valid)
263 free((void*)info.label);
264 free((void*)info.maker);
265 free((void*)info.copyright);
268 info.valid = false;
270 for (unsigned short i=0; i<MAX_PLUGINS; i++)
272 AudioPlugin* plugin = AudioPlugins[i];
273 if (plugin && plugin->id == plugin_id)
275 char buf_str[STR_MAX] = { 0 };
277 info.valid = true;
278 info.type = plugin->type;
279 info.category = plugin->get_category();
280 info.hints = plugin->hints;
281 info.binary = plugin->filename;
282 info.name = plugin->name;
283 info.unique_id = plugin->get_unique_id();
285 plugin->get_label(buf_str);
286 info.label = strdup(buf_str);
288 plugin->get_maker(buf_str);
289 info.maker = strdup(buf_str);
291 plugin->get_copyright(buf_str);
292 info.copyright = strdup(buf_str);
294 return &info;
298 if (carla_is_engine_running())
299 qCritical("get_plugin_info(%i) - could not find plugin", plugin_id);
301 return &info;
304 PortCountInfo* get_audio_port_count_info(unsigned short plugin_id)
306 qDebug("get_audio_port_count_info(%i)", plugin_id);
308 static PortCountInfo info = { false, 0, 0, 0 };
309 info.valid = false;
311 for (unsigned short i=0; i<MAX_PLUGINS; i++)
313 AudioPlugin* plugin = AudioPlugins[i];
314 if (plugin && plugin->id == plugin_id)
316 info.valid = true;
317 info.ins = plugin->ain.count;
318 info.outs = plugin->aout.count;
319 info.total = info.ins + info.outs;
320 return &info;
324 qCritical("get_audio_port_count_info(%i) - could not find plugin", plugin_id);
325 return &info;
328 PortCountInfo* get_midi_port_count_info(unsigned short plugin_id)
330 qDebug("get_midi_port_count_info(%i)", plugin_id);
332 static PortCountInfo info = { false, 0, 0, 0 };
333 info.valid = false;
335 for (unsigned short i=0; i<MAX_PLUGINS; i++)
337 AudioPlugin* plugin = AudioPlugins[i];
338 if (plugin && plugin->id == plugin_id)
340 info.valid = true;
341 info.ins = plugin->min.count;
342 info.outs = plugin->mout.count;
343 info.total = info.ins + info.outs;
344 return &info;
348 qCritical("get_midi_port_count_info(%i) - could not find plugin", plugin_id);
349 return &info;
352 PortCountInfo* get_parameter_count_info(unsigned short plugin_id)
354 qDebug("get_parameter_port_count_info(%i)", plugin_id);
356 static PortCountInfo info = { false, 0, 0, 0 };
357 info.valid = false;
359 for (unsigned short i=0; i<MAX_PLUGINS; i++)
361 AudioPlugin* plugin = AudioPlugins[i];
362 if (plugin && plugin->id == plugin_id)
364 info.valid = true;
365 info.ins = 0;
366 info.outs = 0;
367 info.total = plugin->param.count;
369 for (uint32_t j=0; j < plugin->param.count; j++)
371 ParameterType ParamType = plugin->param.data[j].type;
372 if (ParamType == PARAMETER_INPUT)
373 info.ins += 1;
374 else if (ParamType == PARAMETER_OUTPUT)
375 info.outs += 1;
378 return &info;
382 qCritical("get_parameter_port_count_info(%i) - could not find plugin", plugin_id);
383 return &info;
386 ParameterInfo* get_parameter_info(unsigned short plugin_id, uint32_t parameter_id)
388 qDebug("get_parameter_info(%i, %i)", plugin_id, parameter_id);
390 static ParameterInfo info = { false, nullptr, nullptr, nullptr, 0 };
392 if (info.valid)
394 free((void*)info.name);
395 free((void*)info.symbol);
396 free((void*)info.label);
399 info.valid = false;
401 for (unsigned short i=0; i<MAX_PLUGINS; i++)
403 AudioPlugin* plugin = AudioPlugins[i];
404 if (plugin && plugin->id == plugin_id)
406 if (parameter_id < plugin->param.count)
408 char buf_str[STR_MAX] = { 0 };
409 int32_t rindex = plugin->param.data[parameter_id].rindex;
411 if (rindex >= 0)
413 info.valid = true;
414 info.scalepoint_count = plugin->get_scalepoint_count(rindex);
416 plugin->get_parameter_name(rindex, buf_str);
417 info.name = strdup(buf_str);
419 plugin->get_parameter_symbol(rindex, buf_str);
420 info.symbol = strdup(buf_str);
422 plugin->get_parameter_label(rindex, buf_str);
423 info.label = strdup(buf_str);
425 else
426 qCritical("get_parameter_info(%i, %i) - invalid rindex: %i", plugin_id, parameter_id, rindex);
428 else
429 qCritical("get_parameter_info(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
431 return &info;
435 if (carla_is_engine_running())
436 qCritical("get_parameter_info(%i, %i) - could not find plugin", plugin_id, parameter_id);
438 return &info;
441 ScalePointInfo* get_scalepoint_info(unsigned short plugin_id, uint32_t parameter_id, uint32_t scalepoint_id)
443 qDebug("get_scalepoint_info(%i, %i, %i)", plugin_id, parameter_id, scalepoint_id);
445 static ScalePointInfo info = { false, 0.0, nullptr };
447 if (info.valid)
449 free((void*)info.label);
452 info.valid = false;
454 for (unsigned short i=0; i<MAX_PLUGINS; i++)
456 AudioPlugin* plugin = AudioPlugins[i];
457 if (plugin && plugin->id == plugin_id)
459 if (parameter_id < plugin->param.count)
461 int32_t rindex = plugin->param.data[parameter_id].rindex;
463 if (scalepoint_id < plugin->get_scalepoint_count(rindex))
465 char buf_str[STR_MAX] = { 0 };
467 info.valid = true;
468 info.value = plugin->get_scalepoint_value(rindex, scalepoint_id);
470 plugin->get_scalepoint_label(rindex, scalepoint_id, buf_str);
471 info.label = strdup(buf_str);
473 else
474 qCritical("get_scalepoint_info(%i, %i, %i) - scalepoint_id out of bounds", plugin_id, parameter_id, scalepoint_id);
476 else
477 qCritical("get_scalepoint_info(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, parameter_id);
479 return &info;
483 if (carla_is_engine_running())
484 qCritical("get_scalepoint_info(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, scalepoint_id);
486 return &info;
489 MidiProgramInfo* get_midi_program_info(unsigned short plugin_id, uint32_t midi_program_id)
491 qDebug("get_midi_program_info(%i, %i)", plugin_id, midi_program_id);
493 static MidiProgramInfo info = { false, 0, 0, nullptr };
494 info.valid = false;
496 for (unsigned short i=0; i<MAX_PLUGINS; i++)
498 AudioPlugin* plugin = AudioPlugins[i];
499 if (plugin && plugin->id == plugin_id)
501 if (midi_program_id < plugin->midiprog.count)
503 info.valid = true;
504 info.bank = plugin->midiprog.data[midi_program_id].bank;
505 info.program = plugin->midiprog.data[midi_program_id].program;
506 info.label = plugin->midiprog.names[midi_program_id];
508 else
509 qCritical("get_midi_program_info(%i, %i) - midi_program_id out of bounds", plugin_id, midi_program_id);
511 return &info;
515 qCritical("get_midi_program_info(%i, %i) - could not find plugin", plugin_id, midi_program_id);
516 return &info;
519 ParameterData* get_parameter_data(unsigned short plugin_id, uint32_t parameter_id)
521 qDebug("get_parameter_data(%i, %i)", plugin_id, parameter_id);
523 static ParameterData data = { PARAMETER_UNKNOWN, -1, -1, 0, 0, -1 };
525 for (unsigned short i=0; i<MAX_PLUGINS; i++)
527 AudioPlugin* plugin = AudioPlugins[i];
528 if (plugin && plugin->id == plugin_id)
530 if (parameter_id < plugin->param.count)
531 return &plugin->param.data[parameter_id];
532 else
533 qCritical("get_parameter_data(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
535 return &data;
539 qCritical("get_parameter_data(%i, %i) - could not find plugin", plugin_id, parameter_id);
540 return &data;
543 ParameterRanges* get_parameter_ranges(unsigned short plugin_id, uint32_t parameter_id)
545 qDebug("get_parameter_ranges(%i, %i)", plugin_id, parameter_id);
547 static ParameterRanges ranges = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
549 for (unsigned short i=0; i<MAX_PLUGINS; i++)
551 AudioPlugin* plugin = AudioPlugins[i];
552 if (plugin && plugin->id == plugin_id)
554 if (parameter_id < plugin->param.count)
555 return &plugin->param.ranges[parameter_id];
556 else
557 qCritical("get_parameter_ranges(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
559 return &ranges;
563 qCritical("get_parameter_ranges(%i, %i) - could not find plugin", plugin_id, parameter_id);
564 return &ranges;
567 CustomData* get_custom_data(unsigned short plugin_id, uint32_t custom_data_id)
569 qDebug("get_custom_data(%i, %i)", plugin_id, custom_data_id);
571 static CustomData data = { CUSTOM_DATA_INVALID, nullptr, nullptr };
573 for (unsigned short i=0; i<MAX_PLUGINS; i++)
575 AudioPlugin* plugin = AudioPlugins[i];
576 if (plugin && plugin->id == plugin_id)
578 if (custom_data_id < (uint32_t)plugin->custom.count())
579 return &plugin->custom[custom_data_id];
580 else
581 qCritical("get_custom_data(%i, %i) - custom_data_id out of bounds", plugin_id, custom_data_id);
583 return &data;
587 qCritical("get_custom_data(%i, %i) - could not find plugin", plugin_id, custom_data_id);
588 return &data;
591 const char* get_chunk_data(unsigned short plugin_id)
593 qDebug("get_chunk_data(%i)", plugin_id);
595 static const char* chunk_data = nullptr;
597 if (chunk_data)
598 free((void*)chunk_data);
600 chunk_data = nullptr;
602 for (unsigned short i=0; i<MAX_PLUGINS; i++)
604 AudioPlugin* plugin = AudioPlugins[i];
605 if (plugin && plugin->id == plugin_id)
607 if (plugin->hints & PLUGIN_USES_CHUNKS)
609 void* data = nullptr;
610 int32_t data_size = plugin->get_chunk_data(&data);
612 if (data && data_size >= 4)
614 QByteArray chunk((const char*)data, data_size);
615 chunk_data = strdup(chunk.toBase64().data());
617 else
618 qCritical("get_chunk_data(%i) - got invalid chunk data", plugin_id);
620 else
621 qCritical("get_chunk_data(%i) - plugin does not support chunks", plugin_id);
623 return chunk_data;
627 if (carla_is_engine_running())
628 qCritical("get_chunk_data(%i) - could not find plugin", plugin_id);
630 return chunk_data;
633 GuiData* get_gui_data(unsigned short plugin_id)
635 qDebug("get_gui_data(%i)", plugin_id);
637 static GuiData data = { GUI_NONE, false, false, 0, 0, nullptr, false };
639 for (unsigned short i=0; i<MAX_PLUGINS; i++)
641 AudioPlugin* plugin = AudioPlugins[i];
642 if (plugin && plugin->id == plugin_id)
643 return &plugin->gui;
646 qCritical("get_gui_data(%i) - could not find plugin", plugin_id);
647 return &data;
650 uint32_t get_parameter_count(unsigned short plugin_id)
652 qDebug("get_parameter_count(%i)", plugin_id);
654 for (unsigned short i=0; i<MAX_PLUGINS; i++)
656 AudioPlugin* plugin = AudioPlugins[i];
657 if (plugin && plugin->id == plugin_id)
658 return plugin->param.count;
661 qCritical("get_parameter_count(%i) - could not find plugin", plugin_id);
662 return 0;
665 uint32_t get_program_count(unsigned short plugin_id)
667 qDebug("get_program_count(%i)", plugin_id);
669 for (unsigned short i=0; i<MAX_PLUGINS; i++)
671 AudioPlugin* plugin = AudioPlugins[i];
672 if (plugin && plugin->id == plugin_id)
673 return plugin->prog.count;
676 qCritical("get_program_count(%i) - could not find plugin", plugin_id);
677 return 0;
680 uint32_t get_midi_program_count(unsigned short plugin_id)
682 qDebug("get_midi_program_count(%i)", plugin_id);
684 for (unsigned short i=0; i<MAX_PLUGINS; i++)
686 AudioPlugin* plugin = AudioPlugins[i];
687 if (plugin && plugin->id == plugin_id)
688 return plugin->midiprog.count;
691 qCritical("get_midi_program_count(%i) - could not find plugin", plugin_id);
692 return 0;
695 uint32_t get_custom_data_count(unsigned short plugin_id)
697 qDebug("get_custom_data_count(%i)", plugin_id);
699 for (unsigned short i=0; i<MAX_PLUGINS; i++)
701 AudioPlugin* plugin = AudioPlugins[i];
702 if (plugin && plugin->id == plugin_id)
703 return plugin->custom.count();
706 qCritical("get_custom_data_count(%i) - could not find plugin", plugin_id);
707 return 0;
710 const char* get_program_name(unsigned short plugin_id, uint32_t program_id)
712 qDebug("get_program_name(%i, %i)", plugin_id, program_id);
714 for (unsigned short i=0; i<MAX_PLUGINS; i++)
716 AudioPlugin* plugin = AudioPlugins[i];
717 if (plugin && plugin->id == plugin_id)
719 if (program_id < plugin->prog.count)
720 return plugin->prog.names[program_id];
721 else
722 qCritical("get_program_name(%i, %i) - program_id out of bounds", plugin_id, program_id);
724 return nullptr;
728 qCritical("get_program_name(%i, %i) - could not find plugin", plugin_id, program_id);
729 return nullptr;
732 const char* get_midi_program_name(unsigned short plugin_id, uint32_t midi_program_id)
734 qDebug("get_midi_program_name(%i, %i)", plugin_id, midi_program_id);
736 for (unsigned short i=0; i<MAX_PLUGINS; i++)
738 AudioPlugin* plugin = AudioPlugins[i];
739 if (plugin && plugin->id == plugin_id)
741 if (midi_program_id < plugin->midiprog.count)
742 return plugin->midiprog.names[midi_program_id];
743 else
744 qCritical("get_midi_program_name(%i, %i) - program_id out of bounds", plugin_id, midi_program_id);
746 return nullptr;
750 qCritical("get_midi_program_name(%i, %i) - could not find plugin", plugin_id, midi_program_id);
751 return nullptr;
754 const char* get_real_plugin_name(unsigned short plugin_id)
756 qDebug("get_real_plugin_name(%i)", plugin_id);
758 static const char* real_plugin_name = nullptr;
760 if (real_plugin_name)
761 free((void*)real_plugin_name);
763 real_plugin_name = nullptr;
765 for (unsigned short i=0; i<MAX_PLUGINS; i++)
767 AudioPlugin* plugin = AudioPlugins[i];
768 if (plugin && plugin->id == plugin_id)
770 char buf_str[STR_MAX] = { 0 };
772 plugin->get_real_name(buf_str);
773 real_plugin_name = strdup(buf_str);
775 return real_plugin_name;
779 if (carla_is_engine_running())
780 qCritical("get_real_plugin_name(%i) - could not find plugin", plugin_id);
782 return real_plugin_name;
785 int32_t get_current_program_index(unsigned short plugin_id)
787 qDebug("get_current_program_index(%i)", plugin_id);
789 for (unsigned short i=0; i<MAX_PLUGINS; i++)
791 AudioPlugin* plugin = AudioPlugins[i];
792 if (plugin && plugin->id == plugin_id)
793 return plugin->prog.current;
796 qCritical("get_current_program_index(%i) - could not find plugin", plugin_id);
797 return -1;
800 int32_t get_current_midi_program_index(unsigned short plugin_id)
802 qDebug("get_current_midi_program_index(%i)", plugin_id);
804 for (unsigned short i=0; i<MAX_PLUGINS; i++)
806 AudioPlugin* plugin = AudioPlugins[i];
807 if (plugin && plugin->id == plugin_id)
808 return plugin->midiprog.current;
811 qCritical("get_current_midi_program_index(%i) - could not find plugin", plugin_id);
812 return -1;
815 double get_default_parameter_value(unsigned short plugin_id, uint32_t parameter_id)
817 qDebug("get_default_parameter_value(%i, %i)", plugin_id, parameter_id);
819 for (unsigned short i=0; i<MAX_PLUGINS; i++)
821 AudioPlugin* plugin = AudioPlugins[i];
822 if (plugin && plugin->id == plugin_id)
824 if (parameter_id < plugin->param.count)
825 return plugin->param.ranges[parameter_id].def;
826 else
827 qCritical("get_default_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
829 return 0.0;
833 qCritical("get_default_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
834 return 0.0;
837 double get_current_parameter_value(unsigned short plugin_id, uint32_t parameter_id)
839 //qDebug("get_current_parameter_value(%i, %i)", plugin_id, parameter_id);
841 for (unsigned short i=0; i<MAX_PLUGINS; i++)
843 AudioPlugin* plugin = AudioPlugins[i];
844 if (plugin && plugin->id == plugin_id)
846 if (parameter_id < plugin->param.count)
848 double value = plugin->param.buffers[parameter_id];
850 if (plugin->param.data[parameter_id].hints & PARAMETER_HAS_STRICT_BOUNDS)
851 plugin->fix_parameter_value(value, plugin->param.ranges[parameter_id]);
853 return value;
855 else
856 qCritical("get_current_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
858 return 0.0;
862 qCritical("get_current_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
863 return 0.0;
866 double get_input_peak_value(unsigned short plugin_id, unsigned short port_id)
868 if (port_id == 1 || port_id == 2)
869 return ains_peak[(plugin_id*2)+port_id-1];
870 else
871 return 0.0;
874 double get_output_peak_value(unsigned short plugin_id, unsigned short port_id)
876 if (port_id == 1 || port_id == 2)
877 return aouts_peak[(plugin_id*2)+port_id-1];
878 else
879 return 0.0;
882 void set_active(unsigned short plugin_id, bool onoff)
884 qDebug("set_active(%i, %s)", plugin_id, bool2str(onoff));
886 for (unsigned short i=0; i<MAX_PLUGINS; i++)
888 AudioPlugin* plugin = AudioPlugins[i];
889 if (plugin && plugin->id == plugin_id)
890 return plugin->set_active(onoff, true, false);
893 qCritical("set_active(%i, %s) - could not find plugin", plugin_id, bool2str(onoff));
896 void set_drywet(unsigned short plugin_id, double value)
898 qDebug("set_drywet(%i, %f)", plugin_id, value);
900 for (unsigned short i=0; i<MAX_PLUGINS; i++)
902 AudioPlugin* plugin = AudioPlugins[i];
903 if (plugin && plugin->id == plugin_id)
904 return plugin->set_drywet(value, true, false);
907 qCritical("set_drywet(%i, %f) - could not find plugin", plugin_id, value);
910 void set_vol(unsigned short plugin_id, double value)
912 qDebug("set_vol(%i, %f)", plugin_id, value);
914 for (unsigned short i=0; i<MAX_PLUGINS; i++)
916 AudioPlugin* plugin = AudioPlugins[i];
917 if (plugin && plugin->id == plugin_id)
918 return plugin->set_vol(value, true, false);
921 qCritical("set_vol(%i, %f) - could not find plugin", plugin_id, value);
924 void set_balance_left(unsigned short plugin_id, double value)
926 qDebug("set_balance_left(%i, %f)", plugin_id, value);
928 for (unsigned short i=0; i<MAX_PLUGINS; i++)
930 AudioPlugin* plugin = AudioPlugins[i];
931 if (plugin && plugin->id == plugin_id)
932 return plugin->set_balance_left(value, true, false);
935 qCritical("set_balance_left(%i, %f) - could not find plugin", plugin_id, value);
938 void set_balance_right(unsigned short plugin_id, double value)
940 qDebug("set_balance_right(%i, %f)", plugin_id, value);
942 for (unsigned short i=0; i<MAX_PLUGINS; i++)
944 AudioPlugin* plugin = AudioPlugins[i];
945 if (plugin && plugin->id == plugin_id)
946 return plugin->set_balance_right(value, true, false);
949 qCritical("set_balance_right(%i, %f) - could not find plugin", plugin_id, value);
952 void set_parameter_value(unsigned short plugin_id, uint32_t parameter_id, double value)
954 qDebug("set_parameter_value(%i, %i, %f)", plugin_id, parameter_id, value);
956 for (unsigned short i=0; i<MAX_PLUGINS; i++)
958 AudioPlugin* plugin = AudioPlugins[i];
959 if (plugin && plugin->id == plugin_id)
961 if (parameter_id < plugin->param.count)
962 plugin->set_parameter_value(parameter_id, value, true, true, false);
963 else
964 qCritical("set_parameter_value(%i, %i, %f) - parameter_id out of bounds", plugin_id, parameter_id, value);
966 return;
970 qCritical("set_parameter_value(%i, %i, %f) - could not find plugin", plugin_id, parameter_id, value);
973 void set_parameter_midi_channel(unsigned short plugin_id, uint32_t parameter_id, uint8_t channel)
975 qDebug("set_parameter_midi_channel(%i, %i, %i)", plugin_id, parameter_id, channel);
977 if (channel > 15)
979 qCritical("set_parameter_midi_channel(%i, %i, %i) - invalid channel number", plugin_id, parameter_id, channel);
980 return;
983 for (unsigned short i=0; i<MAX_PLUGINS; i++)
985 AudioPlugin* plugin = AudioPlugins[i];
986 if (plugin && plugin->id == plugin_id)
988 if (parameter_id < plugin->param.count)
990 plugin->param.data[parameter_id].midi_channel = channel;
992 if (plugin->hints & PLUGIN_IS_BRIDGE)
993 osc_send_set_parameter_midi_channel(&plugin->osc.data, plugin->id, parameter_id, channel);
995 else
996 qCritical("set_parameter_midi_channel(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, channel);
998 return;
1002 qCritical("set_parameter_midi_channel(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, channel);
1005 void set_parameter_midi_cc(unsigned short plugin_id, uint32_t parameter_id, int16_t midi_cc)
1007 qDebug("set_parameter_midi_cc(%i, %i, %i)", plugin_id, parameter_id, midi_cc);
1009 if (midi_cc < -1)
1011 midi_cc = -1;
1013 else if (midi_cc > 0x5F) // 95
1015 qCritical("set_parameter_midi_cc(%i, %i, %i) - invalid midi_cc number", plugin_id, parameter_id, midi_cc);
1016 return;
1019 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1021 AudioPlugin* plugin = AudioPlugins[i];
1022 if (plugin && plugin->id == plugin_id)
1024 if (parameter_id < plugin->param.count)
1026 plugin->param.data[parameter_id].midi_cc = midi_cc;
1028 if (plugin->hints & PLUGIN_IS_BRIDGE)
1029 osc_send_set_parameter_midi_cc(&plugin->osc.data, plugin->id, parameter_id, midi_cc);
1031 else
1032 qCritical("set_parameter_midi_cc(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, midi_cc);
1034 return;
1038 qCritical("set_parameter_midi_cc(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, midi_cc);
1041 void set_program(unsigned short plugin_id, uint32_t program_id)
1043 qDebug("set_program(%i, %i)", plugin_id, program_id);
1045 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1047 AudioPlugin* plugin = AudioPlugins[i];
1048 if (plugin && plugin->id == plugin_id)
1050 if (program_id < plugin->prog.count)
1051 plugin->set_program(program_id, true, true, false, true);
1052 else
1053 qCritical("set_program(%i, %i) - program_id out of bounds", plugin_id, program_id);
1055 return;
1059 qCritical("set_program(%i, %i) - could not find plugin", plugin_id, program_id);
1062 void set_midi_program(unsigned short plugin_id, uint32_t midi_program_id)
1064 qDebug("set_midi_program(%i, %i)", plugin_id, midi_program_id);
1066 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1068 AudioPlugin* plugin = AudioPlugins[i];
1069 if (plugin && plugin->id == plugin_id)
1071 if (midi_program_id < plugin->midiprog.count)
1072 plugin->set_midi_program(midi_program_id, true, true, false, true);
1073 else
1074 qCritical("set_midi_program(%i, %i) - program_id out of bounds", plugin_id, midi_program_id);
1076 return;
1080 qCritical("set_midi_program(%i, %i) - could not find plugin", plugin_id, midi_program_id);
1083 void set_custom_data(unsigned short plugin_id, CustomDataType type, const char* key, const char* value)
1085 qDebug("set_custom_data(%i, %i, %s, %s)", plugin_id, type, key, value);
1087 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1089 AudioPlugin* plugin = AudioPlugins[i];
1090 if (plugin && plugin->id == plugin_id)
1091 return plugin->set_custom_data(type, key, value, true);
1094 qCritical("set_custom_data(%i, %i, %s, %s) - could not find plugin", plugin_id, type, key, value);
1097 void set_chunk_data(unsigned short plugin_id, const char* chunk_data)
1099 qDebug("set_chunk_data(%i, %s)", plugin_id, chunk_data);
1101 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1103 AudioPlugin* plugin = AudioPlugins[i];
1104 if (plugin && plugin->id == plugin_id)
1106 if (plugin->hints & PLUGIN_USES_CHUNKS)
1107 plugin->set_chunk_data(chunk_data);
1108 else
1109 qCritical("set_chunk_data(%i, %s) - plugin does not support chunks", plugin_id, chunk_data);
1111 return;
1115 qCritical("set_chunk_data(%i, %s) - could not find plugin", plugin_id, chunk_data);
1118 void set_gui_data(unsigned short plugin_id, int data, intptr_t gui_addr)
1120 qDebug("set_gui_data(%i, %i, " P_INTPTR ")", plugin_id, data, gui_addr);
1122 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1124 AudioPlugin* plugin = AudioPlugins[i];
1125 if (plugin && plugin->id == plugin_id)
1127 if (plugin->gui.type != GUI_NONE)
1128 plugin->set_gui_data(data, get_pointer(gui_addr));
1129 else
1130 qCritical("set_gui_data(%i, %i, " P_INTPTR ") - plugin has no UI", plugin_id, data, gui_addr);
1132 return;
1136 qCritical("set_gui_data(%i, %i, " P_INTPTR ") - could not find plugin", plugin_id, data, gui_addr);
1139 void show_gui(unsigned short plugin_id, bool yesno)
1141 qDebug("show_gui(%i, %s)", plugin_id, bool2str(yesno));
1143 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1145 AudioPlugin* plugin = AudioPlugins[i];
1146 if (plugin && plugin->id == plugin_id)
1148 plugin->show_gui(yesno);
1149 return;
1153 qCritical("show_gui(%i, %s) - could not find plugin", plugin_id, bool2str(yesno));
1156 void idle_gui(unsigned short plugin_id)
1158 qDebug("idle_gui(%i)", plugin_id);
1160 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1162 AudioPlugin* plugin = AudioPlugins[i];
1163 if (plugin && plugin->id == plugin_id)
1165 plugin->idle_gui();
1166 return;
1170 qCritical("idle_gui(%i) - could not find plugin", plugin_id);
1173 void send_midi_note(unsigned short plugin_id, bool onoff, uint8_t note, uint8_t velocity)
1175 qDebug("send_midi_note(%i, %s, %i, %i)", plugin_id, bool2str(onoff), note, velocity);
1177 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1179 AudioPlugin* plugin = AudioPlugins[i];
1180 if (plugin && plugin->id == plugin_id)
1181 return send_plugin_midi_note(plugin_id, onoff, note, velocity, true, true, false);
1184 qCritical("send_midi_note(%i, %s, %i, %i) - could not find plugin", plugin_id, bool2str(onoff), note, velocity);
1187 void prepare_for_save(unsigned short plugin_id)
1189 qDebug("prepare_for_save(%i)", plugin_id);
1191 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1193 AudioPlugin* plugin = AudioPlugins[i];
1194 if (plugin && plugin->id == plugin_id)
1195 return plugin->prepare_for_save();
1198 qCritical("prepare_for_save(%i) - could not find plugin", plugin_id);
1201 void set_callback_function(CallbackFunc func)
1203 qDebug("set_callback_function(%p)", func);
1204 Callback = func;
1207 void set_option(OptionsType option, int value, const char* value_str)
1209 qDebug("set_option(%i, %i, %s)", option, value, value_str);
1211 if (carla_options._initiated)
1212 return;
1214 switch(option)
1216 case OPTION_GLOBAL_JACK_CLIENT:
1217 carla_options.global_jack_client = value;
1218 break;
1219 case OPTION_BRIDGE_PATH_LV2_GTK2:
1220 if (value_str) carla_options.bridge_path_lv2_gtk2 = strdup(value_str);
1221 break;
1222 case OPTION_BRIDGE_PATH_LV2_QT4:
1223 if (value_str) carla_options.bridge_path_lv2_qt4 = strdup(value_str);
1224 break;
1225 case OPTION_BRIDGE_PATH_LV2_X11:
1226 if (value_str) carla_options.bridge_path_lv2_x11 = strdup(value_str);
1227 break;
1228 case OPTION_BRIDGE_PATH_VST_QT4:
1229 if (value_str) carla_options.bridge_path_vst_qt4 = strdup(value_str);
1230 break;
1231 case OPTION_BRIDGE_PATH_WINVST:
1232 if (value_str) carla_options.bridge_path_winvst = strdup(value_str);
1233 break;
1234 default:
1235 break;
1239 const char* get_last_error()
1241 qDebug("get_last_error()");
1242 return last_error;
1245 const char* get_host_client_name()
1247 qDebug("get_host_client_name()");
1248 return carla_client_name;
1251 const char* get_host_osc_url()
1253 qDebug("get_host_osc_url()");
1254 return global_osc_server_path;
1257 uint32_t get_buffer_size()
1259 qDebug("get_buffer_size()");
1260 return carla_buffer_size;
1263 double get_sample_rate()
1265 qDebug("get_sample_rate()");
1266 return carla_sample_rate;
1269 double get_latency()
1271 qDebug("get_latency()");
1272 return double(carla_buffer_size)/carla_sample_rate*1000;
1274 // End of exported symbols (API)
1275 // -------------------------------------------------------------------------------------------------------------------
1277 // -------------------------------------------------------------------------------------------------------------------
1278 // Helper functions
1280 short get_new_plugin_id()
1282 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1284 if (!AudioPlugins[i])
1285 return i;
1288 return -1;
1291 const char* get_unique_name(const char* name)
1293 QString qname(name);
1294 qname.replace(":", "."); // ":" is used in JACK to split client/port names
1296 for (unsigned short i=0; i<MAX_PLUGINS; i++)
1298 // Check if unique name already exists
1299 if (unique_names[i] && qname == unique_names[i])
1301 // Check if string has already been modified
1302 uint len = qname.size();
1304 if (qname.at(len-3) == QChar('(') && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
1306 int number = qname.at(len-2).toAscii()-'0';
1308 if (number == 9)
1309 // next number is 10, 2 digits
1310 qname.replace(" (9)", " (10)");
1311 else
1312 qname[len-2] = QChar('0'+number+1);
1314 continue;
1316 else if (qname.at(len-4) == QChar('(') && qname.at(len-3).isDigit() && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
1318 QChar n2 = qname.at(len-2); // (1x)
1319 QChar n3 = qname.at(len-3); // (x0)
1321 if (n2 == QChar('9'))
1323 n2 = QChar('0');
1324 n3 = QChar(n3.toAscii()+1);
1325 } else
1326 n2 = QChar(n2.toAscii()+1);
1328 qname[len-2] = n2;
1329 qname[len-3] = n3;
1331 continue;
1334 // Modify string if not
1335 qname += " (2)";
1339 return strdup(qname.toStdString().data());
1342 void* get_pointer(intptr_t ptr_addr)
1344 intptr_t* ptr = (intptr_t*)ptr_addr;
1345 return (void*)ptr;
1348 void set_last_error(const char* error)
1350 if (last_error)
1351 free((void*)last_error);
1353 last_error = strdup(error);
1356 void callback_action(CallbackType action, unsigned short plugin_id, int value1, int value2, double value3)
1358 if (Callback)
1359 Callback(action, plugin_id, value1, value2, value3);
1362 void carla_proc_lock()
1364 carla_proc_lock_var.lock();
1367 bool carla_proc_trylock()
1369 return carla_proc_lock_var.tryLock();
1372 void carla_proc_unlock()
1374 carla_proc_lock_var.unlock();
1377 void carla_midi_lock()
1379 carla_midi_lock_var.lock();
1382 void carla_midi_unlock()
1384 carla_midi_lock_var.unlock();
1387 void send_plugin_midi_note(unsigned short plugin_id, bool onoff, uint8_t note, uint8_t velo, bool gui_send, bool osc_send, bool callback_send)
1389 carla_midi_lock();
1390 for (unsigned int i=0; i<MAX_MIDI_EVENTS; i++)
1392 if (ExternalMidiNotes[i].valid == false)
1394 ExternalMidiNotes[i].valid = true;
1395 ExternalMidiNotes[i].plugin_id = plugin_id;
1396 ExternalMidiNotes[i].onoff = onoff;
1397 ExternalMidiNotes[i].note = note;
1398 ExternalMidiNotes[i].velo = velo;
1399 break;
1402 carla_midi_unlock();
1404 if (gui_send)
1406 // TODO - send midi note to GUI?
1409 if (osc_send)
1411 if (onoff)
1412 osc_send_note_on(&AudioPlugins[plugin_id]->osc.data, plugin_id, note, velo);
1413 else
1414 osc_send_note_off(&AudioPlugins[plugin_id]->osc.data, plugin_id, note, velo);
1417 if (callback_send)
1418 callback_action(onoff ? CALLBACK_NOTE_ON : CALLBACK_NOTE_OFF, plugin_id, note, velo, 0.0);
1420 // End of helper functions
1421 // -------------------------------------------------------------------------------------------------------------------