| @@ -61,17 +61,10 @@ | |||||
| <enum>QFrame::Sunken</enum> | <enum>QFrame::Sunken</enum> | ||||
| </property> | </property> | ||||
| <layout class="QGridLayout" name="gridLayout"> | <layout class="QGridLayout" name="gridLayout"> | ||||
| <item row="2" column="3"> | |||||
| <widget class="QCheckBox" name="ch_stereo"> | |||||
| <property name="text"> | |||||
| <string>Stereo only</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="2" column="0"> | |||||
| <widget class="QCheckBox" name="ch_ladspa"> | |||||
| <item row="5" column="0"> | |||||
| <widget class="QCheckBox" name="ch_vst"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>LADSPA</string> | |||||
| <string>VST2</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -82,24 +75,30 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="5" column="0"> | |||||
| <widget class="QCheckBox" name="ch_vst"> | |||||
| <item row="4" column="1"> | |||||
| <widget class="QCheckBox" name="ch_other"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>VST2</string> | |||||
| <string>Other/Misc</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="3" column="3"> | |||||
| <widget class="QCheckBox" name="ch_gui"> | |||||
| <item row="0" column="3"> | |||||
| <widget class="QLabel" name="l_reqs"> | |||||
| <property name="font"> | |||||
| <font> | |||||
| <weight>75</weight> | |||||
| <bold>true</bold> | |||||
| </font> | |||||
| </property> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>With GUI Only</string> | |||||
| <string>Requirements</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="8" column="0"> | |||||
| <widget class="QCheckBox" name="ch_kits"> | |||||
| <item row="2" column="0"> | |||||
| <widget class="QCheckBox" name="ch_ladspa"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Sound Kits</string> | |||||
| <string>LADSPA</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -116,16 +115,10 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="0" column="0"> | |||||
| <widget class="QLabel" name="l_format"> | |||||
| <property name="font"> | |||||
| <font> | |||||
| <weight>75</weight> | |||||
| <bold>true</bold> | |||||
| </font> | |||||
| </property> | |||||
| <item row="2" column="1"> | |||||
| <widget class="QCheckBox" name="ch_instruments"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Plugin format</string> | |||||
| <string>Instruments</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -136,8 +129,8 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="0" column="1"> | |||||
| <widget class="QLabel" name="l_category"> | |||||
| <item row="0" column="0"> | |||||
| <widget class="QLabel" name="l_format"> | |||||
| <property name="font"> | <property name="font"> | ||||
| <font> | <font> | ||||
| <weight>75</weight> | <weight>75</weight> | ||||
| @@ -145,19 +138,12 @@ | |||||
| </font> | </font> | ||||
| </property> | </property> | ||||
| <property name="text"> | <property name="text"> | ||||
| <string>Category</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="3" column="0"> | |||||
| <widget class="QCheckBox" name="ch_dssi"> | |||||
| <property name="text"> | |||||
| <string>DSSI</string> | |||||
| <string>Plugin format</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="0" column="3"> | |||||
| <widget class="QLabel" name="l_reqs"> | |||||
| <item row="0" column="1"> | |||||
| <widget class="QLabel" name="l_category"> | |||||
| <property name="font"> | <property name="font"> | ||||
| <font> | <font> | ||||
| <weight>75</weight> | <weight>75</weight> | ||||
| @@ -165,14 +151,7 @@ | |||||
| </font> | </font> | ||||
| </property> | </property> | ||||
| <property name="text"> | <property name="text"> | ||||
| <string>Requirements</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="4" column="1"> | |||||
| <widget class="QCheckBox" name="ch_other"> | |||||
| <property name="text"> | |||||
| <string>Other/Misc</string> | |||||
| <string>Category</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -190,10 +169,24 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="2" column="1"> | |||||
| <widget class="QCheckBox" name="ch_instruments"> | |||||
| <item row="8" column="0"> | |||||
| <widget class="QCheckBox" name="ch_kits"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Instruments</string> | |||||
| <string>Sound Kits</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="3" column="0"> | |||||
| <widget class="QCheckBox" name="ch_dssi"> | |||||
| <property name="text"> | |||||
| <string>DSSI</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="2" column="3"> | |||||
| <widget class="QCheckBox" name="ch_stereo"> | |||||
| <property name="text"> | |||||
| <string>Stereo only</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -211,17 +204,17 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="3" column="1"> | |||||
| <widget class="QCheckBox" name="ch_midi"> | |||||
| <item row="1" column="0"> | |||||
| <widget class="QCheckBox" name="ch_internal"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>MIDI Plugins</string> | |||||
| <string>Internal</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="1" column="0"> | |||||
| <widget class="QCheckBox" name="ch_internal"> | |||||
| <item row="3" column="1"> | |||||
| <widget class="QCheckBox" name="ch_midi"> | |||||
| <property name="text"> | <property name="text"> | ||||
| <string>Internal</string> | |||||
| <string>MIDI Plugins</string> | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -239,6 +232,27 @@ | |||||
| </property> | </property> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| <item row="5" column="3"> | |||||
| <widget class="QCheckBox" name="ch_inline_display"> | |||||
| <property name="text"> | |||||
| <string>With Inline Display</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="3" column="3"> | |||||
| <widget class="QCheckBox" name="ch_cv"> | |||||
| <property name="text"> | |||||
| <string>With CV Ports</string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| <item row="4" column="3"> | |||||
| <widget class="QCheckBox" name="ch_gui"> | |||||
| <property name="text"> | |||||
| <string>With Custom GUI </string> | |||||
| </property> | |||||
| </widget> | |||||
| </item> | |||||
| </layout> | </layout> | ||||
| </widget> | </widget> | ||||
| </item> | </item> | ||||
| @@ -4722,7 +4722,23 @@ public: | |||||
| else if (std::strcmp(extension, LV2_INLINEDISPLAY__interface) == 0) | else if (std::strcmp(extension, LV2_INLINEDISPLAY__interface) == 0) | ||||
| pData->hints |= PLUGIN_HAS_EXTENSION_INLINE_DISPLAY; | pData->hints |= PLUGIN_HAS_EXTENSION_INLINE_DISPLAY; | ||||
| else | else | ||||
| carla_stdout("Plugin has non-supported extension: '%s'", extension); | |||||
| carla_stdout("Plugin '%s' has non-supported extension: '%s'", fRdfDescriptor->URI, extension); | |||||
| } | |||||
| // Fix for broken plugins, nasty! | |||||
| for (uint32_t i=0; i < fRdfDescriptor->FeatureCount; ++i) | |||||
| { | |||||
| const LV2_RDF_Feature& feature(fRdfDescriptor->Features[i]); | |||||
| if (std::strcmp(feature.URI, LV2_INLINEDISPLAY__queue_draw) == 0) | |||||
| { | |||||
| if (pData->hints & PLUGIN_HAS_EXTENSION_INLINE_DISPLAY) | |||||
| break; | |||||
| carla_stdout("Plugin '%s' uses inline-display but does not set extension data, nasty!", fRdfDescriptor->URI); | |||||
| pData->hints |= PLUGIN_HAS_EXTENSION_INLINE_DISPLAY; | |||||
| break; | |||||
| } | |||||
| } | } | ||||
| if (fDescriptor->extension_data != nullptr) | if (fDescriptor->extension_data != nullptr) | ||||
| @@ -111,6 +111,8 @@ static const CarlaCachedPluginInfo* get_cached_plugin_internal(const NativePlugi | |||||
| info.hints |= CB::PLUGIN_IS_SYNTH; | info.hints |= CB::PLUGIN_IS_SYNTH; | ||||
| if (desc.hints & NATIVE_PLUGIN_HAS_UI) | if (desc.hints & NATIVE_PLUGIN_HAS_UI) | ||||
| info.hints |= CB::PLUGIN_HAS_CUSTOM_UI; | info.hints |= CB::PLUGIN_HAS_CUSTOM_UI; | ||||
| if (desc.hints & NATIVE_PLUGIN_HAS_INLINE_DISPLAY) | |||||
| info.hints |= CB::PLUGIN_HAS_INLINE_DISPLAY; | |||||
| if (desc.hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) | if (desc.hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) | ||||
| info.hints |= CB::PLUGIN_NEEDS_FIXED_BUFFERS; | info.hints |= CB::PLUGIN_NEEDS_FIXED_BUFFERS; | ||||
| if (desc.hints & NATIVE_PLUGIN_NEEDS_UI_MAIN_THREAD) | if (desc.hints & NATIVE_PLUGIN_NEEDS_UI_MAIN_THREAD) | ||||
| @@ -229,10 +231,14 @@ static const CarlaCachedPluginInfo* get_cached_plugin_lv2(Lv2WorldClass& lv2Worl | |||||
| const char* const featureURI(lilvFeatureNode.as_uri()); | const char* const featureURI(lilvFeatureNode.as_uri()); | ||||
| CARLA_SAFE_ASSERT_CONTINUE(featureURI != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(featureURI != nullptr); | ||||
| if (std::strcmp(featureURI, LV2_CORE__hardRTCapable) == 0) | |||||
| /**/ if (std::strcmp(featureURI, LV2_CORE__hardRTCapable) == 0) | |||||
| { | { | ||||
| info.hints |= CB::PLUGIN_IS_RTSAFE; | info.hints |= CB::PLUGIN_IS_RTSAFE; | ||||
| } | } | ||||
| else if (std::strcmp(featureURI, LV2_INLINEDISPLAY__queue_draw) == 0) | |||||
| { | |||||
| info.hints |= CB::PLUGIN_HAS_INLINE_DISPLAY; | |||||
| } | |||||
| else if (std::strcmp(featureURI, LV2_DATA_ACCESS_URI) == 0 | else if (std::strcmp(featureURI, LV2_DATA_ACCESS_URI) == 0 | ||||
| || std::strcmp(featureURI, LV2_INSTANCE_ACCESS_URI) == 0) | || std::strcmp(featureURI, LV2_INSTANCE_ACCESS_URI) == 0) | ||||
| { | { | ||||
| @@ -3,7 +3,7 @@ Manager=KDevGenericManager | |||||
| Name=Carla | Name=Carla | ||||
| [Filters] | [Filters] | ||||
| Excludes=*/.*,*/*~,*/*.pyc,*/ui_*.py,*/__pycache__/,external | |||||
| Excludes=*/.*,*/*~,*/*.pyc,*/ui_*.py,*/__pycache__/,external,juce_* | |||||
| [Project] | [Project] | ||||
| VersionControlSupport=kdevgit | VersionControlSupport=kdevgit | ||||
| @@ -133,7 +133,7 @@ def findFilenames(filePath, stype): | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| # Plugin Query | # Plugin Query | ||||
| PLUGIN_QUERY_API_VERSION = 9 | |||||
| PLUGIN_QUERY_API_VERSION = 10 | |||||
| PyPluginInfo = { | PyPluginInfo = { | ||||
| 'API': PLUGIN_QUERY_API_VERSION, | 'API': PLUGIN_QUERY_API_VERSION, | ||||
| @@ -1469,7 +1469,9 @@ class PluginDatabaseW(QDialog): | |||||
| self.ui.ch_bridged.clicked.connect(self.slot_checkFilters) | self.ui.ch_bridged.clicked.connect(self.slot_checkFilters) | ||||
| self.ui.ch_bridged_wine.clicked.connect(self.slot_checkFilters) | self.ui.ch_bridged_wine.clicked.connect(self.slot_checkFilters) | ||||
| self.ui.ch_rtsafe.clicked.connect(self.slot_checkFilters) | self.ui.ch_rtsafe.clicked.connect(self.slot_checkFilters) | ||||
| self.ui.ch_cv.clicked.connect(self.slot_checkFilters) | |||||
| self.ui.ch_gui.clicked.connect(self.slot_checkFilters) | self.ui.ch_gui.clicked.connect(self.slot_checkFilters) | ||||
| self.ui.ch_inline_display.clicked.connect(self.slot_checkFilters) | |||||
| self.ui.ch_stereo.clicked.connect(self.slot_checkFilters) | self.ui.ch_stereo.clicked.connect(self.slot_checkFilters) | ||||
| # ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
| @@ -1531,7 +1533,9 @@ class PluginDatabaseW(QDialog): | |||||
| settings.setValue("PluginDatabase/ShowBridged", self.ui.ch_bridged.isChecked()) | settings.setValue("PluginDatabase/ShowBridged", self.ui.ch_bridged.isChecked()) | ||||
| settings.setValue("PluginDatabase/ShowBridgedWine", self.ui.ch_bridged_wine.isChecked()) | settings.setValue("PluginDatabase/ShowBridgedWine", self.ui.ch_bridged_wine.isChecked()) | ||||
| settings.setValue("PluginDatabase/ShowRtSafe", self.ui.ch_rtsafe.isChecked()) | settings.setValue("PluginDatabase/ShowRtSafe", self.ui.ch_rtsafe.isChecked()) | ||||
| settings.setValue("PluginDatabase/ShowHasCV", self.ui.ch_cv.isChecked()) | |||||
| settings.setValue("PluginDatabase/ShowHasGUI", self.ui.ch_gui.isChecked()) | settings.setValue("PluginDatabase/ShowHasGUI", self.ui.ch_gui.isChecked()) | ||||
| settings.setValue("PluginDatabase/ShowHasInlineDisplay", self.ui.ch_inline_display.isChecked()) | |||||
| settings.setValue("PluginDatabase/ShowStereoOnly", self.ui.ch_stereo.isChecked()) | settings.setValue("PluginDatabase/ShowStereoOnly", self.ui.ch_stereo.isChecked()) | ||||
| settings.setValue("PluginDatabase/SearchText", self.ui.lineEdit.text()) | settings.setValue("PluginDatabase/SearchText", self.ui.lineEdit.text()) | ||||
| @@ -1556,7 +1560,9 @@ class PluginDatabaseW(QDialog): | |||||
| self.ui.ch_bridged.setChecked(settings.value("PluginDatabase/ShowBridged", True, type=bool)) | self.ui.ch_bridged.setChecked(settings.value("PluginDatabase/ShowBridged", True, type=bool)) | ||||
| self.ui.ch_bridged_wine.setChecked(settings.value("PluginDatabase/ShowBridgedWine", True, type=bool)) | self.ui.ch_bridged_wine.setChecked(settings.value("PluginDatabase/ShowBridgedWine", True, type=bool)) | ||||
| self.ui.ch_rtsafe.setChecked(settings.value("PluginDatabase/ShowRtSafe", False, type=bool)) | self.ui.ch_rtsafe.setChecked(settings.value("PluginDatabase/ShowRtSafe", False, type=bool)) | ||||
| self.ui.ch_cv.setChecked(settings.value("PluginDatabase/ShowHasCV", False, type=bool)) | |||||
| self.ui.ch_gui.setChecked(settings.value("PluginDatabase/ShowHasGUI", False, type=bool)) | self.ui.ch_gui.setChecked(settings.value("PluginDatabase/ShowHasGUI", False, type=bool)) | ||||
| self.ui.ch_inline_display.setChecked(settings.value("PluginDatabase/ShowHasInlineDisplay", False, type=bool)) | |||||
| self.ui.ch_stereo.setChecked(settings.value("PluginDatabase/ShowStereoOnly", False, type=bool)) | self.ui.ch_stereo.setChecked(settings.value("PluginDatabase/ShowStereoOnly", False, type=bool)) | ||||
| self.ui.lineEdit.setText(settings.value("PluginDatabase/SearchText", "", type=str)) | self.ui.lineEdit.setText(settings.value("PluginDatabase/SearchText", "", type=str)) | ||||
| @@ -1592,7 +1598,9 @@ class PluginDatabaseW(QDialog): | |||||
| hideBridgedWine = not self.ui.ch_bridged_wine.isChecked() | hideBridgedWine = not self.ui.ch_bridged_wine.isChecked() | ||||
| hideNonRtSafe = self.ui.ch_rtsafe.isChecked() | hideNonRtSafe = self.ui.ch_rtsafe.isChecked() | ||||
| hideNonCV = self.ui.ch_cv.isChecked() | |||||
| hideNonGui = self.ui.ch_gui.isChecked() | hideNonGui = self.ui.ch_gui.isChecked() | ||||
| hideNonIDisp = self.ui.ch_inline_display.isChecked() | |||||
| hideNonStereo = self.ui.ch_stereo.isChecked() | hideNonStereo = self.ui.ch_stereo.isChecked() | ||||
| if HAIKU or LINUX or MACOS: | if HAIKU or LINUX or MACOS: | ||||
| @@ -1611,6 +1619,8 @@ class PluginDatabaseW(QDialog): | |||||
| plugin = self.ui.tableWidget.item(i, 0).data(Qt.UserRole) | plugin = self.ui.tableWidget.item(i, 0).data(Qt.UserRole) | ||||
| aIns = plugin['audio.ins'] | aIns = plugin['audio.ins'] | ||||
| aOuts = plugin['audio.outs'] | aOuts = plugin['audio.outs'] | ||||
| cvIns = plugin['cv.ins'] | |||||
| cvOuts = plugin['cv.outs'] | |||||
| mIns = plugin['midi.ins'] | mIns = plugin['midi.ins'] | ||||
| mOuts = plugin['midi.outs'] | mOuts = plugin['midi.outs'] | ||||
| ptype = self.ui.tableWidget.item(i, 12).text() | ptype = self.ui.tableWidget.item(i, 12).text() | ||||
| @@ -1622,7 +1632,9 @@ class PluginDatabaseW(QDialog): | |||||
| isNative = bool(plugin['build'] == BINARY_NATIVE) | isNative = bool(plugin['build'] == BINARY_NATIVE) | ||||
| isRtSafe = bool(plugin['hints'] & PLUGIN_IS_RTSAFE) | isRtSafe = bool(plugin['hints'] & PLUGIN_IS_RTSAFE) | ||||
| isStereo = bool(aIns == 2 and aOuts == 2) or (isSynth and aOuts == 2) | isStereo = bool(aIns == 2 and aOuts == 2) or (isSynth and aOuts == 2) | ||||
| hasCV = bool(cvIns + cvOuts > 0) | |||||
| hasGui = bool(plugin['hints'] & PLUGIN_HAS_CUSTOM_UI) | hasGui = bool(plugin['hints'] & PLUGIN_HAS_CUSTOM_UI) | ||||
| hasIDisp = bool(plugin['hints'] & PLUGIN_HAS_INLINE_DISPLAY) | |||||
| isBridged = bool(not isNative and plugin['build'] in nativeBins) | isBridged = bool(not isNative and plugin['build'] in nativeBins) | ||||
| isBridgedWine = bool(not isNative and plugin['build'] in wineBins) | isBridgedWine = bool(not isNative and plugin['build'] in wineBins) | ||||
| @@ -1659,8 +1671,12 @@ class PluginDatabaseW(QDialog): | |||||
| self.ui.tableWidget.hideRow(i) | self.ui.tableWidget.hideRow(i) | ||||
| elif hideNonRtSafe and not isRtSafe: | elif hideNonRtSafe and not isRtSafe: | ||||
| self.ui.tableWidget.hideRow(i) | self.ui.tableWidget.hideRow(i) | ||||
| elif hideNonCV and not hasCV: | |||||
| self.ui.tableWidget.hideRow(i) | |||||
| elif hideNonGui and not hasGui: | elif hideNonGui and not hasGui: | ||||
| self.ui.tableWidget.hideRow(i) | self.ui.tableWidget.hideRow(i) | ||||
| elif hideNonIDisp and not hasIDisp: | |||||
| self.ui.tableWidget.hideRow(i) | |||||
| elif hideNonStereo and not isStereo: | elif hideNonStereo and not isStereo: | ||||
| self.ui.tableWidget.hideRow(i) | self.ui.tableWidget.hideRow(i) | ||||
| elif (text and not ( | elif (text and not ( | ||||
| @@ -2943,6 +2943,8 @@ bool is_lv2_feature_supported(const LV2_URI uri) noexcept | |||||
| return true; | return true; | ||||
| if (std::strcmp(uri, LV2_EVENT_URI) == 0) | if (std::strcmp(uri, LV2_EVENT_URI) == 0) | ||||
| return true; | return true; | ||||
| if (std::strcmp(uri, LV2_INLINEDISPLAY__queue_draw) == 0) | |||||
| return true; | |||||
| if (std::strcmp(uri, LV2_LOG__log) == 0) | if (std::strcmp(uri, LV2_LOG__log) == 0) | ||||
| return true; | return true; | ||||
| if (std::strcmp(uri, LV2_OPTIONS__options) == 0) | if (std::strcmp(uri, LV2_OPTIONS__options) == 0) | ||||