Browse Source

Carla: More work for internal/native plugin support

tags/v0.9.0
falkTX 13 years ago
parent
commit
88d8155cd7
12 changed files with 230 additions and 64 deletions
  1. +9
    -8
      c++/carla-backend/carla_backend.h
  2. +34
    -0
      c++/carla-backend/carla_backend_standalone.cpp
  3. +3
    -0
      c++/carla-backend/carla_backend_standalone.h
  4. +3
    -0
      c++/carla-backend/carla_engine.cpp
  5. +16
    -1
      c++/carla-backend/carla_native.cpp
  6. +3
    -0
      c++/carla-backend/carla_plugin.h
  7. +22
    -0
      c++/carla-backend/carla_shared.cpp
  8. +2
    -0
      c++/carla-backend/carla_shared.h
  9. +64
    -20
      src/carla.py
  10. +27
    -0
      src/carla_backend.py
  11. +15
    -10
      src/shared_carla.py
  12. +32
    -25
      src/ui/carla_database.ui

+ 9
- 8
c++/carla-backend/carla_backend.h View File

@@ -108,14 +108,15 @@ enum BinaryType {
* \note Some plugin classes might provide more than 1 plugin type.
*/
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 {


+ 34
- 0
c++/carla-backend/carla_backend_standalone.cpp View File

@@ -17,6 +17,7 @@

#include "carla_backend_standalone.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)
{
qDebug("CarlaBackendStandalone::engine_init(\"%s\", \"%s\")", driver_name, client_name);


+ 3
- 0
c++/carla-backend/carla_backend_standalone.h View File

@@ -98,6 +98,9 @@ struct GuiInfo {
CARLA_EXPORT unsigned int get_engine_driver_count();
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_close();
CARLA_EXPORT bool is_engine_running();


+ 3
- 0
c++/carla-backend/carla_engine.cpp View File

@@ -285,6 +285,9 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con
{
case PLUGIN_NONE:
break;
case PLUGIN_INTERNAL:
plugin = CarlaPlugin::newNative(init);
break;
case PLUGIN_LADSPA:
plugin = CarlaPlugin::newLADSPA(init, extra);
break;


+ 16
- 1
c++/carla-backend/carla_native.cpp View File

@@ -65,7 +65,7 @@ public:
{
qDebug("NativePlugin::NativePlugin()");

m_type = PLUGIN_NONE;
m_type = PLUGIN_INTERNAL;

descriptor = nullptr;
handle = nullptr;
@@ -164,6 +164,16 @@ public:
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)
{
pluginDescriptors.push_back(desc);
@@ -258,6 +268,11 @@ size_t CarlaPlugin::getNativePluginCount()
return NativePlugin::getPluginCount();
}

const PluginDescriptor* CarlaPlugin::getNativePlugin(size_t index)
{
return NativePlugin::getPlugin(index);
}

CARLA_BACKEND_END_NAMESPACE

void carla_register_native_plugin(const PluginDescriptor* desc)


+ 3
- 0
c++/carla-backend/carla_plugin.h View File

@@ -42,6 +42,8 @@ typedef QX11EmbedContainer GuiContainer;
typedef QWidget GuiContainer;
#endif

typedef struct _PluginDescriptor PluginDescriptor;

CARLA_BACKEND_START_NAMESPACE

/*!
@@ -2108,6 +2110,7 @@ public:
static CarlaPlugin* newNative(const initializer& init);

static size_t getNativePluginCount();
static const PluginDescriptor* getNativePlugin(size_t index);

// -------------------------------------------------------------------



+ 22
- 0
c++/carla-backend/carla_shared.cpp View File

@@ -17,6 +17,10 @@

#include "carla_shared.h"

#ifndef BUILD_BRIDGE
# include "plugins/carla_native.h"
#endif

#include <QtCore/QString>

CARLA_BACKEND_START_NAMESPACE
@@ -58,6 +62,8 @@ const char* PluginType2str(const PluginType type)
{
case PLUGIN_NONE:
return "PLUGIN_NONE";
case PLUGIN_INTERNAL:
return "PLUGIN_INTERNAL";
case PLUGIN_LADSPA:
return "PLUGIN_LADSPA";
case PLUGIN_DSSI:
@@ -393,6 +399,8 @@ const char* getPluginTypeString(const PluginType type)
{
case PLUGIN_NONE:
return "NONE";
case PLUGIN_INTERNAL:
return "INTERNAL";
case PLUGIN_LADSPA:
return "LADSPA";
case PLUGIN_DSSI:
@@ -520,6 +528,20 @@ void setLastError(const char* const error)
// -------------------------------------------------------------------------------------------------------------------

#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)
{
qDebug("CarlaBackend::setOption(%s, %i, \"%s\")", OptionsType2str(option), value, valueStr);


+ 2
- 0
c++/carla-backend/carla_shared.h View File

@@ -51,6 +51,8 @@ const char* getLastError();
void setLastError(const char* const error);

#ifndef BUILD_BRIDGE
uint32_t getPluginHintsFromNative(const uint32_t nativeHints);

void setOption(const OptionsType option, const int value, const char* const valueStr);
void resetOptions();



+ 64
- 20
src/carla.py View File

@@ -576,8 +576,8 @@ class PluginRefreshW(QDialog, ui_carla_refresh.Ui_PluginRefreshW):
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())
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.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_other, 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_dssi, 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.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):
row_count = self.tableWidget.rowCount()
for x in range(row_count):
@@ -717,6 +740,10 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW):
self.last_table_index = 0
self.tableWidget.setSortingEnabled(False)

self.checkInternalPlugins()

internals = toList(self.settings_db.value("Plugins/Internal", []))

ladspa_plugins = []
ladspa_plugins += toList(self.settings_db.value("Plugins/LADSPA_native", []))
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", []))
sfzs = toList(self.settings_db.value("Plugins/SFZ", []))

internal_count = 0
ladspa_count = 0
dssi_count = 0
lv2_count = 0
vst_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 plugin in plugins:
self.addPluginToTable(plugin, "LADSPA")
@@ -794,7 +827,7 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW):
self.tableWidget.setSortingEnabled(True)
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):
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_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_bridged = not self.ch_bridged.isChecked()
@@ -943,6 +977,8 @@ class PluginDatabaseW(QDialog, ui_carla_database.Ui_PluginDatabaseW):
self.tableWidget.hideRow(i)
elif (hide_kits and is_kit):
self.tableWidget.hideRow(i)
elif (hide_internal and ptype == self.tr("Internal")):
self.tableWidget.hideRow(i)
elif (hide_ladspa and ptype == "LADSPA"):
self.tableWidget.hideRow(i)
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/ShowMIDI", self.ch_midi.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/ShowDSSI", self.ch_dssi.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_midi.setChecked(self.settings.value("PluginDatabase/ShowMIDI", 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_dssi.setChecked(self.settings.value("PluginDatabase/ShowDSSI", 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"))
return

x_internal_plugins = None
x_ladspa_plugins = None
x_dssi_plugins = None
x_lv2_plugins = None
@@ -1595,7 +1634,11 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW):
binaryS = os.path.basename(binary)
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:
x_ladspa_plugins = []
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

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'])
continue

@@ -1721,26 +1764,27 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW):
plugin_ul = None
plugin_u = None
plugin_l = None
plugin_B = binary

if (plugin_ulB):
if plugin_ulB:
plugin = plugin_ulB
elif (plugin_ulb):
elif plugin_ulb:
plugin = plugin_ulb
elif (plugin_ul):
elif plugin_ul:
plugin = plugin_ul
elif (plugin_uB):
elif plugin_uB:
plugin = plugin_uB
elif (plugin_ub):
elif plugin_ub:
plugin = plugin_ub
elif (plugin_lB):
elif plugin_lB:
plugin = plugin_lB
elif (plugin_lb):
elif plugin_lb:
plugin = plugin_lb
elif (plugin_u):
elif plugin_u:
plugin = plugin_u
elif (plugin_l):
elif plugin_l:
plugin = plugin_l
elif (plugin_B):
elif plugin_B:
plugin = plugin_B
else:
plugin = None


+ 27
- 0
src/carla_backend.py View File

@@ -615,6 +615,21 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False):

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):
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.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.restype = c_bool

@@ -927,6 +948,12 @@ class Host(object):
def get_engine_driver_name(self, 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):
return self.lib.engine_init(driver_name.encode("utf-8"), client_name.encode("utf-8"))



+ 15
- 10
src/shared_carla.py View File

@@ -87,14 +87,15 @@ BINARY_WIN64 = 4
BINARY_OTHER = 5

# 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
PLUGIN_CATEGORY_NONE = 0
@@ -632,7 +633,9 @@ class PluginEdit(QDialog, ui_carla_edit.Ui_PluginEdit):
self.tab_programs.setCurrentIndex(1)

# 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")
elif pluginType == PLUGIN_DSSI:
self.le_type.setText("DSSI")
@@ -1488,7 +1491,9 @@ class PluginWidget(QFrame, ui_carla_plugin.Ui_PluginWidget):
def getSaveXMLContent(self):
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"
elif self.m_pluginInfo['type'] == PLUGIN_DSSI:
typeStr = "DSSI"


+ 32
- 25
src/ui/carla_database.ui View File

@@ -61,66 +61,73 @@
<enum>QFrame::Sunken</enum>
</property>
<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">
<string>Effects</string>
<string>DSSI</string>
</property>
</widget>
</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">
<string>Instruments</string>
<string>LV2</string>
</property>
</widget>
</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">
<string>MIDI Plugins</string>
<string>VST</string>
</property>
</widget>
</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">
<string>Other/Misc</string>
<string>LADSPA</string>
</property>
</widget>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QCheckBox" name="ch_kits">
<property name="text">
<string>Sound Kits</string>
</property>
</widget>
</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">
<string>LV2</string>
<string>Internal</string>
</property>
</widget>
</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">
<string>VST</string>
<string>Effects</string>
</property>
</widget>
</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">
<string>LADSPA</string>
<string>Instruments</string>
</property>
</widget>
</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">
<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>
</widget>
</item>


Loading…
Cancel
Save