6#include "CarlaBackendUtils.hpp"
7#include "CarlaBinaryUtils.hpp"
8#include "CarlaJuceUtils.hpp"
9#include "CarlaPipeUtils.hpp"
10#include "CarlaSha1Utils.hpp"
11#include "CarlaTimeUtils.hpp"
25 if (recursionLimit == 0 ||
filename.length() < 5 || !
filename.contains(
"/"))
30 if (
water::File(path +
"/dosdevices").isDirectory())
41_CarlaPluginDiscoveryMetadata::_CarlaPluginDiscoveryMetadata()
noexcept
47_CarlaPluginDiscoveryIO::_CarlaPluginDiscoveryIO()
noexcept
57_CarlaPluginDiscoveryInfo::_CarlaPluginDiscoveryInfo()
noexcept
68 #if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN)
91 const std::vector<water::File>&& binaries,
94 void*
const callbackPtr)
119 void*
const callbackPtr,
120 const char*
const pluginPath =
nullptr)
141 stopPipeServer(5000);
155 const uint32_t timeNow = carla_gettime_ms();
160 carla_stdout(
"Plugin took too long to respond, skipping...");
161 stopPipeServer(1000);
186 stopPipeServer(1000);
194 if (std::strcmp(
msg,
"warning") == 0 || std::strcmp(
msg,
"error") == 0)
196 const char*
text =
nullptr;
197 readNextLineAsString(
text,
false);
198 carla_stdout(
"discovery: %s",
text);
202 if (std::strcmp(
msg,
"init") == 0)
205 readNextLineAsString(
_,
false);
210 if (std::strcmp(
msg,
"end") == 0)
213 readNextLineAsString(
_,
false);
268 if (std::strcmp(
msg,
"build") == 0)
271 readNextLineAsByte(btype);
276 if (std::strcmp(
msg,
"hints") == 0)
278 readNextLineAsUInt(
fNextInfo.metadata.hints);
282 if (std::strcmp(
msg,
"category") == 0)
284 const char* category =
nullptr;
285 readNextLineAsString(category,
false);
286 fNextInfo.metadata.category = CB::getPluginCategoryFromString(category);
290 if (std::strcmp(
msg,
"name") == 0)
296 if (std::strcmp(
msg,
"label") == 0)
302 if (std::strcmp(
msg,
"maker") == 0)
308 if (std::strcmp(
msg,
"uniqueId") == 0)
314 if (std::strcmp(
msg,
"audio.ins") == 0)
316 readNextLineAsUInt(
fNextInfo.io.audioIns);
320 if (std::strcmp(
msg,
"audio.outs") == 0)
322 readNextLineAsUInt(
fNextInfo.io.audioOuts);
326 if (std::strcmp(
msg,
"cv.ins") == 0)
332 if (std::strcmp(
msg,
"cv.outs") == 0)
338 if (std::strcmp(
msg,
"midi.ins") == 0)
340 readNextLineAsUInt(
fNextInfo.io.midiIns);
344 if (std::strcmp(
msg,
"midi.outs") == 0)
346 readNextLineAsUInt(
fNextInfo.io.midiOuts);
350 if (std::strcmp(
msg,
"parameters.ins") == 0)
352 readNextLineAsUInt(
fNextInfo.io.parameterIns);
356 if (std::strcmp(
msg,
"parameters.outs") == 0)
358 readNextLineAsUInt(
fNextInfo.io.parameterOuts);
362 if (std::strcmp(
msg,
"exiting") == 0)
364 stopPipeServer(1000);
368 carla_stdout(
"discovery: unknown message '%s' received",
msg);
410 case CB::BINARY_WIN32:
417 case CB::BINARY_WIN64:
447 const char*
const envWinePrefix = std::getenv(
"WINEPREFIX");
449 if (envWinePrefix !=
nullptr && envWinePrefix[0] !=
'\0')
450 winePrefix = envWinePrefix;
457 const CarlaScopedEnvVar sev1(
"WINEDEBUG",
"-all");
458 const CarlaScopedEnvVar sev2(
"WINEPREFIX", winePrefix.
toRawUTF8());
461 const CarlaScopedEnvVar sev3(
"CARLA_DISCOVERY_NO_PROCESSING_CHECKS",
"1");
471 case CB::PLUGIN_INTERNAL:
473 case CB::PLUGIN_JSFX:
481 if (pinfo ==
nullptr || !pinfo->
valid)
486 info.btype = CB::BINARY_NATIVE;
508 info.label = slash + 1;
544 carla_debug(
"Skipping \"%s\", using cache",
filename.toRawUTF8());
549 carla_stdout(
"Scanning \"%s\"...",
filename.toRawUTF8());
580 const int64_t mtime =
file.getLastModificationTime();
581 sha1.write(&mtime,
sizeof(mtime));
591static bool findDirectories(std::vector<water::File>&
files,
const char*
const pluginPath,
const char*
const wildcard)
595 if (pluginPath[0] ==
'\0')
604 if (splitPaths.
size() == 0)
607 for (
String *it = splitPaths.
begin(), *end = splitPaths.
end(); it != end; ++it)
610 std::vector<File> results;
615 files.insert(
files.end(), results.begin(), results.end());
619 return files.empty();
623 const BinaryType btype,
const char*
const pluginPath,
const char*
const wildcard)
627 if (pluginPath[0] ==
'\0')
636 if (splitPaths.
size() == 0)
639 for (
String *it = splitPaths.
begin(), *end = splitPaths.
end(); it != end; ++it)
642 std::vector<File> results;
648 for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit)
652 if (CB::getBinaryTypeFromFile(
file.getFullPathName().toRawUTF8()) == btype)
658 return files.empty();
662 const BinaryType btype,
const char*
const pluginPath)
666 if (pluginPath[0] ==
'\0')
675 if (splitPaths.
size() == 0)
678 const uint flags = btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64
682 for (
String *it = splitPaths.
begin(), *end = splitPaths.
end(); it != end; ++it)
685 std::vector<File> results;
691 for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit)
695 if (CB::getBinaryTypeFromFile(
file.getFullPathName().toRawUTF8()) == btype)
701 return files.empty();
707 const char*
const pluginPath,
710 void*
const callbackPtr)
716 carla_debug(
"carla_plugin_discovery_start(%s, %d:%s, %d:%s, %s, %p, %p, %p)",
717 discoveryTool, btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), pluginPath,
718 discoveryCb, checkCacheCb, callbackPtr);
720 bool directories =
false;
721 const char* wildcard =
nullptr;
725 case CB::PLUGIN_INTERNAL:
728 case CB::PLUGIN_JSFX:
740 case CB::PLUGIN_NONE:
741 case CB::PLUGIN_JACK:
742 case CB::PLUGIN_TYPE_COUNT:
747 case CB::PLUGIN_JSFX:
749 const CarlaScopedEnvVar csev(
"CARLA_DISCOVERY_PATH", pluginPath);
750 return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr, pluginPath);
753 case CB::PLUGIN_INTERNAL:
754 return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr);
756 case CB::PLUGIN_LADSPA:
757 case CB::PLUGIN_DSSI:
761 if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64)
768 wildcard =
"*.dylib";
776 case CB::PLUGIN_VST2:
780 if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64)
796 case CB::PLUGIN_VST3:
803 wildcard =
"*.component";
806 case CB::PLUGIN_CLAP:
826 std::vector<water::File>
files;
828 if (ptype == CB::PLUGIN_VST3)
833 else if (directories)
845 discoveryCb, checkCacheCb, callbackPtr);
867 #if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN)
868 case CB::ENGINE_OPTION_WINE_EXECUTABLE:
869 if (valueStr !=
nullptr && valueStr[0] !=
'\0')
874 case CB::ENGINE_OPTION_WINE_AUTO_PREFIX:
878 case CB::ENGINE_OPTION_WINE_FALLBACK_PREFIX:
879 if (valueStr !=
nullptr && valueStr[0] !=
'\0')
#define CARLA_BACKEND_NAMESPACE
Definition CarlaBackend.h:32
#define CARLA_OS_SEP
Definition CarlaDefines.h:318
#define CARLA_OS_SPLIT_STR
Definition CarlaDefines.h:321
#define CARLA_SAFE_ASSERT_RETURN(cond, ret)
Definition CarlaDefines.h:190
unsigned int uint
Definition CarlaDefines.h:327
#define CARLA_SAFE_ASSERT_BREAK(cond)
Definition CarlaDefines.h:188
#define CARLA_SAFE_ASSERT_UINT_RETURN(cond, value, ret)
Definition CarlaDefines.h:211
#define CARLA_SAFE_ASSERT(cond)
Definition CarlaDefines.h:182
#define noexcept
Definition DistrhoDefines.h:72
#define nullptr
Definition DistrhoDefines.h:75
static bool findFiles(std::vector< water::File > &files, const BinaryType btype, const char *const pluginPath, const char *const wildcard)
Definition PluginDiscovery.cpp:622
static water::String findWinePrefix(const water::String filename, const int recursionLimit=10)
Definition PluginDiscovery.cpp:23
static bool findDirectories(std::vector< water::File > &files, const char *const pluginPath, const char *const wildcard)
Definition PluginDiscovery.cpp:591
static bool findVST3s(std::vector< water::File > &files, const BinaryType btype, const char *const pluginPath)
Definition PluginDiscovery.cpp:661
static const char *const gPluginsDiscoveryNullCharPtr
Definition PluginDiscovery.cpp:39
Definition PluginDiscovery.cpp:86
char * fNextMaker
Definition PluginDiscovery.cpp:391
const CarlaPluginCheckCacheCallback fCheckCacheCallback
Definition PluginDiscovery.cpp:376
bool idle()
Definition PluginDiscovery.cpp:148
CarlaPluginDiscovery(const char *const discoveryTool, const BinaryType btype, const PluginType ptype, const std::vector< water::File > &&binaries, const CarlaPluginDiscoveryCallback discoveryCb, const CarlaPluginCheckCacheCallback checkCacheCb, void *const callbackPtr)
Definition PluginDiscovery.cpp:88
char * fNextName
Definition PluginDiscovery.cpp:392
const char * fPluginPath
Definition PluginDiscovery.cpp:378
const PluginType fPluginType
Definition PluginDiscovery.cpp:374
char * fNextLabel
Definition PluginDiscovery.cpp:390
CarlaPluginDiscovery(const char *const discoveryTool, const BinaryType btype, const PluginType ptype, const CarlaPluginDiscoveryCallback discoveryCb, const CarlaPluginCheckCacheCallback checkCacheCb, void *const callbackPtr, const char *const pluginPath=nullptr)
Definition PluginDiscovery.cpp:114
~CarlaPluginDiscovery()
Definition PluginDiscovery.cpp:139
void makeHash(const water::File &file, const water::String &filename)
Definition PluginDiscovery.cpp:560
const std::vector< water::File > fBinaries
Definition PluginDiscovery.cpp:383
uint32_t fLastMessageTime
Definition PluginDiscovery.cpp:386
const uint fBinaryCount
Definition PluginDiscovery.cpp:382
CarlaString fNextSha1Sum
Definition PluginDiscovery.cpp:389
void skip()
Definition PluginDiscovery.cpp:183
bool msgReceived(const char *const msg) noexcept
Definition PluginDiscovery.cpp:190
const CarlaString fDiscoveryTool
Definition PluginDiscovery.cpp:384
void start()
Definition PluginDiscovery.cpp:394
uint fBinaryIndex
Definition PluginDiscovery.cpp:381
bool fPluginsFoundInBinary
Definition PluginDiscovery.cpp:380
const CarlaPluginDiscoveryCallback fDiscoveryCallback
Definition PluginDiscovery.cpp:375
void *const fCallbackPtr
Definition PluginDiscovery.cpp:377
CarlaPluginDiscoveryInfo fNextInfo
Definition PluginDiscovery.cpp:388
const BinaryType fBinaryType
Definition PluginDiscovery.cpp:373
@ findDirectories
Definition File.h:461
@ findFiles
Definition File.h:462
@ ignoreHiddenFiles
Definition File.h:464
@ userHomeDirectory
Definition File.h:635
static File getSpecialLocation(const SpecialLocationType type)
Definition File.cpp:1642
uint findChildFiles(std::vector< File > &results, int whatToLookFor, bool searchRecursively, const String &wildCardPattern="*") const
Definition File.cpp:581
Definition StringArray.h:41
String * begin() const noexcept
Definition StringArray.h:120
int size() const noexcept
Definition StringArray.h:97
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition StringArray.cpp:369
String * end() const noexcept
Definition StringArray.h:125
bool isNotEmpty() const noexcept
Definition String.h:244
const char * toRawUTF8() const
Definition String.cpp:1925
bool isEmpty() const noexcept
Definition String.h:238
const String & getFullPathName() const noexcept
Definition File.h:152
Definition StringArray.h:41
register unsigned i
Definition inflate.c:1575
static char filename[]
Definition features.c:5
#define _(msgid)
Definition getopt.c:86
PluginType
Definition CarlaBackend.h:614
BinaryType
Definition CarlaBackend.h:550
EngineOption
Definition CarlaBackend.h:1333
@ PLUGIN_NONE
Definition CarlaBackend.h:618
@ BINARY_NONE
Definition CarlaBackend.h:554
@ PLUGIN_CATEGORY_NONE
Definition CarlaBackend.h:708
CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char *const discoveryTool, const BinaryType btype, const PluginType ptype, const char *const pluginPath, const CarlaPluginDiscoveryCallback discoveryCb, const CarlaPluginCheckCacheCallback checkCacheCb, void *const callbackPtr)
Definition PluginDiscovery.cpp:704
void * CarlaPluginDiscoveryHandle
Definition CarlaUtils.h:28
void carla_plugin_discovery_stop(const CarlaPluginDiscoveryHandle handle)
Definition PluginDiscovery.cpp:858
struct _CarlaCachedPluginInfo CarlaCachedPluginInfo
bool carla_plugin_discovery_idle(const CarlaPluginDiscoveryHandle handle)
Definition PluginDiscovery.cpp:848
bool(* CarlaPluginCheckCacheCallback)(void *ptr, const char *filename, const char *sha1)
Definition CarlaUtils.h:188
void carla_plugin_discovery_skip(const CarlaPluginDiscoveryHandle handle)
Definition PluginDiscovery.cpp:853
CARLA_PLUGIN_EXPORT uint carla_get_cached_plugin_count(PluginType ptype, const char *pluginPath)
void carla_plugin_discovery_set_option(const EngineOption option, const int value, const char *const valueStr)
Definition PluginDiscovery.cpp:863
void(* CarlaPluginDiscoveryCallback)(void *ptr, const CarlaPluginDiscoveryInfo *info, const char *sha1)
Definition CarlaUtils.h:181
struct _CarlaPluginDiscoveryInfo CarlaPluginDiscoveryInfo
CARLA_PLUGIN_EXPORT const CarlaCachedPluginInfo * carla_get_cached_plugin_info(PluginType ptype, uint index)
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
struct backing_store_struct * info
Definition jmemsys.h:183
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
static char ** files
Definition misc.c:28
const char * msg
Definition missing_descriptor.c:20
#define false
Definition ordinals.h:83
uint32_t parameterIns
Definition CarlaUtils.h:291
uint32_t midiOuts
Definition CarlaUtils.h:286
uint32_t parameterOuts
Definition CarlaUtils.h:296
uint32_t audioOuts
Definition CarlaUtils.h:266
uint32_t midiIns
Definition CarlaUtils.h:281
uint32_t cvIns
Definition CarlaUtils.h:271
uint hints
Definition CarlaUtils.h:256
uint32_t cvOuts
Definition CarlaUtils.h:276
const char * maker
Definition CarlaUtils.h:311
bool valid
Definition CarlaUtils.h:245
const char * label
Definition CarlaUtils.h:306
const char * name
Definition CarlaUtils.h:301
uint32_t audioIns
Definition CarlaUtils.h:261
PluginCategory category
Definition CarlaUtils.h:250
Definition CarlaUtils.h:124
Definition PluginDiscovery.cpp:67
CarlaString executable
Definition PluginDiscovery.cpp:71
struct CarlaPluginDiscoveryOptions::@225223212227005147163077370124203146176270146345 wine
CarlaString fallbackPrefix
Definition PluginDiscovery.cpp:72
static CarlaPluginDiscoveryOptions & getInstance() noexcept
Definition PluginDiscovery.cpp:76
bool autoPrefix
Definition PluginDiscovery.cpp:70
const char * text
Definition swell-functions.h:167
struct zdirent * file
Definition win32.c:1500
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263