Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement auto-discovery for wine bridges
Signed-off-by: falkTX <falktx@falktx.com>
  • Loading branch information
falkTX committed Sep 2, 2023
1 parent 04355ba commit cec462a
Show file tree
Hide file tree
Showing 17 changed files with 452 additions and 126 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -124,7 +124,7 @@ $(MODULEDIR)/carla_plugin.a: .FORCE
$(MODULEDIR)/jackbridge.a: .FORCE
@$(MAKE) -C source/jackbridge

$(MODULEDIR)/jackbridge.%.a: $(MODULEDIR)/jackbridge.a
$(MODULEDIR)/jackbridge.%.a: .FORCE
@$(MAKE) -C source/jackbridge $*

$(MODULEDIR)/native-plugins.a: .FORCE
Expand Down
1 change: 1 addition & 0 deletions source/backend/CarlaUtils.h
Expand Up @@ -304,6 +304,7 @@ typedef bool (*CarlaPluginCheckCacheCallback)(void* ptr, const char* filename, c
* @a carla_plugin_discovery_idle must be called at regular intervals afterwards.
*/
CARLA_PLUGIN_EXPORT CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* discoveryTool,
BinaryType btype,
PluginType ptype,
const char* pluginPath,
CarlaPluginDiscoveryCallback discoveryCb,
Expand Down
1 change: 1 addition & 0 deletions source/backend/utils/Makefile
Expand Up @@ -10,6 +10,7 @@ include ../Makefile.mk
# ---------------------------------------------------------------------------------------------------------------------

BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS)
BUILD_CXX_FLAGS += $(MAGIC_LIBS)
BUILD_CXX_FLAGS += $(YSFX_FLAGS)

# ---------------------------------------------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion source/backend/utils/PipeClient.cpp
@@ -1,6 +1,6 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
Expand Down
116 changes: 89 additions & 27 deletions source/backend/utils/PluginDiscovery.cpp
Expand Up @@ -18,6 +18,7 @@
#include "CarlaUtils.h"

#include "CarlaBackendUtils.hpp"
#include "CarlaBinaryUtils.hpp"
#include "CarlaJuceUtils.hpp"
#include "CarlaPipeUtils.hpp"
#include "CarlaSha1Utils.hpp"
Expand Down Expand Up @@ -64,12 +65,14 @@ class CarlaPluginDiscovery : private CarlaPipeServer
{
public:
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)
: fPluginType(ptype),
: fBinaryType(btype),
fPluginType(ptype),
fDiscoveryCallback(discoveryCb),
fCheckCacheCallback(checkCacheCb),
fCallbackPtr(callbackPtr),
Expand All @@ -87,11 +90,13 @@ class CarlaPluginDiscovery : private CarlaPipeServer
}

CarlaPluginDiscovery(const char* const discoveryTool,
const BinaryType btype,
const PluginType ptype,
const CarlaPluginDiscoveryCallback discoveryCb,
const CarlaPluginCheckCacheCallback checkCacheCb,
void* const callbackPtr)
: fPluginType(ptype),
: fBinaryType(btype),
fPluginType(ptype),
fDiscoveryCallback(discoveryCb),
fCheckCacheCallback(checkCacheCb),
fCallbackPtr(callbackPtr),
Expand Down Expand Up @@ -340,6 +345,7 @@ class CarlaPluginDiscovery : private CarlaPipeServer
}

private:
const BinaryType fBinaryType;
const PluginType fPluginType;
const CarlaPluginDiscoveryCallback fDiscoveryCallback;
const CarlaPluginCheckCacheCallback fCheckCacheCallback;
Expand All @@ -365,9 +371,25 @@ class CarlaPluginDiscovery : private CarlaPipeServer
fPluginsFoundInBinary = false;
fNextSha1Sum.clear();

const char* helperTool;
switch (fBinaryType)
{
#ifndef CARLA_OS_WIN
case CB::BINARY_WIN32:
helperTool = "wine";
break;
case CB::BINARY_WIN64:
helperTool = "wine64";
break;
#endif
default:
helperTool = nullptr;
break;
}

