diff --git a/source/backend/CarlaHostCommon.cpp b/source/backend/CarlaHostCommon.cpp index addde0379..818dfb813 100644 --- a/source/backend/CarlaHostCommon.cpp +++ b/source/backend/CarlaHostCommon.cpp @@ -26,6 +26,7 @@ #ifdef CARLA_OS_MAC # include "juce_audio_processors.h" +using juce::AudioUnitPluginFormat; using juce::StringArray; #endif @@ -36,11 +37,13 @@ namespace CB = CarlaBackend; static const char* const gNullCharPtr = ""; +#ifdef CARLA_COMMON_NEED_CHECKSTRINGPTR static void checkStringPtr(const char*& charPtr) noexcept { if (charPtr == nullptr) charPtr = gNullCharPtr; } +#endif // ------------------------------------------------------------------------------------------------------------------- // Constructors @@ -294,13 +297,13 @@ uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath) static bool initiated = false; if (initiated) - return gCachedAuPluginResults.size(); + return static_cast(gCachedAuPluginResults.size()); initiated = true; - AudioUnitPluginFormat auFormat; gCachedAuPluginResults = auFormat.searchPathsForPlugins(juce::FileSearchPath(), false); - return gCachedAuPluginResults.size(); + + return static_cast(gCachedAuPluginResults.size()); #else return 0; #endif @@ -313,7 +316,6 @@ uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath) const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint index) { - CARLA_SAFE_ASSERT_RETURN(ptype == CB::PLUGIN_INTERNAL || ptype == CB::PLUGIN_LV2 || ptype == CB::PLUGIN_AU, nullptr); carla_debug("carla_get_cached_plugin_info(%i:%s, %i)", ptype, CB::PluginType2Str(ptype), index); static CarlaCachedPluginInfo info; @@ -323,7 +325,7 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint case CB::PLUGIN_INTERNAL: { #ifndef BUILD_BRIDGE const NativePluginDescriptor* const desc(CarlaPlugin::getNativePluginDescriptor(index)); - CARLA_SAFE_ASSERT_RETURN(desc != nullptr, nullptr); + CARLA_SAFE_ASSERT_BREAK(desc != nullptr); info.category = static_cast(desc->category); info.hints = 0x0; @@ -339,19 +341,19 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint if (desc->hints & ::PLUGIN_NEEDS_SINGLE_THREAD) info.hints |= CB::PLUGIN_NEEDS_SINGLE_THREAD; - info.audioIns = desc->audioIns; - info.audioOuts = desc->audioOuts; - info.midiIns = desc->midiIns; - info.midiOuts = desc->midiOuts; + info.audioIns = desc->audioIns; + info.audioOuts = desc->audioOuts; + info.midiIns = desc->midiIns; + info.midiOuts = desc->midiOuts; info.parameterIns = desc->paramIns; info.parameterOuts = desc->paramOuts; - - info.name = desc->name; - info.label = desc->label; - info.maker = desc->maker; - info.copyright = desc->copyright; + info.name = desc->name; + info.label = desc->label; + info.maker = desc->maker; + info.copyright = desc->copyright; + return &info; #else - return nullptr; + break; #endif } @@ -359,10 +361,10 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint Lv2WorldClass& lv2World(Lv2WorldClass::getInstance()); const LilvPlugin* const cPlugin(lv2World.getPluginFromIndex(index)); - CARLA_SAFE_ASSERT_RETURN(cPlugin != nullptr, nullptr); + CARLA_SAFE_ASSERT_BREAK(cPlugin != nullptr); Lilv::Plugin lilvPlugin(cPlugin); - CARLA_SAFE_ASSERT_RETURN(lilvPlugin.get_uri().is_uri(), nullptr); + CARLA_SAFE_ASSERT_BREAK(lilvPlugin.get_uri().is_uri()); // features info.hints = 0x0; @@ -636,22 +638,22 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint case CB::PLUGIN_AU: { #ifdef CARLA_OS_MAC const int indexi(static_cast(index)); - CARLA_SAFE_ASSERT_RETURN(indexi < gCachedAuPluginResults.size(), nullptr); + CARLA_SAFE_ASSERT_BREAK(indexi < gCachedAuPluginResults.size()); using namespace juce; String pluginId(gCachedAuPluginResults[indexi]); OwnedArray results; - AudioPluginFormat& auFormat = *(AudioPluginFormat*)0; + AudioUnitPluginFormat auFormat; auFormat.findAllTypesForFile(results, pluginId); - CARLA_SAFE_ASSERT_RETURN(results.size() > 0, nullptr); + CARLA_SAFE_ASSERT_BREAK(results.size() > 0); CARLA_SAFE_ASSERT(results.size() == 1); PluginDescription* const desc(results[0]); - CARLA_SAFE_ASSERT_RETURN(desc != nullptr, nullptr); + CARLA_SAFE_ASSERT_BREAK(desc != nullptr); - info.category = CB::PLUGIN_CATEGORY_NONE; + info.category = CB::getPluginCategoryFromName(desc->category.toRawUTF8()); info.hints = 0x0; if (desc->isInstrument) @@ -679,19 +681,26 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint return &info; #else - return nullptr; + break; #endif } default: - return nullptr; + break; } - checkStringPtr(info.name); - checkStringPtr(info.label); - checkStringPtr(info.maker); - checkStringPtr(info.copyright); - + info.category = CB::PLUGIN_CATEGORY_NONE; + info.hints = 0x0; + info.audioIns = 0; + info.audioOuts = 0; + info.midiIns = 0; + info.midiOuts = 0; + info.parameterIns = 0; + info.parameterOuts = 0; + info.name = gNullCharPtr; + info.label = gNullCharPtr; + info.maker = gNullCharPtr; + info.copyright = gNullCharPtr; return &info; } diff --git a/source/backend/CarlaStandalone.cpp b/source/backend/CarlaStandalone.cpp index 27db5561f..33124b974 100644 --- a/source/backend/CarlaStandalone.cpp +++ b/source/backend/CarlaStandalone.cpp @@ -358,6 +358,7 @@ static CarlaNSM gNSM; // ------------------------------------------------------------------------------------------------------------------- // API +#define CARLA_COMMON_NEED_CHECKSTRINGPTR #include "CarlaHostCommon.cpp" // ------------------------------------------------------------------------------------------------------------------- diff --git a/source/backend/plugin/AuPlugin.cpp b/source/backend/plugin/AuPlugin.cpp index 20ba128b5..30d2b3007 100644 --- a/source/backend/plugin/AuPlugin.cpp +++ b/source/backend/plugin/AuPlugin.cpp @@ -25,7 +25,7 @@ CARLA_BACKEND_START_NAMESPACE CarlaPlugin* CarlaPlugin::newAU(const Initializer& init) { - carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId); + carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId); #if defined(CARLA_OS_MAC) return newJuce(init, "AU"); diff --git a/source/backend/plugin/JucePlugin.cpp b/source/backend/plugin/JucePlugin.cpp index 30cd73d22..29f942e81 100644 --- a/source/backend/plugin/JucePlugin.cpp +++ b/source/backend/plugin/JucePlugin.cpp @@ -170,7 +170,10 @@ public: void getLabel(char* const strBuf) const noexcept override { - std::strncpy(strBuf, fDesc.name.toRawUTF8(), STR_MAX); + if (fDesc.pluginFormatName == "AU" || fDesc.pluginFormatName == "AudioUnit") + std::strncpy(strBuf, fDesc.fileOrIdentifier.toRawUTF8(), STR_MAX); + else + std::strncpy(strBuf, fDesc.name.toRawUTF8(), STR_MAX); } void getMaker(char* const strBuf) const noexcept override @@ -1036,7 +1039,7 @@ protected: // ------------------------------------------------------------------- public: - bool init(const char* const filename, const char* const name, /*const char* const label, */const int64_t uniqueId, const char* const format) + bool init(const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const char* const format) { CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); @@ -1049,44 +1052,45 @@ public: return false; } - if (filename == nullptr || filename[0] == '\0') + if (format == nullptr || format[0] == '\0') { - pData->engine->setLastError("null filename"); + pData->engine->setLastError("null format"); return false; } -#if 0 - if (label == nullptr || label[0] == '\0') + if (std::strcmp(format, "AU") == 0) { - pData->engine->setLastError("null label"); - return false; - } -#endif + if (label == nullptr || label[0] == '\0') + { + pData->engine->setLastError("null label"); + return false; + } - if (format == nullptr || format[0] == '\0') - { - pData->engine->setLastError("null format"); - return false; + fDesc.fileOrIdentifier = label; } + else + { + if (filename == nullptr || filename[0] == '\0') + { + pData->engine->setLastError("null filename"); + return false; + } - // --------------------------------------------------------------- - // fix path for wine usage - - String jfilename(filename); + String jfilename(filename); #ifdef CARLA_OS_WIN - if (jfilename.startsWith("/")) - { - jfilename.replace("/", "\\"); - jfilename = "Z:" + jfilename; - } + if (jfilename.startsWith("/")) + { + jfilename.replace("/", "\\"); + jfilename = "Z:" + jfilename; + } #endif - //fDesc.name = fDesc.descriptiveName = label; - fDesc.uid = static_cast(uniqueId); - fDesc.fileOrIdentifier = jfilename; - fDesc.pluginFormatName = format; + fDesc.fileOrIdentifier = jfilename; + fDesc.uid = static_cast(uniqueId); + } + fDesc.pluginFormatName = format; fFormatManager.addDefaultFormats(); String error; @@ -1174,7 +1178,7 @@ CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init, const char* const for #if (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) JucePlugin* const plugin(new JucePlugin(init.engine, init.id)); - if (! plugin->init(init.filename, init.name, /*init.label,*/ init.uniqueId, format)) + if (! plugin->init(init.filename, init.name, init.label, init.uniqueId, format)) { delete plugin; return nullptr; diff --git a/source/utils/CarlaBackendUtils.hpp b/source/utils/CarlaBackendUtils.hpp index a523cc290..78e75acbc 100644 --- a/source/utils/CarlaBackendUtils.hpp +++ b/source/utils/CarlaBackendUtils.hpp @@ -480,6 +480,8 @@ PluginType getPluginTypeFromString(const char* const ctype) noexcept return PLUGIN_VST3; if (stype == "au") return PLUGIN_AU; + if (stype == "audiounit") + return PLUGIN_AU; if (stype == "gig") return PLUGIN_GIG; if (stype == "sf2") diff --git a/source/utils/CarlaStateUtils.cpp b/source/utils/CarlaStateUtils.cpp index 923c88dc8..eef0af6c6 100644 --- a/source/utils/CarlaStateUtils.cpp +++ b/source/utils/CarlaStateUtils.cpp @@ -285,7 +285,7 @@ bool StateSave::fillFromXmlElement(const XmlElement* const xmlElement) type = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("name")) name = xmlSafeStringCharDup(text, false); - else if (tag.equalsIgnoreCase("label") || tag.equalsIgnoreCase("uri")) + else if (tag.equalsIgnoreCase("label") || tag.equalsIgnoreCase("identifier") || tag.equalsIgnoreCase("uri")) label = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("binary") || tag.equalsIgnoreCase("bundle") || tag.equalsIgnoreCase("filename")) binary = xmlSafeStringCharDup(text, false); @@ -511,9 +511,7 @@ String StateSave::toString() const infoXml << " " << uniqueId << "\n"; break; case PLUGIN_AU: - // TODO? - infoXml << " " << xmlSafeString(binary, true) << "\n"; - infoXml << " " << uniqueId << "\n"; + infoXml << " " << xmlSafeString(label, true) << "\n"; break; case PLUGIN_GIG: case PLUGIN_SF2: