Signed-off-by: falkTX <falktx@falktx.com>pull/1807/head
@@ -644,7 +644,6 @@ typedef enum { | |||
/*! | |||
* VST3 plugin. | |||
* @note Windows and MacOS only | |||
*/ | |||
PLUGIN_VST3 = 6, | |||
@@ -22,6 +22,7 @@ | |||
#ifdef __cplusplus | |||
using CARLA_BACKEND_NAMESPACE::BinaryType; | |||
using CARLA_BACKEND_NAMESPACE::EngineOption; | |||
using CARLA_BACKEND_NAMESPACE::PluginCategory; | |||
using CARLA_BACKEND_NAMESPACE::PluginType; | |||
#endif | |||
@@ -35,100 +36,6 @@ using CARLA_BACKEND_NAMESPACE::PluginType; | |||
* @{ | |||
*/ | |||
/*! | |||
* Information about a cached plugin. | |||
* @see carla_get_cached_plugin_info() | |||
*/ | |||
typedef struct _CarlaCachedPluginInfo { | |||
/*! | |||
* Wherever the data in this struct is valid. | |||
* For performance reasons, plugins are only checked on request, | |||
* and as such, the count vs number of really valid plugins might not match. | |||
* Use this field to skip on plugins which cannot be loaded in Carla. | |||
*/ | |||
bool valid; | |||
/*! | |||
* Plugin category. | |||
*/ | |||
PluginCategory category; | |||
/*! | |||
* Plugin hints. | |||
* @see PluginHints | |||
*/ | |||
uint hints; | |||
/*! | |||
* Number of audio inputs. | |||
*/ | |||
uint32_t audioIns; | |||
/*! | |||
* Number of audio outputs. | |||
*/ | |||
uint32_t audioOuts; | |||
/*! | |||
* Number of CV inputs. | |||
*/ | |||
uint32_t cvIns; | |||
/*! | |||
* Number of CV outputs. | |||
*/ | |||
uint32_t cvOuts; | |||
/*! | |||
* Number of MIDI inputs. | |||
*/ | |||
uint32_t midiIns; | |||
/*! | |||
* Number of MIDI outputs. | |||
*/ | |||
uint32_t midiOuts; | |||
/*! | |||
* Number of input parameters. | |||
*/ | |||
uint32_t parameterIns; | |||
/*! | |||
* Number of output parameters. | |||
*/ | |||
uint32_t parameterOuts; | |||
/*! | |||
* Plugin name. | |||
*/ | |||
const char* name; | |||
/*! | |||
* Plugin label. | |||
*/ | |||
const char* label; | |||
/*! | |||
* Plugin author/maker. | |||
*/ | |||
const char* maker; | |||
/*! | |||
* Plugin copyright/license. | |||
*/ | |||
const char* copyright; | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
CARLA_API _CarlaCachedPluginInfo() noexcept; | |||
CARLA_DECLARE_NON_COPYABLE(_CarlaCachedPluginInfo) | |||
#endif | |||
} CarlaCachedPluginInfo; | |||
/* -------------------------------------------------------------------------------------------------------------------- | |||
* plugin discovery */ | |||
@@ -330,9 +237,108 @@ CARLA_PLUGIN_EXPORT void carla_plugin_discovery_skip(CarlaPluginDiscoveryHandle | |||
*/ | |||
CARLA_PLUGIN_EXPORT void carla_plugin_discovery_stop(CarlaPluginDiscoveryHandle handle); | |||
/*! | |||
* Set a plugin discovery setting, to be applied globally. | |||
*/ | |||
CARLA_PLUGIN_EXPORT void carla_plugin_discovery_set_option(EngineOption option, int value, const char* valueStr); | |||
/* -------------------------------------------------------------------------------------------------------------------- | |||
* cached plugins */ | |||
/*! | |||
* Information about a cached plugin. | |||
* @see carla_get_cached_plugin_info() | |||
*/ | |||
typedef struct _CarlaCachedPluginInfo { | |||
/*! | |||
* Wherever the data in this struct is valid. | |||
* For performance reasons, plugins are only checked on request, | |||
* and as such, the count vs number of really valid plugins might not match. | |||
* Use this field to skip on plugins which cannot be loaded in Carla. | |||
*/ | |||
bool valid; | |||
/*! | |||
* Plugin category. | |||
*/ | |||
PluginCategory category; | |||
/*! | |||
* Plugin hints. | |||
* @see PluginHints | |||
*/ | |||
uint hints; | |||
/*! | |||
* Number of audio inputs. | |||
*/ | |||
uint32_t audioIns; | |||
/*! | |||
* Number of audio outputs. | |||
*/ | |||
uint32_t audioOuts; | |||
/*! | |||
* Number of CV inputs. | |||
*/ | |||
uint32_t cvIns; | |||
/*! | |||
* Number of CV outputs. | |||
*/ | |||
uint32_t cvOuts; | |||
/*! | |||
* Number of MIDI inputs. | |||
*/ | |||
uint32_t midiIns; | |||
/*! | |||
* Number of MIDI outputs. | |||
*/ | |||
uint32_t midiOuts; | |||
/*! | |||
* Number of input parameters. | |||
*/ | |||
uint32_t parameterIns; | |||
/*! | |||
* Number of output parameters. | |||
*/ | |||
uint32_t parameterOuts; | |||
/*! | |||
* Plugin name. | |||
*/ | |||
const char* name; | |||
/*! | |||
* Plugin label. | |||
*/ | |||
const char* label; | |||
/*! | |||
* Plugin author/maker. | |||
*/ | |||
const char* maker; | |||
/*! | |||
* Plugin copyright/license. | |||
*/ | |||
const char* copyright; | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
CARLA_API _CarlaCachedPluginInfo() noexcept; | |||
CARLA_DECLARE_NON_COPYABLE(_CarlaCachedPluginInfo) | |||
#endif | |||
} CarlaCachedPluginInfo; | |||
/*! | |||
* Get how many cached plugins are available. | |||
* Internal and LV2 plugin formats are cached and need to be discovered via this function. | |||
@@ -52,6 +52,7 @@ static const ExternalMidiNote kExternalMidiNoteFallback = { -1, 0, 0 }; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
#ifndef CARLA_OS_WIN | |||
static String findWinePrefix(const String filename, const int recursionLimit = 10) | |||
{ | |||
if (recursionLimit == 0 || filename.length() < 5 || ! filename.contains("/")) | |||
@@ -64,6 +65,7 @@ static String findWinePrefix(const String filename, const int recursionLimit = 1 | |||
return findWinePrefix(path, recursionLimit-1); | |||
} | |||
#endif | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -128,15 +130,15 @@ public: | |||
fBridgeBinary(), | |||
fLabel(), | |||
fShmIds(), | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
fWinePrefix(), | |||
#endif | |||
#endif | |||
fProcess() {} | |||
void setData( | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
const char* const winePrefix, | |||
#endif | |||
#endif | |||
const char* const binaryArchName, | |||
const char* const bridgeBinary, | |||
const char* const label, | |||
@@ -146,9 +148,9 @@ public: | |||
CARLA_SAFE_ASSERT_RETURN(shmIds != nullptr && shmIds[0] != '\0',); | |||
CARLA_SAFE_ASSERT(! isThreadRunning()); | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
fWinePrefix = winePrefix; | |||
#endif | |||
#endif | |||
fBinaryArchName = binaryArchName; | |||
fBridgeBinary = bridgeBinary; | |||
fShmIds = shmIds; | |||
@@ -190,7 +192,7 @@ protected: | |||
StringArray arguments; | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
// start with "wine" if needed | |||
if (fBridgeBinary.endsWithIgnoreCase(".exe")) | |||
{ | |||
@@ -212,7 +214,7 @@ protected: | |||
arguments.add(wineCMD); | |||
} | |||
#endif | |||
#endif | |||
// setup binary arch | |||
ChildProcess::Type childType; | |||
@@ -245,10 +247,10 @@ protected: | |||
{ | |||
const ScopedEngineEnvironmentLocker _seel(kEngine); | |||
#ifdef CARLA_OS_LINUX | |||
#ifdef CARLA_OS_LINUX | |||
const CarlaScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr); | |||
const CarlaScopedEnvVar sev2("LD_PRELOAD", nullptr); | |||
#endif | |||
#endif | |||
carla_setenv("ENGINE_OPTION_FORCE_STEREO", bool2str(options.forceStereo)); | |||
carla_setenv("ENGINE_OPTION_PREFER_PLUGIN_BRIDGES", bool2str(options.preferPluginBridges)); | |||
@@ -318,7 +320,7 @@ protected: | |||
carla_setenv("ENGINE_BRIDGE_SHM_IDS", fShmIds.toRawUTF8()); | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
if (fWinePrefix.isNotEmpty()) | |||
{ | |||
carla_setenv("WINEDEBUG", "-all"); | |||
@@ -354,12 +356,12 @@ protected: | |||
carla_stdout("Using WINEPREFIX '%s', without RT priorities", fWinePrefix.toRawUTF8()); | |||
} | |||
} | |||
#endif | |||
#endif | |||
carla_stdout("Starting plugin bridge, command is:\n%s \"%s\" \"%s\" \"%s\" " P_INT64, | |||
fBridgeBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId()); | |||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
const File projFolder(kEngine->getCurrentProjectFolder()); | |||
if (projFolder.isNotNull()) | |||
@@ -370,7 +372,7 @@ protected: | |||
oldFolder.setAsCurrentWorkingDirectory(); | |||
} | |||
else | |||
#endif | |||
#endif | |||
{ | |||
started = fProcess->start(arguments, childType); | |||
} | |||
@@ -427,9 +429,9 @@ private: | |||
String fBridgeBinary; | |||
String fLabel; | |||
String fShmIds; | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
String fWinePrefix; | |||
#endif | |||
#endif | |||
CarlaScopedPointer<ChildProcess> fProcess; | |||
@@ -460,9 +462,9 @@ public: | |||
fShmRtClientControl(), | |||
fShmNonRtClientControl(), | |||
fShmNonRtServerControl(), | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
fWinePrefix(), | |||
#endif | |||
#endif | |||
fReceivingParamText(), | |||
fInfo(), | |||
fUniqueId(0), | |||
@@ -478,11 +480,11 @@ public: | |||
{ | |||
carla_debug("CarlaPluginBridge::~CarlaPluginBridge()"); | |||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
// close UI | |||
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) | |||
pData->transientTryCounter = 0; | |||
#endif | |||
#endif | |||
pData->singleMutex.lock(); | |||
pData->masterMutex.lock(); | |||
@@ -2754,7 +2756,7 @@ public: | |||
return false; | |||
} | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
// --------------------------------------------------------------- | |||
// set wine prefix | |||
@@ -2767,7 +2769,7 @@ public: | |||
if (fWinePrefix.isEmpty()) | |||
{ | |||
const char* const envWinePrefix(std::getenv("WINEPREFIX")); | |||
const char* const envWinePrefix = std::getenv("WINEPREFIX"); | |||
if (envWinePrefix != nullptr && envWinePrefix[0] != '\0') | |||
fWinePrefix = envWinePrefix; | |||
@@ -2777,7 +2779,7 @@ public: | |||
fWinePrefix = File::getSpecialLocation(File::userHomeDirectory).getFullPathName() + "/.wine"; | |||
} | |||
} | |||
#endif | |||
#endif | |||
// --------------------------------------------------------------- | |||
// init bridge thread | |||
@@ -2914,9 +2916,9 @@ private: | |||
BridgeNonRtClientControl fShmNonRtClientControl; | |||
BridgeNonRtServerControl fShmNonRtServerControl; | |||
#ifndef CARLA_OS_WIN | |||
#ifndef CARLA_OS_WIN | |||
String fWinePrefix; | |||
#endif | |||
#endif | |||
class ReceivingParamText { | |||
public: | |||
@@ -33,6 +33,23 @@ namespace CB = CARLA_BACKEND_NAMESPACE; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
#ifndef CARLA_OS_WIN | |||
static water::String findWinePrefix(const water::String filename, const int recursionLimit = 10) | |||
{ | |||
if (recursionLimit == 0 || filename.length() < 5 || ! filename.contains("/")) | |||
return ""; | |||
const water::String path(filename.upToLastOccurrenceOf("/", false, false)); | |||
if (water::File(path + "/dosdevices").isDirectory()) | |||
return path; | |||
return findWinePrefix(path, recursionLimit-1); | |||
} | |||
#endif | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
static const char* const gPluginsDiscoveryNullCharPtr = ""; | |||
_CarlaPluginDiscoveryMetadata::_CarlaPluginDiscoveryMetadata() noexcept | |||
@@ -61,6 +78,24 @@ _CarlaPluginDiscoveryInfo::_CarlaPluginDiscoveryInfo() noexcept | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
struct CarlaPluginDiscoveryOptions { | |||
#if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN) | |||
struct { | |||
bool autoPrefix; | |||
CarlaString executable; | |||
CarlaString fallbackPrefix; | |||
} wine; | |||
#endif | |||
static CarlaPluginDiscoveryOptions& getInstance() noexcept | |||
{ | |||
static CarlaPluginDiscoveryOptions instance; | |||
return instance; | |||
} | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
class CarlaPluginDiscovery : private CarlaPipeServer | |||
{ | |||
public: | |||
@@ -367,36 +402,59 @@ private: | |||
void start() | |||
{ | |||
using water::File; | |||
using water::String; | |||
fLastMessageTime = carla_gettime_ms(); | |||
fPluginsFoundInBinary = false; | |||
fNextSha1Sum.clear(); | |||
const char* helperTool; | |||
#ifndef CARLA_OS_WIN | |||
const CarlaPluginDiscoveryOptions& options(CarlaPluginDiscoveryOptions::getInstance()); | |||
String helperTool; | |||
switch (fBinaryType) | |||
{ | |||
#ifndef CARLA_OS_WIN | |||
case CB::BINARY_WIN32: | |||
helperTool = "wine"; | |||
if (options.wine.executable.isNotEmpty()) | |||
helperTool = options.wine.executable.buffer(); | |||
else | |||
helperTool = "wine"; | |||
break; | |||
case CB::BINARY_WIN64: | |||
helperTool = "wine64"; | |||
if (options.wine.executable.isNotEmpty()) | |||
{ | |||
helperTool = options.wine.executable.buffer(); | |||
if (helperTool[0] == CARLA_OS_SEP && File(helperTool + "64").existsAsFile()) | |||
helperTool += "64"; | |||
} | |||
else | |||
{ | |||
helperTool = "wine"; | |||
} | |||
break; | |||
#endif | |||
default: | |||
helperTool = nullptr; | |||
break; | |||
} | |||
#endif | |||
if (fBinaries.empty()) | |||
{ | |||
startPipeServer(helperTool, fDiscoveryTool, | |||
getPluginTypeAsString(fPluginType), | |||
":all"); | |||
#ifndef CARLA_OS_WIN | |||
if (helperTool.isNotEmpty()) | |||
startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all"); | |||
else | |||
#endif | |||
startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), ":all"); | |||
} | |||
else | |||
{ | |||
const water::File file(fBinaries[fBinaryIndex]); | |||
const water::String filename(file.getFullPathName()); | |||
const File file(fBinaries[fBinaryIndex]); | |||
const String filename(file.getFullPathName()); | |||
if (fCheckCacheCallback != nullptr) | |||
{ | |||
@@ -410,8 +468,36 @@ private: | |||
} | |||
} | |||
#ifndef CARLA_OS_WIN | |||
String winePrefix; | |||
if (options.wine.autoPrefix) | |||
winePrefix = findWinePrefix(filename); | |||
if (winePrefix.isEmpty()) | |||
{ | |||
const char* const envWinePrefix = std::getenv("WINEPREFIX"); | |||
if (envWinePrefix != nullptr && envWinePrefix[0] != '\0') | |||
winePrefix = envWinePrefix; | |||
else if (options.wine.fallbackPrefix != nullptr && options.wine.fallbackPrefix[0] != '\0') | |||
winePrefix = options.wine.fallbackPrefix.buffer(); | |||
else | |||
winePrefix = File::getSpecialLocation(File::userHomeDirectory).getFullPathName() + "/.wine"; | |||
} | |||
const CarlaScopedEnvVar sev1("WINEDEBUG", "-all"); | |||
const CarlaScopedEnvVar sev2("WINEPREFIX", winePrefix.toRawUTF8()); | |||
#endif | |||
carla_stdout("Scanning \"%s\"...", filename.toRawUTF8()); | |||
startPipeServer(helperTool, fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
#ifndef CARLA_OS_WIN | |||
if (helperTool.isNotEmpty()) | |||
startPipeServer(helperTool.toRawUTF8(), fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
else | |||
#endif | |||
startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
} | |||
} | |||
@@ -696,4 +782,31 @@ void carla_plugin_discovery_stop(const CarlaPluginDiscoveryHandle handle) | |||
delete static_cast<CarlaPluginDiscovery*>(handle); | |||
} | |||
void carla_plugin_discovery_set_option(const EngineOption option, const int value, const char* const valueStr) | |||
{ | |||
switch (option) | |||
{ | |||
#if !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) && !defined(CARLA_OS_WIN) | |||
case CB::ENGINE_OPTION_WINE_EXECUTABLE: | |||
if (valueStr != nullptr && valueStr[0] != '\0') | |||
CarlaPluginDiscoveryOptions::getInstance().wine.executable = valueStr; | |||
else | |||
CarlaPluginDiscoveryOptions::getInstance().wine.executable.clear(); | |||
break; | |||
case CB::ENGINE_OPTION_WINE_AUTO_PREFIX: | |||
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); | |||
CarlaPluginDiscoveryOptions::getInstance().wine.autoPrefix = value != 0; | |||
break; | |||
case CB::ENGINE_OPTION_WINE_FALLBACK_PREFIX: | |||
if (valueStr != nullptr && valueStr[0] != '\0') | |||
CarlaPluginDiscoveryOptions::getInstance().wine.fallbackPrefix = valueStr; | |||
else | |||
CarlaPluginDiscoveryOptions::getInstance().wine.fallbackPrefix.clear(); | |||
break; | |||
#endif | |||
default: | |||
break; | |||
} | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -20,6 +20,7 @@ | |||
#include "CarlaBackend.h" | |||
#ifdef __cplusplus | |||
using CARLA_BACKEND_NAMESPACE::PluginType; | |||
extern "C" { | |||
#endif | |||
@@ -31,6 +32,15 @@ typedef struct { | |||
const char* labelSetup; | |||
} JackAppDialogResults; | |||
typedef struct _HostSettings { | |||
bool showPluginBridges; | |||
bool showWineBridges; | |||
bool useSystemIcons; | |||
bool wineAutoPrefix; | |||
const char* wineExecutable; | |||
const char* wineFallbackPrefix; | |||
} HostSettings; | |||
typedef struct { | |||
uint build; | |||
uint type; | |||
@@ -55,20 +65,28 @@ struct PluginListDialog; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
CARLA_API void | |||
CARLA_PLUGIN_EXPORT void | |||
carla_frontend_createAndExecAboutJuceDialog(void* parent); | |||
CARLA_API const JackAppDialogResults* | |||
CARLA_PLUGIN_EXPORT const JackAppDialogResults* | |||
carla_frontend_createAndExecJackAppDialog(void* parent, const char* projectFilename); | |||
CARLA_API PluginListDialog* | |||
carla_frontend_createPluginListDialog(void* parent); | |||
CARLA_PLUGIN_EXPORT PluginListDialog* | |||
carla_frontend_createPluginListDialog(void* parent, const HostSettings* hostSettings); | |||
CARLA_PLUGIN_EXPORT void | |||
carla_frontend_destroyPluginListDialog(PluginListDialog* dialog); | |||
// TODO get favorites | |||
CARLA_PLUGIN_EXPORT void | |||
carla_frontend_setPluginListDialogPath(PluginListDialog* dialog, int ptype, const char* path); | |||
CARLA_API const PluginListDialogResults* | |||
CARLA_PLUGIN_EXPORT const PluginListDialogResults* | |||
carla_frontend_execPluginListDialog(PluginListDialog* dialog); | |||
CARLA_API const PluginListDialogResults* | |||
carla_frontend_createAndExecPluginListDialog(void* parent/*, const HostSettings& hostSettings*/); | |||
// CARLA_PLUGIN_EXPORT const PluginListDialogResults* | |||
// carla_frontend_createAndExecPluginListDialog(void* parent, const HostSettings* hostSettings); | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -23,7 +23,7 @@ | |||
# Imports (ctypes) | |||
from ctypes import ( | |||
c_bool, c_char, c_char_p, c_uint, c_uint64, c_void_p, cast, | |||
c_bool, c_char, c_char_p, c_int, c_uint, c_uint64, c_void_p, cast, | |||
cdll, Structure, | |||
POINTER | |||
) | |||
@@ -53,6 +53,16 @@ class JackApplicationDialogResults(Structure): | |||
("labelSetup", c_char_p) | |||
] | |||
class HostSettings(Structure): | |||
_fields_ = [ | |||
("showPluginBridges", c_bool), | |||
("showWineBridges", c_bool), | |||
("useSystemIcons", c_bool), | |||
("wineAutoPrefix", c_bool), | |||
("wineExecutable", c_char_p), | |||
("wineFallbackPrefix", c_char_p), | |||
] | |||
class PluginListDialogResults(Structure): | |||
_fields_ = [ | |||
("build", c_uint), | |||
@@ -87,15 +97,18 @@ class CarlaFrontendLib(): | |||
self.lib.carla_frontend_createAndExecJackAppDialog.argtypes = (c_void_p, c_char_p) | |||
self.lib.carla_frontend_createAndExecJackAppDialog.restype = POINTER(JackApplicationDialogResults) | |||
self.lib.carla_frontend_createPluginListDialog.argtypes = (c_void_p,) | |||
self.lib.carla_frontend_createPluginListDialog.argtypes = (c_void_p, POINTER(HostSettings)) | |||
self.lib.carla_frontend_createPluginListDialog.restype = c_void_p | |||
self.lib.carla_frontend_destroyPluginListDialog.argtypes = (c_void_p,) | |||
self.lib.carla_frontend_destroyPluginListDialog.restype = None | |||
self.lib.carla_frontend_setPluginListDialogPath.argtypes = (c_void_p, c_int, c_char_p) | |||
self.lib.carla_frontend_setPluginListDialogPath.restype = None | |||
self.lib.carla_frontend_execPluginListDialog.argtypes = (c_void_p,) | |||
self.lib.carla_frontend_execPluginListDialog.restype = POINTER(PluginListDialogResults) | |||
self.lib.carla_frontend_createAndExecPluginListDialog.argtypes = (c_void_p,) | |||
self.lib.carla_frontend_createAndExecPluginListDialog.restype = POINTER(PluginListDialogResults) | |||
# -------------------------------------------------------------------------------------------------------- | |||
def createAndExecAboutJuceDialog(self, parent): | |||
@@ -105,13 +118,23 @@ class CarlaFrontendLib(): | |||
return structToDictOrNull(self.lib.carla_frontend_createAndExecJackAppDialog(unwrapinstance(parent), | |||
projectFilename.encode("utf-8"))) | |||
def createPluginListDialog(self, parent, useSystemIcons): | |||
return self.lib.carla_frontend_createPluginListDialog(unwrapinstance(parent)) | |||
def createPluginListDialog(self, parent, hostSettings): | |||
hostSettingsC = HostSettings() | |||
hostSettingsC.showPluginBridges = hostSettings['showPluginBridges'] | |||
hostSettingsC.showWineBridges = hostSettings['showWineBridges'] | |||
hostSettingsC.useSystemIcons = hostSettings['useSystemIcons'] | |||
hostSettingsC.wineAutoPrefix = hostSettings['wineAutoPrefix'] | |||
hostSettingsC.wineExecutable = hostSettings['wineExecutable'].encode("utf-8") | |||
hostSettingsC.wineFallbackPrefix = hostSettings['wineFallbackPrefix'].encode("utf-8") | |||
return self.lib.carla_frontend_createPluginListDialog(unwrapinstance(parent), hostSettingsC) | |||
def destroyPluginListDialog(self, dialog): | |||
self.lib.carla_frontend_destroyPluginListDialog(dialog) | |||
def setPluginListDialogPath(self, dialog, ptype, path): | |||
self.lib.carla_frontend_setPluginListDialogPath(dialog, ptype, path.encode("utf-8")) | |||
def execPluginListDialog(self, dialog): | |||
return structToDictOrNull(self.lib.carla_frontend_execPluginListDialog(dialog)) | |||
def createAndExecPluginListDialog(self, parent, useSystemIcons): | |||
return structToDictOrNull(self.lib.carla_frontend_createAndExecPluginListDialog(unwrapinstance(parent))) | |||
# ------------------------------------------------------------------------------------------------------------ |
@@ -931,10 +931,11 @@ class HostWindow(QMainWindow): | |||
@pyqtSlot() | |||
def slot_engineStart(self): | |||
audioDriver = setEngineSettings(self.host) | |||
firstInit = self.fFirstEngineInit | |||
audioDriver = setEngineSettings(self.host, self.fSavedSettings) | |||
firstInit = self.fFirstEngineInit | |||
self.fFirstEngineInit = False | |||
self.ui.text_logs.appendPlainText("======= Starting engine =======") | |||
if self.host.engine_init(audioDriver, self.fClientName): | |||
@@ -953,9 +954,11 @@ class HostWindow(QMainWindow): | |||
audioError = self.host.get_last_error() | |||
if audioError: | |||
QMessageBox.critical(self, self.tr("Error"), self.tr("Could not connect to Audio backend '%s', possible reasons:\n%s" % (audioDriver, audioError))) | |||
QMessageBox.critical(self, self.tr("Error"), | |||
self.tr("Could not connect to Audio backend '%s', possible reasons:\n%s" % (audioDriver, audioError))) | |||
else: | |||
QMessageBox.critical(self, self.tr("Error"), self.tr("Could not connect to Audio backend '%s'" % audioDriver)) | |||
QMessageBox.critical(self, self.tr("Error"), | |||
self.tr("Could not connect to Audio backend '%s'" % audioDriver)) | |||
@pyqtSlot() | |||
def slot_engineStop(self, forced = False): | |||
@@ -1209,10 +1212,27 @@ class HostWindow(QMainWindow): | |||
def showAddPluginDialog(self): | |||
# TODO self.fHasLoadedLv2Plugins | |||
if self.fPluginListDialog is None: | |||
self.fPluginListDialog = gCarla.felib.createPluginListDialog(self.fParentOrSelf, | |||
self.fSavedSettings[CARLA_KEY_MAIN_SYSTEM_ICONS]) | |||
hostSettings = { | |||
'showPluginBridges': self.fSavedSettings[CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES], | |||
'showWineBridges': self.fSavedSettings[CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES], | |||
'useSystemIcons': self.fSavedSettings[CARLA_KEY_MAIN_SYSTEM_ICONS], | |||
'wineAutoPrefix': self.fSavedSettings[CARLA_KEY_WINE_AUTO_PREFIX], | |||
'wineExecutable': self.fSavedSettings[CARLA_KEY_WINE_EXECUTABLE], | |||
'wineFallbackPrefix': self.fSavedSettings[CARLA_KEY_WINE_FALLBACK_PREFIX], | |||
} | |||
self.fPluginListDialog = d = gCarla.felib.createPluginListDialog(self.fParentOrSelf, hostSettings) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_LADSPA, self.fSavedSettings[CARLA_KEY_PATHS_LADSPA]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_DSSI, self.fSavedSettings[CARLA_KEY_PATHS_DSSI]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_LV2, self.fSavedSettings[CARLA_KEY_PATHS_LV2]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_VST2, self.fSavedSettings[CARLA_KEY_PATHS_VST2]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_VST3, self.fSavedSettings[CARLA_KEY_PATHS_VST3]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_SF2, self.fSavedSettings[CARLA_KEY_PATHS_SF2]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_SFZ, self.fSavedSettings[CARLA_KEY_PATHS_SFZ]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_JSFX, self.fSavedSettings[CARLA_KEY_PATHS_JSFX]) | |||
gCarla.felib.setPluginListDialogPath(d, PLUGIN_CLAP, self.fSavedSettings[CARLA_KEY_PATHS_CLAP]) | |||
ret = gCarla.felib.execPluginListDialog(self.fPluginListDialog) | |||
print(ret) | |||
# TODO | |||
#if dialog.fFavoritePluginsChanged: | |||
@@ -1940,6 +1960,10 @@ class HostWindow(QMainWindow): | |||
def loadSettings(self, firstTime): | |||
settings = QSafeSettings() | |||
if self.fPluginListDialog is not None: | |||
gCarla.felib.destroyPluginListDialog(self.fPluginListDialog) | |||
self.fPluginListDialog = None | |||
if firstTime: | |||
geometry = settings.value("Geometry", QByteArray(), QByteArray) | |||
if not geometry.isNull(): | |||
@@ -1990,6 +2014,13 @@ class HostWindow(QMainWindow): | |||
# TODO - complete this | |||
oldSettings = self.fSavedSettings | |||
if self.host.audioDriverForced is not None: | |||
audioDriver = self.host.audioDriverForced | |||
else: | |||
audioDriver = settings.value(CARLA_KEY_ENGINE_AUDIO_DRIVER, CARLA_DEFAULT_AUDIO_DRIVER, str) | |||
audioDriverPrefix = CARLA_KEY_ENGINE_DRIVER_PREFIX + audioDriver | |||
self.fSavedSettings = { | |||
CARLA_KEY_MAIN_PROJECT_FOLDER: settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, str), | |||
CARLA_KEY_MAIN_CONFIRM_EXIT: settings.value(CARLA_KEY_MAIN_CONFIRM_EXIT, CARLA_DEFAULT_MAIN_CONFIRM_EXIT, bool), | |||
@@ -2010,6 +2041,51 @@ class HostWindow(QMainWindow): | |||
CARLA_KEY_CANVAS_FULL_REPAINTS: settings.value(CARLA_KEY_CANVAS_FULL_REPAINTS, CARLA_DEFAULT_CANVAS_FULL_REPAINTS, bool), | |||
CARLA_KEY_CUSTOM_PAINTING: (settings.value(CARLA_KEY_MAIN_USE_PRO_THEME, True, bool) and | |||
settings.value(CARLA_KEY_MAIN_PRO_THEME_COLOR, "Black", str).lower() == "black"), | |||
# engine | |||
CARLA_KEY_ENGINE_AUDIO_DRIVER: audioDriver, | |||
CARLA_KEY_ENGINE_AUDIO_DEVICE: settings.value(audioDriverPrefix+"/Device", "", str), | |||
CARLA_KEY_ENGINE_BUFFER_SIZE: settings.value(audioDriverPrefix+"/BufferSize", CARLA_DEFAULT_AUDIO_BUFFER_SIZE, int), | |||
CARLA_KEY_ENGINE_SAMPLE_RATE: settings.value(audioDriverPrefix+"/SampleRate", CARLA_DEFAULT_AUDIO_SAMPLE_RATE, int), | |||
CARLA_KEY_ENGINE_TRIPLE_BUFFER: settings.value(audioDriverPrefix+"/TripleBuffer", CARLA_DEFAULT_AUDIO_TRIPLE_BUFFER, bool), | |||
# file paths | |||
CARLA_KEY_PATHS_AUDIO: splitter.join(settings.value(CARLA_KEY_PATHS_AUDIO, CARLA_DEFAULT_FILE_PATH_AUDIO, list)), | |||
CARLA_KEY_PATHS_MIDI: splitter.join(settings.value(CARLA_KEY_PATHS_MIDI, CARLA_DEFAULT_FILE_PATH_MIDI, list)), | |||
# plugin paths | |||
CARLA_KEY_PATHS_LADSPA: splitter.join(settings.value(CARLA_KEY_PATHS_LADSPA, CARLA_DEFAULT_LADSPA_PATH, list)), | |||
CARLA_KEY_PATHS_DSSI: splitter.join(settings.value(CARLA_KEY_PATHS_DSSI, CARLA_DEFAULT_DSSI_PATH, list)), | |||
CARLA_KEY_PATHS_LV2: splitter.join(settings.value(CARLA_KEY_PATHS_LV2, CARLA_DEFAULT_LV2_PATH, list)), | |||
CARLA_KEY_PATHS_VST2: splitter.join(settings.value(CARLA_KEY_PATHS_VST2, CARLA_DEFAULT_VST2_PATH, list)), | |||
CARLA_KEY_PATHS_VST3: splitter.join(settings.value(CARLA_KEY_PATHS_VST3, CARLA_DEFAULT_VST3_PATH, list)), | |||
CARLA_KEY_PATHS_SF2: splitter.join(settings.value(CARLA_KEY_PATHS_SF2, CARLA_DEFAULT_SF2_PATH, list)), | |||
CARLA_KEY_PATHS_SFZ: splitter.join(settings.value(CARLA_KEY_PATHS_SFZ, CARLA_DEFAULT_SFZ_PATH, list)), | |||
CARLA_KEY_PATHS_JSFX: splitter.join(settings.value(CARLA_KEY_PATHS_JSFX, CARLA_DEFAULT_JSFX_PATH, list)), | |||
CARLA_KEY_PATHS_CLAP: splitter.join(settings.value(CARLA_KEY_PATHS_CLAP, CARLA_DEFAULT_CLAP_PATH, list)), | |||
# osc | |||
CARLA_KEY_OSC_ENABLED: settings.value(CARLA_KEY_OSC_ENABLED, CARLA_DEFAULT_OSC_ENABLED, bool), | |||
CARLA_KEY_OSC_TCP_PORT_ENABLED: settings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED, CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, bool), | |||
CARLA_KEY_OSC_TCP_PORT_RANDOM: settings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, bool), | |||
CARLA_KEY_OSC_TCP_PORT_NUMBER: settings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER, CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, int), | |||
CARLA_KEY_OSC_UDP_PORT_ENABLED: settings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED, CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, bool), | |||
CARLA_KEY_OSC_UDP_PORT_RANDOM: settings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, bool), | |||
CARLA_KEY_OSC_UDP_PORT_NUMBER: settings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER, CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, int), | |||
# wine | |||
CARLA_KEY_WINE_EXECUTABLE: settings.value(CARLA_KEY_WINE_EXECUTABLE, CARLA_DEFAULT_WINE_EXECUTABLE, str), | |||
CARLA_KEY_WINE_AUTO_PREFIX: settings.value(CARLA_KEY_WINE_AUTO_PREFIX, CARLA_DEFAULT_WINE_AUTO_PREFIX, bool), | |||
CARLA_KEY_WINE_FALLBACK_PREFIX: settings.value(CARLA_KEY_WINE_FALLBACK_PREFIX, CARLA_DEFAULT_WINE_FALLBACK_PREFIX, str), | |||
CARLA_KEY_WINE_RT_PRIO_ENABLED: settings.value(CARLA_KEY_WINE_RT_PRIO_ENABLED, CARLA_DEFAULT_WINE_RT_PRIO_ENABLED, bool), | |||
CARLA_KEY_WINE_BASE_RT_PRIO: settings.value(CARLA_KEY_WINE_BASE_RT_PRIO, CARLA_DEFAULT_WINE_BASE_RT_PRIO, int), | |||
CARLA_KEY_WINE_SERVER_RT_PRIO: settings.value(CARLA_KEY_WINE_SERVER_RT_PRIO, CARLA_DEFAULT_WINE_SERVER_RT_PRIO, int), | |||
# experimental switches | |||
CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES: | |||
settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, bool), | |||
CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES: | |||
settings.value(CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES, CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES, bool), | |||
} | |||
if not self.host.isControl: | |||
@@ -2027,7 +2103,7 @@ class HostWindow(QMainWindow): | |||
self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY] else 0 | |||
setEngineSettings(self.host) | |||
setEngineSettings(self.host, self.fSavedSettings) | |||
self.restartTimersIfNeeded() | |||
if oldSettings.get(CARLA_KEY_MAIN_CLASSIC_SKIN, None) not in (self.fSavedSettings[CARLA_KEY_MAIN_CLASSIC_SKIN], None): | |||
@@ -3386,67 +3462,104 @@ def setHostSettings(host): | |||
if not (NSM_URL and host.nsmOK): | |||
host.set_engine_option(ENGINE_OPTION_CLIENT_NAME_PREFIX, 0, gCarla.cnprefix) | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Set Engine settings according to carla preferences. Returns selected audio driver. | |||
def setEngineSettings(host, oscPort = None): | |||
def setEngineSettings(host, settings, oscPort = None): | |||
# kdevelop likes this :) | |||
if False: host = CarlaHostNull() | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# do nothing if control | |||
if host.isControl: | |||
return "Control" | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# fetch settings as needed | |||
settings = QSafeSettings("falkTX", "Carla2") | |||
if settings is None: | |||
qsettings = QSafeSettings("falkTX", "Carla2") | |||
# -------------------------------------------------------------------------------------------------------- | |||
if host.audioDriverForced is not None: | |||
audioDriver = host.audioDriverForced | |||
else: | |||
audioDriver = qsettings.value(CARLA_KEY_ENGINE_AUDIO_DRIVER, CARLA_DEFAULT_AUDIO_DRIVER, str) | |||
audioDriverPrefix = CARLA_KEY_ENGINE_DRIVER_PREFIX + audioDriver | |||
settings = { | |||
# engine | |||
CARLA_KEY_ENGINE_AUDIO_DRIVER: audioDriver, | |||
CARLA_KEY_ENGINE_AUDIO_DEVICE: qsettings.value(audioDriverPrefix+"/Device", "", str), | |||
CARLA_KEY_ENGINE_BUFFER_SIZE: qsettings.value(audioDriverPrefix+"/BufferSize", CARLA_DEFAULT_AUDIO_BUFFER_SIZE, int), | |||
CARLA_KEY_ENGINE_SAMPLE_RATE: qsettings.value(audioDriverPrefix+"/SampleRate", CARLA_DEFAULT_AUDIO_SAMPLE_RATE, int), | |||
CARLA_KEY_ENGINE_TRIPLE_BUFFER: qsettings.value(audioDriverPrefix+"/TripleBuffer", CARLA_DEFAULT_AUDIO_TRIPLE_BUFFER, bool), | |||
# file paths | |||
CARLA_KEY_PATHS_AUDIO: splitter.join(qsettings.value(CARLA_KEY_PATHS_AUDIO, CARLA_DEFAULT_FILE_PATH_AUDIO, list)), | |||
CARLA_KEY_PATHS_MIDI: splitter.join(qsettings.value(CARLA_KEY_PATHS_MIDI, CARLA_DEFAULT_FILE_PATH_MIDI, list)), | |||
# plugin paths | |||
CARLA_KEY_PATHS_LADSPA: splitter.join(qsettings.value(CARLA_KEY_PATHS_LADSPA, CARLA_DEFAULT_LADSPA_PATH, list)), | |||
CARLA_KEY_PATHS_DSSI: splitter.join(qsettings.value(CARLA_KEY_PATHS_DSSI, CARLA_DEFAULT_DSSI_PATH, list)), | |||
CARLA_KEY_PATHS_LV2: splitter.join(qsettings.value(CARLA_KEY_PATHS_LV2, CARLA_DEFAULT_LV2_PATH, list)), | |||
CARLA_KEY_PATHS_VST2: splitter.join(qsettings.value(CARLA_KEY_PATHS_VST2, CARLA_DEFAULT_VST2_PATH, list)), | |||
CARLA_KEY_PATHS_VST3: splitter.join(qsettings.value(CARLA_KEY_PATHS_VST3, CARLA_DEFAULT_VST3_PATH, list)), | |||
CARLA_KEY_PATHS_SF2: splitter.join(qsettings.value(CARLA_KEY_PATHS_SF2, CARLA_DEFAULT_SF2_PATH, list)), | |||
CARLA_KEY_PATHS_SFZ: splitter.join(qsettings.value(CARLA_KEY_PATHS_SFZ, CARLA_DEFAULT_SFZ_PATH, list)), | |||
CARLA_KEY_PATHS_JSFX: splitter.join(qsettings.value(CARLA_KEY_PATHS_JSFX, CARLA_DEFAULT_JSFX_PATH, list)), | |||
CARLA_KEY_PATHS_CLAP: splitter.join(qsettings.value(CARLA_KEY_PATHS_CLAP, CARLA_DEFAULT_CLAP_PATH, list)), | |||
# osc | |||
CARLA_KEY_OSC_ENABLED: qsettings.value(CARLA_KEY_OSC_ENABLED, CARLA_DEFAULT_OSC_ENABLED, bool), | |||
CARLA_KEY_OSC_TCP_PORT_ENABLED: qsettings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED, CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, bool), | |||
CARLA_KEY_OSC_TCP_PORT_RANDOM: qsettings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, bool), | |||
CARLA_KEY_OSC_TCP_PORT_NUMBER: qsettings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER, CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, int), | |||
CARLA_KEY_OSC_UDP_PORT_ENABLED: qsettings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED, CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, bool), | |||
CARLA_KEY_OSC_UDP_PORT_RANDOM: qsettings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, bool), | |||
CARLA_KEY_OSC_UDP_PORT_NUMBER: qsettings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER, CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, int), | |||
# wine | |||
CARLA_KEY_WINE_EXECUTABLE: qsettings.value(CARLA_KEY_WINE_EXECUTABLE, CARLA_DEFAULT_WINE_EXECUTABLE, str), | |||
CARLA_KEY_WINE_AUTO_PREFIX: qsettings.value(CARLA_KEY_WINE_AUTO_PREFIX, CARLA_DEFAULT_WINE_AUTO_PREFIX, bool), | |||
CARLA_KEY_WINE_FALLBACK_PREFIX: qsettings.value(CARLA_KEY_WINE_FALLBACK_PREFIX, CARLA_DEFAULT_WINE_FALLBACK_PREFIX, str), | |||
CARLA_KEY_WINE_RT_PRIO_ENABLED: qsettings.value(CARLA_KEY_WINE_RT_PRIO_ENABLED, CARLA_DEFAULT_WINE_RT_PRIO_ENABLED, bool), | |||
CARLA_KEY_WINE_BASE_RT_PRIO: qsettings.value(CARLA_KEY_WINE_BASE_RT_PRIO, CARLA_DEFAULT_WINE_BASE_RT_PRIO, int), | |||
CARLA_KEY_WINE_SERVER_RT_PRIO: qsettings.value(CARLA_KEY_WINE_SERVER_RT_PRIO, CARLA_DEFAULT_WINE_SERVER_RT_PRIO, int), | |||
} | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# main settings | |||
setHostSettings(host) | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# file paths | |||
FILE_PATH_AUDIO = settings.value(CARLA_KEY_PATHS_AUDIO, CARLA_DEFAULT_FILE_PATH_AUDIO, list) | |||
FILE_PATH_MIDI = settings.value(CARLA_KEY_PATHS_MIDI, CARLA_DEFAULT_FILE_PATH_MIDI, list) | |||
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_AUDIO, settings[CARLA_KEY_PATHS_AUDIO]) | |||
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_MIDI, settings[CARLA_KEY_PATHS_MIDI]) | |||
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_AUDIO, splitter.join(FILE_PATH_AUDIO)) | |||
host.set_engine_option(ENGINE_OPTION_FILE_PATH, FILE_MIDI, splitter.join(FILE_PATH_MIDI)) | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# plugin paths | |||
LADSPA_PATH = settings.value(CARLA_KEY_PATHS_LADSPA, CARLA_DEFAULT_LADSPA_PATH, list) | |||
DSSI_PATH = settings.value(CARLA_KEY_PATHS_DSSI, CARLA_DEFAULT_DSSI_PATH, list) | |||
LV2_PATH = settings.value(CARLA_KEY_PATHS_LV2, CARLA_DEFAULT_LV2_PATH, list) | |||
VST2_PATH = settings.value(CARLA_KEY_PATHS_VST2, CARLA_DEFAULT_VST2_PATH, list) | |||
VST3_PATH = settings.value(CARLA_KEY_PATHS_VST3, CARLA_DEFAULT_VST3_PATH, list) | |||
SF2_PATH = settings.value(CARLA_KEY_PATHS_SF2, CARLA_DEFAULT_SF2_PATH, list) | |||
SFZ_PATH = settings.value(CARLA_KEY_PATHS_SFZ, CARLA_DEFAULT_SFZ_PATH, list) | |||
JSFX_PATH = settings.value(CARLA_KEY_PATHS_JSFX, CARLA_DEFAULT_JSFX_PATH, list) | |||
CLAP_PATH = settings.value(CARLA_KEY_PATHS_CLAP, CARLA_DEFAULT_CLAP_PATH, list) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, splitter.join(LADSPA_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, splitter.join(DSSI_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, splitter.join(LV2_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST2, splitter.join(VST2_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST3, splitter.join(VST3_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, splitter.join(SF2_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, splitter.join(SFZ_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_JSFX, splitter.join(JSFX_PATH)) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_CLAP, splitter.join(CLAP_PATH)) | |||
# -------------------------------------------------------------------------------------------------------- | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, settings[CARLA_KEY_PATHS_LADSPA]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, settings[CARLA_KEY_PATHS_DSSI]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, settings[CARLA_KEY_PATHS_LV2]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST2, settings[CARLA_KEY_PATHS_VST2]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST3, settings[CARLA_KEY_PATHS_VST3]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, settings[CARLA_KEY_PATHS_SF2]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, settings[CARLA_KEY_PATHS_SFZ]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_JSFX, settings[CARLA_KEY_PATHS_JSFX]) | |||
host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_CLAP, settings[CARLA_KEY_PATHS_CLAP]) | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# don't continue if plugin | |||
if host.isPlugin: | |||
return "Plugin" | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# osc settings | |||
if oscPort is not None and isinstance(oscPort, int): | |||
@@ -3454,84 +3567,65 @@ def setEngineSettings(host, oscPort = None): | |||
portNumTCP = portNumUDP = oscPort | |||
else: | |||
oscEnabled = settings.value(CARLA_KEY_OSC_ENABLED, CARLA_DEFAULT_OSC_ENABLED, bool) | |||
oscEnabled = settings[CARLA_KEY_OSC_ENABLED] | |||
if not settings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED, CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, bool): | |||
if not settings[CARLA_KEY_OSC_TCP_PORT_ENABLED]: | |||
portNumTCP = -1 | |||
elif settings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, bool): | |||
elif settings[CARLA_KEY_OSC_TCP_PORT_RANDOM]: | |||
portNumTCP = 0 | |||
else: | |||
portNumTCP = settings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER, CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, int) | |||
portNumTCP = settings[CARLA_KEY_OSC_TCP_PORT_NUMBER] | |||
if not settings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED, CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, bool): | |||
if not settings[CARLA_KEY_OSC_UDP_PORT_ENABLED]: | |||
portNumUDP = -1 | |||
elif settings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, bool): | |||
elif settings[CARLA_KEY_OSC_UDP_PORT_RANDOM]: | |||
portNumUDP = 0 | |||
else: | |||
portNumUDP = settings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER, CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, int) | |||
portNumUDP = settings[CARLA_KEY_OSC_UDP_PORT_NUMBER] | |||
host.set_engine_option(ENGINE_OPTION_OSC_ENABLED, 1 if oscEnabled else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_OSC_PORT_TCP, portNumTCP, "") | |||
host.set_engine_option(ENGINE_OPTION_OSC_PORT_UDP, portNumUDP, "") | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# wine settings | |||
optWineExecutable = settings.value(CARLA_KEY_WINE_EXECUTABLE, CARLA_DEFAULT_WINE_EXECUTABLE, str) | |||
optWineAutoPrefix = settings.value(CARLA_KEY_WINE_AUTO_PREFIX, CARLA_DEFAULT_WINE_AUTO_PREFIX, bool) | |||
optWineFallbackPrefix = settings.value(CARLA_KEY_WINE_FALLBACK_PREFIX, CARLA_DEFAULT_WINE_FALLBACK_PREFIX, str) | |||
optWineRtPrioEnabled = settings.value(CARLA_KEY_WINE_RT_PRIO_ENABLED, CARLA_DEFAULT_WINE_RT_PRIO_ENABLED, bool) | |||
optWineBaseRtPrio = settings.value(CARLA_KEY_WINE_BASE_RT_PRIO, CARLA_DEFAULT_WINE_BASE_RT_PRIO, int) | |||
optWineServerRtPrio = settings.value(CARLA_KEY_WINE_SERVER_RT_PRIO, CARLA_DEFAULT_WINE_SERVER_RT_PRIO, int) | |||
host.set_engine_option(ENGINE_OPTION_WINE_EXECUTABLE, 0, settings[CARLA_KEY_WINE_EXECUTABLE]) | |||
host.set_engine_option(ENGINE_OPTION_WINE_AUTO_PREFIX, 1 if settings[CARLA_KEY_WINE_AUTO_PREFIX] else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_FALLBACK_PREFIX, 0, os.path.expanduser(settings[CARLA_KEY_WINE_FALLBACK_PREFIX])) | |||
host.set_engine_option(ENGINE_OPTION_WINE_RT_PRIO_ENABLED, 1 if settings[CARLA_KEY_WINE_RT_PRIO_ENABLED] else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_BASE_RT_PRIO, settings[CARLA_KEY_WINE_BASE_RT_PRIO], "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_SERVER_RT_PRIO, settings[CARLA_KEY_WINE_SERVER_RT_PRIO], "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_EXECUTABLE, 0, optWineExecutable) | |||
host.set_engine_option(ENGINE_OPTION_WINE_AUTO_PREFIX, 1 if optWineAutoPrefix else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_FALLBACK_PREFIX, 0, os.path.expanduser(optWineFallbackPrefix)) | |||
host.set_engine_option(ENGINE_OPTION_WINE_RT_PRIO_ENABLED, 1 if optWineRtPrioEnabled else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_BASE_RT_PRIO, optWineBaseRtPrio, "") | |||
host.set_engine_option(ENGINE_OPTION_WINE_SERVER_RT_PRIO, optWineServerRtPrio, "") | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# driver and device settings | |||
# driver name | |||
if host.audioDriverForced is not None: | |||
audioDriver = host.audioDriverForced | |||
else: | |||
try: | |||
audioDriver = settings.value(CARLA_KEY_ENGINE_AUDIO_DRIVER, CARLA_DEFAULT_AUDIO_DRIVER, str) | |||
except: | |||
audioDriver = CARLA_DEFAULT_AUDIO_DRIVER | |||
# driver options | |||
audioDevice = settings.value("%s%s/Device" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, audioDriver), "", str) | |||
audioBufferSize = settings.value("%s%s/BufferSize" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, audioDriver), CARLA_DEFAULT_AUDIO_BUFFER_SIZE, int) | |||
audioSampleRate = settings.value("%s%s/SampleRate" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, audioDriver), CARLA_DEFAULT_AUDIO_SAMPLE_RATE, int) | |||
audioTripleBuffer = settings.value("%s%s/TripleBuffer" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, audioDriver), CARLA_DEFAULT_AUDIO_TRIPLE_BUFFER, bool) | |||
audioDriver = settings[CARLA_KEY_ENGINE_AUDIO_DRIVER] | |||
# Only setup audio things if engine is not running | |||
if not host.is_engine_running(): | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_DRIVER, 0, audioDriver) | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_DEVICE, 0, audioDevice) | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_DEVICE, 0, settings[CARLA_KEY_ENGINE_AUDIO_DEVICE]) | |||
if not audioDriver.startswith("JACK"): | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, audioBufferSize, "") | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, audioSampleRate, "") | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_TRIPLE_BUFFER, 1 if audioTripleBuffer else 0, "") | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, settings[CARLA_KEY_ENGINE_BUFFER_SIZE], "") | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, settings[CARLA_KEY_ENGINE_SAMPLE_RATE], "") | |||
host.set_engine_option(ENGINE_OPTION_AUDIO_TRIPLE_BUFFER, 1 if settings[CARLA_KEY_ENGINE_TRIPLE_BUFFER] else 0, "") | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# fix things if needed | |||
if audioDriver != "JACK" and host.transportMode == ENGINE_TRANSPORT_MODE_JACK: | |||
host.transportMode = ENGINE_TRANSPORT_MODE_INTERNAL | |||
host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, ENGINE_TRANSPORT_MODE_INTERNAL, host.transportExtra) | |||
# -------------------------------------------------------------------------------------------------------- | |||
# ----------------------------------------------------------------------------------------------------------------- | |||
# return selected driver name | |||
return audioDriver | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Run Carla without showing UI | |||
def runHostWithoutUI(host): | |||
@@ -3564,7 +3658,7 @@ def runHostWithoutUI(host): | |||
# -------------------------------------------------------------------------------------------------------- | |||
# Init engine | |||
audioDriver = setEngineSettings(host, oscPort) | |||
audioDriver = setEngineSettings(host, None, oscPort) | |||
if not host.engine_init(audioDriver, "Carla"): | |||
print("Engine failed to initialize, possible reasons:\n%s" % host.get_last_error()) | |||
sys.exit(1) | |||
@@ -204,6 +204,10 @@ CARLA_KEY_CANVAS_FULL_REPAINTS = "Canvas/FullRepaints" # bool | |||
CARLA_KEY_ENGINE_DRIVER_PREFIX = "Engine/Driver-" | |||
CARLA_KEY_ENGINE_AUDIO_DRIVER = "Engine/AudioDriver" # str | |||
CARLA_KEY_ENGINE_AUDIO_DEVICE = "Engine/AudioDevice" # str | |||
CARLA_KEY_ENGINE_BUFFER_SIZE = "Engine/BufferSize" # int | |||
CARLA_KEY_ENGINE_SAMPLE_RATE = "Engine/SampleRate" # int | |||
CARLA_KEY_ENGINE_TRIPLE_BUFFER = "Engine/TripleBuffer" # bool | |||
CARLA_KEY_ENGINE_PROCESS_MODE = "Engine/ProcessMode" # enum | |||
CARLA_KEY_ENGINE_TRANSPORT_MODE = "Engine/TransportMode" # enum | |||
CARLA_KEY_ENGINE_TRANSPORT_EXTRA = "Engine/TransportExtra" # str | |||
@@ -33,7 +33,6 @@ | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaJuceUtils.hpp" | |||
#include "CarlaFrontend.h" | |||
#include "CarlaUtils.h" | |||
#include "CarlaString.hpp" | |||
@@ -42,22 +41,6 @@ | |||
CARLA_BACKEND_USE_NAMESPACE | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Carla Settings keys | |||
#define CARLA_KEY_PATHS_LADSPA "Paths/LADSPA" | |||
#define CARLA_KEY_PATHS_DSSI "Paths/DSSI" | |||
#define CARLA_KEY_PATHS_LV2 "Paths/LV2" | |||
#define CARLA_KEY_PATHS_VST2 "Paths/VST2" | |||
#define CARLA_KEY_PATHS_VST3 "Paths/VST3" | |||
#define CARLA_KEY_PATHS_CLAP "Paths/CLAP" | |||
#define CARLA_KEY_PATHS_SF2 "Paths/SF2" | |||
#define CARLA_KEY_PATHS_SFZ "Paths/SFZ" | |||
#define CARLA_KEY_PATHS_JSFX "Paths/JSFX" | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Carla Settings defaults | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// getenv with a fallback value if unset | |||
@@ -381,11 +364,11 @@ struct PluginPaths { | |||
static inline | |||
int fontMetricsHorizontalAdvance(const QFontMetrics& fontMetrics, const QString& string) | |||
{ | |||
#if QT_VERSION >= 0x50b00 | |||
#if QT_VERSION >= 0x50b00 | |||
return fontMetrics.horizontalAdvance(string); | |||
#else | |||
#else | |||
return fontMetrics.width(string); | |||
#endif | |||
#endif | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -692,6 +675,7 @@ struct PluginListDialog::PrivateData { | |||
carla_plugin_discovery_stop(handle); | |||
} | |||
#ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
bool nextTool() | |||
{ | |||
if (handle != nullptr) | |||
@@ -771,6 +755,7 @@ struct PluginListDialog::PrivateData { | |||
tool += ".exe"; | |||
#endif | |||
} | |||
#endif // CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
} discovery; | |||
PluginPaths paths; | |||
@@ -825,13 +810,20 @@ struct PluginListDialog::PrivateData { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Plugin List Dialog | |||
PluginListDialog::PluginListDialog(QWidget* const parent, const HostSettings& hostSettings) | |||
PluginListDialog::PluginListDialog(QWidget* const parent, const HostSettings* const hostSettings) | |||
: QDialog(parent), | |||
p(new PrivateData) | |||
{ | |||
ui.setupUi(this); | |||
// p->hostSettings = hostSettings; | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// Set-up global discovery options | |||
#ifndef CARLA_OS_WIN | |||
carla_plugin_discovery_set_option(ENGINE_OPTION_WINE_AUTO_PREFIX, hostSettings->wineAutoPrefix, nullptr); | |||
carla_plugin_discovery_set_option(ENGINE_OPTION_WINE_EXECUTABLE, 0, hostSettings->wineExecutable); | |||
carla_plugin_discovery_set_option(ENGINE_OPTION_WINE_FALLBACK_PREFIX, 0, hostSettings->wineFallbackPrefix); | |||
#endif | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// Set-up GUI | |||
@@ -917,7 +909,7 @@ PluginListDialog::PluginListDialog(QWidget* const parent, const HostSettings& ho | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// Set-up Icons | |||
if (hostSettings.useSystemIcons) | |||
if (hostSettings->useSystemIcons) | |||
{ | |||
#if 0 | |||
ui.b_add.setIcon(getIcon('list-add', 16, 'svgz')) | |||
@@ -1090,6 +1082,44 @@ bool PluginListDialog::checkPluginCache(const char* const filename, const char* | |||
return true; | |||
} | |||
void PluginListDialog::setPluginPath(const PluginType ptype, const char* const path) | |||
{ | |||
switch (ptype) | |||
{ | |||
case PLUGIN_LV2: | |||
p->paths.lv2 = path; | |||
break; | |||
case PLUGIN_VST2: | |||
p->paths.vst2 = path; | |||
break; | |||
case PLUGIN_VST3: | |||
p->paths.vst3 = path; | |||
break; | |||
case PLUGIN_CLAP: | |||
p->paths.clap = path; | |||
break; | |||
#ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
case PLUGIN_LADSPA: | |||
p->paths.ladspa = path; | |||
break; | |||
case PLUGIN_DSSI: | |||
p->paths.dssi = path; | |||
break; | |||
case PLUGIN_SF2: | |||
p->paths.sf2 = path; | |||
break; | |||
case PLUGIN_SFZ: | |||
p->paths.sfz = path; | |||
break; | |||
case PLUGIN_JSFX: | |||
p->paths.jsfx = path; | |||
break; | |||
#endif | |||
default: | |||
break; | |||
} | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// protected methods | |||
@@ -1239,7 +1269,9 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
#endif | |||
default: | |||
// discovery complete | |||
#ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
if (! p->discovery.nextTool()) | |||
#endif | |||
refreshPluginsStop(); | |||
} | |||
@@ -1489,7 +1521,7 @@ void PluginListDialog::loadSettings() | |||
#endif | |||
} | |||
// ----------------------------------------------------------------------------------------------------------------- | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// private slots | |||
void PluginListDialog::cellClicked(const int row, const int column) | |||
@@ -1994,12 +2026,24 @@ void PluginListDialog::saveSettings() | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
PluginListDialog* | |||
carla_frontend_createPluginListDialog(void* const parent) | |||
carla_frontend_createPluginListDialog(void* const parent, const HostSettings* const hostSettings) | |||
{ | |||
const HostSettings hostSettings = {}; | |||
return new PluginListDialog(reinterpret_cast<QWidget*>(parent), hostSettings); | |||
} | |||
void | |||
carla_frontend_destroyPluginListDialog(PluginListDialog* const dialog) | |||
{ | |||
dialog->close(); | |||
delete dialog; | |||
} | |||
void | |||
carla_frontend_setPluginListDialogPath(PluginListDialog* const dialog, const int ptype, const char* const path) | |||
{ | |||
dialog->setPluginPath(static_cast<PluginType>(ptype), path); | |||
} | |||
const PluginListDialogResults* | |||
carla_frontend_execPluginListDialog(PluginListDialog* const dialog) | |||
{ | |||
@@ -2046,13 +2090,12 @@ carla_frontend_execPluginListDialog(PluginListDialog* const dialog) | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
const PluginListDialogResults* | |||
carla_frontend_createAndExecPluginListDialog(void* const parent/*, const HostSettings& hostSettings*/) | |||
{ | |||
const HostSettings hostSettings = {}; | |||
PluginListDialog gui(reinterpret_cast<QWidget*>(parent), hostSettings); | |||
return carla_frontend_execPluginListDialog(&gui); | |||
} | |||
// const PluginListDialogResults* | |||
// carla_frontend_createAndExecPluginListDialog(void* const parent, const HostSettings* const hostSettings) | |||
// { | |||
// PluginListDialog gui(reinterpret_cast<QWidget*>(parent), hostSettings); | |||
// | |||
// return carla_frontend_execPluginListDialog(&gui); | |||
// } | |||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -6,6 +6,8 @@ | |||
#pragma once | |||
#include "CarlaFrontend.h" | |||
#ifdef __clang__ | |||
# pragma clang diagnostic push | |||
# pragma clang diagnostic ignored "-Wdeprecated-copy-with-user-provided-copy" | |||
@@ -26,14 +28,9 @@ | |||
#include "ui_pluginlistdialog.h" | |||
struct HostSettings { | |||
bool showPluginBridges; | |||
bool showWineBridges; | |||
bool useSystemIcons; | |||
}; | |||
class QSafeSettings; | |||
typedef struct _CarlaPluginDiscoveryInfo CarlaPluginDiscoveryInfo; | |||
typedef struct _HostSettings HostSettings; | |||
struct PluginInfo; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -63,12 +60,13 @@ class PluginListDialog : public QDialog | |||
// public methods | |||
public: | |||
explicit PluginListDialog(QWidget* parent, const HostSettings& hostSettings); | |||
explicit PluginListDialog(QWidget* parent, const HostSettings* hostSettings); | |||
~PluginListDialog() override; | |||
const PluginInfo& getSelectedPluginInfo() const; | |||
void addPluginInfo(const CarlaPluginDiscoveryInfo* info, const char* sha1sum); | |||
bool checkPluginCache(const char* filename, const char* sha1sum); | |||
void setPluginPath(PluginType ptype, const char* path); | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// protected methods | |||