if (fBinaries.empty())
{
startPipeServer(fDiscoveryTool,
startPipeServer(helperTool, fDiscoveryTool,
getPluginTypeAsString(fPluginType),
":all");
}
Expand All @@ -389,7 +411,7 @@ class CarlaPluginDiscovery : private CarlaPipeServer
}

carla_stdout("Scanning \"%s\"...", filename.toRawUTF8());
startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8());
startPipeServer(helperTool, fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8());
}
}

Expand Down Expand Up @@ -455,7 +477,8 @@ static bool findDirectories(std::vector<water::File>& files, const char* const p
return files.empty();
}

static bool findFiles(std::vector<water::File>& files, const char* const pluginPath, const char* const wildcard)
static bool findFiles(std::vector<water::File>& files,
const BinaryType btype, const char* const pluginPath, const char* const wildcard)
{
CARLA_SAFE_ASSERT_RETURN(pluginPath != nullptr, true);

Expand All @@ -479,14 +502,22 @@ static bool findFiles(std::vector<water::File>& files, const char* const pluginP
if (dir.findChildFiles(results, File::findFiles|File::ignoreHiddenFiles, true, wildcard) > 0)
{
files.reserve(files.size() + results.size());
files.insert(files.end(), results.begin(), results.end());

for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit)
{
const File file(*cit);

if (CB::getBinaryTypeFromFile(file.getFullPathName().toRawUTF8()) == btype)
files.push_back(file);
}
}
}

return files.empty();
}

static bool findVST3s(std::vector<water::File>& files, const char* const pluginPath)
static bool findVST3s(std::vector<water::File>& files,
const BinaryType btype, const char* const pluginPath)
{
CARLA_SAFE_ASSERT_RETURN(pluginPath != nullptr, true);

Expand All @@ -502,11 +533,9 @@ static bool findVST3s(std::vector<water::File>& files, const char* const pluginP
if (splitPaths.size() == 0)
return true;

#if defined(CARLA_OS_WIN)
static constexpr const uint flags = File::findDirectories|File::findFiles;
#else
static constexpr const uint flags = File::findDirectories;
#endif
const uint flags = btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64
? File::findDirectories|File::findFiles
: File::findDirectories;

for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it)
{
Expand All @@ -516,20 +545,30 @@ static bool findVST3s(std::vector<water::File>& files, const char* const pluginP
if (dir.findChildFiles(results, flags|File::ignoreHiddenFiles, true, "*.vst3") > 0)
{
files.reserve(files.size() + results.size());
files.insert(files.end(), results.begin(), results.end());

for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit)
{
const File file(*cit);

if (CB::getBinaryTypeFromFile(file.getFullPathName().toRawUTF8()) == btype)
files.push_back(file);
}
}
}

return files.empty();
}

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)
{
CARLA_SAFE_ASSERT_RETURN(btype != CB::BINARY_NONE, nullptr);
CARLA_SAFE_ASSERT_RETURN(ptype != CB::PLUGIN_NONE, nullptr);
CARLA_SAFE_ASSERT_RETURN(discoveryTool != nullptr && discoveryTool[0] != '\0', nullptr);
CARLA_SAFE_ASSERT_RETURN(discoveryCb != nullptr, nullptr);

Expand All @@ -547,44 +586,66 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov
case CB::PLUGIN_JSFX:
{
const CarlaScopedEnvVar csev("CARLA_DISCOVERY_PATH", pluginPath);
return new CarlaPluginDiscovery(discoveryTool, ptype, discoveryCb, checkCacheCb, callbackPtr);
return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr);
}

case CB::PLUGIN_INTERNAL:
case CB::PLUGIN_LV2:
case CB::PLUGIN_AU:
return new CarlaPluginDiscovery(discoveryTool, ptype, discoveryCb, checkCacheCb, callbackPtr);
return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr);

