1 /* JACK Backend code for Carla */
3 #include "carla_backend.h"
4 #include "audio_plugin.h"
11 #include <QtGui/QApplication>
12 #include <QtCore/QMutex>
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 };
32 jack_client_t
* carla_jack_client
= nullptr;
33 jack_nframes_t carla_buffer_size
= 512;
34 jack_nframes_t carla_sample_rate
= 48000;
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 };
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
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
);
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;
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;
99 set_last_error("Failed to create new JACK client");
100 carla_jack_client
= nullptr;
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
]))
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;
123 check_thread
.start();
125 set_last_error("no error");
133 qDebug("carla_close()");
137 if (jack_deactivate(carla_jack_client
))
138 set_last_error("Failed to deactivate the JACK client");
141 if (jack_client_close(carla_jack_client
))
142 set_last_error("Failed to close the JACK client");
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)
158 if (!check_thread
.wait(1000000)) // 1 sec
159 qWarning("Failed to properly stop global check thread");
161 osc_send_exit(&global_osc_data
);
164 if (carla_client_name
)
165 free((void*)carla_client_name
);
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
190 get_parameter_info(0, 0);
191 get_scalepoint_info(0, 0, 0);
193 get_real_plugin_name(0);
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
);
210 return add_plugin_ladspa(filename
, label
, extra_stuff
);
212 return add_plugin_dssi(filename
, label
, extra_stuff
);
214 return add_plugin_lv2(filename
, label
, extra_stuff
);
216 return add_plugin_vst(filename
, label
);
218 return add_plugin_winvst(filename
, label
, extra_stuff
);
220 return add_plugin_sf2(filename
, label
);
222 set_last_error("Unknown plugin type");
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
);
244 AudioPlugins
[i
] = nullptr;
245 unique_names
[i
] = nullptr;
251 set_last_error("Could not find plugin to remove");
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 };
263 free((void*)info
.label
);
264 free((void*)info
.maker
);
265 free((void*)info
.copyright
);
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 };
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
);
298 if (carla_is_engine_running())
299 qCritical("get_plugin_info(%i) - could not find plugin", plugin_id
);
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 };
311 for (unsigned short i
=0; i
<MAX_PLUGINS
; i
++)
313 AudioPlugin
* plugin
= AudioPlugins
[i
];
314 if (plugin
&& plugin
->id
== plugin_id
)
317 info
.ins
= plugin
->ain
.count
;
318 info
.outs
= plugin
->aout
.count
;
319 info
.total
= info
.ins
+ info
.outs
;
324 qCritical("get_audio_port_count_info(%i) - could not find plugin", plugin_id
);
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 };
335 for (unsigned short i
=0; i
<MAX_PLUGINS
; i
++)
337 AudioPlugin
* plugin
= AudioPlugins
[i
];
338 if (plugin
&& plugin
->id
== plugin_id
)
341 info
.ins
= plugin
->min
.count
;
342 info
.outs
= plugin
->mout
.count
;
343 info
.total
= info
.ins
+ info
.outs
;
348 qCritical("get_midi_port_count_info(%i) - could not find plugin", plugin_id
);
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 };
359 for (unsigned short i
=0; i
<MAX_PLUGINS
; i
++)
361 AudioPlugin
* plugin
= AudioPlugins
[i
];
362 if (plugin
&& plugin
->id
== plugin_id
)
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
)
374 else if (ParamType
== PARAMETER_OUTPUT
)
382 qCritical("get_parameter_port_count_info(%i) - could not find plugin", plugin_id
);
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 };
394 free((void*)info
.name
);
395 free((void*)info
.symbol
);
396 free((void*)info
.label
);
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
;
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
);
426 qCritical("get_parameter_info(%i, %i) - invalid rindex: %i", plugin_id
, parameter_id
, rindex
);
429 qCritical("get_parameter_info(%i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
);
435 if (carla_is_engine_running())
436 qCritical("get_parameter_info(%i, %i) - could not find plugin", plugin_id
, parameter_id
);
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 };
449 free((void*)info
.label
);
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 };
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
);
474 qCritical("get_scalepoint_info(%i, %i, %i) - scalepoint_id out of bounds", plugin_id
, parameter_id
, scalepoint_id
);
477 qCritical("get_scalepoint_info(%i, %i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
, parameter_id
);
483 if (carla_is_engine_running())
484 qCritical("get_scalepoint_info(%i, %i, %i) - could not find plugin", plugin_id
, parameter_id
, scalepoint_id
);
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 };
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
)
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
];
509 qCritical("get_midi_program_info(%i, %i) - midi_program_id out of bounds", plugin_id
, midi_program_id
);
515 qCritical("get_midi_program_info(%i, %i) - could not find plugin", plugin_id
, midi_program_id
);
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
];
533 qCritical("get_parameter_data(%i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
);
539 qCritical("get_parameter_data(%i, %i) - could not find plugin", plugin_id
, parameter_id
);
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
];
557 qCritical("get_parameter_ranges(%i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
);
563 qCritical("get_parameter_ranges(%i, %i) - could not find plugin", plugin_id
, parameter_id
);
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
];
581 qCritical("get_custom_data(%i, %i) - custom_data_id out of bounds", plugin_id
, custom_data_id
);
587 qCritical("get_custom_data(%i, %i) - could not find plugin", plugin_id
, custom_data_id
);
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;
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());
618 qCritical("get_chunk_data(%i) - got invalid chunk data", plugin_id
);
621 qCritical("get_chunk_data(%i) - plugin does not support chunks", plugin_id
);
627 if (carla_is_engine_running())
628 qCritical("get_chunk_data(%i) - could not find plugin", plugin_id
);
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
)
646 qCritical("get_gui_data(%i) - could not find plugin", plugin_id
);
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
);
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
);
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
);
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
);
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
];
722 qCritical("get_program_name(%i, %i) - program_id out of bounds", plugin_id
, program_id
);
728 qCritical("get_program_name(%i, %i) - could not find plugin", plugin_id
, program_id
);
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
];
744 qCritical("get_midi_program_name(%i, %i) - program_id out of bounds", plugin_id
, midi_program_id
);
750 qCritical("get_midi_program_name(%i, %i) - could not find plugin", plugin_id
, midi_program_id
);
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
);
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
);
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
;
827 qCritical("get_default_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
);
833 qCritical("get_default_parameter_value(%i, %i) - could not find plugin", plugin_id
, parameter_id
);
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
]);
856 qCritical("get_current_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
);
862 qCritical("get_current_parameter_value(%i, %i) - could not find plugin", plugin_id
, parameter_id
);
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];
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];
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);
964 qCritical("set_parameter_value(%i, %i, %f) - parameter_id out of bounds", plugin_id
, parameter_id
, value
);
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
);
979 qCritical("set_parameter_midi_channel(%i, %i, %i) - invalid channel number", plugin_id
, parameter_id
, channel
);
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
);
996 qCritical("set_parameter_midi_channel(%i, %i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
, channel
);
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
);
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
);
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
);
1032 qCritical("set_parameter_midi_cc(%i, %i, %i) - parameter_id out of bounds", plugin_id
, parameter_id
, midi_cc
);
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);
1053 qCritical("set_program(%i, %i) - program_id out of bounds", plugin_id
, program_id
);
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);
1074 qCritical("set_midi_program(%i, %i) - program_id out of bounds", plugin_id
, midi_program_id
);
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
);
1109 qCritical("set_chunk_data(%i, %s) - plugin does not support chunks", plugin_id
, chunk_data
);
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
));
1130 qCritical("set_gui_data(%i, %i, " P_INTPTR
") - plugin has no UI", plugin_id
, data
, gui_addr
);
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
);
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
)
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
);
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
)
1216 case OPTION_GLOBAL_JACK_CLIENT
:
1217 carla_options
.global_jack_client
= value
;
1219 case OPTION_BRIDGE_PATH_LV2_GTK2
:
1220 if (value_str
) carla_options
.bridge_path_lv2_gtk2
= strdup(value_str
);
1222 case OPTION_BRIDGE_PATH_LV2_QT4
:
1223 if (value_str
) carla_options
.bridge_path_lv2_qt4
= strdup(value_str
);
1225 case OPTION_BRIDGE_PATH_LV2_X11
:
1226 if (value_str
) carla_options
.bridge_path_lv2_x11
= strdup(value_str
);
1228 case OPTION_BRIDGE_PATH_VST_QT4
:
1229 if (value_str
) carla_options
.bridge_path_vst_qt4
= strdup(value_str
);
1231 case OPTION_BRIDGE_PATH_WINVST
:
1232 if (value_str
) carla_options
.bridge_path_winvst
= strdup(value_str
);
1239 const char* get_last_error()
1241 qDebug("get_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 // -------------------------------------------------------------------------------------------------------------------
1280 short get_new_plugin_id()
1282 for (unsigned short i
=0; i
<MAX_PLUGINS
; i
++)
1284 if (!AudioPlugins
[i
])
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';
1309 // next number is 10, 2 digits
1310 qname
.replace(" (9)", " (10)");
1312 qname
[len
-2] = QChar('0'+number
+1);
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'))
1324 n3
= QChar(n3
.toAscii()+1);
1326 n2
= QChar(n2
.toAscii()+1);
1334 // Modify string if not
1339 return strdup(qname
.toStdString().data());
1342 void* get_pointer(intptr_t ptr_addr
)
1344 intptr_t* ptr
= (intptr_t*)ptr_addr
;
1348 void set_last_error(const char* 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
)
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
)
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
;
1402 carla_midi_unlock();
1406 // TODO - send midi note to GUI?
1412 osc_send_note_on(&AudioPlugins
[plugin_id
]->osc
.data
, plugin_id
, note
, velo
);
1414 osc_send_note_off(&AudioPlugins
[plugin_id
]->osc
.data
, plugin_id
, note
, velo
);
1418 callback_action(onoff
? CALLBACK_NOTE_ON
: CALLBACK_NOTE_OFF
, plugin_id
, note
, velo
, 0.0);
1420 // End of helper functions
1421 // -------------------------------------------------------------------------------------------------------------------