diff --git a/src/carla-bridge/carla_bridge.cpp b/src/carla-bridge/carla_bridge.cpp index 7467997..a6ee817 100644 --- a/src/carla-bridge/carla_bridge.cpp +++ b/src/carla-bridge/carla_bridge.cpp @@ -111,7 +111,7 @@ int main(int argc, char* argv[]) if (close_now) break; - msleep(50); + carla_msleep(50); } delete plugin; diff --git a/src/carla.py b/src/carla.py index 32e247e..fdb0c62 100755 --- a/src/carla.py +++ b/src/carla.py @@ -2942,6 +2942,8 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.m_bridge_info.unique_id = plugin['unique_id'] self.m_bridge_info.ains = plugin['audio.ins'] self.m_bridge_info.aouts = plugin['audio.outs'] + self.m_bridge_info.mins = plugin['midi.ins'] + self.m_bridge_info.mouts = plugin['midi.outs'] return pointer(self.m_bridge_info) elif (ptype == PLUGIN_LADSPA): @@ -3340,7 +3342,21 @@ if __name__ == '__main__': gui = CarlaMainW() # Init backend - CarlaHost.set_option(OPTION_GLOBAL_JACK_CLIENT, 0, "") + CarlaHost.set_option(OPTION_GLOBAL_JACK_CLIENT, gui.settings.value("Engine/GlobalClient", False, type=bool), "") + CarlaHost.set_option(OPTION_USE_DSSI_CHUNKS, gui.settings.value("Engine/DSSIChunks", False, type=bool), "") + CarlaHost.set_option(OPTION_PREFER_UI_BRIDGES, gui.settings.value("Engine/PreferBridges", True, type=bool), "") + + if (carla_bridge_unix32): + CarlaHost.set_option(OPTION_PATH_BRIDGE_UNIX32, 0, carla_bridge_unix32) + + if (carla_bridge_unix32): + CarlaHost.set_option(OPTION_PATH_BRIDGE_UNIX64, 0, carla_bridge_unix64) + + if (carla_bridge_win32): + CarlaHost.set_option(OPTION_PATH_BRIDGE_WIN32, 0, carla_bridge_win32) + + if (carla_bridge_win64): + CarlaHost.set_option(OPTION_PATH_BRIDGE_WIN64, 0, carla_bridge_win64) if (not CarlaHost.carla_init("Carla")): CustomMessageBox(None, QMessageBox.Critical, "Error", "Could not connect to JACK", diff --git a/src/carla/carla_backend.cpp b/src/carla/carla_backend.cpp index c1b7670..57abca8 100644 --- a/src/carla/carla_backend.cpp +++ b/src/carla/carla_backend.cpp @@ -81,6 +81,18 @@ bool carla_close() get_real_plugin_name(0); set_last_error(nullptr); + if (carla_options.bridge_unix32) + free((void*)carla_options.bridge_unix32); + + if (carla_options.bridge_unix64) + free((void*)carla_options.bridge_unix64); + + if (carla_options.bridge_win32) + free((void*)carla_options.bridge_win32); + + if (carla_options.bridge_win64) + free((void*)carla_options.bridge_win64); + return closed; } @@ -584,13 +596,27 @@ const char* get_program_name(unsigned short plugin_id, uint32_t program_id) { qDebug("get_program_name(%i, %i)", plugin_id, program_id); + static const char* program_name = nullptr; + + if (program_name) + free((void*)program_name); + + program_name = nullptr; + for (unsigned short i=0; iid() == plugin_id) { if (program_id < plugin->prog_count()) - return plugin->prog_name(program_id); + { + char buf_str[STR_MAX] = { 0 }; + + plugin->get_program_name(program_id, buf_str); + program_name = strdup(buf_str); + + return program_name; + } else qCritical("get_program_name(%i, %i) - program_id out of bounds", plugin_id, program_id); @@ -606,13 +632,27 @@ const char* get_midi_program_name(unsigned short plugin_id, uint32_t midi_progra { qDebug("get_midi_program_name(%i, %i)", plugin_id, midi_program_id); + static const char* midi_program_name = nullptr; + + if (midi_program_name) + free((void*)midi_program_name); + + midi_program_name = nullptr; + for (unsigned short i=0; iid() == plugin_id) { if (midi_program_id < plugin->midiprog_count()) - return plugin->midiprog_name(midi_program_id); + { + char buf_str[STR_MAX] = { 0 }; + + plugin->get_midi_program_name(midi_program_id, buf_str); + midi_program_name = strdup(buf_str); + + return midi_program_name; + } else qCritical("get_midi_program_name(%i, %i) - program_id out of bounds", plugin_id, midi_program_id); @@ -695,7 +735,8 @@ double get_default_parameter_value(unsigned short plugin_id, uint32_t parameter_ if (plugin && plugin->id() == plugin_id) { if (parameter_id < plugin->param_count()) - return plugin->get_default_parameter_value(parameter_id); + return plugin->param_ranges(parameter_id)->def; + //return plugin->get_default_parameter_value(parameter_id); else qCritical("get_default_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id); @@ -1066,6 +1107,24 @@ void set_option(OptionsType option, int value, const char* value_str) case OPTION_GLOBAL_JACK_CLIENT: carla_options.global_jack_client = value; break; + case OPTION_USE_DSSI_CHUNKS: + carla_options.use_dssi_chunks = value; + break; + case OPTION_PREFER_UI_BRIDGES: + carla_options.prefer_ui_bridges = value; + break; + case OPTION_PATH_BRIDGE_UNIX32: + carla_options.bridge_unix32 = strdup(value_str); + break; + case OPTION_PATH_BRIDGE_UNIX64: + carla_options.bridge_unix64 = strdup(value_str); + break; + case OPTION_PATH_BRIDGE_WIN32: + carla_options.bridge_win32 = strdup(value_str); + break; + case OPTION_PATH_BRIDGE_WIN64: + carla_options.bridge_win64 = strdup(value_str); + break; default: break; } diff --git a/src/carla/carla_backend.h b/src/carla/carla_backend.h index 3510cc6..7a59ac7 100644 --- a/src/carla/carla_backend.h +++ b/src/carla/carla_backend.h @@ -111,7 +111,11 @@ enum GuiType { enum OptionsType { OPTION_GLOBAL_JACK_CLIENT = 1, OPTION_USE_DSSI_CHUNKS = 2, - OPTION_PREFER_UI_BRIDGES = 3 + OPTION_PREFER_UI_BRIDGES = 3, + OPTION_PATH_BRIDGE_UNIX32 = 4, + OPTION_PATH_BRIDGE_UNIX64 = 5, + OPTION_PATH_BRIDGE_WIN32 = 6, + OPTION_PATH_BRIDGE_WIN64 = 7 }; enum CallbackType { @@ -208,6 +212,8 @@ struct PluginBridgeInfo { long unique_id; uint32_t ains; uint32_t aouts; + uint32_t mins; + uint32_t mouts; }; struct carla_options_t { @@ -215,6 +221,10 @@ struct carla_options_t { bool global_jack_client; bool use_dssi_chunks; bool prefer_ui_bridges; + const char* bridge_unix32; + const char* bridge_unix64; + const char* bridge_win32; + const char* bridge_win64; }; typedef void (*CallbackFunc)(CallbackType action, unsigned short plugin_id, int value1, int value2, double value3); diff --git a/src/carla/carla_bridge.cpp b/src/carla/carla_bridge.cpp index 797908b..b5fcbf2 100644 --- a/src/carla/carla_bridge.cpp +++ b/src/carla/carla_bridge.cpp @@ -58,6 +58,7 @@ public: delete m_thread; } +#if 0 virtual PluginCategory category() { return m_info.category; @@ -80,14 +81,12 @@ public: virtual uint32_t min_count() { - // TODO - add this to pluginbridgeinfo - return 0; //m_info.mins; + return m_info.mins; } virtual uint32_t mout_count() { - // TODO - add this to pluginbridgeinfo - return 0; //m_info.mouts; + return m_info.mouts; } virtual void get_label(char* buf_str) @@ -110,13 +109,6 @@ public: strncpy(buf_str, m_info.name, STR_MAX); } - virtual void get_audio_port_count_info(PortCountInfo* info) - { - info->ins = m_info.ains; - info->outs = m_info.aouts; - info->total = m_info.ains + m_info.aouts; - } - virtual void reload() { // plugin checks @@ -133,6 +125,7 @@ public: m_hints |= m_info.hints; } +#endif bool init(const char* filename, const char* label, void* extra_stuff) { diff --git a/src/carla/carla_plugin.h b/src/carla/carla_plugin.h index 8609b59..bab7da4 100644 --- a/src/carla/carla_plugin.h +++ b/src/carla/carla_plugin.h @@ -356,10 +356,10 @@ public: } // FIXME - remove this? - double get_default_parameter_value(uint32_t param_id) - { - return param.ranges[param_id].def; - } +// double get_default_parameter_value(uint32_t param_id) +// { +// return param.ranges[param_id].def; +// } virtual void get_label(char* buf_str) { @@ -381,34 +381,34 @@ public: *buf_str = 0; } - virtual void get_parameter_name(uint32_t /*index*/, char* buf_str) + virtual void get_parameter_name(uint32_t /*param_id*/, char* buf_str) { *buf_str = 0; } - virtual void get_parameter_symbol(uint32_t /*index*/, char* buf_str) + virtual void get_parameter_symbol(uint32_t /*param_id*/, char* buf_str) { *buf_str = 0; } - virtual void get_parameter_label(uint32_t /*index*/, char* buf_str) + virtual void get_parameter_label(uint32_t /*param_id*/, char* buf_str) { *buf_str = 0; } - virtual void get_parameter_scalepoint_label(uint32_t /*pindex*/, uint32_t /*index*/, char* buf_str) + virtual void get_parameter_scalepoint_label(uint32_t /*param_id*/, uint32_t /*scalepoint_id*/, char* buf_str) { *buf_str = 0; } - const char* prog_name(uint32_t index) + void get_program_name(uint32_t program_id, char* buf_str) { - return prog.names[index]; + strncpy(buf_str, prog.names[program_id], STR_MAX); } - const char* midiprog_name(uint32_t index) + void get_midi_program_name(uint32_t midiprogram_id, char* buf_str) { - return midiprog.data[index].name; + strncpy(buf_str, midiprog.data[midiprogram_id].name, STR_MAX); } void get_parameter_count_info(PortCountInfo* info) @@ -606,11 +606,11 @@ public: virtual void set_custom_data(CustomDataType dtype, const char* key, const char* value, bool) { + qDebug("set_custom_data(%i, %s, %s)", dtype, key, value); + bool save_data = true; bool already_have = false; - qDebug("set_custom_data(%i, %s, %s)", dtype, key, value); - switch (dtype) { case CUSTOM_DATA_INVALID: @@ -716,7 +716,7 @@ public: callback_action(CALLBACK_MIDI_PROGRAM_CHANGED, m_id, midiprog.current, 0, 0.0); } - virtual void send_midi_note(bool onoff, uint8_t note, uint8_t velo, bool, bool osc_send, bool callback_send) + void send_midi_note(bool onoff, uint8_t note, uint8_t velo, bool, bool osc_send, bool callback_send) { carla_midi_lock(); for (unsigned int i=0; iLabel, STR_MAX); @@ -120,9 +128,9 @@ public: strncpy(buf_str, ldescriptor->Name, STR_MAX); } - virtual void get_parameter_name(uint32_t index, char* buf_str) + virtual void get_parameter_name(uint32_t param_id, char* buf_str) { - int32_t rindex = param.data[index].rindex; + int32_t rindex = param.data[param_id].rindex; strncpy(buf_str, ldescriptor->PortNames[rindex], STR_MAX); } @@ -134,11 +142,6 @@ public: info->type = GUI_NONE; } - virtual double get_current_parameter_value(uint32_t index) - { - return param_buffers[index]; - } - virtual void set_parameter_value(uint32_t index, double value, bool gui_send, bool osc_send, bool callback_send) { param_buffers[index] = value; @@ -1093,6 +1096,26 @@ public: m_active_before = m_active; } + virtual void delete_buffers() + { + qDebug("DssiPlugin::delete_buffers() - start"); + + if (ain.count > 0) + delete[] ain_rindexes; + + if (aout.count > 0) + delete[] aout_rindexes; + + if (param.count > 0) + delete[] param_buffers; + + ain_rindexes = nullptr; + aout_rindexes = nullptr; + param_buffers = nullptr; + + qDebug("DssiPlugin::delete_buffers() - end"); + } + bool init(const char* filename, const char* label, void* extra_stuff) { if (lib_open(filename)) diff --git a/src/carla/ladspa.cpp b/src/carla/ladspa.cpp index d9a0fa3..af25810 100644 --- a/src/carla/ladspa.cpp +++ b/src/carla/ladspa.cpp @@ -72,6 +72,10 @@ public: handle = nullptr; descriptor = nullptr; rdf_descriptor = nullptr; + + ain_rindexes = nullptr; + aout_rindexes = nullptr; + param_buffers = nullptr; } virtual ~LadspaPlugin() @@ -147,6 +151,11 @@ public: return 0; } + virtual double get_parameter_value(uint32_t param_id) + { + return param_buffers[param_id]; + } + virtual double get_parameter_scalepoint_value(uint32_t param_id, uint32_t scalepoint_id) { int32_t param_rindex = param.data[param_id].rindex; @@ -181,15 +190,15 @@ public: strncpy(buf_str, descriptor->Name, STR_MAX); } - virtual void get_parameter_name(uint32_t index, char* buf_str) + virtual void get_parameter_name(uint32_t param_id, char* buf_str) { - int32_t rindex = param.data[index].rindex; + int32_t rindex = param.data[param_id].rindex; strncpy(buf_str, descriptor->PortNames[rindex], STR_MAX); } - virtual void get_parameter_symbol(uint32_t index, char* buf_str) + virtual void get_parameter_symbol(uint32_t param_id, char* buf_str) { - int32_t rindex = param.data[index].rindex; + int32_t rindex = param.data[param_id].rindex; bool HasPortRDF = (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount); if (HasPortRDF) @@ -204,9 +213,9 @@ public: *buf_str = 0; } - virtual void get_parameter_label(uint32_t index, char* buf_str) + virtual void get_parameter_label(uint32_t param_id, char* buf_str) { - int32_t rindex = param.data[index].rindex; + int32_t rindex = param.data[param_id].rindex; bool HasPortRDF = (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount); if (HasPortRDF) @@ -240,22 +249,17 @@ public: *buf_str = 0; } - virtual void get_parameter_scalepoint_label(uint32_t pindex, uint32_t index, char* buf_str) + virtual void get_parameter_scalepoint_label(uint32_t param_id, uint32_t scalepoint_id, char* buf_str) { - int32_t prindex = param.data[pindex].rindex; + int32_t param_rindex = param.data[param_id].rindex; - bool HasPortRDF = (rdf_descriptor && prindex < (int32_t)rdf_descriptor->PortCount); + bool HasPortRDF = (rdf_descriptor && param_rindex < (int32_t)rdf_descriptor->PortCount); if (HasPortRDF) - strncpy(buf_str, rdf_descriptor->Ports[prindex].ScalePoints[index].Label, STR_MAX); + strncpy(buf_str, rdf_descriptor->Ports[param_rindex].ScalePoints[scalepoint_id].Label, STR_MAX); else *buf_str = 0; } - virtual double get_current_parameter_value(uint32_t index) - { - return param_buffers[index]; - } - virtual void set_parameter_value(uint32_t index, double value, bool gui_send, bool osc_send, bool callback_send) { param_buffers[index] = value; @@ -866,6 +870,26 @@ public: m_active_before = m_active; } + virtual void delete_buffers() + { + qDebug("LadspaPlugin::delete_buffers() - start"); + + if (ain.count > 0) + delete[] ain_rindexes; + + if (aout.count > 0) + delete[] aout_rindexes; + + if (param.count > 0) + delete[] param_buffers; + + ain_rindexes = nullptr; + aout_rindexes = nullptr; + param_buffers = nullptr; + + qDebug("LadspaPlugin::delete_buffers() - end"); + } + bool init(const char* filename, const char* label, void* extra_stuff) { if (lib_open(filename)) diff --git a/src/carla/lv2.cpp b/src/carla/lv2.cpp index 225aaa8..9c78ad8 100644 --- a/src/carla/lv2.cpp +++ b/src/carla/lv2.cpp @@ -120,6 +120,7 @@ public: custom_uri_ids.clear(); } +#if 0 virtual PluginCategory category() { LV2_Property Category = rdf_descriptor->Type; @@ -287,6 +288,7 @@ public: qDebug("Lv2Plugin::lv2_delete_buffers() - end"); } +#endif bool init(const char* filename, const char* URI, void* extra_stuff) { diff --git a/src/carla/sf2.cpp b/src/carla/sf2.cpp index 4ae0ea4..2d1f8df 100644 --- a/src/carla/sf2.cpp +++ b/src/carla/sf2.cpp @@ -48,6 +48,7 @@ public: delete_fluid_settings(f_settings); } +#if 0 virtual PluginCategory category() { return PLUGIN_CATEGORY_SYNTH; @@ -1002,6 +1003,7 @@ public: active_before = active; #endif } +#endif bool init(const char* filename, const char* label) { diff --git a/src/carla/vst.cpp b/src/carla/vst.cpp index 55daa49..ddbee77 100644 --- a/src/carla/vst.cpp +++ b/src/carla/vst.cpp @@ -78,6 +78,7 @@ public: } } +#if 0 virtual PluginCategory category() { intptr_t VstCategory = effect->dispatcher(effect, effGetPlugCategory, 0, 0, nullptr, 0.0f); @@ -129,6 +130,7 @@ public: { effect->dispatcher(effect, effGetEffectName, 0, 0, buf_str, 0.0f); } +#endif private: AEffect* effect; diff --git a/src/carla_backend.py b/src/carla_backend.py index bfd534c..ea39075 100644 --- a/src/carla_backend.py +++ b/src/carla_backend.py @@ -191,6 +191,11 @@ carla_discovery_unix64 = "" carla_discovery_win32 = "" carla_discovery_win64 = "" +carla_bridge_unix32 = "" +carla_bridge_unix64 = "" +carla_bridge_win32 = "" +carla_bridge_win64 = "" + #carla_bridge_lv2_gtk2 = "" #carla_bridge_lv2_qt4 = "" #carla_bridge_lv2_x11 = "" @@ -246,6 +251,42 @@ else: carla_discovery_win64 = os.path.join(p, "carla-discovery-win64.exe") break +# bridge-unix32 +if (os.path.exists(os.path.join(CWD, "carla-bridge", "carla-bridge-unix32"))): + carla_bridge_unix32 = os.path.join(CWD, "carla-bridge", "carla-bridge-unix32") +else: + for p in PATH: + if (os.path.exists(os.path.join(p, "carla-bridge-unix32"))): + carla_bridge_unix32 = os.path.join(p, "carla-bridge-unix32") + break + +# bridge-unix64 +if (os.path.exists(os.path.join(CWD, "carla-bridge", "carla-bridge-unix64"))): + carla_bridge_unix64 = os.path.join(CWD, "carla-bridge", "carla-bridge-unix64") +else: + for p in PATH: + if (os.path.exists(os.path.join(p, "carla-bridge-unix64"))): + carla_bridge_unix64 = os.path.join(p, "carla-bridge-unix64") + break + +# bridge-win32 +if (os.path.exists(os.path.join(CWD, "carla-bridge", "carla-bridge-win32.exe"))): + carla_bridge_win32 = os.path.join(CWD, "carla-bridge", "carla-bridge-win32.exe") +else: + for p in PATH: + if (os.path.exists(os.path.join(p, "carla-bridge-wine32.exe"))): + carla_bridge_win32 = os.path.join(p, "carla-bridge-win32.exe") + break + +# bridge-win64 +if (os.path.exists(os.path.join(CWD, "carla-bridge", "carla-bridge-win64.exe"))): + carla_bridge_win64 = os.path.join(CWD, "carla-bridge", "carla-bridge-win64.exe") +else: + for p in PATH: + if (os.path.exists(os.path.join(p, "carla-bridge-win64.exe"))): + carla_bridge_win64 = os.path.join(p, "carla-bridge-win64.exe") + break + ## lv2-gtk2 #if (os.path.exists(os.path.join(CWD, "carla-bridges", "carla-bridge-lv2-gtk2"))): #carla_bridge_lv2_gtk2 = os.path.join(CWD, "carla-bridges", "carla-bridge-lv2-gtk2") @@ -295,12 +336,10 @@ print("carla_discovery_unix32 ->", carla_discovery_unix32) print("carla_discovery_unix64 ->", carla_discovery_unix64) print("carla_discovery_win32 ->", carla_discovery_win32) print("carla_discovery_win64 ->", carla_discovery_win64) - -print("LADSPA ->", DEFAULT_LADSPA_PATH) -print("DSSI ->", DEFAULT_DSSI_PATH) -print("LV2 ->", DEFAULT_LV2_PATH) -print("VST ->", DEFAULT_VST_PATH) -print("SF2 ->", DEFAULT_SF2_PATH) +print("carla_bridge_unix32 ->", carla_bridge_unix32) +print("carla_bridge_unix64 ->", carla_bridge_unix64) +print("carla_bridge_win32 ->", carla_bridge_win32) +print("carla_bridge_win64 ->", carla_bridge_win64) # ------------------------------------------------------------------------------------------------ # Plugin Query (helper functions) @@ -657,6 +696,10 @@ GUI_EXTERNAL_LV2 = 4 OPTION_GLOBAL_JACK_CLIENT = 1 OPTION_USE_DSSI_CHUNKS = 2 OPTION_PREFER_UI_BRIDGES = 3 +OPTION_PATH_BRIDGE_UNIX32 = 4 +OPTION_PATH_BRIDGE_UNIX64 = 5 +OPTION_PATH_BRIDGE_WIN32 = 6 +OPTION_PATH_BRIDGE_WIN64 = 7 # enum CallbackType CALLBACK_DEBUG = 0 @@ -760,7 +803,9 @@ class PluginBridgeInfo(Structure): ("maker", c_char_p), ("unique_id", c_long), ("ains", c_uint32), - ("aouts", c_uint32) + ("aouts", c_uint32), + ("mins", c_uint32), + ("mouts", c_uint32) ] CallbackFunc = CFUNCTYPE(None, c_enum, c_ushort, c_int, c_int, c_double)