| @@ -24,6 +24,11 @@ | |||
| #include "juce_audio_formats.h" | |||
| #ifdef CARLA_OS_MAC | |||
| # include "juce_audio_processors.h" | |||
| using juce::StringArray; | |||
| #endif | |||
| namespace CB = CarlaBackend; | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| @@ -259,6 +264,10 @@ const char* carla_get_supported_file_extensions() | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| #ifdef CARLA_OS_MAC | |||
| static StringArray gCachedAuPluginResults; | |||
| #endif | |||
| uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(ptype == CB::PLUGIN_INTERNAL || ptype == CB::PLUGIN_LV2 || ptype == CB::PLUGIN_AU, 0); | |||
| @@ -280,9 +289,21 @@ uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath) | |||
| return lv2World.getPluginCount(); | |||
| } | |||
| case CB::PLUGIN_AU: { | |||
| // TODO | |||
| case CB::PLUGIN_AU: { | |||
| #ifdef CARLA_OS_MAC | |||
| static bool initiated = false; | |||
| if (initiated) | |||
| return gCachedAuPluginResults.size(); | |||
| initiated = true; | |||
| AudioUnitPluginFormat auFormat; | |||
| gCachedAuPluginResults = auFormat.searchPathsForPlugins(juce::FileSearchPath(), false); | |||
| return gCachedAuPluginResults.size(); | |||
| #else | |||
| return 0; | |||
| #endif | |||
| } | |||
| default: | |||
| @@ -613,8 +634,53 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint | |||
| } | |||
| case CB::PLUGIN_AU: { | |||
| // TODO | |||
| #ifdef CARLA_OS_MAC | |||
| const int indexi(static_cast<int>(index)); | |||
| CARLA_SAFE_ASSERT_RETURN(indexi < gCachedAuPluginResults.size(), nullptr); | |||
| using namespace juce; | |||
| String pluginId(gCachedAuPluginResults[indexi]); | |||
| OwnedArray<PluginDescription> results; | |||
| AudioPluginFormat& auFormat = *(AudioPluginFormat*)0; | |||
| auFormat.findAllTypesForFile(results, pluginId); | |||
| CARLA_SAFE_ASSERT_RETURN(results.size() > 0, nullptr); | |||
| CARLA_SAFE_ASSERT(results.size() == 1); | |||
| PluginDescription* const desc(results[0]); | |||
| CARLA_SAFE_ASSERT_RETURN(desc != nullptr, nullptr); | |||
| info.category = CB::PLUGIN_CATEGORY_NONE; | |||
| info.hints = 0x0; | |||
| if (desc->isInstrument) | |||
| info.hints |= CB::PLUGIN_IS_SYNTH; | |||
| if (true) | |||
| info.hints |= CB::PLUGIN_HAS_CUSTOM_UI; | |||
| info.audioIns = static_cast<uint32_t>(desc->numInputChannels); | |||
| info.audioOuts = static_cast<uint32_t>(desc->numOutputChannels); | |||
| info.midiIns = desc->isInstrument ? 1 : 0; | |||
| info.midiOuts = 0; | |||
| info.parameterIns = 0; | |||
| info.parameterOuts = 0; | |||
| static CarlaString sname, slabel, smaker; | |||
| sname = desc->name.toRawUTF8(); | |||
| slabel = desc->fileOrIdentifier.toRawUTF8(); | |||
| smaker = desc->manufacturerName.toRawUTF8(); | |||
| info.name = sname; | |||
| info.label = slabel; | |||
| info.maker = smaker; | |||
| info.copyright = gNullCharPtr; | |||
| return &info; | |||
| #else | |||
| return nullptr; | |||
| #endif | |||
| } | |||
| default: | |||