| @@ -108,14 +108,15 @@ enum BinaryType { | |||||
| * \note Some plugin classes might provide more than 1 plugin type. | * \note Some plugin classes might provide more than 1 plugin type. | ||||
| */ | */ | ||||
| enum PluginType { | enum PluginType { | ||||
| PLUGIN_NONE = 0, //!< Null plugin type. | |||||
| PLUGIN_LADSPA = 1, //!< LADSPA plugin.\see LadspaPlugin | |||||
| PLUGIN_DSSI = 2, //!< DSSI plugin.\see DssiPlugin | |||||
| PLUGIN_LV2 = 3, //!< LV2 plugin.\see Lv2Plugin | |||||
| PLUGIN_VST = 4, //!< VST plugin.\see VstPlugin | |||||
| PLUGIN_GIG = 5, //!< GIG sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||||
| PLUGIN_SF2 = 6, //!< SF2 sound kit (aka SoundFont), implemented via FluidSynth.\see FluidSynthPlugin | |||||
| PLUGIN_SFZ = 7 //!< SFZ sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||||
| PLUGIN_NONE = 0, //!< Null plugin type. | |||||
| PLUGIN_INTERNAL = 1, //!< Internal plugin. | |||||
| PLUGIN_LADSPA = 2, //!< LADSPA plugin.\see LadspaPlugin | |||||
| PLUGIN_DSSI = 3, //!< DSSI plugin.\see DssiPlugin | |||||
| PLUGIN_LV2 = 4, //!< LV2 plugin.\see Lv2Plugin | |||||
| PLUGIN_VST = 5, //!< VST plugin.\see VstPlugin | |||||
| PLUGIN_GIG = 6, //!< GIG sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||||
| PLUGIN_SF2 = 7, //!< SF2 sound kit (aka SoundFont), implemented via FluidSynth.\see FluidSynthPlugin | |||||
| PLUGIN_SFZ = 8 //!< SFZ sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||||
| }; | }; | ||||
| enum PluginCategory { | enum PluginCategory { | ||||
| @@ -17,6 +17,7 @@ | |||||
| #include "carla_backend_standalone.h" | #include "carla_backend_standalone.h" | ||||
| #include "carla_plugin.h" | #include "carla_plugin.h" | ||||
| #include "plugins/carla_native.h" | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -90,6 +91,39 @@ const char* get_engine_driver_name(unsigned int index) | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| unsigned int get_internal_plugin_count() | |||||
| { | |||||
| qDebug("CarlaBackendStandalone::get_internal_plugin_count()"); | |||||
| return CarlaBackend::CarlaPlugin::getNativePluginCount(); | |||||
| } | |||||
| const PluginInfo* get_internal_plugin_info(unsigned int plugin_id) | |||||
| { | |||||
| qDebug("CarlaBackendStandalone::get_internal_plugin_info(%i)", plugin_id); | |||||
| static PluginInfo info; | |||||
| const PluginDescriptor* const nativePlugin = CarlaBackend::CarlaPlugin::getNativePlugin(plugin_id); | |||||
| Q_ASSERT(nativePlugin); | |||||
| if (! nativePlugin) | |||||
| return nullptr; | |||||
| info.type = CarlaBackend::PLUGIN_NONE; | |||||
| info.category = (CarlaBackend::PluginCategory)nativePlugin->category; | |||||
| info.hints = CarlaBackend::getPluginHintsFromNative(nativePlugin->hints); | |||||
| info.name = nativePlugin->name; | |||||
| info.label = nativePlugin->label; | |||||
| info.maker = nativePlugin->maker; | |||||
| info.copyright = nativePlugin->copyright; | |||||
| return &info; | |||||
| } | |||||
| // ------------------------------------------------------------------------------------------------------------------- | |||||
| bool engine_init(const char* driver_name, const char* client_name) | bool engine_init(const char* driver_name, const char* client_name) | ||||
| { | { | ||||
| qDebug("CarlaBackendStandalone::engine_init(\"%s\", \"%s\")", driver_name, client_name); | qDebug("CarlaBackendStandalone::engine_init(\"%s\", \"%s\")", driver_name, client_name); | ||||
| @@ -98,6 +98,9 @@ struct GuiInfo { | |||||
| CARLA_EXPORT unsigned int get_engine_driver_count(); | CARLA_EXPORT unsigned int get_engine_driver_count(); | ||||
| CARLA_EXPORT const char* get_engine_driver_name(unsigned int index); | CARLA_EXPORT const char* get_engine_driver_name(unsigned int index); | ||||
| CARLA_EXPORT unsigned int get_internal_plugin_count(); | |||||
| CARLA_EXPORT const PluginInfo* get_internal_plugin_info(unsigned int plugin_id); | |||||
| CARLA_EXPORT bool engine_init(const char* driver_name, const char* client_name); | CARLA_EXPORT bool engine_init(const char* driver_name, const char* client_name); | ||||
| CARLA_EXPORT bool engine_close(); | CARLA_EXPORT bool engine_close(); | ||||
| CARLA_EXPORT bool is_engine_running(); | CARLA_EXPORT bool is_engine_running(); | ||||
| @@ -285,6 +285,9 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con | |||||
| { | { | ||||
| case PLUGIN_NONE: | case PLUGIN_NONE: | ||||
| break; | break; | ||||
| case PLUGIN_INTERNAL: | |||||
| plugin = CarlaPlugin::newNative(init); | |||||
| break; | |||||
| case PLUGIN_LADSPA: | case PLUGIN_LADSPA: | ||||
| plugin = CarlaPlugin::newLADSPA(init, extra); | plugin = CarlaPlugin::newLADSPA(init, extra); | ||||
| break; | break; | ||||
| @@ -65,7 +65,7 @@ public: | |||||
| { | { | ||||
| qDebug("NativePlugin::NativePlugin()"); | qDebug("NativePlugin::NativePlugin()"); | ||||
| m_type = PLUGIN_NONE; | |||||
| m_type = PLUGIN_INTERNAL; | |||||
| descriptor = nullptr; | descriptor = nullptr; | ||||
| handle = nullptr; | handle = nullptr; | ||||
| @@ -164,6 +164,16 @@ public: | |||||
| return pluginDescriptors.size(); | return pluginDescriptors.size(); | ||||
| } | } | ||||
| static const PluginDescriptor* getPlugin(size_t index) | |||||
| { | |||||
| Q_ASSERT(index < pluginDescriptors.size()); | |||||
| if (index < pluginDescriptors.size()) | |||||
| return pluginDescriptors[index]; | |||||
| return nullptr; | |||||
| } | |||||
| static void registerPlugin(const PluginDescriptor* desc) | static void registerPlugin(const PluginDescriptor* desc) | ||||
| { | { | ||||
| pluginDescriptors.push_back(desc); | pluginDescriptors.push_back(desc); | ||||
| @@ -258,6 +268,11 @@ size_t CarlaPlugin::getNativePluginCount() | |||||
| return NativePlugin::getPluginCount(); | return NativePlugin::getPluginCount(); | ||||
| } | } | ||||
| const PluginDescriptor* CarlaPlugin::getNativePlugin(size_t index) | |||||
| { | |||||
| return NativePlugin::getPlugin(index); | |||||
| } | |||||
| CARLA_BACKEND_END_NAMESPACE | CARLA_BACKEND_END_NAMESPACE | ||||
| void carla_register_native_plugin(const PluginDescriptor* desc) | void carla_register_native_plugin(const PluginDescriptor* desc) | ||||
| @@ -42,6 +42,8 @@ typedef QX11EmbedContainer GuiContainer; | |||||
| typedef QWidget GuiContainer; | typedef QWidget GuiContainer; | ||||
| #endif | #endif | ||||
| typedef struct _PluginDescriptor PluginDescriptor; | |||||
| CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
| /*! | /*! | ||||
| @@ -2108,6 +2110,7 @@ public: | |||||
| static CarlaPlugin* newNative(const initializer& init); | static CarlaPlugin* newNative(const initializer& init); | ||||
| static size_t getNativePluginCount(); | static size_t getNativePluginCount(); | ||||
| static const PluginDescriptor* getNativePlugin(size_t index); | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -17,6 +17,10 @@ | |||||
| #include "carla_shared.h" | #include "carla_shared.h" | ||||
| #ifndef BUILD_BRIDGE | |||||
| # include "plugins/carla_native.h" | |||||
| #endif | |||||
| #include <QtCore/QString> | #include <QtCore/QString> | ||||
| CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
| @@ -58,6 +62,8 @@ const char* PluginType2str(const PluginType type) | |||||
| { | { | ||||
| case PLUGIN_NONE: | case PLUGIN_NONE: | ||||
| return "PLUGIN_NONE"; | return "PLUGIN_NONE"; | ||||
| case PLUGIN_INTERNAL: | |||||
| return "PLUGIN_INTERNAL"; | |||||
| case PLUGIN_LADSPA: | case PLUGIN_LADSPA: | ||||
| return "PLUGIN_LADSPA"; | return "PLUGIN_LADSPA"; | ||||
| case PLUGIN_DSSI: | case PLUGIN_DSSI: | ||||
| @@ -393,6 +399,8 @@ const char* getPluginTypeString(const PluginType type) | |||||
| { | { | ||||
| case PLUGIN_NONE: | case PLUGIN_NONE: | ||||
| return "NONE"; | return "NONE"; | ||||
| case PLUGIN_INTERNAL: | |||||
| return "INTERNAL"; | |||||
| case PLUGIN_LADSPA: | case PLUGIN_LADSPA: | ||||
| return "LADSPA"; | return "LADSPA"; | ||||
| case PLUGIN_DSSI: | case PLUGIN_DSSI: | ||||
| @@ -520,6 +528,20 @@ void setLastError(const char* const error) | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| uint32_t getPluginHintsFromNative(const uint32_t nativeHints) | |||||
| { | |||||
| uint32_t realHints = 0; | |||||
| if (nativeHints & ::PLUGIN_IS_SYNTH) | |||||
| realHints |= PLUGIN_IS_SYNTH; | |||||
| if (nativeHints & ::PLUGIN_HAS_GUI) | |||||
| realHints |= PLUGIN_HAS_GUI; | |||||
| if (nativeHints & ::PLUGIN_USES_SINGLE_THREAD) | |||||
| realHints |= PLUGIN_USES_SINGLE_THREAD; | |||||
| return realHints; | |||||
| } | |||||
| void setOption(const OptionsType option, const int value, const char* const valueStr) | void setOption(const OptionsType option, const int value, const char* const valueStr) | ||||
| { | { | ||||
| qDebug("CarlaBackend::setOption(%s, %i, \"%s\")", OptionsType2str(option), value, valueStr); | qDebug("CarlaBackend::setOption(%s, %i, \"%s\")", OptionsType2str(option), value, valueStr); | ||||
| @@ -51,6 +51,8 @@ const char* getLastError(); | |||||
| void setLastError(const char* const error); | void setLastError(const char* const error); | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| uint32_t getPluginHintsFromNative(const uint32_t nativeHints); | |||||
| void setOption(const OptionsType option, const int value, const char* const valueStr); | void setOption(const OptionsType option, const int value, const char* const valueStr); | ||||
| void resetOptions(); | void resetOptions(); | ||||
| @@ -576,8 +576,8 @@ class PluginRefreshW(QDialog, ui_carla_refresh.Ui_PluginRefreshW): | |||||
| self.b_close.setVisible(False) | self.b_close.setVisible(False) | ||||
| native, posix32, posix64, win32, win64 = (self.ch_native.isChecked(), self.ch_posix32.isChecked(), self.ch_posix64.isChecked(), self.ch_win32.isChecked(), self.ch_win64.isChecked()) | native, posix32, posix64, win32, win64 = (self.ch_native.isChecked(), self.ch_posix32.isChecked(), self.ch_posix64.isChecked(), self.ch_win32.isChecked(), self.ch_win64.isChecked()) | ||||
| ladspa, dssi, lv2, vst, gig, sf2, sfz = (self.ch_ladspa.isChecked(), self.ch_dssi.isChecked(), self.ch_lv2.isChecked(), self.ch_vst.isChecked(), | |||||
| self.ch_gig.isChecked(), self.ch_sf2.isChecked(), self.ch_sfz.isChecked()) | |||||
| ladspa, dssi, lv2, vst, gig, sf2, sfz = (self.ch_ladspa.isChecked(), self.ch_dssi.isChecked(), self.ch_lv2.isChecked(), self.ch_vst.isChecked(), | |||||
| self.ch_gig.isChecked(), self.ch_sf2.isChecked(), self.ch_sfz.isChecked()) | |||||
| self.pThread.setSearchBinaryTypes(native, posix32, posix64, win32, win64) | self.pThread.setSearchBinaryTypes(native, posix32, posix64, win32, win64) | ||||
| self.pThread.setSearchPluginTypes(ladspa, dssi, lv2, vst, gig, sf2, sfz) | self.pThread.setSearchPluginTypes(ladspa, dssi, lv2, vst, gig, sf2, sfz) | ||||
| @@ -693,6 +693,7 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.connect(self.ch_midi, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_midi, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| self.connect(self.ch_other, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_other, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| self.connect(self.ch_kits, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_kits, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| self.connect(self.ch_internal, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | |||||
| self.connect(self.ch_ladspa, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_ladspa, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| self.connect(self.ch_dssi, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_dssi, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| self.connect(self.ch_lv2, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | self.connect(self.ch_lv2, SIGNAL("clicked()"), SLOT("slot_checkFilters()")) | ||||
| @@ -709,6 +710,28 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.tb_filters.setArrowType(Qt.UpArrow if yesno else Qt.DownArrow) | self.tb_filters.setArrowType(Qt.UpArrow if yesno else Qt.DownArrow) | ||||
| self.frame.setVisible(yesno) | self.frame.setVisible(yesno) | ||||
| def checkInternalPlugins(self): | |||||
| internals = toList(self.settings_db.value("Plugins/Internal", [])) | |||||
| count = 0 | |||||
| for plugins in internals: | |||||
| for plugin in plugins: | |||||
| count += 1 | |||||
| if count != Carla.Host.get_internal_plugin_count(): | |||||
| internal_plugins = [] | |||||
| for i in range(Carla.Host.get_internal_plugin_count()): | |||||
| descInfo = Carla.Host.get_internal_plugin_info(i) | |||||
| plugins = checkPluginInternal(descInfo) | |||||
| if plugins: | |||||
| internal_plugins.append(plugins) | |||||
| self.settings_db.setValue("Plugins/Internal", internal_plugins) | |||||
| self.settings_db.sync() | |||||
| def reAddPlugins(self): | def reAddPlugins(self): | ||||
| row_count = self.tableWidget.rowCount() | row_count = self.tableWidget.rowCount() | ||||
| for x in range(row_count): | for x in range(row_count): | ||||
| @@ -717,6 +740,10 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.last_table_index = 0 | self.last_table_index = 0 | ||||
| self.tableWidget.setSortingEnabled(False) | self.tableWidget.setSortingEnabled(False) | ||||
| self.checkInternalPlugins() | |||||
| internals = toList(self.settings_db.value("Plugins/Internal", [])) | |||||
| ladspa_plugins = [] | ladspa_plugins = [] | ||||
| ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_native", [])) | ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_native", [])) | ||||
| ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_posix32", [])) | ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_posix32", [])) | ||||
| @@ -749,12 +776,18 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| sf2s = toList(self.settings_db.value("Plugins/SF2", [])) | sf2s = toList(self.settings_db.value("Plugins/SF2", [])) | ||||
| sfzs = toList(self.settings_db.value("Plugins/SFZ", [])) | sfzs = toList(self.settings_db.value("Plugins/SFZ", [])) | ||||
| internal_count = 0 | |||||
| ladspa_count = 0 | ladspa_count = 0 | ||||
| dssi_count = 0 | dssi_count = 0 | ||||
| lv2_count = 0 | lv2_count = 0 | ||||
| vst_count = 0 | vst_count = 0 | ||||
| kit_count = 0 | kit_count = 0 | ||||
| for plugins in internals: | |||||
| for plugin in plugins: | |||||
| self.addPluginToTable(plugin, self.tr("Internal")) | |||||
| internal_count += 1 | |||||
| for plugins in ladspa_plugins: | for plugins in ladspa_plugins: | ||||
| for plugin in plugins: | for plugin in plugins: | ||||
| self.addPluginToTable(plugin, "LADSPA") | self.addPluginToTable(plugin, "LADSPA") | ||||
| @@ -794,7 +827,7 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.tableWidget.setSortingEnabled(True) | self.tableWidget.setSortingEnabled(True) | ||||
| self.tableWidget.sortByColumn(0, Qt.AscendingOrder) | self.tableWidget.sortByColumn(0, Qt.AscendingOrder) | ||||
| self.label.setText(self.tr("Have %i LADSPA, %i DSSI, %i LV2, %i VST and %i Sound Kits" % (ladspa_count, dssi_count, lv2_count, vst_count, kit_count))) | |||||
| self.label.setText(self.tr("Have %i %s, %i LADSPA, %i DSSI, %i LV2, %i VST and %i Sound Kits" % (internal_count, self.tr("Internal"), ladspa_count, dssi_count, lv2_count, vst_count, kit_count))) | |||||
| def addPluginToTable(self, plugin, ptype): | def addPluginToTable(self, plugin, ptype): | ||||
| index = self.last_table_index | index = self.last_table_index | ||||
| @@ -888,11 +921,12 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| hide_midi = not self.ch_midi.isChecked() | hide_midi = not self.ch_midi.isChecked() | ||||
| hide_other = not self.ch_other.isChecked() | hide_other = not self.ch_other.isChecked() | ||||
| hide_ladspa = not self.ch_ladspa.isChecked() | |||||
| hide_dssi = not self.ch_dssi.isChecked() | |||||
| hide_lv2 = not self.ch_lv2.isChecked() | |||||
| hide_vst = not self.ch_vst.isChecked() | |||||
| hide_kits = not self.ch_kits.isChecked() | |||||
| hide_internal = not self.ch_internal.isChecked() | |||||
| hide_ladspa = not self.ch_ladspa.isChecked() | |||||
| hide_dssi = not self.ch_dssi.isChecked() | |||||
| hide_lv2 = not self.ch_lv2.isChecked() | |||||
| hide_vst = not self.ch_vst.isChecked() | |||||
| hide_kits = not self.ch_kits.isChecked() | |||||
| hide_native = not self.ch_native.isChecked() | hide_native = not self.ch_native.isChecked() | ||||
| hide_bridged = not self.ch_bridged.isChecked() | hide_bridged = not self.ch_bridged.isChecked() | ||||
| @@ -943,6 +977,8 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.tableWidget.hideRow(i) | self.tableWidget.hideRow(i) | ||||
| elif (hide_kits and is_kit): | elif (hide_kits and is_kit): | ||||
| self.tableWidget.hideRow(i) | self.tableWidget.hideRow(i) | ||||
| elif (hide_internal and ptype == self.tr("Internal")): | |||||
| self.tableWidget.hideRow(i) | |||||
| elif (hide_ladspa and ptype == "LADSPA"): | elif (hide_ladspa and ptype == "LADSPA"): | ||||
| self.tableWidget.hideRow(i) | self.tableWidget.hideRow(i) | ||||
| elif (hide_dssi and ptype == "DSSI"): | elif (hide_dssi and ptype == "DSSI"): | ||||
| @@ -977,6 +1013,7 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.settings.setValue("PluginDatabase/ShowInstruments", self.ch_instruments.isChecked()) | self.settings.setValue("PluginDatabase/ShowInstruments", self.ch_instruments.isChecked()) | ||||
| self.settings.setValue("PluginDatabase/ShowMIDI", self.ch_midi.isChecked()) | self.settings.setValue("PluginDatabase/ShowMIDI", self.ch_midi.isChecked()) | ||||
| self.settings.setValue("PluginDatabase/ShowOther", self.ch_other.isChecked()) | self.settings.setValue("PluginDatabase/ShowOther", self.ch_other.isChecked()) | ||||
| self.settings.setValue("PluginDatabase/ShowInternal", self.ch_internal.isChecked()) | |||||
| self.settings.setValue("PluginDatabase/ShowLADSPA", self.ch_ladspa.isChecked()) | self.settings.setValue("PluginDatabase/ShowLADSPA", self.ch_ladspa.isChecked()) | ||||
| self.settings.setValue("PluginDatabase/ShowDSSI", self.ch_dssi.isChecked()) | self.settings.setValue("PluginDatabase/ShowDSSI", self.ch_dssi.isChecked()) | ||||
| self.settings.setValue("PluginDatabase/ShowLV2", self.ch_lv2.isChecked()) | self.settings.setValue("PluginDatabase/ShowLV2", self.ch_lv2.isChecked()) | ||||
| @@ -996,6 +1033,7 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW): | |||||
| self.ch_instruments.setChecked(self.settings.value("PluginDatabase/ShowInstruments", True, type=bool)) | self.ch_instruments.setChecked(self.settings.value("PluginDatabase/ShowInstruments", True, type=bool)) | ||||
| self.ch_midi.setChecked(self.settings.value("PluginDatabase/ShowMIDI", True, type=bool)) | self.ch_midi.setChecked(self.settings.value("PluginDatabase/ShowMIDI", True, type=bool)) | ||||
| self.ch_other.setChecked(self.settings.value("PluginDatabase/ShowOther", True, type=bool)) | self.ch_other.setChecked(self.settings.value("PluginDatabase/ShowOther", True, type=bool)) | ||||
| self.ch_internal.setChecked(self.settings.value("PluginDatabase/ShowInternal", True, type=bool)) | |||||
| self.ch_ladspa.setChecked(self.settings.value("PluginDatabase/ShowLADSPA", True, type=bool)) | self.ch_ladspa.setChecked(self.settings.value("PluginDatabase/ShowLADSPA", True, type=bool)) | ||||
| self.ch_dssi.setChecked(self.settings.value("PluginDatabase/ShowDSSI", True, type=bool)) | self.ch_dssi.setChecked(self.settings.value("PluginDatabase/ShowDSSI", True, type=bool)) | ||||
| self.ch_lv2.setChecked(self.settings.value("PluginDatabase/ShowLV2", True, type=bool)) | self.ch_lv2.setChecked(self.settings.value("PluginDatabase/ShowLV2", True, type=bool)) | ||||
| @@ -1570,6 +1608,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||||
| QMessageBox.critical(self, self.tr("Error"), self.tr("Not a valid Carla project file")) | QMessageBox.critical(self, self.tr("Error"), self.tr("Not a valid Carla project file")) | ||||
| return | return | ||||
| x_internal_plugins = None | |||||
| x_ladspa_plugins = None | x_ladspa_plugins = None | ||||
| x_dssi_plugins = None | x_dssi_plugins = None | ||||
| x_lv2_plugins = None | x_lv2_plugins = None | ||||
| @@ -1595,7 +1634,11 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||||
| binaryS = os.path.basename(binary) | binaryS = os.path.basename(binary) | ||||
| unique_id = x_save_state_dict['UniqueID'] | unique_id = x_save_state_dict['UniqueID'] | ||||
| if ptype == "LADSPA": | |||||
| if ptype == "Internal": | |||||
| if not x_internal_plugins: x_internal_plugins = toList(self.settings_db.value("Plugins/Internal", [])) | |||||
| x_plugins = x_internal_plugins | |||||
| elif ptype == "LADSPA": | |||||
| if not x_ladspa_plugins: | if not x_ladspa_plugins: | ||||
| x_ladspa_plugins = [] | x_ladspa_plugins = [] | ||||
| x_ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_native", [])) | x_ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_native", [])) | ||||
| @@ -1648,7 +1691,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||||
| x_plugins = x_sfz_plugins | x_plugins = x_sfz_plugins | ||||
| else: | else: | ||||
| print("load_project() - ptype '%s' not recognized", ptype) | |||||
| print("load_project() - ptype '%s' not recognized" % ptype) | |||||
| x_failed_plugins.append(x_save_state_dict['Name']) | x_failed_plugins.append(x_save_state_dict['Name']) | ||||
| continue | continue | ||||
| @@ -1721,26 +1764,27 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): | |||||
| plugin_ul = None | plugin_ul = None | ||||
| plugin_u = None | plugin_u = None | ||||
| plugin_l = None | plugin_l = None | ||||
| plugin_B = binary | |||||
| if (plugin_ulB): | |||||
| if plugin_ulB: | |||||
| plugin = plugin_ulB | plugin = plugin_ulB | ||||
| elif (plugin_ulb): | |||||
| elif plugin_ulb: | |||||
| plugin = plugin_ulb | plugin = plugin_ulb | ||||
| elif (plugin_ul): | |||||
| elif plugin_ul: | |||||
| plugin = plugin_ul | plugin = plugin_ul | ||||
| elif (plugin_uB): | |||||
| elif plugin_uB: | |||||
| plugin = plugin_uB | plugin = plugin_uB | ||||
| elif (plugin_ub): | |||||
| elif plugin_ub: | |||||
| plugin = plugin_ub | plugin = plugin_ub | ||||
| elif (plugin_lB): | |||||
| elif plugin_lB: | |||||
| plugin = plugin_lB | plugin = plugin_lB | ||||
| elif (plugin_lb): | |||||
| elif plugin_lb: | |||||
| plugin = plugin_lb | plugin = plugin_lb | ||||
| elif (plugin_u): | |||||
| elif plugin_u: | |||||
| plugin = plugin_u | plugin = plugin_u | ||||
| elif (plugin_l): | |||||
| elif plugin_l: | |||||
| plugin = plugin_l | plugin = plugin_l | ||||
| elif (plugin_B): | |||||
| elif plugin_B: | |||||
| plugin = plugin_B | plugin = plugin_B | ||||
| else: | else: | ||||
| plugin = None | plugin = None | ||||
| @@ -615,6 +615,21 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False): | |||||
| return plugins | return plugins | ||||
| def checkPluginInternal(desc): | |||||
| plugins = [] | |||||
| pinfo = deepcopy(PyPluginInfo) | |||||
| pinfo['type'] = PLUGIN_INTERNAL | |||||
| pinfo['name'] = cString(desc['name']) | |||||
| pinfo['label'] = cString(desc['label']) | |||||
| pinfo['maker'] = cString(desc['maker']) | |||||
| pinfo['copyright'] = cString(desc['copyright']) | |||||
| pinfo['hints'] = int(desc['hints']) | |||||
| pinfo['build'] = BINARY_NATIVE | |||||
| plugins.append(pinfo) | |||||
| return plugins | |||||
| def checkPluginLADSPA(filename, tool, isWine=False): | def checkPluginLADSPA(filename, tool, isWine=False): | ||||
| return runCarlaDiscovery(PLUGIN_LADSPA, "LADSPA", filename, tool, isWine) | return runCarlaDiscovery(PLUGIN_LADSPA, "LADSPA", filename, tool, isWine) | ||||
| @@ -750,6 +765,12 @@ class Host(object): | |||||
| self.lib.get_engine_driver_name.argtypes = [c_uint] | self.lib.get_engine_driver_name.argtypes = [c_uint] | ||||
| self.lib.get_engine_driver_name.restype = c_char_p | self.lib.get_engine_driver_name.restype = c_char_p | ||||
| self.lib.get_internal_plugin_count.argtypes = None | |||||
| self.lib.get_internal_plugin_count.restype = c_uint | |||||
| self.lib.get_internal_plugin_info.argtypes = [c_uint] | |||||
| self.lib.get_internal_plugin_info.restype = POINTER(PluginInfo) | |||||
| self.lib.engine_init.argtypes = [c_char_p, c_char_p] | self.lib.engine_init.argtypes = [c_char_p, c_char_p] | ||||
| self.lib.engine_init.restype = c_bool | self.lib.engine_init.restype = c_bool | ||||
| @@ -927,6 +948,12 @@ class Host(object): | |||||
| def get_engine_driver_name(self, index): | def get_engine_driver_name(self, index): | ||||
| return self.lib.get_engine_driver_name(index) | return self.lib.get_engine_driver_name(index) | ||||
| def get_internal_plugin_count(self): | |||||
| return self.lib.get_internal_plugin_count() | |||||
| def get_internal_plugin_info(self, index): | |||||
| return struct_to_dict(self.lib.get_internal_plugin_info(index).contents) | |||||
| def engine_init(self, driver_name, client_name): | def engine_init(self, driver_name, client_name): | ||||
| return self.lib.engine_init(driver_name.encode("utf-8"), client_name.encode("utf-8")) | return self.lib.engine_init(driver_name.encode("utf-8"), client_name.encode("utf-8")) | ||||
| @@ -87,14 +87,15 @@ BINARY_WIN64 = 4 | |||||
| BINARY_OTHER = 5 | BINARY_OTHER = 5 | ||||
| # enum PluginType | # enum PluginType | ||||
| PLUGIN_NONE = 0 | |||||
| PLUGIN_LADSPA = 1 | |||||
| PLUGIN_DSSI = 2 | |||||
| PLUGIN_LV2 = 3 | |||||
| PLUGIN_VST = 4 | |||||
| PLUGIN_GIG = 5 | |||||
| PLUGIN_SF2 = 6 | |||||
| PLUGIN_SFZ = 7 | |||||
| PLUGIN_NONE = 0 | |||||
| PLUGIN_INTERNAL = 1 | |||||
| PLUGIN_LADSPA = 2 | |||||
| PLUGIN_DSSI = 3 | |||||
| PLUGIN_LV2 = 4 | |||||
| PLUGIN_VST = 5 | |||||
| PLUGIN_GIG = 6 | |||||
| PLUGIN_SF2 = 7 | |||||
| PLUGIN_SFZ = 8 | |||||
| # enum PluginCategory | # enum PluginCategory | ||||
| PLUGIN_CATEGORY_NONE = 0 | PLUGIN_CATEGORY_NONE = 0 | ||||
| @@ -632,7 +633,9 @@ class PluginEdit(QDialog, ui_carla_edit.Ui_PluginEdit): | |||||
| self.tab_programs.setCurrentIndex(1) | self.tab_programs.setCurrentIndex(1) | ||||
| # Set Meta-Data | # Set Meta-Data | ||||
| if pluginType == PLUGIN_LADSPA: | |||||
| if pluginType == PLUGIN_INTERNAL: | |||||
| self.le_type.setText(self.tr("Internal")) | |||||
| elif pluginType == PLUGIN_LADSPA: | |||||
| self.le_type.setText("LADSPA") | self.le_type.setText("LADSPA") | ||||
| elif pluginType == PLUGIN_DSSI: | elif pluginType == PLUGIN_DSSI: | ||||
| self.le_type.setText("DSSI") | self.le_type.setText("DSSI") | ||||
| @@ -1488,7 +1491,9 @@ class PluginWidget(QFrame, ui_carla_plugin.Ui_PluginWidget): | |||||
| def getSaveXMLContent(self): | def getSaveXMLContent(self): | ||||
| Carla.Host.prepare_for_save(self.m_pluginId) | Carla.Host.prepare_for_save(self.m_pluginId) | ||||
| if self.m_pluginInfo['type'] == PLUGIN_LADSPA: | |||||
| if self.m_pluginInfo['type'] == PLUGIN_INTERNAL: | |||||
| typeStr = "Internal" | |||||
| elif self.m_pluginInfo['type'] == PLUGIN_LADSPA: | |||||
| typeStr = "LADSPA" | typeStr = "LADSPA" | ||||
| elif self.m_pluginInfo['type'] == PLUGIN_DSSI: | elif self.m_pluginInfo['type'] == PLUGIN_DSSI: | ||||
| typeStr = "DSSI" | typeStr = "DSSI" | ||||
| @@ -61,66 +61,73 @@ | |||||
| <enum>QFrame::Sunken</enum> | <enum>QFrame::Sunken</enum> | ||||
| </property> | </property> | ||||
| <layout class="QGridLayout" name="gridLayout"> | <layout class="QGridLayout" name="gridLayout"> | ||||
| <item row="0" column="1"> | |||||
| <widget class="QCheckBox" name="ch_effects"> | |||||
| <item row="2" column="0"> | |||||
| <widget class="QCheckBox" name="ch_dssi"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Effects</string> | |||||
| <string>DSSI</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="1" column="1"> | |||||
| <widget class="QCheckBox" name="ch_instruments"> | |||||
| <item row="3" column="0"> | |||||
| <widget class="QCheckBox" name="ch_lv2"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Instruments</string> | |||||
| <string>LV2</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="2" column="1"> | |||||
| <widget class="QCheckBox" name="ch_midi"> | |||||
| <item row="4" column="0"> | |||||
| <widget class="QCheckBox" name="ch_vst"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>MIDI Plugins</string> | |||||
| <string>VST</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="3" column="1"> | |||||
| <widget class="QCheckBox" name="ch_other"> | |||||
| <item row="1" column="0"> | |||||
| <widget class="QCheckBox" name="ch_ladspa"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Other/Misc</string> | |||||
| <string>LADSPA</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="4" column="0"> | |||||
| <item row="5" column="0"> | |||||
| <widget class="QCheckBox" name="ch_kits"> | <widget class="QCheckBox" name="ch_kits"> | ||||
| <property name="text"> | <property name="text"> | ||||
| <string>Sound Kits</string> | <string>Sound Kits</string> | ||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="2" column="0"> | |||||
| <widget class="QCheckBox" name="ch_lv2"> | |||||
| <item row="0" column="0"> | |||||
| <widget class="QCheckBox" name="ch_internal"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>LV2</string> | |||||
| <string>Internal</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="3" column="0"> | |||||
| <widget class="QCheckBox" name="ch_vst"> | |||||
| <item row="0" column="1"> | |||||
| <widget class="QCheckBox" name="ch_effects"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>VST</string> | |||||
| <string>Effects</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="0" column="0"> | |||||
| <widget class="QCheckBox" name="ch_ladspa"> | |||||
| <item row="1" column="1"> | |||||
| <widget class="QCheckBox" name="ch_instruments"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>LADSPA</string> | |||||
| <string>Instruments</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="1" column="0"> | |||||
| <widget class="QCheckBox" name="ch_dssi"> | |||||
| <item row="2" column="1"> | |||||
| <widget class="QCheckBox" name="ch_midi"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>DSSI</string> | |||||
| <string>MIDI Plugins</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="3" column="1"> | |||||
| <widget class="QCheckBox" name="ch_other"> | |||||
| <property name="text"> | |||||
| <string>Other/Misc</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||