case CB::PLUGIN_LADSPA:
case CB::PLUGIN_DSSI:
#if defined(CARLA_OS_MAC)
wildcard = "*.dylib";
#elif defined(CARLA_OS_WIN)
#ifdef CARLA_OS_WIN
wildcard = "*.dll";
#else
wildcard = "*.so";
if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64)
{
wildcard = "*.dll";
}
else
{
#ifdef CARLA_OS_MAC
wildcard = "*.dylib";
#else
wildcard = "*.so";
#endif
}
#endif
break;

case CB::PLUGIN_VST2:
#if defined(CARLA_OS_MAC)
directories = true;
wildcard = "*.vst";
#elif defined(CARLA_OS_WIN)
#ifdef CARLA_OS_WIN
wildcard = "*.dll";
#else
wildcard = "*.so";
if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64)
{
wildcard = "*.dll";
}
else
{
#ifdef CARLA_OS_MAC
directories = true;
wildcard = "*.vst";
#else
wildcard = "*.so";
#endif
}
#endif
break;

case CB::PLUGIN_VST3:
directories = true;
wildcard = "*.vst3";
break;

case CB::PLUGIN_CLAP:
wildcard = "*.clap";
#ifdef CARLA_OS_MAC
directories = true;
#endif
break;

case CB::PLUGIN_DLS:
wildcard = "*.dls";
break;
Expand All @@ -602,7 +663,7 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov

if (ptype == CB::PLUGIN_VST3)
{
if (findVST3s(files, pluginPath))
if (findVST3s(files, btype, pluginPath))
return nullptr;
}
else if (directories)
Expand All @@ -612,11 +673,12 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov
}
else
{
if (findFiles(files, pluginPath, wildcard))
if (findFiles(files, btype, pluginPath, wildcard))
return nullptr;
}

return new CarlaPluginDiscovery(discoveryTool, ptype, std::move(files), discoveryCb, checkCacheCb, callbackPtr);
return new CarlaPluginDiscovery(discoveryTool, btype, ptype, std::move(files),
discoveryCb, checkCacheCb, callbackPtr);
}

bool carla_plugin_discovery_idle(const CarlaPluginDiscoveryHandle handle)
Expand Down
15 changes: 10 additions & 5 deletions source/discovery/Makefile
Expand Up @@ -79,11 +79,11 @@ LIBS_win64 = $(MODULEDIR)/lilv.win64.a
LINK_FLAGS += $(LILV_LIBS)

LIBS_native += $(MODULEDIR)/water.files.a
LIBS_arm32 = $(MODULEDIR)/water.files.arm32.a
LIBS_posix32 = $(MODULEDIR)/water.posix32.a
LIBS_posix64 = $(MODULEDIR)/water.posix64.a
LIBS_win32 = $(MODULEDIR)/water.win32.a
LIBS_win64 = $(MODULEDIR)/water.win64.a
LIBS_arm32 += $(MODULEDIR)/water.files.arm32.a
LIBS_posix32 += $(MODULEDIR)/water.posix32.a
LIBS_posix64 += $(MODULEDIR)/water.posix64.a
LIBS_win32 += $(MODULEDIR)/water.win32.a
LIBS_win64 += $(MODULEDIR)/water.win64.a
LINK_FLAGS += $(WATER_LIBS)
LINK_FLAGS += $(LIBDL_LIBS)

Expand All @@ -92,6 +92,11 @@ LIBS_native += $(MODULEDIR)/ysfx.a
LINK_FLAGS += $(YSFX_GRAPHICS_LIBS)
endif

ifeq ($(BUILDING_FOR_WINE),true)
LIBS_win32 += $(MODULEDIR)/jackbridge.win32e.a
LIBS_win64 += $(MODULEDIR)/jackbridge.win64e.a
endif

ifeq ($(USING_JUCE),true)
LIBS_native += $(MODULEDIR)/carla_juce.a
LIBS_native += $(MODULEDIR)/juce_audio_basics.a
Expand Down

0 comments on commit cec462a

Please sign in to comment.