Browse Source

Continue full recheck

tags/1.9.4
falkTX 11 years ago
parent
commit
087c2258c5
19 changed files with 994 additions and 748 deletions
  1. +226
    -226
      source/backend/CarlaBackend.hpp
  2. +11
    -10
      source/backend/CarlaEngine.hpp
  3. +20
    -12
      source/backend/CarlaHost.hpp
  4. +133
    -87
      source/backend/engine/CarlaEngine.cpp
  5. +4
    -3
      source/backend/engine/CarlaEngineInternal.hpp
  6. +83
    -55
      source/backend/engine/CarlaEngineJack.cpp
  7. +4
    -0
      source/backend/engine/CarlaEngineJuce.cpp
  8. +2
    -2
      source/backend/engine/CarlaEngineOsc.cpp
  9. +92
    -48
      source/backend/engine/CarlaEngineRtAudio.cpp
  10. +3
    -5
      source/backend/engine/CarlaEngineThread.cpp
  11. +3
    -4
      source/backend/engine/CarlaEngineThread.hpp
  12. +3
    -1
      source/backend/engine/Makefile
  13. +130
    -92
      source/backend/standalone/CarlaStandalone.cpp
  14. +12
    -12
      source/backend/standalone/Makefile
  15. +188
    -184
      source/utils/CarlaBackendUtils.hpp
  16. +5
    -1
      source/utils/CarlaStateUtils.hpp
  17. +2
    -1
      source/utils/CarlaString.hpp
  18. +3
    -4
      source/utils/CarlaThread.hpp
  19. +70
    -1
      source/utils/CarlaUtils.hpp

+ 226
- 226
source/backend/CarlaBackend.hpp View File

@@ -215,7 +215,7 @@ enum ParameterType SIZE_INT {
* Internal parameter indexes.\n * Internal parameter indexes.\n
* These are special parameters used internally, plugins do not know about their existence. * These are special parameters used internally, plugins do not know about their existence.
*/ */
enum InternalParametersIndex SIZE_INT {
enum InternalParameterIndex SIZE_INT {
PARAMETER_NULL = -1, //!< Null parameter. PARAMETER_NULL = -1, //!< Null parameter.
PARAMETER_ACTIVE = -2, //!< Active parameter, can only be 'true' or 'false'; default is 'false'. PARAMETER_ACTIVE = -2, //!< Active parameter, can only be 'true' or 'false'; default is 'false'.
PARAMETER_DRYWET = -3, //!< Dry/Wet parameter, range 0.0...1.0; default is 1.0. PARAMETER_DRYWET = -3, //!< Dry/Wet parameter, range 0.0...1.0; default is 1.0.
@@ -227,232 +227,11 @@ enum InternalParametersIndex SIZE_INT {
PARAMETER_MAX = -9 //!< Max value, defined for convenience. PARAMETER_MAX = -9 //!< Max value, defined for convenience.
}; };


/*!
* Engine process mode.
* \see ENGINE_OPTION_PROCESS_MODE
*/
enum ProcessMode SIZE_INT {
PROCESS_MODE_SINGLE_CLIENT = 0, //!< Single client mode (dynamic input/outputs as needed by plugins).
PROCESS_MODE_MULTIPLE_CLIENTS = 1, //!< Multiple client mode (1 master client + 1 client per plugin).
PROCESS_MODE_CONTINUOUS_RACK = 2, //!< Single client, 'rack' mode. Processes plugins in order of Id, with forced stereo.
PROCESS_MODE_PATCHBAY = 3, //!< Single client, 'patchbay' mode.
PROCESS_MODE_BRIDGE = 4 //!< Special mode, used in plugin-bridges only.
};

/*!
* All the available transport modes
*/
enum TransportMode SIZE_INT {
TRANSPORT_MODE_INTERNAL = 0, //!< Internal transport mode.
TRANSPORT_MODE_JACK = 1, //!< Transport from JACK, only available if driver name is "JACK".
TRANSPORT_MODE_PLUGIN = 2, //!< Transport from host, used when Carla is a plugin.
TRANSPORT_MODE_BRIDGE = 3 //!< Special mode, used in plugin-bridges only.
};

/*!
* Options used in the CarlaEngine::setOption() calls.\n
* All options except paths must be set before initiliazing or after closing the engine.
*/
enum EngineOptionsType SIZE_INT {
/*!
* Set the current process name.\n
* This is a convenience option, as Python lacks this functionality.
*/
ENGINE_OPTION_PROCESS_NAME = 0,

/*!
* Set the engine processing mode.\n
* Default is PROCESS_MODE_MULTIPLE_CLIENTS on Linux and PROCESS_MODE_CONTINUOUS_RACK for all other OSes.
* \see ProcessMode
*/
ENGINE_OPTION_PROCESS_MODE = 1,

/*!
* Set the engine transport mode.\n
* Default is TRANSPORT_MODE_INTERNAL.
* \see TransportMode
*/
ENGINE_OPTION_TRANSPORT_MODE = 2,

/*!
* Force mono plugins as stereo, by running 2 instances at the same time.
* \note Not supported by all plugins.
* \see PLUGIN_OPTION_FORCE_STEREO
*/
ENGINE_OPTION_FORCE_STEREO = 3,

/*!
* Use plugin bridges whenever possible.\n
* Default is no, EXPERIMENTAL.
*/
ENGINE_OPTION_PREFER_PLUGIN_BRIDGES = 4,

/*!
* Use UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n
* Default is yes.
*/
ENGINE_OPTION_PREFER_UI_BRIDGES = 5,

/*!
* Make plugin UIs always-on-top.\n
* Default is yes.
*/
ENGINE_OPTION_UIS_ALWAYS_ON_TOP = 6,

/*!
* Maximum number of parameters allowed.\n
* Default is MAX_DEFAULT_PARAMETERS.
*/
ENGINE_OPTION_MAX_PARAMETERS = 7,

/*!
* Timeout value in ms for how much to wait for UI-Bridges to respond.\n
* Default is 4000 (4 secs).
*/
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 8,

/*!
* Audio number of periods.
*/
ENGINE_OPTION_AUDIO_NUM_PERIODS = 9,

/*!
* Audio buffer size.
*/
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 10,

/*!
* Audio sample rate.
*/
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 11,

/*!
* Audio device.
*/
ENGINE_OPTION_AUDIO_DEVICE = 12,

/*!
* Set path to the resource files.\n
* Default unset.
*
* \note Must be set for some internal plugins to work!
*/
ENGINE_OPTION_PATH_RESOURCES = 13,

#ifndef BUILD_BRIDGE
/*!
* Set path to the native plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_NATIVE = 14,

/*!
* Set path to the POSIX 32bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_POSIX32 = 15,

/*!
* Set path to the POSIX 64bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_POSIX64 = 16,

/*!
* Set path to the Windows 32bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_WIN32 = 17,

/*!
* Set path to the Windows 64bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_WIN64 = 18,
#endif

#ifdef WANT_LV2
/*!
* Set path to the LV2 External UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL = 19,

/*!
* Set path to the LV2 Gtk2 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2 = 20,

/*!
* Set path to the LV2 Gtk3 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3 = 21,

/*!
* Set path to the LV2 Ntk UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_NTK = 22,

/*!
* Set path to the LV2 Qt4 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_QT4 = 23,

/*!
* Set path to the LV2 Qt5 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_QT5 = 24,

/*!
* Set path to the LV2 Cocoa UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA = 25,

/*!
* Set path to the LV2 Windows UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS = 26,

/*!
* Set path to the LV2 X11 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_X11 = 27,
#endif

#ifdef WANT_VST
/*!
* Set path to the VST Mac UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_MAC = 28,

/*!
* Set path to the VST HWND UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_HWND = 29,

/*!
* Set path to the VST X11 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_X11 = 30
#endif
};

/*! /*!
* Opcodes sent from the engine callback to the GUI, as defined by EngineCallbackFunc. * Opcodes sent from the engine callback to the GUI, as defined by EngineCallbackFunc.
* \see CarlaEngine::setCallback() * \see CarlaEngine::setCallback()
*/ */
enum EngineCallbackType SIZE_INT {
enum EngineCallbackOpcode SIZE_INT {
/*! /*!
* Debug.\n * Debug.\n
* This opcode is undefined and used only for testing purposes. * This opcode is undefined and used only for testing purposes.
@@ -698,10 +477,231 @@ enum EngineCallbackType SIZE_INT {
ENGINE_CALLBACK_QUIT = 38 ENGINE_CALLBACK_QUIT = 38
}; };


/*!
* Options used in the CarlaEngine::setOption() calls.\n
* All options except paths must be set before initiliazing or after closing the engine.
*/
enum EngineOption SIZE_INT {
/*!
* Set the current process name.\n
* This is a convenience option, as Python lacks this functionality.
*/
ENGINE_OPTION_PROCESS_NAME = 0,

/*!
* Set the engine processing mode.\n
* Default is PROCESS_MODE_MULTIPLE_CLIENTS on Linux and PROCESS_MODE_CONTINUOUS_RACK for all other OSes.
* \see ProcessMode
*/
ENGINE_OPTION_PROCESS_MODE = 1,

/*!
* Set the engine transport mode.\n
* Default is TRANSPORT_MODE_INTERNAL.
* \see TransportMode
*/
ENGINE_OPTION_TRANSPORT_MODE = 2,

/*!
* Force mono plugins as stereo, by running 2 instances at the same time.
* \note Not supported by all plugins.
* \see PLUGIN_OPTION_FORCE_STEREO
*/
ENGINE_OPTION_FORCE_STEREO = 3,

/*!
* Use plugin bridges whenever possible.\n
* Default is no, EXPERIMENTAL.
*/
ENGINE_OPTION_PREFER_PLUGIN_BRIDGES = 4,

/*!
* Use UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n
* Default is yes.
*/
ENGINE_OPTION_PREFER_UI_BRIDGES = 5,

/*!
* Make plugin UIs always-on-top.\n
* Default is yes.
*/
ENGINE_OPTION_UIS_ALWAYS_ON_TOP = 6,

/*!
* Maximum number of parameters allowed.\n
* Default is MAX_DEFAULT_PARAMETERS.
*/
ENGINE_OPTION_MAX_PARAMETERS = 7,

/*!
* Timeout value in ms for how much to wait for UI-Bridges to respond.\n
* Default is 4000 (4 secs).
*/
ENGINE_OPTION_UI_BRIDGES_TIMEOUT = 8,

/*!
* Audio number of periods.
*/
ENGINE_OPTION_AUDIO_NUM_PERIODS = 9,

/*!
* Audio buffer size.
*/
ENGINE_OPTION_AUDIO_BUFFER_SIZE = 10,

/*!
* Audio sample rate.
*/
ENGINE_OPTION_AUDIO_SAMPLE_RATE = 11,

/*!
* Audio device.
*/
ENGINE_OPTION_AUDIO_DEVICE = 12,

/*!
* Set path to the resource files.\n
* Default unset.
*
* \note Must be set for some internal plugins to work!
*/
ENGINE_OPTION_PATH_RESOURCES = 13,

#ifndef BUILD_BRIDGE
/*!
* Set path to the native plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_NATIVE = 14,

/*!
* Set path to the POSIX 32bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_POSIX32 = 15,

/*!
* Set path to the POSIX 64bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_POSIX64 = 16,

/*!
* Set path to the Windows 32bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_WIN32 = 17,

/*!
* Set path to the Windows 64bit plugin bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_WIN64 = 18,
#endif

#ifdef WANT_LV2
/*!
* Set path to the LV2 External UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL = 19,

/*!
* Set path to the LV2 Gtk2 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2 = 20,

/*!
* Set path to the LV2 Gtk3 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3 = 21,

/*!
* Set path to the LV2 Ntk UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_NTK = 22,

/*!
* Set path to the LV2 Qt4 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_QT4 = 23,

/*!
* Set path to the LV2 Qt5 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_QT5 = 24,

/*!
* Set path to the LV2 Cocoa UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA = 25,

/*!
* Set path to the LV2 Windows UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS = 26,

/*!
* Set path to the LV2 X11 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_LV2_X11 = 27,
#endif

#ifdef WANT_VST
/*!
* Set path to the VST Mac UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_MAC = 28,

/*!
* Set path to the VST HWND UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_HWND = 29,

/*!
* Set path to the VST X11 UI bridge executable.\n
* Default unset.
*/
ENGINE_OPTION_PATH_BRIDGE_VST_X11 = 30
#endif
};

/*!
* Engine process mode.
* \see ENGINE_OPTION_PROCESS_MODE
*/
enum EngineProcessMode SIZE_INT {
ENGINE_PROCESS_MODE_SINGLE_CLIENT = 0, //!< Single client mode (dynamic input/outputs as needed by plugins).
ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS = 1, //!< Multiple client mode (1 master client + 1 client per plugin).
ENGINE_PROCESS_MODE_CONTINUOUS_RACK = 2, //!< Single client, 'rack' mode. Processes plugins in order of Id, with forced stereo.
ENGINE_PROCESS_MODE_PATCHBAY = 3, //!< Single client, 'patchbay' mode.
ENGINE_PROCESS_MODE_BRIDGE = 4 //!< Special mode, used in plugin-bridges only.
};

/*!
* All the available transport modes
*/
enum EngineTransportMode SIZE_INT {
ENGINE_TRANSPORT_MODE_INTERNAL = 0, //!< Internal transport mode.
ENGINE_TRANSPORT_MODE_JACK = 1, //!< Transport from JACK, only available if driver name is "JACK".
ENGINE_TRANSPORT_MODE_PLUGIN = 2, //!< Transport from host, used when Carla is a plugin.
ENGINE_TRANSPORT_MODE_BRIDGE = 3 //!< Special mode, used in plugin-bridges only.
};

/*! /*!
* Opcodes sent from the backend to the frontend, asking for file related tasks. * Opcodes sent from the backend to the frontend, asking for file related tasks.
*/ */
enum FileCallbackType SIZE_INT {
enum FileCallbackOpcode SIZE_INT {
/*! /*!
* Debug.\n * Debug.\n
* This opcode is undefined and used only for testing purposes. * This opcode is undefined and used only for testing purposes.
@@ -723,13 +723,13 @@ enum FileCallbackType SIZE_INT {
* Engine callback function. * Engine callback function.
* \see EngineCallbackType * \see EngineCallbackType
*/ */
typedef void (*EngineCallbackFunc)(void* ptr, EngineCallbackType action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr);
typedef void (*EngineCallbackFunc)(void* ptr, EngineCallbackOpcode action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr);


/*! /*!
* File callback function. * File callback function.
* \see FileCallbackType * \see FileCallbackType
*/ */
typedef char* (*FileCallbackFunc)(void* ptr, FileCallbackType action, bool isDir, const char* title, const char* filter);
typedef const char* (*FileCallbackFunc)(void* ptr, FileCallbackOpcode action, bool isDir, const char* title, const char* filter);


/*! /*!
* Parameter data. * Parameter data.


+ 11
- 10
source/backend/CarlaEngine.hpp View File

@@ -232,8 +232,8 @@ struct EngineEvent {
* Engine options. * Engine options.
*/ */
struct EngineOptions { struct EngineOptions {
ProcessMode processMode;
TransportMode transportMode;
EngineProcessMode processMode;
EngineTransportMode transportMode;


bool forceStereo; bool forceStereo;
bool preferPluginBridges; bool preferPluginBridges;
@@ -259,6 +259,7 @@ struct EngineOptions {
CarlaString bridge_lv2Extrn; CarlaString bridge_lv2Extrn;
CarlaString bridge_lv2Gtk2; CarlaString bridge_lv2Gtk2;
CarlaString bridge_lv2Gtk3; CarlaString bridge_lv2Gtk3;
CarlaString bridge_lv2Ntk;
CarlaString bridge_lv2Qt4; CarlaString bridge_lv2Qt4;
CarlaString bridge_lv2Qt5; CarlaString bridge_lv2Qt5;
CarlaString bridge_lv2Cocoa; CarlaString bridge_lv2Cocoa;
@@ -273,11 +274,11 @@ struct EngineOptions {


EngineOptions() EngineOptions()
#if defined(CARLA_OS_LINUX) #if defined(CARLA_OS_LINUX)
: processMode(PROCESS_MODE_MULTIPLE_CLIENTS),
transportMode(TRANSPORT_MODE_JACK),
: processMode(ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS),
transportMode(ENGINE_TRANSPORT_MODE_JACK),
#else #else
: processMode(PROCESS_MODE_CONTINUOUS_RACK),
transportMode(TRANSPORT_MODE_INTERNAL),
: processMode(ENGINE_PROCESS_MODE_CONTINUOUS_RACK),
transportMode(ENGINE_TRANSPORT_MODE_INTERNAL),
#endif #endif
forceStereo(false), forceStereo(false),
preferPluginBridges(false), preferPluginBridges(false),
@@ -926,7 +927,7 @@ public:
/*! /*!
* Get the engine proccess mode. * Get the engine proccess mode.
*/ */
ProcessMode getProccessMode() const noexcept
EngineProcessMode getProccessMode() const noexcept
{ {
return fOptions.processMode; return fOptions.processMode;
} }
@@ -960,12 +961,12 @@ public:
/*! /*!
* TODO. * TODO.
*/ */
void callback(const CallbackType action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr);
void callback(const EngineCallbackOpcode action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr);


/*! /*!
* TODO. * TODO.
*/ */
void setCallback(const CallbackFunc func, void* const ptr);
void setCallback(const EngineCallbackFunc func, void* const ptr);


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Patchbay // Patchbay
@@ -1031,7 +1032,7 @@ public:
/*! /*!
* Set the engine option \a option. * Set the engine option \a option.
*/ */
void setOption(const OptionsType option, const int value, const char* const valueStr);
void setOption(const EngineOption option, const int value, const char* const valueStr);


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// OSC Stuff // OSC Stuff


+ 20
- 12
source/backend/CarlaHost.hpp View File

@@ -40,16 +40,18 @@
* Basic typedefs to help make code cleaner. * Basic typedefs to help make code cleaner.
* @{ * @{
*/ */
typedef CarlaBackend::BinaryType CarlaBinaryType;
typedef CarlaBackend::PluginType CarlaPluginType;
typedef CarlaBackend::PluginCategory CarlaPluginCategory;
typedef CarlaBackend::OptionsType CarlaOptionsType;
typedef CarlaBackend::CallbackType CarlaCallbackType;
typedef CarlaBackend::CallbackFunc CarlaCallbackFunc;
typedef CarlaBackend::ParameterData CarlaParameterData;
typedef CarlaBackend::ParameterRanges CarlaParameterRanges;
typedef CarlaBackend::MidiProgramData CarlaMidiProgramData;
typedef CarlaBackend::CustomData CarlaCustomData;
typedef CarlaBackend::BinaryType CarlaBinaryType;
typedef CarlaBackend::PluginType CarlaPluginType;
typedef CarlaBackend::PluginCategory CarlaPluginCategory;
typedef CarlaBackend::EngineCallbackFunc CarlaEngineCallbackFunc;
typedef CarlaBackend::EngineCallbackOpcode CarlaEngineCallbackOpcode;
typedef CarlaBackend::EngineOption CarlaEngineOption;
typedef CarlaBackend::FileCallbackFunc CarlaFileCallbackFunc;
typedef CarlaBackend::FileCallbackOpcode CarlaFileCallbackOpcode;
typedef CarlaBackend::ParameterData CarlaParameterData;
typedef CarlaBackend::ParameterRanges CarlaParameterRanges;
typedef CarlaBackend::MidiProgramData CarlaMidiProgramData;
typedef CarlaBackend::CustomData CarlaCustomData;
/**@}*/ /**@}*/


/*! /*!
@@ -344,14 +346,20 @@ CARLA_EXPORT void carla_set_engine_about_to_close();
* Set the engine callback function to \a func. * Set the engine callback function to \a func.
* Use \a ptr to pass a custom pointer to the callback. * Use \a ptr to pass a custom pointer to the callback.
*/ */
CARLA_EXPORT void carla_set_engine_callback(CarlaCallbackFunc func, void* ptr);
CARLA_EXPORT void carla_set_engine_callback(CarlaEngineCallbackFunc func, void* ptr);


/*! /*!
* Set the engine option \a option.\n * Set the engine option \a option.\n
* With the exception of OPTION_PROCESS_NAME, OPTION_TRANSPORT_MODE and OPTION_PATH_*, * With the exception of OPTION_PROCESS_NAME, OPTION_TRANSPORT_MODE and OPTION_PATH_*,
* this function should not be called when the engine is running. * this function should not be called when the engine is running.
*/ */
CARLA_EXPORT void carla_set_engine_option(CarlaOptionsType option, int value, const char* valueStr);
CARLA_EXPORT void carla_set_engine_option(CarlaEngineOption option, int value, const char* valueStr);

/*!
* Set the file callback function to \a func.
* Use \a ptr to pass a custom pointer to the callback.
*/
CARLA_EXPORT void carla_set_file_callback(CarlaFileCallbackFunc func, void* ptr);


/*! /*!
* Load \a filename of any type.\n * Load \a filename of any type.\n


+ 133
- 87
source/backend/engine/CarlaEngine.cpp View File

@@ -30,9 +30,11 @@
#include "CarlaStateUtils.hpp" #include "CarlaStateUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


#ifdef USE_JUCE
#include "juce_audio_basics.h" #include "juce_audio_basics.h"


using juce::FloatVectorOperations; using juce::FloatVectorOperations;
#endif


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -41,8 +43,8 @@ CARLA_BACKEND_START_NAMESPACE
#endif #endif


// Engine helper macro, sets lastError and returns false/NULL // Engine helper macro, sets lastError and returns false/NULL
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; }
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; }
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; }
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Fallback data // Fallback data
@@ -102,7 +104,9 @@ void CarlaEngineCVPort::initBuffer()
{ {
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,);


#ifdef USE_JUCE
FloatVectorOperations::clear(fBuffer, fEngine.getBufferSize()); FloatVectorOperations::clear(fBuffer, fEngine.getBufferSize());
#endif
} }


void CarlaEngineCVPort::writeBuffer(const uint32_t, const uint32_t) void CarlaEngineCVPort::writeBuffer(const uint32_t, const uint32_t)
@@ -127,7 +131,7 @@ CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngine& engine, const bool
{ {
carla_debug("CarlaEngineEventPort::CarlaEngineEventPort(name:\"%s\", %s)", engine.getName(), bool2str(isInput)); carla_debug("CarlaEngineEventPort::CarlaEngineEventPort(name:\"%s\", %s)", engine.getName(), bool2str(isInput));


if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_PATCHBAY)
fBuffer = new EngineEvent[kEngineMaxInternalEventCount]; fBuffer = new EngineEvent[kEngineMaxInternalEventCount];
} }


@@ -135,7 +139,7 @@ CarlaEngineEventPort::~CarlaEngineEventPort()
{ {
carla_debug("CarlaEngineEventPort::~CarlaEngineEventPort()"); carla_debug("CarlaEngineEventPort::~CarlaEngineEventPort()");


if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_PATCHBAY)
{ {
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,);


@@ -146,9 +150,9 @@ CarlaEngineEventPort::~CarlaEngineEventPort()


void CarlaEngineEventPort::initBuffer() void CarlaEngineEventPort::initBuffer()
{ {
if (fEngine.getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK || fEngine.getProccessMode() == PROCESS_MODE_BRIDGE)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_BRIDGE)
fBuffer = fEngine.getInternalEventBuffer(fIsInput); fBuffer = fEngine.getInternalEventBuffer(fIsInput);
else if (fEngine.getProccessMode() == PROCESS_MODE_PATCHBAY && ! fIsInput)
else if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_PATCHBAY && ! fIsInput)
carla_zeroStruct<EngineEvent>(fBuffer, kEngineMaxInternalEventCount); carla_zeroStruct<EngineEvent>(fBuffer, kEngineMaxInternalEventCount);
} }


@@ -156,7 +160,7 @@ uint32_t CarlaEngineEventPort::getEventCount() const
{ {
CARLA_SAFE_ASSERT_RETURN(fIsInput, 0); CARLA_SAFE_ASSERT_RETURN(fIsInput, 0);
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, 0); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, 0);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != PROCESS_MODE_MULTIPLE_CLIENTS, 0);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, 0);


uint32_t i=0; uint32_t i=0;


@@ -173,7 +177,7 @@ const EngineEvent& CarlaEngineEventPort::getEvent(const uint32_t index)
{ {
CARLA_SAFE_ASSERT_RETURN(fIsInput, kFallbackEngineEvent); CARLA_SAFE_ASSERT_RETURN(fIsInput, kFallbackEngineEvent);
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, kFallbackEngineEvent); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, kFallbackEngineEvent);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != PROCESS_MODE_MULTIPLE_CLIENTS, kFallbackEngineEvent);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, kFallbackEngineEvent);
CARLA_SAFE_ASSERT_RETURN(index < kEngineMaxInternalEventCount, kFallbackEngineEvent); CARLA_SAFE_ASSERT_RETURN(index < kEngineMaxInternalEventCount, kFallbackEngineEvent);


return fBuffer[index]; return fBuffer[index];
@@ -188,7 +192,7 @@ bool CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t
{ {
CARLA_SAFE_ASSERT_RETURN(! fIsInput, false); CARLA_SAFE_ASSERT_RETURN(! fIsInput, false);
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != PROCESS_MODE_MULTIPLE_CLIENTS, false);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, false);
CARLA_SAFE_ASSERT_RETURN(type != kEngineControlEventTypeNull, false); CARLA_SAFE_ASSERT_RETURN(type != kEngineControlEventTypeNull, false);
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false); CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false);
CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f); CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);
@@ -226,7 +230,7 @@ bool CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t cha
{ {
CARLA_SAFE_ASSERT_RETURN(! fIsInput, false); CARLA_SAFE_ASSERT_RETURN(! fIsInput, false);
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false); CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != PROCESS_MODE_MULTIPLE_CLIENTS, false);
CARLA_SAFE_ASSERT_RETURN(fEngine.getProccessMode() != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fEngine.getProccessMode() != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, false);
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false); CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false);
CARLA_SAFE_ASSERT_RETURN(data != nullptr, false); CARLA_SAFE_ASSERT_RETURN(data != nullptr, false);
CARLA_SAFE_ASSERT_RETURN(size > 0 && size <= 4, false); CARLA_SAFE_ASSERT_RETURN(size > 0 && size <= 4, false);
@@ -494,22 +498,22 @@ bool CarlaEngine::init(const char* const clientName)


switch (fOptions.processMode) switch (fOptions.processMode)
{ {
case PROCESS_MODE_SINGLE_CLIENT:
case PROCESS_MODE_MULTIPLE_CLIENTS:
case ENGINE_PROCESS_MODE_SINGLE_CLIENT:
case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS:
pData->maxPluginNumber = MAX_DEFAULT_PLUGINS; pData->maxPluginNumber = MAX_DEFAULT_PLUGINS;
break; break;


case PROCESS_MODE_CONTINUOUS_RACK:
case ENGINE_PROCESS_MODE_CONTINUOUS_RACK:
pData->maxPluginNumber = MAX_RACK_PLUGINS; pData->maxPluginNumber = MAX_RACK_PLUGINS;
pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount]; pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount];
pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount]; pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount];
break; break;


case PROCESS_MODE_PATCHBAY:
case ENGINE_PROCESS_MODE_PATCHBAY:
pData->maxPluginNumber = MAX_PATCHBAY_PLUGINS; pData->maxPluginNumber = MAX_PATCHBAY_PLUGINS;
break; break;


case PROCESS_MODE_BRIDGE:
case ENGINE_PROCESS_MODE_BRIDGE:
pData->maxPluginNumber = 1; pData->maxPluginNumber = 1;
pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount]; pData->bufEvents.in = new EngineEvent[kEngineMaxInternalEventCount];
pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount]; pData->bufEvents.out = new EngineEvent[kEngineMaxInternalEventCount];
@@ -533,9 +537,9 @@ bool CarlaEngine::init(const char* const clientName)
#endif #endif


pData->nextAction.ready(); pData->nextAction.ready();
pData->thread.startThread();
pData->thread.start();


callback(CALLBACK_ENGINE_STARTED, 0, 0, 0, 0.0f, getCurrentDriverName());
callback(ENGINE_CALLBACK_ENGINE_STARTED, 0, 0, 0, 0.0f, getCurrentDriverName());


return true; return true;
} }
@@ -548,7 +552,7 @@ bool CarlaEngine::close()
CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #9)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #9)");
carla_debug("CarlaEngine::close()"); carla_debug("CarlaEngine::close()");


pData->thread.stopThread(500);
pData->thread.stop(500);
pData->nextAction.ready(); pData->nextAction.ready();


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
@@ -582,7 +586,7 @@ bool CarlaEngine::close()


fName.clear(); fName.clear();


callback(CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr);


return true; return true;
} }
@@ -779,12 +783,12 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
if (oldPlugin != nullptr) if (oldPlugin != nullptr)
{ {
delete oldPlugin; delete oldPlugin;
callback(CALLBACK_RELOAD_ALL, id, 0, 0, 0.0f, plugin->getName());
callback(ENGINE_CALLBACK_RELOAD_ALL, id, 0, 0, 0.0f, plugin->getName());
} }
else else
{ {
++pData->curPluginCount; ++pData->curPluginCount;
callback(CALLBACK_PLUGIN_ADDED, id, 0, 0, 0.0f, plugin->getName());
callback(ENGINE_CALLBACK_PLUGIN_ADDED, id, 0, 0, 0.0f, plugin->getName());
} }


return true; return true;
@@ -803,9 +807,9 @@ bool CarlaEngine::removePlugin(const unsigned int id)
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to remove"); CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to remove");
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data (err #17)"); CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data (err #17)");


pData->thread.stopThread(500);
pData->thread.stop(500);


const bool lockWait(isRunning() && fOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS);
const bool lockWait(isRunning() && fOptions.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS);
const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionRemovePlugin, id, 0, lockWait); const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionRemovePlugin, id, 0, lockWait);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
@@ -816,9 +820,9 @@ bool CarlaEngine::removePlugin(const unsigned int id)
delete plugin; delete plugin;


if (isRunning() && ! pData->aboutToClose) if (isRunning() && ! pData->aboutToClose)
pData->thread.startThread();
pData->thread.start();


callback(CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0.0f, nullptr);
return true; return true;
} }


@@ -832,7 +836,7 @@ bool CarlaEngine::removeAllPlugins()
if (pData->curPluginCount == 0) if (pData->curPluginCount == 0)
return true; return true;


pData->thread.stopThread(500);
pData->thread.stop(500);


const bool lockWait(isRunning()); const bool lockWait(isRunning());
const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionZeroCount, 0, 0, lockWait); const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionZeroCount, 0, 0, lockWait);
@@ -854,7 +858,7 @@ bool CarlaEngine::removeAllPlugins()
} }


if (isRunning() && ! pData->aboutToClose) if (isRunning() && ! pData->aboutToClose)
pData->thread.startThread();
pData->thread.start();


return true; return true;
} }
@@ -949,9 +953,9 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB)
CARLA_SAFE_ASSERT_RETURN_ERR(pluginA->getId() == idA, "Invalid engine internal data (err #36)"); CARLA_SAFE_ASSERT_RETURN_ERR(pluginA->getId() == idA, "Invalid engine internal data (err #36)");
CARLA_SAFE_ASSERT_RETURN_ERR(pluginB->getId() == idB, "Invalid engine internal data (err #37)"); CARLA_SAFE_ASSERT_RETURN_ERR(pluginB->getId() == idB, "Invalid engine internal data (err #37)");


pData->thread.stopThread(500);
pData->thread.stop(500);


const bool lockWait(isRunning() && fOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS);
const bool lockWait(isRunning() && fOptions.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS);
const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionSwitchPlugins, idA, idB, lockWait); const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionSwitchPlugins, idA, idB, lockWait);


#ifndef BUILD_BRIDGE // TODO #ifndef BUILD_BRIDGE // TODO
@@ -960,7 +964,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB)
#endif #endif


if (isRunning() && ! pData->aboutToClose) if (isRunning() && ! pData->aboutToClose)
pData->thread.startThread();
pData->thread.start();


return true; return true;
} }
@@ -1073,6 +1077,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #1)"); CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #1)");
carla_debug("CarlaEngine::loadFilename(\"%s\")", filename); carla_debug("CarlaEngine::loadFilename(\"%s\")", filename);


#ifdef USE_JUCE
using namespace juce; using namespace juce;


File file(filename); File file(filename);
@@ -1113,7 +1118,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile")) if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile"))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_STRING, "file", filename, true);
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
return true; return true;
} }
return false; return false;
@@ -1131,7 +1136,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile")) if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile"))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_STRING, "file", filename, true);
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
return true; return true;
} }
return false; return false;
@@ -1153,7 +1158,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile")) if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile"))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_STRING, "file", filename, true);
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
return true; return true;
} }
return false; return false;
@@ -1172,7 +1177,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "zynaddsubfx")) if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "zynaddsubfx"))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_STRING, (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2", filename, true);
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2", filename, true);
return true; return true;
} }
return false; return false;
@@ -1181,6 +1186,7 @@ bool CarlaEngine::loadFilename(const char* const filename)
return false; return false;
#endif #endif
} }
#endif


// ------------------------------------------------------------------- // -------------------------------------------------------------------


@@ -1207,6 +1213,7 @@ bool CarlaEngine::loadProject(const char* const filename)
CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #2)"); CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #2)");
carla_debug("CarlaEngine::loadProject(\"%s\")", filename); carla_debug("CarlaEngine::loadProject(\"%s\")", filename);


#ifdef USE_JUCE
using namespace juce; using namespace juce;


File file(filename); File file(filename);
@@ -1267,6 +1274,7 @@ bool CarlaEngine::loadProject(const char* const filename)
delete xmlCheck; delete xmlCheck;
return false; return false;
} }
#endif


setLastError("Not a valid file"); setLastError("Not a valid file");
return false; return false;
@@ -1277,6 +1285,7 @@ bool CarlaEngine::saveProject(const char* const filename)
CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #3)"); CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #3)");
carla_debug("CarlaEngine::saveProject(\"%s\")", filename); carla_debug("CarlaEngine::saveProject(\"%s\")", filename);


#ifdef USE_JUCE
using namespace juce; using namespace juce;


File file(filename); File file(filename);
@@ -1323,6 +1332,9 @@ bool CarlaEngine::saveProject(const char* const filename)
out << "</CARLA-PROJECT>\n"; out << "</CARLA-PROJECT>\n";


return file.replaceWithData(out.getData(), out.getDataSize()); return file.replaceWithData(out.getData(), out.getDataSize());
#endif

return false;
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -1349,15 +1361,15 @@ float CarlaEngine::getOutputPeak(const unsigned int pluginId, const unsigned sho
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Callback // Callback


void CarlaEngine::callback(const CallbackType action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr)
void CarlaEngine::callback(const EngineCallbackOpcode action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr)
{ {
carla_debug("CarlaEngine::callback(%s, %i, %i, %i, %f, \"%s\")", CallbackType2Str(action), pluginId, value1, value2, value3, valueStr);
carla_debug("CarlaEngine::callback(%s, %i, %i, %i, %f, \"%s\")", EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr);


if (pData->callback != nullptr) if (pData->callback != nullptr)
pData->callback(pData->callbackPtr, action, pluginId, value1, value2, value3, valueStr); pData->callback(pData->callbackPtr, action, pluginId, value1, value2, value3, valueStr);
} }


void CarlaEngine::setCallback(const CallbackFunc func, void* const ptr)
void CarlaEngine::setCallback(const EngineCallbackFunc func, void* const ptr)
{ {
CARLA_ASSERT(func != nullptr); CARLA_ASSERT(func != nullptr);
carla_debug("CarlaEngine::setCallback(%p, %p)", func, ptr); carla_debug("CarlaEngine::setCallback(%p, %p)", func, ptr);
@@ -1427,146 +1439,149 @@ void CarlaEngine::setAboutToClose()
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Global options // Global options


void CarlaEngine::setOption(const OptionsType option, const int value, const char* const valueStr)
void CarlaEngine::setOption(const EngineOption option, const int value, const char* const valueStr)
{ {
carla_debug("CarlaEngine::setOption(%i:%s, %i, \"%s\")", option, OptionsType2Str(option), value, valueStr);
carla_debug("CarlaEngine::setOption(%i:%s, %i, \"%s\")", option, EngineOption2Str(option), value, valueStr);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (option >= OPTION_PROCESS_MODE && option < OPTION_PATH_RESOURCES && isRunning())
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", OptionsType2Str(option), value, valueStr);
if (option >= ENGINE_OPTION_PROCESS_MODE && option < ENGINE_OPTION_PATH_RESOURCES && isRunning())
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", EngineOption2Str(option), value, valueStr);
#endif #endif


switch (option) switch (option)
{ {
case OPTION_PROCESS_NAME:
case ENGINE_OPTION_PROCESS_NAME:
break; break;


case OPTION_PROCESS_MODE:
if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_PATCHBAY)
return carla_stderr("CarlaEngine::setOption(OPTION_PROCESS_MODE, %i, \"%s\") - invalid value", value, valueStr);
case ENGINE_OPTION_PROCESS_MODE:
if (value < ENGINE_PROCESS_MODE_SINGLE_CLIENT || value > ENGINE_PROCESS_MODE_PATCHBAY)
return carla_stderr("CarlaEngine::setOption(ENGINE_OPTION_PROCESS_MODE, %i, \"%s\") - invalid value", value, valueStr);


fOptions.processMode = static_cast<ProcessMode>(value);
fOptions.processMode = static_cast<EngineProcessMode>(value);
break; break;


case OPTION_TRANSPORT_MODE:
if (value < TRANSPORT_MODE_INTERNAL || value > TRANSPORT_MODE_JACK)
return carla_stderr2("carla_set_engine_option(OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr);
case ENGINE_OPTION_TRANSPORT_MODE:
if (value < ENGINE_TRANSPORT_MODE_INTERNAL || value > ENGINE_TRANSPORT_MODE_JACK)
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr);


fOptions.transportMode = static_cast<TransportMode>(value);
fOptions.transportMode = static_cast<EngineTransportMode>(value);
break; break;


case OPTION_FORCE_STEREO:
case ENGINE_OPTION_FORCE_STEREO:
fOptions.forceStereo = (value != 0); fOptions.forceStereo = (value != 0);
break; break;


case OPTION_PREFER_PLUGIN_BRIDGES:
case ENGINE_OPTION_PREFER_PLUGIN_BRIDGES:
fOptions.preferPluginBridges = (value != 0); fOptions.preferPluginBridges = (value != 0);
break; break;


case OPTION_PREFER_UI_BRIDGES:
case ENGINE_OPTION_PREFER_UI_BRIDGES:
fOptions.preferUiBridges = (value != 0); fOptions.preferUiBridges = (value != 0);
break; break;


case OPTION_UIS_ALWAYS_ON_TOP:
case ENGINE_OPTION_UIS_ALWAYS_ON_TOP:
fOptions.uisAlwaysOnTop = (value != 0); fOptions.uisAlwaysOnTop = (value != 0);
break; break;


case OPTION_MAX_PARAMETERS:
case ENGINE_OPTION_MAX_PARAMETERS:
if (value < 1) if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);


fOptions.maxParameters = static_cast<uint>(value); fOptions.maxParameters = static_cast<uint>(value);
break; break;


case OPTION_UI_BRIDGES_TIMEOUT:
case ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
if (value < 1) if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr);
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr);


fOptions.uiBridgesTimeout = static_cast<uint>(value); fOptions.uiBridgesTimeout = static_cast<uint>(value);
break; break;


case OPTION_AUDIO_NUM_PERIODS:
case ENGINE_OPTION_AUDIO_NUM_PERIODS:
if (value < 2 || value > 3) if (value < 2 || value > 3)
return carla_stderr2("carla_set_engine_option(OPTION_AUDIO_NUM_PERIODS, %i, \"%s\") - invalid value", value, valueStr);
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_NUM_PERIODS, %i, \"%s\") - invalid value", value, valueStr);


fOptions.audioNumPeriods = static_cast<uint>(value); fOptions.audioNumPeriods = static_cast<uint>(value);
break; break;


case OPTION_AUDIO_BUFFER_SIZE:
case ENGINE_OPTION_AUDIO_BUFFER_SIZE:
if (value < 8) if (value < 8)
return carla_stderr2("carla_set_engine_option(OPTION_AUDIO_BUFFER_SIZE, %i, \"%s\") - invalid value", value, valueStr);
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, %i, \"%s\") - invalid value", value, valueStr);


fOptions.audioBufferSize = static_cast<uint>(value); fOptions.audioBufferSize = static_cast<uint>(value);
break; break;


case OPTION_AUDIO_SAMPLE_RATE:
case ENGINE_OPTION_AUDIO_SAMPLE_RATE:
if (value < 22050) if (value < 22050)
return carla_stderr2("carla_set_engine_option(OPTION_AUDIO_SAMPLE_RATE, %i, \"%s\") - invalid value", value, valueStr);
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, %i, \"%s\") - invalid value", value, valueStr);


fOptions.audioSampleRate = static_cast<uint>(value); fOptions.audioSampleRate = static_cast<uint>(value);
break; break;


case OPTION_AUDIO_DEVICE:
case ENGINE_OPTION_AUDIO_DEVICE:
fOptions.audioDevice = valueStr; fOptions.audioDevice = valueStr;
break; break;


case OPTION_PATH_RESOURCES:
case ENGINE_OPTION_PATH_RESOURCES:
fOptions.resourceDir = valueStr; fOptions.resourceDir = valueStr;
break; break;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
case OPTION_PATH_BRIDGE_NATIVE:
case ENGINE_OPTION_PATH_BRIDGE_NATIVE:
fOptions.bridge_native = valueStr; fOptions.bridge_native = valueStr;
break; break;
case OPTION_PATH_BRIDGE_POSIX32:
case ENGINE_OPTION_PATH_BRIDGE_POSIX32:
fOptions.bridge_posix32 = valueStr; fOptions.bridge_posix32 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_POSIX64:
case ENGINE_OPTION_PATH_BRIDGE_POSIX64:
fOptions.bridge_posix64 = valueStr; fOptions.bridge_posix64 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_WIN32:
case ENGINE_OPTION_PATH_BRIDGE_WIN32:
fOptions.bridge_win32 = valueStr; fOptions.bridge_win32 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_WIN64:
case ENGINE_OPTION_PATH_BRIDGE_WIN64:
fOptions.bridge_win64 = valueStr; fOptions.bridge_win64 = valueStr;
break; break;
#endif #endif


#ifdef WANT_LV2 #ifdef WANT_LV2
case OPTION_PATH_BRIDGE_LV2_EXTERNAL:
case ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL:
fOptions.bridge_lv2Extrn = valueStr; fOptions.bridge_lv2Extrn = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_GTK2:
case ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2:
fOptions.bridge_lv2Gtk2 = valueStr; fOptions.bridge_lv2Gtk2 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_GTK3:
case ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3:
fOptions.bridge_lv2Gtk3 = valueStr; fOptions.bridge_lv2Gtk3 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_QT4:
case ENGINE_OPTION_PATH_BRIDGE_LV2_NTK:
fOptions.bridge_lv2Ntk = valueStr;
break;
case ENGINE_OPTION_PATH_BRIDGE_LV2_QT4:
fOptions.bridge_lv2Qt4 = valueStr; fOptions.bridge_lv2Qt4 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_QT5:
case ENGINE_OPTION_PATH_BRIDGE_LV2_QT5:
fOptions.bridge_lv2Qt5 = valueStr; fOptions.bridge_lv2Qt5 = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_COCOA:
case ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA:
fOptions.bridge_lv2Cocoa = valueStr; fOptions.bridge_lv2Cocoa = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_WINDOWS:
case ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS:
fOptions.bridge_lv2Win = valueStr; fOptions.bridge_lv2Win = valueStr;
break; break;
case OPTION_PATH_BRIDGE_LV2_X11:
case ENGINE_OPTION_PATH_BRIDGE_LV2_X11:
fOptions.bridge_lv2X11 = valueStr; fOptions.bridge_lv2X11 = valueStr;
break; break;
#endif #endif


#ifdef WANT_VST #ifdef WANT_VST
case OPTION_PATH_BRIDGE_VST_MAC:
case ENGINE_OPTION_PATH_BRIDGE_VST_MAC:
fOptions.bridge_vstMac = valueStr; fOptions.bridge_vstMac = valueStr;
break; break;
case OPTION_PATH_BRIDGE_VST_HWND:
case ENGINE_OPTION_PATH_BRIDGE_VST_HWND:
fOptions.bridge_vstHWND = valueStr; fOptions.bridge_vstHWND = valueStr;
break; break;
case OPTION_PATH_BRIDGE_VST_X11:
case ENGINE_OPTION_PATH_BRIDGE_VST_X11:
fOptions.bridge_vstX11 = valueStr; fOptions.bridge_vstX11 = valueStr;
break; break;
#endif #endif
@@ -1641,7 +1656,7 @@ void CarlaEngine::bufferSizeChanged(const uint32_t newBufferSize)
plugin->bufferSizeChanged(newBufferSize); plugin->bufferSizeChanged(newBufferSize);
} }


callback(CALLBACK_BUFFER_SIZE_CHANGED, 0, newBufferSize, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_BUFFER_SIZE_CHANGED, 0, newBufferSize, 0, 0.0f, nullptr);
} }


void CarlaEngine::sampleRateChanged(const double newSampleRate) void CarlaEngine::sampleRateChanged(const double newSampleRate)
@@ -1656,7 +1671,7 @@ void CarlaEngine::sampleRateChanged(const double newSampleRate)
plugin->sampleRateChanged(newSampleRate); plugin->sampleRateChanged(newSampleRate);
} }


callback(CALLBACK_SAMPLE_RATE_CHANGED, 0, 0, 0, newSampleRate, nullptr);
callback(ENGINE_CALLBACK_SAMPLE_RATE_CHANGED, 0, 0, 0, newSampleRate, nullptr);
} }


void CarlaEngine::offlineModeChanged(const bool isOffline) void CarlaEngine::offlineModeChanged(const bool isOffline)
@@ -1679,7 +1694,7 @@ void CarlaEngine::runPendingRtEvents()
if (pData->time.playing) if (pData->time.playing)
pData->time.frame += fBufferSize; pData->time.frame += fBufferSize;


if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL)
{ {
fTimeInfo.playing = pData->time.playing; fTimeInfo.playing = pData->time.playing;
fTimeInfo.frame = pData->time.frame; fTimeInfo.frame = pData->time.frame;
@@ -1707,6 +1722,7 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3
float inBuf1[frames]; float inBuf1[frames];
float* inBuf[2] = { inBuf0, inBuf1 }; float* inBuf[2] = { inBuf0, inBuf1 };


#ifdef USE_JUCE
// initialize audio inputs // initialize audio inputs
FloatVectorOperations::copy(inBuf0, inBufReal[0], frames); FloatVectorOperations::copy(inBuf0, inBufReal[0], frames);
FloatVectorOperations::copy(inBuf1, inBufReal[1], frames); FloatVectorOperations::copy(inBuf1, inBufReal[1], frames);
@@ -1714,6 +1730,15 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3
// initialize audio outputs (zero) // initialize audio outputs (zero)
FloatVectorOperations::clear(outBuf[0], frames); FloatVectorOperations::clear(outBuf[0], frames);
FloatVectorOperations::clear(outBuf[1], frames); FloatVectorOperations::clear(outBuf[1], frames);
#else
// initialize audio inputs
carla_copyFloat(inBuf0, inBufReal[0], frames);
carla_copyFloat(inBuf1, inBufReal[1], frames);

// initialize audio outputs (zero)
carla_zeroFloat(outBuf[0], frames);
carla_zeroFloat(outBuf[1], frames);
#endif


// initialize event outputs (zero) // initialize event outputs (zero)
carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount); carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
@@ -1733,6 +1758,7 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3


if (processed) if (processed)
{ {
#ifdef USE_JUCE
// initialize audio inputs (from previous outputs) // initialize audio inputs (from previous outputs)
FloatVectorOperations::copy(inBuf0, outBuf[0], frames); FloatVectorOperations::copy(inBuf0, outBuf[0], frames);
FloatVectorOperations::copy(inBuf1, outBuf[1], frames); FloatVectorOperations::copy(inBuf1, outBuf[1], frames);
@@ -1740,6 +1766,15 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3
// initialize audio outputs (zero) // initialize audio outputs (zero)
FloatVectorOperations::clear(outBuf[0], frames); FloatVectorOperations::clear(outBuf[0], frames);
FloatVectorOperations::clear(outBuf[1], frames); FloatVectorOperations::clear(outBuf[1], frames);
#else
// initialize audio inputs (from previous outputs)
carla_copyFloat(inBuf0, outBuf[0], frames);
carla_copyFloat(inBuf1, outBuf[1], frames);

// initialize audio outputs (zero)
carla_zeroFloat(outBuf[0], frames);
carla_zeroFloat(outBuf[1], frames);
#endif


// if plugin has no midi out, add previous events // if plugin has no midi out, add previous events
if (oldMidiOutCount == 0 && pData->bufEvents.in[0].type != kEngineEventTypeNull) if (oldMidiOutCount == 0 && pData->bufEvents.in[0].type != kEngineEventTypeNull)
@@ -1771,15 +1806,22 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3
// if plugin has no audio inputs, add input buffer // if plugin has no audio inputs, add input buffer
if (oldAudioInCount == 0) if (oldAudioInCount == 0)
{ {
#ifdef USE_JUCE
FloatVectorOperations::add(outBuf[0], inBuf0, frames); FloatVectorOperations::add(outBuf[0], inBuf0, frames);
FloatVectorOperations::add(outBuf[1], inBuf1, frames); FloatVectorOperations::add(outBuf[1], inBuf1, frames);
#else
carla_addFloat(outBuf[0], inBuf0, frames);
carla_addFloat(outBuf[1], inBuf1, frames);
#endif
} }


// set peaks // set peaks
{ {
float tmpMin, tmpMax;
EnginePluginData& pluginData(pData->plugins[i]); EnginePluginData& pluginData(pData->plugins[i]);


#ifdef USE_JUCE
float tmpMin, tmpMax;

FloatVectorOperations::findMinAndMax(inBuf0, frames, tmpMin, tmpMax); FloatVectorOperations::findMinAndMax(inBuf0, frames, tmpMin, tmpMax);
pluginData.insPeak[0] = carla_max<float>(std::abs(tmpMin), std::abs(tmpMax), 1.0f); pluginData.insPeak[0] = carla_max<float>(std::abs(tmpMin), std::abs(tmpMax), 1.0f);


@@ -1791,6 +1833,10 @@ void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint3


FloatVectorOperations::findMinAndMax(outBuf[1], frames, tmpMin, tmpMax); FloatVectorOperations::findMinAndMax(outBuf[1], frames, tmpMin, tmpMax);
pluginData.outsPeak[1] = carla_max<float>(std::abs(tmpMin), std::abs(tmpMax), 1.0f); pluginData.outsPeak[1] = carla_max<float>(std::abs(tmpMin), std::abs(tmpMax), 1.0f);
#else
// TODO
(void)pluginData;
#endif
} }


processed = true; processed = true;
@@ -1968,7 +2014,7 @@ void CarlaEngine::oscSend_control_set_parameter_value(const int32_t pluginId, co
{ {
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pluginId >= 0 && pluginId < static_cast<int32_t>(pData->maxPluginNumber),); CARLA_SAFE_ASSERT_RETURN(pluginId >= 0 && pluginId < static_cast<int32_t>(pData->maxPluginNumber),);
carla_debug("CarlaEngine::oscSend_control_set_parameter_value(%i, %i:%s, %f)", pluginId, index, (index < 0) ? InternalParametersIndex2Str(static_cast<InternalParametersIndex>(index)) : "(none)", value);
carla_debug("CarlaEngine::oscSend_control_set_parameter_value(%i, %i:%s, %f)", pluginId, index, (index < 0) ? InternalParameterIndex2Str(static_cast<InternalParameterIndex>(index)) : "(none)", value);


if (pData->oscData->target != nullptr) if (pData->oscData->target != nullptr)
{ {


+ 4
- 3
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -150,9 +150,10 @@ struct CarlaEngineProtectedData {


const CarlaOscData* oscData; const CarlaOscData* oscData;


CallbackFunc callback;
void* callbackPtr;
CarlaString lastError;
EngineCallbackFunc callback;
void* callbackPtr;

CarlaString lastError;


bool aboutToClose; // don't re-activate thread if true bool aboutToClose; // don't re-activate thread if true
unsigned int curPluginCount; // number of plugins loaded (0...max) unsigned int curPluginCount; // number of plugins loaded (0...max)


+ 83
- 55
source/backend/engine/CarlaEngineJack.cpp View File

@@ -21,11 +21,15 @@


#include "jackbridge/JackBridge.hpp" #include "jackbridge/JackBridge.hpp"


#include "juce_audio_basics.h"
#include <cmath>


#define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon" #define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon"


#ifdef USE_JUCE
#include "juce_audio_basics.h"

using juce::FloatVectorOperations; using juce::FloatVectorOperations;
#endif


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -51,7 +55,7 @@ public:
{ {
carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port); carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);


if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_ASSERT(client != nullptr && port != nullptr); CARLA_ASSERT(client != nullptr && port != nullptr);
} }
@@ -79,7 +83,13 @@ public:
fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize);


if (! fIsInput) if (! fIsInput)
{
#ifdef USE_JUCE
FloatVectorOperations::clear(fBuffer, bufferSize); FloatVectorOperations::clear(fBuffer, bufferSize);
#else
carla_zeroFloat(fBuffer, bufferSize);
#endif
}
} }


private: private:
@@ -104,7 +114,7 @@ public:
{ {
carla_debug("CarlaEngineJackCVPort::CarlaEngineJackCVPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port); carla_debug("CarlaEngineJackCVPort::CarlaEngineJackCVPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);


if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_ASSERT(client != nullptr && port != nullptr); CARLA_ASSERT(client != nullptr && port != nullptr);
} }
@@ -132,11 +142,19 @@ public:
if (fIsInput) if (fIsInput)
{ {
float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, bufferSize)); float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, bufferSize));
#ifdef USE_JUCE
FloatVectorOperations::copy(fBuffer, jackBuffer, bufferSize); FloatVectorOperations::copy(fBuffer, jackBuffer, bufferSize);
#else
carla_copyFloat(fBuffer, jackBuffer, bufferSize);
#endif
} }
else else
{ {
#ifdef USE_JUCE
FloatVectorOperations::clear(fBuffer, bufferSize); FloatVectorOperations::clear(fBuffer, bufferSize);
#else
carla_zeroFloat(fBuffer, bufferSize);
#endif
} }
} }


@@ -145,7 +163,12 @@ public:
CARLA_SAFE_ASSERT_RETURN(! fIsInput,); CARLA_SAFE_ASSERT_RETURN(! fIsInput,);


float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, fEngine.getBufferSize())); float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, fEngine.getBufferSize()));

#ifdef USE_JUCE
FloatVectorOperations::copy(jackBuffer+timeOffset, fBuffer, frames); FloatVectorOperations::copy(jackBuffer+timeOffset, fBuffer, frames);
#else
carla_copyFloat(jackBuffer+timeOffset, fBuffer, frames);
#endif
} }


private: private:
@@ -171,7 +194,7 @@ public:
{ {
carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port); carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);


if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_ASSERT(client != nullptr && port != nullptr); CARLA_ASSERT(client != nullptr && port != nullptr);
} }
@@ -412,7 +435,7 @@ public:
CarlaEngineJackClient(const CarlaEngine& engine, jack_client_t* const client) CarlaEngineJackClient(const CarlaEngine& engine, jack_client_t* const client)
: CarlaEngineClient(engine), : CarlaEngineClient(engine),
fClient(client), fClient(client),
fUseClient(engine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || engine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
fUseClient(engine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || engine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(name:\"%s\", %p)", engine.getName(), client); carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(name:\"%s\", %p)", engine.getName(), client);


@@ -430,7 +453,7 @@ public:
{ {
carla_debug("CarlaEngineClient::~CarlaEngineClient()"); carla_debug("CarlaEngineClient::~CarlaEngineClient()");


if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS && fClient != nullptr)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS && fClient != nullptr)
jackbridge_client_close(fClient); jackbridge_client_close(fClient);
} }


@@ -438,7 +461,7 @@ public:
{ {
carla_debug("CarlaEngineJackClient::activate()"); carla_debug("CarlaEngineJackClient::activate()");


if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && ! fActive,); CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && ! fActive,);


@@ -452,7 +475,7 @@ public:
{ {
carla_debug("CarlaEngineJackClient::deactivate()"); carla_debug("CarlaEngineJackClient::deactivate()");


if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && fActive,); CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && fActive,);


@@ -560,13 +583,13 @@ public:
carla_debug("CarlaEngineJack::CarlaEngineJack()"); carla_debug("CarlaEngineJack::CarlaEngineJack()");


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS;
fOptions.processMode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS;
#else #else
carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr); carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr);
#endif #endif


// FIXME: Always enable JACK transport for now // FIXME: Always enable JACK transport for now
fOptions.transportMode = TRANSPORT_MODE_JACK;
fOptions.transportMode = ENGINE_TRANSPORT_MODE_JACK;


carla_zeroStruct<jack_position_t>(fTransportPos); carla_zeroStruct<jack_position_t>(fTransportPos);
} }
@@ -589,7 +612,7 @@ public:


unsigned int getMaxClientNameSize() const noexcept override unsigned int getMaxClientNameSize() const noexcept override
{ {
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
unsigned int ret = 0; unsigned int ret = 0;


@@ -606,7 +629,7 @@ public:


unsigned int getMaxPortNameSize() const noexcept override unsigned int getMaxPortNameSize() const noexcept override
{ {
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
unsigned int ret = 0; unsigned int ret = 0;


@@ -669,7 +692,7 @@ public:
jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this); jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this);
jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this); jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this);


if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK)
{ {
fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
@@ -724,7 +747,7 @@ public:
#else #else
if (jackbridge_deactivate(fClient)) if (jackbridge_deactivate(fClient))
{ {
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK)
{ {
jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]); jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]);
jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]); jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]);
@@ -777,10 +800,10 @@ public:
void* data; void* data;
size_t dataSize; size_t dataSize;


NonRtList<int> groupIconsCopy;
List<int> groupIconsCopy;
fGroupIconsChanged.spliceAppend(groupIconsCopy, true); fGroupIconsChanged.spliceAppend(groupIconsCopy, true);


for (NonRtList<int>::Itenerator it = groupIconsCopy.begin(); it.valid(); it.next())
for (List<int>::Itenerator it = groupIconsCopy.begin(); it.valid(); it.next())
{ {
const int& groupId(*it); const int& groupId(*it);
const char* const groupName(getGroupName(groupId)); const char* const groupName(getGroupName(groupId));
@@ -793,7 +816,7 @@ public:
const char* const icon((const char*)data); const char* const icon((const char*)data);
CARLA_ASSERT(std::strlen(icon)+1 == dataSize); CARLA_ASSERT(std::strlen(icon)+1 == dataSize);


callback(CALLBACK_PATCHBAY_ICON_CHANGED, 0, groupId, 0, 0.0f, icon);
callback(ENGINE_CALLBACK_PATCHBAY_ICON_CHANGED, 0, groupId, 0, 0.0f, icon);


jackbridge_free(data); jackbridge_free(data);
} }
@@ -849,11 +872,11 @@ public:
jackbridge_set_process_callback(client, carla_jack_process_callback, this); jackbridge_set_process_callback(client, carla_jack_process_callback, this);
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
#else #else
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT)
{ {
client = fClient; client = fClient;
} }
else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
else if (fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr); client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr);


@@ -893,13 +916,13 @@ public:


CARLA_ASSERT(plugin->getId() == id); CARLA_ASSERT(plugin->getId() == id);


bool needsReinit = (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT);
bool needsReinit = (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT);
const char* name = getUniquePluginName(newName); const char* name = getUniquePluginName(newName);


// TODO - use rename port if single-client // TODO - use rename port if single-client


// JACK client rename // JACK client rename
if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS)
{ {
CarlaEngineJackClient* const client((CarlaEngineJackClient*)plugin->getEngineClient()); CarlaEngineJackClient* const client((CarlaEngineJackClient*)plugin->getEngineClient());


@@ -994,7 +1017,7 @@ public:
return false; return false;
} }


for (NonRtList<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
for (List<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
{ {
const ConnectionToId& connectionToId(*it); const ConnectionToId& connectionToId(*it);


@@ -1042,7 +1065,7 @@ public:


void transportPlay() override void transportPlay() override
{ {
if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL)
CarlaEngine::transportPlay(); CarlaEngine::transportPlay();
else if (fClient != nullptr) else if (fClient != nullptr)
jackbridge_transport_start(fClient); jackbridge_transport_start(fClient);
@@ -1050,7 +1073,7 @@ public:


void transportPause() override void transportPause() override
{ {
if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL)
CarlaEngine::transportPause(); CarlaEngine::transportPause();
else if (fClient != nullptr) else if (fClient != nullptr)
jackbridge_transport_stop(fClient); jackbridge_transport_stop(fClient);
@@ -1058,7 +1081,7 @@ public:


void transportRelocate(const uint32_t frame) override void transportRelocate(const uint32_t frame) override
{ {
if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL)
CarlaEngine::transportRelocate(frame); CarlaEngine::transportRelocate(frame);
else if (fClient != nullptr) else if (fClient != nullptr)
jackbridge_transport_locate(fClient, frame); jackbridge_transport_locate(fClient, frame);
@@ -1096,7 +1119,7 @@ protected:


void saveTransportInfo() void saveTransportInfo()
{ {
if (fOptions.transportMode != TRANSPORT_MODE_JACK)
if (fOptions.transportMode != ENGINE_TRANSPORT_MODE_JACK)
return; return;


fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
@@ -1140,7 +1163,7 @@ protected:
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
// pass-through // pass-through
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK)
{ {
float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes); float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes);
@@ -1148,8 +1171,11 @@ protected:
float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes); float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes);
void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes); void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes);


#ifdef USE_JUCE
FloatVectorOperations::copy(audioOut1, audioIn1, nframes); FloatVectorOperations::copy(audioOut1, audioIn1, nframes);
FloatVectorOperations::copy(audioOut2, audioIn2, nframes); FloatVectorOperations::copy(audioOut2, audioIn2, nframes);
#else
#endif
jackbridge_midi_clear_buffer(eventOut); jackbridge_midi_clear_buffer(eventOut);
} }
#endif #endif
@@ -1169,7 +1195,7 @@ protected:


return runPendingRtEvents(); return runPendingRtEvents();
#else #else
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT)
{ {
for (unsigned int i=0; i < pData->curPluginCount; ++i) for (unsigned int i=0; i < pData->curPluginCount; ++i)
{ {
@@ -1186,7 +1212,7 @@ protected:
return runPendingRtEvents(); return runPendingRtEvents();
} }


if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK)
{ {
// get buffers from jack // get buffers from jack
float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
@@ -1387,7 +1413,7 @@ protected:


void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
{ {
if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
if (fOptions.processMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT)
return; return;


for (unsigned int i=0; i < pData->curPluginCount; ++i) for (unsigned int i=0; i < pData->curPluginCount; ++i)
@@ -1426,7 +1452,7 @@ protected:
GroupNameToId groupNameId(id, name); GroupNameToId groupNameId(id, name);
fUsedGroupNames.removeAll(groupNameId); fUsedGroupNames.removeAll(groupNameId);


callback(CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, id, 0, 0.0f, name);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, id, 0, 0.0f, name);
} }


void handleJackPortRegistrationCallback(const jack_port_id_t port, const bool reg) void handleJackPortRegistrationCallback(const jack_port_id_t port, const bool reg)
@@ -1464,12 +1490,12 @@ protected:


if (jackPortFlags & JackPortIsPhysical) if (jackPortFlags & JackPortIsPhysical)
{ {
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
// hardware // hardware
} }
else else
{ {
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
fGroupIconsChanged.append(groupId); fGroupIconsChanged.append(groupId);
// "application" // "application"
} }
@@ -1489,7 +1515,7 @@ protected:
PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName); PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
fUsedPortNames.append(portNameToId); fUsedPortNames.append(portNameToId);


callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
} }
else else
{ {
@@ -1504,7 +1530,7 @@ protected:
PortNameToId portNameId(groupId, portId, portName, fullPortName); PortNameToId portNameId(groupId, portId, portName, fullPortName);
fUsedPortNames.removeOne(portNameId); fUsedPortNames.removeOne(portNameId);


callback(CALLBACK_PATCHBAY_PORT_REMOVED, 0, groupId, portId, 0.0f, portName);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED, 0, groupId, portId, 0.0f, portName);
} }
} }


@@ -1540,17 +1566,17 @@ protected:
ConnectionToId connectionToId(fLastConnectionId++, portIdA, portIdB); ConnectionToId connectionToId(fLastConnectionId++, portIdA, portIdB);
fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, portIdA, portIdB, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, portIdA, portIdB, nullptr);
} }
else else
{ {
for (NonRtList<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
for (List<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
{ {
const ConnectionToId& connectionToId(*it); const ConnectionToId& connectionToId(*it);


if (connectionToId.portOut == portIdA && connectionToId.portIn == portIdB) if (connectionToId.portOut == portIdA && connectionToId.portIn == portIdB)
{ {
callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connectionToId.id, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connectionToId.id, 0, 0.0f, nullptr);
fUsedConnections.remove(it); fUsedConnections.remove(it);
break; break;
} }
@@ -1560,14 +1586,14 @@ protected:


void handleJackClientRenameCallback(const char* const oldName, const char* const newName) void handleJackClientRenameCallback(const char* const oldName, const char* const newName)
{ {
for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
for (List<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
{ {
GroupNameToId& groupNameToId(*it); GroupNameToId& groupNameToId(*it);


if (std::strcmp(groupNameToId.name, oldName) == 0) if (std::strcmp(groupNameToId.name, oldName) == 0)
{ {
groupNameToId.rename(newName); groupNameToId.rename(newName);
callback(CALLBACK_PATCHBAY_CLIENT_RENAMED, 0, groupNameToId.id, 0, 0.0f, newName);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED, 0, groupNameToId.id, 0, 0.0f, newName);
break; break;
} }
} }
@@ -1596,7 +1622,7 @@ protected:
if (groupId == -1) if (groupId == -1)
return; return;


for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
for (List<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
{ {
PortNameToId& portNameId(*it); PortNameToId& portNameId(*it);


@@ -1604,7 +1630,7 @@ protected:
{ {
CARLA_ASSERT(portNameId.groupId == groupId); CARLA_ASSERT(portNameId.groupId == groupId);
portNameId.rename(portName, newName); portNameId.rename(portName, newName);
callback(CALLBACK_PATCHBAY_PORT_RENAMED, 0, groupId, portNameId.portId, 0.0f, newName);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED, 0, groupId, portNameId.portId, 0.0f, newName);
break; break;
} }
} }
@@ -1622,7 +1648,7 @@ protected:
} }


fClient = nullptr; fClient = nullptr;
callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -1764,10 +1790,10 @@ private:
int fLastPortId; int fLastPortId;
int fLastConnectionId; int fLastConnectionId;


NonRtList<GroupNameToId> fUsedGroupNames;
NonRtList<PortNameToId> fUsedPortNames;
NonRtList<ConnectionToId> fUsedConnections;
NonRtList<int> fGroupIconsChanged;
List<GroupNameToId> fUsedGroupNames;
List<PortNameToId> fUsedPortNames;
List<ConnectionToId> fUsedConnections;
List<int> fGroupIconsChanged;


int getGroupId(const char* const name) int getGroupId(const char* const name)
{ {
@@ -1776,7 +1802,7 @@ private:
if (name == nullptr) if (name == nullptr)
return -1; return -1;


for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
for (List<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
{ {
const GroupNameToId& groupNameId(*it); const GroupNameToId& groupNameId(*it);


@@ -1796,7 +1822,7 @@ private:
if (groupId < 0) if (groupId < 0)
return fallback; return fallback;


for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
for (List<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
{ {
const GroupNameToId& groupNameId(*it); const GroupNameToId& groupNameId(*it);


@@ -1814,7 +1840,7 @@ private:
if (fullName == nullptr) if (fullName == nullptr)
return -1; return -1;


for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
for (List<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
{ {
const PortNameToId& portNameId(*it); const PortNameToId& portNameId(*it);


@@ -1827,7 +1853,7 @@ private:


void getFullPortName(const int portId, char nameBuf[STR_MAX+1]) void getFullPortName(const int portId, char nameBuf[STR_MAX+1])
{ {
for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
for (List<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
{ {
const PortNameToId& portNameId(*it); const PortNameToId& portNameId(*it);


@@ -1849,6 +1875,7 @@ private:
CARLA_ASSERT(fLastConnectionId == 0); CARLA_ASSERT(fLastConnectionId == 0);
CARLA_ASSERT(ourName != nullptr); CARLA_ASSERT(ourName != nullptr);


#ifdef USE_JUCE
using namespace juce; using namespace juce;


// query initial jack ports // query initial jack ports
@@ -1862,7 +1889,7 @@ private:
GroupNameToId groupNameToId(fLastGroupId++, ourName); GroupNameToId groupNameToId(fLastGroupId++, ourName);
fUsedGroupNames.append(groupNameToId); fUsedGroupNames.append(groupNameToId);


callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupNameToId.id, 0, 0.0f, ourName);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupNameToId.id, 0, 0.0f, ourName);
// carla // carla
} }


@@ -1913,7 +1940,7 @@ private:
// icon // icon
} }


callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName);
} }


bool portIsInput = (jackPortFlags & JackPortIsInput); bool portIsInput = (jackPortFlags & JackPortIsInput);
@@ -1930,7 +1957,7 @@ private:
PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName); PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
fUsedPortNames.append(portNameToId); fUsedPortNames.append(portNameToId);


callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
} }


#if 0 #if 0
@@ -1969,7 +1996,7 @@ private:
ConnectionToId connectionToId(fLastConnectionId++, thisPortId, targetPortId); ConnectionToId connectionToId(fLastConnectionId++, thisPortId, targetPortId);
fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, thisPortId, targetPortId, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, thisPortId, targetPortId, nullptr);
} }


jackbridge_free(connections); jackbridge_free(connections);
@@ -1980,6 +2007,7 @@ private:


jackbridge_free(ports); jackbridge_free(ports);
} }
#endif
} }
#endif #endif




+ 4
- 0
source/backend/engine/CarlaEngineJuce.cpp View File

@@ -15,6 +15,10 @@
* For a full copy of the GNU General Public License see the GPL.txt file * For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#ifndef USE_JUCE
# error This file should not be compiled if Juce is disabled
#endif

#include "CarlaEngineInternal.hpp" #include "CarlaEngineInternal.hpp"
#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


+ 2
- 2
source/backend/engine/CarlaEngineOsc.cpp View File

@@ -463,7 +463,7 @@ int CarlaEngineOsc::handleMsgConfigure(CARLA_ENGINE_OSC_HANDLE_ARGS2)
const char* const key = (const char*)&argv[0]->s; const char* const key = (const char*)&argv[0]->s;
const char* const value = (const char*)&argv[1]->s; const char* const value = (const char*)&argv[1]->s;


plugin->setCustomData(CUSTOM_DATA_STRING, key, value, false);
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, key, value, false);


return 0; return 0;
} }
@@ -589,7 +589,7 @@ int CarlaEngineOsc::handleMsgExiting(CARLA_ENGINE_OSC_HANDLE_ARGS1)
carla_debug("CarlaEngineOsc::handleMsgExiting()"); carla_debug("CarlaEngineOsc::handleMsgExiting()");


// TODO - check for non-UIs (dssi-vst) and set to -1 instead // TODO - check for non-UIs (dssi-vst) and set to -1 instead
fEngine->callback(CALLBACK_SHOW_GUI, plugin->getId(), 0, 0, 0.0f, nullptr);
fEngine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, plugin->getId(), 0, 0, 0.0f, nullptr);


// TODO // TODO
//plugin->freeOscData(); //plugin->freeOscData();


+ 92
- 48
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -23,9 +23,11 @@
#include "rtaudio/RtAudio.h" #include "rtaudio/RtAudio.h"
#include "rtmidi/RtMidi.h" #include "rtmidi/RtMidi.h"


#ifdef USE_JUCE
#include "juce_audio_basics.h" #include "juce_audio_basics.h"


using juce::FloatVectorOperations; using juce::FloatVectorOperations;
#endif


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -113,8 +115,8 @@ public:


// just to make sure // just to make sure
fOptions.forceStereo = true; fOptions.forceStereo = true;
fOptions.processMode = PROCESS_MODE_CONTINUOUS_RACK;
fOptions.transportMode = TRANSPORT_MODE_INTERNAL;
fOptions.processMode = ENGINE_PROCESS_MODE_CONTINUOUS_RACK;
fOptions.transportMode = ENGINE_TRANSPORT_MODE_INTERNAL;
} }


~CarlaEngineRtAudio() override ~CarlaEngineRtAudio() override
@@ -337,7 +339,7 @@ public:


fConnectName.clear(); fConnectName.clear();


for (NonRtList<MidiPort>::Itenerator it = fMidiIns.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it = fMidiIns.begin(); it.valid(); it.next())
{ {
MidiPort& port(*it); MidiPort& port(*it);
RtMidiIn* const midiInPort((RtMidiIn*)port.rtmidi); RtMidiIn* const midiInPort((RtMidiIn*)port.rtmidi);
@@ -346,7 +348,7 @@ public:
delete midiInPort; delete midiInPort;
} }


for (NonRtList<MidiPort>::Itenerator it = fMidiOuts.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it = fMidiOuts.begin(); it.valid(); it.next())
{ {
MidiPort& port(*it); MidiPort& port(*it);
RtMidiOut* const midiOutPort((RtMidiOut*)port.rtmidi); RtMidiOut* const midiOutPort((RtMidiOut*)port.rtmidi);
@@ -519,7 +521,7 @@ public:
connectionToId.portOut = portA; connectionToId.portOut = portA;
connectionToId.portIn = portB; connectionToId.portIn = portB;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, portA, portB, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, portA, portB, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
@@ -544,7 +546,7 @@ public:
return false; return false;
} }


for (NonRtList<ConnectionToId>::Itenerator it=fUsedConnections.begin(); it.valid(); it.next())
for (List<ConnectionToId>::Itenerator it=fUsedConnections.begin(); it.valid(); it.next())
{ {
const ConnectionToId& connection(*it); const ConnectionToId& connection(*it);


@@ -557,7 +559,7 @@ public:
{ {
const int portId(targetPort-PATCHBAY_GROUP_MIDI_OUT*1000); const int portId(targetPort-PATCHBAY_GROUP_MIDI_OUT*1000);


for (NonRtList<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
{ {
MidiPort& midiPort(*it); MidiPort& midiPort(*it);


@@ -576,7 +578,7 @@ public:
{ {
const int portId(targetPort-PATCHBAY_GROUP_MIDI_IN*1000); const int portId(targetPort-PATCHBAY_GROUP_MIDI_IN*1000);


for (NonRtList<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next())
{ {
MidiPort& midiPort(*it); MidiPort& midiPort(*it);


@@ -627,7 +629,7 @@ public:
CARLA_ASSERT(false); CARLA_ASSERT(false);
} }


callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connection.id, 0, 0.0f, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connection.id, 0, 0.0f, nullptr);


fUsedConnections.remove(it); fUsedConnections.remove(it);
break; break;
@@ -653,14 +655,14 @@ public:


// Main // Main
{ {
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_CARLA, 0, 0.0f, getName());
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_CARLA, 0, 0.0f, getName());


callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_IN1, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, "audio-in1");
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_IN2, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, "audio-in2");
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_OUT1, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, "audio-out1");
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_OUT2, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, "audio-out2");
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_MIDI_IN, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_INPUT, "midi-in");
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_MIDI_OUT, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_OUTPUT, "midi-out");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_IN1, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, "audio-in1");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_IN2, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, "audio-in2");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_OUT1, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, "audio-out1");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_AUDIO_OUT2, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, "audio-out2");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_MIDI_IN, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_INPUT, "midi-in");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_CARLA, PATCHBAY_PORT_MIDI_OUT, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_OUTPUT, "midi-out");
} }


// Audio In // Audio In
@@ -670,12 +672,12 @@ public:
else else
std::strncpy(strBuf, "Capture", STR_MAX); std::strncpy(strBuf, "Capture", STR_MAX);


callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_AUDIO_IN, 0, 0.0f, strBuf);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_AUDIO_IN, 0, 0.0f, strBuf);


for (unsigned int i=0; i < fAudioCountIn; ++i) for (unsigned int i=0; i < fAudioCountIn; ++i)
{ {
std::snprintf(strBuf, STR_MAX, "capture_%i", i+1); std::snprintf(strBuf, STR_MAX, "capture_%i", i+1);
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_AUDIO_IN, PATCHBAY_GROUP_AUDIO_IN*1000 + i, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, strBuf);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_AUDIO_IN, PATCHBAY_GROUP_AUDIO_IN*1000 + i, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_OUTPUT, strBuf);
} }
} }


@@ -686,18 +688,18 @@ public:
else else
std::strncpy(strBuf, "Playback", STR_MAX); std::strncpy(strBuf, "Playback", STR_MAX);


callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_AUDIO_OUT, 0, 0.0f, strBuf);
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_AUDIO_OUT, 0, 0.0f, strBuf);


for (unsigned int i=0; i < fAudioCountOut; ++i) for (unsigned int i=0; i < fAudioCountOut; ++i)
{ {
std::snprintf(strBuf, STR_MAX, "playback_%i", i+1); std::snprintf(strBuf, STR_MAX, "playback_%i", i+1);
callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_AUDIO_OUT, PATCHBAY_GROUP_AUDIO_OUT*1000 + i, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, strBuf);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_AUDIO_OUT, PATCHBAY_GROUP_AUDIO_OUT*1000 + i, PATCHBAY_PORT_IS_AUDIO|PATCHBAY_PORT_IS_INPUT, strBuf);
} }
} }


// MIDI In // MIDI In
{ {
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_MIDI_IN, 0, 0.0f, "Readable MIDI ports");
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_MIDI_IN, 0, 0.0f, "Readable MIDI ports");


for (unsigned int i=0, count=fDummyMidiIn.getPortCount(); i < count; ++i) for (unsigned int i=0, count=fDummyMidiIn.getPortCount(); i < count; ++i)
{ {
@@ -706,14 +708,14 @@ public:
std::strncpy(portNameToId.name, fDummyMidiIn.getPortName(i).c_str(), STR_MAX); std::strncpy(portNameToId.name, fDummyMidiIn.getPortName(i).c_str(), STR_MAX);
fUsedMidiIns.append(portNameToId); fUsedMidiIns.append(portNameToId);


callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_MIDI_IN, portNameToId.portId, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_OUTPUT, portNameToId.name);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_MIDI_IN, portNameToId.portId, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_OUTPUT, portNameToId.name);
} }
} }


#if 0 // midi-out not implemented yet #if 0 // midi-out not implemented yet
// MIDI Out // MIDI Out
{ {
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_MIDI_OUT, 0, 0.0f, "Writable MIDI ports");
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, 0, PATCHBAY_GROUP_MIDI_OUT, 0, 0.0f, "Writable MIDI ports");


for (unsigned int i=0, count=fDummyMidiOut.getPortCount(); i < count; ++i) for (unsigned int i=0, count=fDummyMidiOut.getPortCount(); i < count; ++i)
{ {
@@ -722,7 +724,7 @@ public:
std::strncpy(portNameToId.name, fDummyMidiOut.getPortName(i).c_str(), STR_MAX); std::strncpy(portNameToId.name, fDummyMidiOut.getPortName(i).c_str(), STR_MAX);
fUsedMidiOuts.append(portNameToId); fUsedMidiOuts.append(portNameToId);


callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_MIDI_OUT, portNameToId.portId, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_INPUT, portNameToId.name);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, 0, PATCHBAY_GROUP_MIDI_OUT, portNameToId.portId, PATCHBAY_PORT_IS_MIDI|PATCHBAY_PORT_IS_INPUT, portNameToId.name);
} }
} }
#endif #endif
@@ -730,7 +732,7 @@ public:
// Connections // Connections
fConnectAudioLock.lock(); fConnectAudioLock.lock();


for (NonRtList<uint>::Itenerator it = fConnectedAudioIns[0].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioIns[0].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountIn); CARLA_ASSERT(port < fAudioCountIn);
@@ -740,13 +742,13 @@ public:
connectionToId.portOut = PATCHBAY_GROUP_AUDIO_IN*1000 + port; connectionToId.portOut = PATCHBAY_GROUP_AUDIO_IN*1000 + port;
connectionToId.portIn = PATCHBAY_PORT_AUDIO_IN1; connectionToId.portIn = PATCHBAY_PORT_AUDIO_IN1;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
} }


for (NonRtList<uint>::Itenerator it = fConnectedAudioIns[1].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioIns[1].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountIn); CARLA_ASSERT(port < fAudioCountIn);
@@ -756,13 +758,13 @@ public:
connectionToId.portOut = PATCHBAY_GROUP_AUDIO_IN*1000 + port; connectionToId.portOut = PATCHBAY_GROUP_AUDIO_IN*1000 + port;
connectionToId.portIn = PATCHBAY_PORT_AUDIO_IN2; connectionToId.portIn = PATCHBAY_PORT_AUDIO_IN2;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
} }


for (NonRtList<uint>::Itenerator it = fConnectedAudioOuts[0].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioOuts[0].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountOut); CARLA_ASSERT(port < fAudioCountOut);
@@ -772,13 +774,13 @@ public:
connectionToId.portOut = PATCHBAY_PORT_AUDIO_OUT1; connectionToId.portOut = PATCHBAY_PORT_AUDIO_OUT1;
connectionToId.portIn = PATCHBAY_GROUP_AUDIO_OUT*1000 + port; connectionToId.portIn = PATCHBAY_GROUP_AUDIO_OUT*1000 + port;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
} }


for (NonRtList<uint>::Itenerator it = fConnectedAudioOuts[1].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioOuts[1].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountOut); CARLA_ASSERT(port < fAudioCountOut);
@@ -788,7 +790,7 @@ public:
connectionToId.portOut = PATCHBAY_PORT_AUDIO_OUT2; connectionToId.portOut = PATCHBAY_PORT_AUDIO_OUT2;
connectionToId.portIn = PATCHBAY_GROUP_AUDIO_OUT*1000 + port; connectionToId.portIn = PATCHBAY_GROUP_AUDIO_OUT*1000 + port;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
@@ -796,7 +798,7 @@ public:


fConnectAudioLock.unlock(); fConnectAudioLock.unlock();


for (NonRtList<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next())
{ {
const MidiPort& midiPort(*it); const MidiPort& midiPort(*it);


@@ -805,13 +807,13 @@ public:
connectionToId.portOut = PATCHBAY_GROUP_MIDI_IN*1000 + midiPort.portId; connectionToId.portOut = PATCHBAY_GROUP_MIDI_IN*1000 + midiPort.portId;
connectionToId.portIn = PATCHBAY_PORT_MIDI_IN; connectionToId.portIn = PATCHBAY_PORT_MIDI_IN;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
} }


for (NonRtList<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
for (List<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
{ {
const MidiPort& midiPort(*it); const MidiPort& midiPort(*it);


@@ -820,7 +822,7 @@ public:
connectionToId.portOut = PATCHBAY_PORT_MIDI_OUT; connectionToId.portOut = PATCHBAY_PORT_MIDI_OUT;
connectionToId.portIn = PATCHBAY_GROUP_MIDI_OUT*1000 + midiPort.portId; connectionToId.portIn = PATCHBAY_GROUP_MIDI_OUT*1000 + midiPort.portId;


callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, connectionToId.portOut, connectionToId.portIn, nullptr);


fUsedConnections.append(connectionToId); fUsedConnections.append(connectionToId);
fLastConnectionId++; fLastConnectionId++;
@@ -844,7 +846,11 @@ protected:
if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady) if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady)
{ {
if (fAudioCountOut > 0 && fAudioIsReady) if (fAudioCountOut > 0 && fAudioIsReady)
{
#ifdef USE_JUCE
FloatVectorOperations::clear(outsPtr, nframes*fAudioCountOut); FloatVectorOperations::clear(outsPtr, nframes*fAudioCountOut);
#endif
}


return runPendingRtEvents(); return runPendingRtEvents();
} }
@@ -863,15 +869,21 @@ protected:
else else
{ {
for (unsigned int i=0; i < fAudioCountIn; ++i) for (unsigned int i=0; i < fAudioCountIn; ++i)
{
#ifdef USE_JUCE
FloatVectorOperations::copy(fAudioBufIn[i], insPtr+(nframes*i), nframes); FloatVectorOperations::copy(fAudioBufIn[i], insPtr+(nframes*i), nframes);
#endif
}
} }


#ifdef USE_JUCE
// initialize audio output // initialize audio output
for (unsigned int i=0; i < fAudioCountOut; ++i) for (unsigned int i=0; i < fAudioCountOut; ++i)
FloatVectorOperations::clear(fAudioBufOut[i], nframes); FloatVectorOperations::clear(fAudioBufOut[i], nframes);


FloatVectorOperations::clear(fAudioBufRackOut[0], nframes); FloatVectorOperations::clear(fAudioBufRackOut[0], nframes);
FloatVectorOperations::clear(fAudioBufRackOut[1], nframes); FloatVectorOperations::clear(fAudioBufRackOut[1], nframes);
#endif


// initialize input events // initialize input events
carla_zeroMem(pData->bufEvents.in, sizeof(EngineEvent)*kEngineMaxInternalEventCount); carla_zeroMem(pData->bufEvents.in, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
@@ -971,54 +983,78 @@ protected:
// connect input buffers // connect input buffers
if (fConnectedAudioIns[0].count() == 0) if (fConnectedAudioIns[0].count() == 0)
{ {
#ifdef USE_JUCE
FloatVectorOperations::clear(fAudioBufRackIn[0], nframes); FloatVectorOperations::clear(fAudioBufRackIn[0], nframes);
#endif
} }
else else
{ {
bool first = true; bool first = true;


for (NonRtList<uint>::Itenerator it = fConnectedAudioIns[0].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioIns[0].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountIn); CARLA_ASSERT(port < fAudioCountIn);


if (first) if (first)
{ {
#ifdef USE_JUCE
FloatVectorOperations::copy(fAudioBufRackIn[0], fAudioBufIn[port], nframes); FloatVectorOperations::copy(fAudioBufRackIn[0], fAudioBufIn[port], nframes);
#endif
first = false; first = false;
} }
else else
{
#ifdef USE_JUCE
FloatVectorOperations::add(fAudioBufRackIn[0], fAudioBufIn[port], nframes); FloatVectorOperations::add(fAudioBufRackIn[0], fAudioBufIn[port], nframes);
#endif
}
} }


if (first) if (first)
{
#ifdef USE_JUCE
FloatVectorOperations::clear(fAudioBufRackIn[0], nframes); FloatVectorOperations::clear(fAudioBufRackIn[0], nframes);
#endif
}
} }


if (fConnectedAudioIns[1].count() == 0) if (fConnectedAudioIns[1].count() == 0)
{ {
#ifdef USE_JUCE
FloatVectorOperations::clear(fAudioBufRackIn[1], nframes); FloatVectorOperations::clear(fAudioBufRackIn[1], nframes);
#endif
} }
else else
{ {
bool first = true; bool first = true;


for (NonRtList<uint>::Itenerator it = fConnectedAudioIns[1].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioIns[1].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountIn); CARLA_ASSERT(port < fAudioCountIn);


if (first) if (first)
{ {
#ifdef USE_JUCE
FloatVectorOperations::copy(fAudioBufRackIn[1], fAudioBufIn[port], nframes); FloatVectorOperations::copy(fAudioBufRackIn[1], fAudioBufIn[port], nframes);
#endif
first = false; first = false;
} }
else else
{
#ifdef USE_JUCE
FloatVectorOperations::add(fAudioBufRackIn[1], fAudioBufIn[port], nframes); FloatVectorOperations::add(fAudioBufRackIn[1], fAudioBufIn[port], nframes);
#endif
}
} }


if (first) if (first)
{
#ifdef USE_JUCE
FloatVectorOperations::clear(fAudioBufRackIn[1], nframes); FloatVectorOperations::clear(fAudioBufRackIn[1], nframes);
#endif
}
} }


// process // process
@@ -1027,23 +1063,27 @@ protected:
// connect output buffers // connect output buffers
if (fConnectedAudioOuts[0].count() != 0) if (fConnectedAudioOuts[0].count() != 0)
{ {
for (NonRtList<uint>::Itenerator it = fConnectedAudioOuts[0].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioOuts[0].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountOut); CARLA_ASSERT(port < fAudioCountOut);


#ifdef USE_JUCE
FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[0], nframes); FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[0], nframes);
#endif
} }
} }


if (fConnectedAudioOuts[1].count() != 0) if (fConnectedAudioOuts[1].count() != 0)
{ {
for (NonRtList<uint>::Itenerator it = fConnectedAudioOuts[1].begin(); it.valid(); it.next())
for (List<uint>::Itenerator it = fConnectedAudioOuts[1].begin(); it.valid(); it.next())
{ {
const uint& port(*it); const uint& port(*it);
CARLA_ASSERT(port < fAudioCountOut); CARLA_ASSERT(port < fAudioCountOut);


#ifdef USE_JUCE
FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[1], nframes); FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[1], nframes);
#endif
} }
} }


@@ -1063,7 +1103,11 @@ protected:
else else
{ {
for (unsigned int i=0; i < fAudioCountOut; ++i) for (unsigned int i=0; i < fAudioCountOut; ++i)
{
#ifdef USE_JUCE
FloatVectorOperations::copy(outsPtr+(nframes*i), fAudioBufOut[i], nframes); FloatVectorOperations::copy(outsPtr+(nframes*i), fAudioBufOut[i], nframes);
#endif
}
} }


// output events // output events
@@ -1248,8 +1292,8 @@ private:
bool fAudioIsInterleaved; bool fAudioIsInterleaved;
bool fAudioIsReady; bool fAudioIsReady;


NonRtList<uint> fConnectedAudioIns[2];
NonRtList<uint> fConnectedAudioOuts[2];
List<uint> fConnectedAudioIns[2];
List<uint> fConnectedAudioOuts[2];
CarlaMutex fConnectAudioLock; CarlaMutex fConnectAudioLock;
CarlaString fConnectName; CarlaString fConnectName;


@@ -1287,17 +1331,17 @@ private:
}; };


int fLastConnectionId; int fLastConnectionId;
NonRtList<PortNameToId> fUsedMidiIns;
NonRtList<PortNameToId> fUsedMidiOuts;
NonRtList<ConnectionToId> fUsedConnections;
List<PortNameToId> fUsedMidiIns;
List<PortNameToId> fUsedMidiOuts;
List<ConnectionToId> fUsedConnections;


struct MidiPort { struct MidiPort {
RtMidi* rtmidi; RtMidi* rtmidi;
int portId; int portId;
}; };


NonRtList<MidiPort> fMidiIns;
NonRtList<MidiPort> fMidiOuts;
List<MidiPort> fMidiIns;
List<MidiPort> fMidiOuts;


struct RtMidiEvent { struct RtMidiEvent {
uint32_t time; uint32_t time;
@@ -1472,7 +1516,7 @@ const char** CarlaEngine::getRtAudioApiDeviceNames(const unsigned int index)


if (devCount > 0) if (devCount > 0)
{ {
NonRtList<const char*> devNames;
List<const char*> devNames;


for (unsigned int i=0; i < devCount; ++i) for (unsigned int i=0; i < devCount; ++i)
{ {


+ 3
- 5
source/backend/engine/CarlaEngineThread.cpp View File

@@ -25,13 +25,11 @@ CARLA_BACKEND_START_NAMESPACE
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine) CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine)
: Thread("CarlaEngineThread"),
: CarlaThread("CarlaEngineThread"),
fEngine(engine) fEngine(engine)
{ {
CARLA_ASSERT(engine != nullptr); CARLA_ASSERT(engine != nullptr);
carla_debug("CarlaEngineThread::CarlaEngineThread(%p)", engine); carla_debug("CarlaEngineThread::CarlaEngineThread(%p)", engine);

setPriority(5);
} }


CarlaEngineThread::~CarlaEngineThread() CarlaEngineThread::~CarlaEngineThread()
@@ -50,7 +48,7 @@ void CarlaEngineThread::run()
bool oscRegisted, needsSingleThread; bool oscRegisted, needsSingleThread;
float value; float value;


while (fEngine->isRunning() && ! threadShouldExit())
while (fEngine->isRunning() && ! shouldExit())
{ {
#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
oscRegisted = fEngine->isOscBridgeRegistered(); oscRegisted = fEngine->isOscBridgeRegistered();
@@ -113,7 +111,7 @@ void CarlaEngineThread::run()
} }


fEngine->idleOsc(); fEngine->idleOsc();
Thread::sleep(oscRegisted ? 30 : 50);
carla_msleep(oscRegisted ? 30 : 50);
} }
} }




+ 3
- 4
source/backend/engine/CarlaEngineThread.hpp View File

@@ -19,8 +19,7 @@
#define CARLA_ENGINE_THREAD_HPP_INCLUDED #define CARLA_ENGINE_THREAD_HPP_INCLUDED


#include "CarlaBackend.hpp" #include "CarlaBackend.hpp"

#include "juce_core.h"
#include "CarlaThread.hpp"


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -30,7 +29,7 @@ CARLA_BACKEND_START_NAMESPACE


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


class CarlaEngineThread : public juce::Thread
class CarlaEngineThread : public CarlaThread
{ {
public: public:
CarlaEngineThread(CarlaEngine* const engine); CarlaEngineThread(CarlaEngine* const engine);
@@ -42,7 +41,7 @@ protected:
private: private:
CarlaEngine* const fEngine; CarlaEngine* const fEngine;


JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineThread)
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineThread)
}; };


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


+ 3
- 1
source/backend/engine/Makefile View File

@@ -24,9 +24,11 @@ OBJSp = \
OBJS = $(OBJSp) \ OBJS = $(OBJSp) \
CarlaEngineBridge.cpp.o \ CarlaEngineBridge.cpp.o \
CarlaEngineJack.cpp.o \ CarlaEngineJack.cpp.o \
CarlaEngineJuce.cpp.o \
CarlaEngineRtAudio.cpp.o CarlaEngineRtAudio.cpp.o


# OBJS += \
# CarlaEngineJuce.cpp.o

HEADERS = \ HEADERS = \
../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp \ ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp \
CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp


+ 130
- 92
source/backend/standalone/CarlaStandalone.cpp View File

@@ -42,6 +42,7 @@ using CB::CarlaPlugin;
using CB::EngineCallbackFunc; using CB::EngineCallbackFunc;
using CB::EngineOptions; using CB::EngineOptions;
using CB::EngineTimeInfo; using CB::EngineTimeInfo;
using CB::FileCallbackFunc;


#ifdef USE_JUCE #ifdef USE_JUCE
using namespace juce; using namespace juce;
@@ -139,10 +140,20 @@ struct CarlaBackendStandalone {
CARLA_DECLARE_NON_COPY_STRUCT(CarlaBackendStandalone) CARLA_DECLARE_NON_COPY_STRUCT(CarlaBackendStandalone)
}; };


struct CarlaBackendFileHandler {
FileCallbackFunc callback;
void* callbackPtr;

CarlaBackendFileHandler()
: callback(nullptr),
callbackPtr(nullptr) {}
};

//#ifdef WANT_LOGS //#ifdef WANT_LOGS
//static CarlaLogThread gLogThread; //static CarlaLogThread gLogThread;
//#endif //#endif
static CarlaBackendStandalone gStandalone;
static CarlaBackendStandalone gStandalone;
static CarlaBackendFileHandler gFileHandler;


// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------
// API // API
@@ -296,11 +307,14 @@ unsigned int carla_get_engine_driver_count()
return CarlaEngine::getDriverCount(); return CarlaEngine::getDriverCount();
} }


const char* carla_get_engine_driver_name(unsigned int index)
const CarlaEngineDriverInfo* carla_get_engine_driver_info(unsigned int index)
{ {
carla_debug("carla_get_engine_driver_name(%i)", index);
carla_debug("carla_get_engine_driver_info(%i)", index);

static CarlaEngineDriverInfo info;
info.name = CarlaEngine::getDriverName(index);


return CarlaEngine::getDriverName(index);
return &info;
} }


const char** carla_get_engine_driver_device_names(unsigned int index) const char** carla_get_engine_driver_device_names(unsigned int index)
@@ -407,41 +421,41 @@ bool carla_engine_init(const char* driverName, const char* clientName)
gStandalone.engine->setCallback(gStandalone.callback, gStandalone.callbackPtr); gStandalone.engine->setCallback(gStandalone.callback, gStandalone.callbackPtr);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
gStandalone.engine->setOption(CB::OPTION_PROCESS_MODE, static_cast<int>(gStandalone.options.processMode), nullptr);
gStandalone.engine->setOption(CB::OPTION_TRANSPORT_MODE, static_cast<int>(gStandalone.options.transportMode), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, static_cast<int>(gStandalone.options.processMode), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, static_cast<int>(gStandalone.options.transportMode), nullptr);
#endif #endif
gStandalone.engine->setOption(CB::OPTION_FORCE_STEREO, gStandalone.options.forceStereo ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::OPTION_PREFER_PLUGIN_BRIDGES, gStandalone.options.preferPluginBridges ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::OPTION_PREFER_UI_BRIDGES, gStandalone.options.preferUiBridges ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::OPTION_UIS_ALWAYS_ON_TOP, gStandalone.options.uisAlwaysOnTop ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.options.maxParameters), nullptr);
gStandalone.engine->setOption(CB::OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.options.uiBridgesTimeout), nullptr);
gStandalone.engine->setOption(CB::OPTION_AUDIO_NUM_PERIODS, static_cast<int>(gStandalone.options.audioNumPeriods), nullptr);
gStandalone.engine->setOption(CB::OPTION_AUDIO_BUFFER_SIZE, static_cast<int>(gStandalone.options.audioBufferSize), nullptr);
gStandalone.engine->setOption(CB::OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.options.audioSampleRate), nullptr);
gStandalone.engine->setOption(CB::OPTION_AUDIO_DEVICE, 0, (const char*)gStandalone.options.audioDevice);
gStandalone.engine->setOption(CB::OPTION_PATH_RESOURCES, 0, (const char*)gStandalone.options.resourceDir);
gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, gStandalone.options.forceStereo ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, gStandalone.options.preferPluginBridges ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, gStandalone.options.preferUiBridges ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, gStandalone.options.uisAlwaysOnTop ? 1 : 0, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.options.maxParameters), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.options.uiBridgesTimeout), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_NUM_PERIODS, static_cast<int>(gStandalone.options.audioNumPeriods), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE, static_cast<int>(gStandalone.options.audioBufferSize), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.options.audioSampleRate), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_DEVICE, 0, (const char*)gStandalone.options.audioDevice);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, (const char*)gStandalone.options.resourceDir);
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_NATIVE, 0, (const char*)gStandalone.options.bridge_native);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_POSIX32, 0, (const char*)gStandalone.options.bridge_posix32);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_POSIX64, 0, (const char*)gStandalone.options.bridge_posix64);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_WIN32, 0, (const char*)gStandalone.options.bridge_win32);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_WIN64, 0, (const char*)gStandalone.options.bridge_win64);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_NATIVE, 0, (const char*)gStandalone.options.bridge_native);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_POSIX32, 0, (const char*)gStandalone.options.bridge_posix32);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_POSIX64, 0, (const char*)gStandalone.options.bridge_posix64);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_WIN32, 0, (const char*)gStandalone.options.bridge_win32);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_WIN64, 0, (const char*)gStandalone.options.bridge_win64);
#endif #endif
#ifdef WANT_LV2 #ifdef WANT_LV2
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_EXTERNAL, 0, (const char*)gStandalone.options.bridge_lv2Extrn);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_GTK2, 0, (const char*)gStandalone.options.bridge_lv2Gtk2);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_GTK3, 0, (const char*)gStandalone.options.bridge_lv2Gtk3);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_QT4, 0, (const char*)gStandalone.options.bridge_lv2Qt4);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_QT5, 0, (const char*)gStandalone.options.bridge_lv2Qt5);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_COCOA, 0, (const char*)gStandalone.options.bridge_lv2Cocoa);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_WINDOWS, 0, (const char*)gStandalone.options.bridge_lv2Win);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_LV2_X11, 0, (const char*)gStandalone.options.bridge_lv2X11);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL, 0, (const char*)gStandalone.options.bridge_lv2Extrn);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2, 0, (const char*)gStandalone.options.bridge_lv2Gtk2);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3, 0, (const char*)gStandalone.options.bridge_lv2Gtk3);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT4, 0, (const char*)gStandalone.options.bridge_lv2Qt4);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT5, 0, (const char*)gStandalone.options.bridge_lv2Qt5);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA, 0, (const char*)gStandalone.options.bridge_lv2Cocoa);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS, 0, (const char*)gStandalone.options.bridge_lv2Win);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_LV2_X11, 0, (const char*)gStandalone.options.bridge_lv2X11);
#endif #endif
#ifdef WANT_VST #ifdef WANT_VST
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_VST_MAC, 0, (const char*)gStandalone.options.bridge_vstMac);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_VST_HWND, 0, (const char*)gStandalone.options.bridge_vstHWND);
gStandalone.engine->setOption(CB::OPTION_PATH_BRIDGE_VST_X11, 0, (const char*)gStandalone.options.bridge_vstX11);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_VST_MAC, 0, (const char*)gStandalone.options.bridge_vstMac);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_VST_HWND, 0, (const char*)gStandalone.options.bridge_vstHWND);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BRIDGE_VST_X11, 0, (const char*)gStandalone.options.bridge_vstX11);
#endif #endif


if (gStandalone.engine->init(clientName)) if (gStandalone.engine->init(clientName))
@@ -486,14 +500,14 @@ bool carla_engine_init_bridge(const char* audioBaseName, const char* controlBase
if (gStandalone.callback != nullptr) if (gStandalone.callback != nullptr)
gStandalone.engine->setCallback(gStandalone.callback, gStandalone.callbackPtr); gStandalone.engine->setCallback(gStandalone.callback, gStandalone.callbackPtr);


gStandalone.engine->setOption(CB::OPTION_PROCESS_MODE, CB::PROCESS_MODE_BRIDGE, nullptr);
gStandalone.engine->setOption(CB::OPTION_TRANSPORT_MODE, CB::TRANSPORT_MODE_BRIDGE, nullptr);
gStandalone.engine->setOption(CB::OPTION_FORCE_STEREO, false, nullptr);
gStandalone.engine->setOption(CB::OPTION_PREFER_PLUGIN_BRIDGES, false, nullptr);
gStandalone.engine->setOption(CB::OPTION_PREFER_UI_BRIDGES, false, nullptr);
//gStandalone.engine->setOption(CB::OPTION_UIS_ALWAYS_ON_TOP, gStandalone.options.uisAlwaysOnTop ? 1 : 0, nullptr);
//gStandalone.engine->setOption(CB::OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.options.maxParameters), nullptr);
//gStandalone.engine->setOption(CB::OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.options.uiBridgesTimeout), nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, CB::PROCESS_MODE_BRIDGE, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, CB::TRANSPORT_MODE_BRIDGE, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, false, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, false, nullptr);
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, false, nullptr);
//gStandalone.engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, gStandalone.options.uisAlwaysOnTop ? 1 : 0, nullptr);
//gStandalone.engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.options.maxParameters), nullptr);
//gStandalone.engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.options.uiBridgesTimeout), nullptr);


if (gStandalone.engine->init(clientName)) if (gStandalone.engine->init(clientName))
{ {
@@ -559,7 +573,7 @@ void carla_set_engine_about_to_close()
gStandalone.engine->setAboutToClose(); gStandalone.engine->setAboutToClose();
} }


void carla_set_engine_callback(CarlaCallbackFunc func, void* ptr)
void carla_set_engine_callback(CarlaEngineCallbackFunc func, void* ptr)
{ {
carla_debug("carla_set_engine_callback(%p, %p)", func, ptr); carla_debug("carla_set_engine_callback(%p, %p)", func, ptr);


@@ -574,165 +588,170 @@ void carla_set_engine_callback(CarlaCallbackFunc func, void* ptr)
//#endif //#endif
} }


void carla_set_engine_option(CarlaOptionsType option, int value, const char* valueStr)
void carla_set_engine_option(CarlaEngineOption option, int value, const char* valueStr)
{ {
carla_debug("carla_set_engine_option(%i:%s, %i, \"%s\")", option, CB::OptionsType2Str(option), value, valueStr);
carla_debug("carla_set_engine_option(%i:%s, %i, \"%s\")", option, CB::EngineOption2Str(option), value, valueStr);


switch (option) switch (option)
{ {
case CB::OPTION_PROCESS_NAME:
case CB::ENGINE_OPTION_PROCESS_NAME:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
#ifdef USE_JUCE #ifdef USE_JUCE
juce::Thread::setCurrentThreadName(valueStr); juce::Thread::setCurrentThreadName(valueStr);
#endif #endif
break; break;


case CB::OPTION_PROCESS_MODE:
CARLA_SAFE_ASSERT_RETURN(value >= CB::PROCESS_MODE_SINGLE_CLIENT && value <= CB::PROCESS_MODE_BRIDGE,);
gStandalone.options.processMode = static_cast<CB::ProcessMode>(value);
case CB::ENGINE_OPTION_PROCESS_MODE:
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_PROCESS_MODE_SINGLE_CLIENT && value <= CB::ENGINE_PROCESS_MODE_BRIDGE,);
gStandalone.options.processMode = static_cast<CB::EngineProcessMode>(value);
break; break;


case CB::OPTION_TRANSPORT_MODE:
CARLA_SAFE_ASSERT_RETURN(value >= CB::TRANSPORT_MODE_INTERNAL && value <= CB::TRANSPORT_MODE_BRIDGE,);
gStandalone.options.transportMode = static_cast<CB::TransportMode>(value);
case CB::ENGINE_OPTION_TRANSPORT_MODE:
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_TRANSPORT_MODE_INTERNAL && value <= CB::ENGINE_TRANSPORT_MODE_BRIDGE,);
gStandalone.options.transportMode = static_cast<CB::EngineTransportMode>(value);
break; break;


case CB::OPTION_FORCE_STEREO:
case CB::ENGINE_OPTION_FORCE_STEREO:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
gStandalone.options.forceStereo = (value != 0); gStandalone.options.forceStereo = (value != 0);
break; break;


case CB::OPTION_PREFER_PLUGIN_BRIDGES:
case CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
gStandalone.options.preferPluginBridges = (value != 0); gStandalone.options.preferPluginBridges = (value != 0);
break; break;


case CB::OPTION_PREFER_UI_BRIDGES:
case CB::ENGINE_OPTION_PREFER_UI_BRIDGES:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
gStandalone.options.preferUiBridges = (value != 0); gStandalone.options.preferUiBridges = (value != 0);
break; break;


case CB::OPTION_UIS_ALWAYS_ON_TOP:
case CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP:
CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,); CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
gStandalone.options.uisAlwaysOnTop = (value != 0); gStandalone.options.uisAlwaysOnTop = (value != 0);
break; break;


case CB::OPTION_MAX_PARAMETERS:
case CB::ENGINE_OPTION_MAX_PARAMETERS:
CARLA_SAFE_ASSERT_RETURN(value >= 0,); CARLA_SAFE_ASSERT_RETURN(value >= 0,);
gStandalone.options.maxParameters = static_cast<unsigned int>(value); gStandalone.options.maxParameters = static_cast<unsigned int>(value);
break; break;


case CB::OPTION_UI_BRIDGES_TIMEOUT:
case CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
CARLA_SAFE_ASSERT_RETURN(value >= 0,); CARLA_SAFE_ASSERT_RETURN(value >= 0,);
gStandalone.options.uiBridgesTimeout = static_cast<unsigned int>(value); gStandalone.options.uiBridgesTimeout = static_cast<unsigned int>(value);
break; break;


case CB::OPTION_AUDIO_NUM_PERIODS:
case CB::ENGINE_OPTION_AUDIO_NUM_PERIODS:
CARLA_SAFE_ASSERT_RETURN(value == 2 || value == 3,); CARLA_SAFE_ASSERT_RETURN(value == 2 || value == 3,);
gStandalone.options.audioNumPeriods = static_cast<unsigned int>(value); gStandalone.options.audioNumPeriods = static_cast<unsigned int>(value);
break; break;


case CB::OPTION_AUDIO_BUFFER_SIZE:
case CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE:
CARLA_SAFE_ASSERT_RETURN(value >= 8,); CARLA_SAFE_ASSERT_RETURN(value >= 8,);
gStandalone.options.audioBufferSize = static_cast<unsigned int>(value); gStandalone.options.audioBufferSize = static_cast<unsigned int>(value);
break; break;


case CB::OPTION_AUDIO_SAMPLE_RATE:
case CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE:
CARLA_SAFE_ASSERT_RETURN(value >= 22050,); CARLA_SAFE_ASSERT_RETURN(value >= 22050,);
gStandalone.options.audioSampleRate = static_cast<unsigned int>(value); gStandalone.options.audioSampleRate = static_cast<unsigned int>(value);
break; break;


case CB::OPTION_AUDIO_DEVICE:
case CB::ENGINE_OPTION_AUDIO_DEVICE:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.audioDevice = valueStr; gStandalone.options.audioDevice = valueStr;
break; break;


case CB::OPTION_PATH_RESOURCES:
case CB::ENGINE_OPTION_PATH_RESOURCES:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.resourceDir = valueStr; gStandalone.options.resourceDir = valueStr;
break; break;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
case CB::OPTION_PATH_BRIDGE_NATIVE:
case CB::ENGINE_OPTION_PATH_BRIDGE_NATIVE:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_native = valueStr; gStandalone.options.bridge_native = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_POSIX32:
case CB::ENGINE_OPTION_PATH_BRIDGE_POSIX32:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_posix32 = valueStr; gStandalone.options.bridge_posix32 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_POSIX64:
case CB::ENGINE_OPTION_PATH_BRIDGE_POSIX64:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_posix64 = valueStr; gStandalone.options.bridge_posix64 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_WIN32:
case CB::ENGINE_OPTION_PATH_BRIDGE_WIN32:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_win32 = valueStr; gStandalone.options.bridge_win32 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_WIN64:
case CB::ENGINE_OPTION_PATH_BRIDGE_WIN64:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_win64 = valueStr; gStandalone.options.bridge_win64 = valueStr;
break; break;
#endif #endif


#ifdef WANT_LV2 #ifdef WANT_LV2
case CB::OPTION_PATH_BRIDGE_LV2_EXTERNAL:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Extrn = valueStr; gStandalone.options.bridge_lv2Extrn = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_GTK2:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Gtk2 = valueStr; gStandalone.options.bridge_lv2Gtk2 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_GTK3:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Gtk3 = valueStr; gStandalone.options.bridge_lv2Gtk3 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_QT4:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_NTK:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Ntk = valueStr;
break;

case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT4:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Qt4 = valueStr; gStandalone.options.bridge_lv2Qt4 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_QT5:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT5:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Qt5 = valueStr; gStandalone.options.bridge_lv2Qt5 = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_COCOA:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Cocoa = valueStr; gStandalone.options.bridge_lv2Cocoa = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_WINDOWS:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2Win = valueStr; gStandalone.options.bridge_lv2Win = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_LV2_X11:
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_X11:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_lv2X11 = valueStr; gStandalone.options.bridge_lv2X11 = valueStr;
break; break;
#endif #endif


#ifdef WANT_VST #ifdef WANT_VST
case CB::OPTION_PATH_BRIDGE_VST_MAC:
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_MAC:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_vstMac = valueStr; gStandalone.options.bridge_vstMac = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_VST_HWND:
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_HWND:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_vstHWND = valueStr; gStandalone.options.bridge_vstHWND = valueStr;
break; break;


case CB::OPTION_PATH_BRIDGE_VST_X11:
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_X11:
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
gStandalone.options.bridge_vstX11 = valueStr; gStandalone.options.bridge_vstX11 = valueStr;
break; break;
@@ -745,6 +764,24 @@ void carla_set_engine_option(CarlaOptionsType option, int value, const char* val


// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------


void carla_set_file_callback(CarlaFileCallbackFunc func, void* ptr)
{
carla_debug("carla_set_file_callback(%p, %p)", func, ptr);

gFileHandler.callback = func;
gFileHandler.callbackPtr = ptr;
}

const char* carla_file_callback(CarlaFileCallbackOpcode action, bool isDir, const char* title, const char* filter)
{
if (gFileHandler.callback == nullptr)
return nullptr;

return gFileHandler.callback(gFileHandler.callbackPtr, action, isDir, title, filter);
}

// -------------------------------------------------------------------------------------------------------------------

bool carla_load_filename(const char* filename) bool carla_load_filename(const char* filename)
{ {
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
@@ -1034,17 +1071,16 @@ const CarlaPluginInfo* carla_get_plugin_info(unsigned int pluginId)
static CarlaPluginInfo info; static CarlaPluginInfo info;


// reset // reset
info.type = CB::PLUGIN_NONE;
info.category = CB::PLUGIN_CATEGORY_NONE;
info.hints = 0x0;
info.hints = 0x0;
info.binary = nullptr;
info.name = nullptr;
info.iconName = nullptr;
info.uniqueId = 0;
info.latency = 0;
info.type = CB::PLUGIN_NONE;
info.category = CB::PLUGIN_CATEGORY_NONE;
info.hints = 0x0;
info.optionsAvailable = 0x0; info.optionsAvailable = 0x0;
info.optionsEnabled = 0x0; info.optionsEnabled = 0x0;
info.binary = nullptr;
info.name = nullptr;
info.iconName = nullptr;
info.patchbayClientId = 0;
info.uniqueId = 0;


// cleanup // cleanup
if (info.label != nullptr) if (info.label != nullptr)
@@ -1084,7 +1120,6 @@ const CarlaPluginInfo* carla_get_plugin_info(unsigned int pluginId)
info.name = plugin->getName(); info.name = plugin->getName();
info.iconName = plugin->getIconName(); info.iconName = plugin->getIconName();
info.uniqueId = plugin->getUniqueId(); info.uniqueId = plugin->getUniqueId();
info.latency = plugin->getLatencyInFrames();


info.optionsAvailable = plugin->getAvailableOptions(); info.optionsAvailable = plugin->getAvailableOptions();
info.optionsEnabled = plugin->getOptions(); info.optionsEnabled = plugin->getOptions();
@@ -1386,6 +1421,7 @@ const char* carla_get_chunk_data(unsigned int pluginId)


if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
{ {
#ifdef USE_JUCE
if (plugin->getOptions() & CB::PLUGIN_OPTION_USE_CHUNKS) if (plugin->getOptions() & CB::PLUGIN_OPTION_USE_CHUNKS)
{ {
void* data = nullptr; void* data = nullptr;
@@ -1402,7 +1438,9 @@ const char* carla_get_chunk_data(unsigned int pluginId)
} }
else else
carla_stderr2("carla_get_chunk_data(%i) - plugin does not use chunks", pluginId); carla_stderr2("carla_get_chunk_data(%i) - plugin does not use chunks", pluginId);

#else
carla_stderr2("carla_get_chunk_data(%i) - unsupported", pluginId);
#endif
return nullptr; return nullptr;
} }


@@ -2047,7 +2085,7 @@ protected:
carla_msleep(100); carla_msleep(100);


if (std::strcmp(method, "/nsm/server/announce") == 0 && gStandalone.callback != nullptr) if (std::strcmp(method, "/nsm/server/announce") == 0 && gStandalone.callback != nullptr)
gStandalone.callback(gStandalone.callbackPtr, CB::CALLBACK_NSM_ANNOUNCE, 0, 0, 0, 0.0f, smName);
gStandalone.callback(gStandalone.callbackPtr, CB::ENGINE_CALLBACK_NSM_ANNOUNCE, 0, 0, 0, 0.0f, smName);


return 0; return 0;


@@ -2080,7 +2118,7 @@ protected:


fIsOpened = false; fIsOpened = false;


gStandalone.callback(nullptr, CB::CALLBACK_NSM_OPEN, 0, 0, 0, 0.0f, data);
gStandalone.callback(nullptr, CB::ENGINE_CALLBACK_NSM_OPEN, 0, 0, 0, 0.0f, data);


// wait max 10 secs to open // wait max 10 secs to open
for (int i=0; i < 100 && ! fIsOpened; ++i) for (int i=0; i < 100 && ! fIsOpened; ++i)
@@ -2115,7 +2153,7 @@ protected:


fIsSaved = false; fIsSaved = false;


gStandalone.callback(nullptr, CB::CALLBACK_NSM_SAVE, 0, 0, 0, 0.0f, nullptr);
gStandalone.callback(nullptr, CB::ENGINE_CALLBACK_NSM_SAVE, 0, 0, 0, 0.0f, nullptr);


// wait max 10 secs to save // wait max 10 secs to save
for (int i=0; i < 100 && ! fIsSaved; ++i) for (int i=0; i < 100 && ! fIsSaved; ++i)


+ 12
- 12
source/backend/standalone/Makefile View File

@@ -16,12 +16,12 @@ BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo)
LINK_FLAGS += $(shell pkg-config --libs liblo) LINK_FLAGS += $(shell pkg-config --libs liblo)


LINK_FLAGS += $(JACKBRIDGE_LIBS) LINK_FLAGS += $(JACKBRIDGE_LIBS)
LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS)
LINK_FLAGS += $(JUCE_CORE_LIBS)
LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
LINK_FLAGS += $(JUCE_EVENTS_LIBS)
LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
# LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS)
# LINK_FLAGS += $(JUCE_CORE_LIBS)
# LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
# LINK_FLAGS += $(JUCE_EVENTS_LIBS)
# LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
# LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
LINK_FLAGS += $(RTAUDIO_LIBS) LINK_FLAGS += $(RTAUDIO_LIBS)
LINK_FLAGS += $(RTMIDI_LIBS) LINK_FLAGS += $(RTMIDI_LIBS)
LINK_FLAGS += $(RTMEMPOOL_LIBS) LINK_FLAGS += $(RTMEMPOOL_LIBS)
@@ -76,12 +76,12 @@ LIBS += ../libcarla_plugin.a


LIBS += ../../modules/carla_native.a LIBS += ../../modules/carla_native.a
LIBS += ../../modules/jackbridge.a LIBS += ../../modules/jackbridge.a
LIBS += ../../modules/juce_audio_basics.a
LIBS += ../../modules/juce_core.a
LIBS += ../../modules/juce_data_structures.a
LIBS += ../../modules/juce_events.a
LIBS += ../../modules/juce_graphics.a
LIBS += ../../modules/juce_gui_basics.a
# LIBS += ../../modules/juce_audio_basics.a
# LIBS += ../../modules/juce_core.a
# LIBS += ../../modules/juce_data_structures.a
# LIBS += ../../modules/juce_events.a
# LIBS += ../../modules/juce_graphics.a
# LIBS += ../../modules/juce_gui_basics.a
LIBS += ../../modules/rtaudio.a LIBS += ../../modules/rtaudio.a
LIBS += ../../modules/rtmidi.a LIBS += ../../modules/rtmidi.a
LIBS += ../../modules/rtmempool.a LIBS += ../../modules/rtmempool.a


+ 188
- 184
source/utils/CarlaBackendUtils.hpp View File

@@ -50,10 +50,12 @@ const char* PluginOption2Str(const unsigned int option)
return "PLUGIN_OPTION_SEND_ALL_SOUND_OFF"; return "PLUGIN_OPTION_SEND_ALL_SOUND_OFF";
} }


carla_stderr("CarlaBackend::PluginOption2Str(%i) - invalid type", option);
carla_stderr("CarlaBackend::PluginOption2Str(%i) - invalid option", option);
return nullptr; return nullptr;
} }


// -----------------------------------------------------------------------

static inline static inline
const char* BinaryType2Str(const BinaryType type) const char* BinaryType2Str(const BinaryType type)
{ {
@@ -125,6 +127,8 @@ const char* PluginCategory2Str(const PluginCategory category)
return "PLUGIN_CATEGORY_EQ"; return "PLUGIN_CATEGORY_EQ";
case PLUGIN_CATEGORY_FILTER: case PLUGIN_CATEGORY_FILTER:
return "PLUGIN_CATEGORY_FILTER"; return "PLUGIN_CATEGORY_FILTER";
case PLUGIN_CATEGORY_DISTORTION:
return "PLUGIN_CATEGORY_DISTORTION";
case PLUGIN_CATEGORY_DYNAMICS: case PLUGIN_CATEGORY_DYNAMICS:
return "PLUGIN_CATEGORY_DYNAMICS"; return "PLUGIN_CATEGORY_DYNAMICS";
case PLUGIN_CATEGORY_MODULATOR: case PLUGIN_CATEGORY_MODULATOR:
@@ -150,16 +154,8 @@ const char* ParameterType2Str(const ParameterType type)
return "PARAMETER_INPUT"; return "PARAMETER_INPUT";
case PARAMETER_OUTPUT: case PARAMETER_OUTPUT:
return "PARAMETER_OUTPUT"; return "PARAMETER_OUTPUT";
case PARAMETER_LATENCY:
return "PARAMETER_LATENCY";
case PARAMETER_SAMPLE_RATE:
return "PARAMETER_SAMPLE_RATE";
#ifdef WANT_LV2
case PARAMETER_LV2_FREEWHEEL:
return "PARAMETER_LV2_FREEWHEEL";
case PARAMETER_LV2_TIME:
return "PARAMETER_LV2_TIME";
#endif
case PARAMETER_SPECIAL:
return "PARAMETER_SPECIAL";
} }


carla_stderr("CarlaBackend::ParameterType2Str(%i) - invalid type", type); carla_stderr("CarlaBackend::ParameterType2Str(%i) - invalid type", type);
@@ -167,7 +163,7 @@ const char* ParameterType2Str(const ParameterType type)
} }


static inline static inline
const char* InternalParametersIndex2Str(const InternalParametersIndex index)
const char* InternalParameterIndex2Str(const InternalParameterIndex index)
{ {
switch (index) switch (index)
{ {
@@ -191,211 +187,215 @@ const char* InternalParametersIndex2Str(const InternalParametersIndex index)
return "PARAMETER_MAX"; return "PARAMETER_MAX";
} }


carla_stderr("CarlaBackend::InternalParametersIndex2Str(%i) - invalid index", index);
carla_stderr("CarlaBackend::InternalParameterIndex2Str(%i) - invalid index", index);
return nullptr; return nullptr;
} }


static inline static inline
const char* OptionsType2Str(const OptionsType option)
const char* EngineCallbackOpcode2Str(const EngineCallbackOpcode opcode)
{ {
switch (option)
switch (opcode)
{ {
case OPTION_PROCESS_NAME:
return "OPTION_PROCESS_NAME";
case OPTION_PROCESS_MODE:
return "OPTION_PROCESS_MODE";
case OPTION_TRANSPORT_MODE:
return "OPTION_TRANSPORT_MODE";
case OPTION_FORCE_STEREO:
return "OPTION_FORCE_STEREO";
case OPTION_PREFER_PLUGIN_BRIDGES:
return "OPTION_PREFER_PLUGIN_BRIDGES";
case OPTION_PREFER_UI_BRIDGES:
return "OPTION_PREFER_UI_BRIDGES";
case OPTION_UIS_ALWAYS_ON_TOP:
return "OPTION_UIS_ALWAYS_ON_TOP";
case OPTION_MAX_PARAMETERS:
return "OPTION_MAX_PARAMETERS";
case OPTION_UI_BRIDGES_TIMEOUT:
return "OPTION_UI_BRIDGES_TIMEOUT";
case OPTION_AUDIO_NUM_PERIODS:
return "OPTION_AUDIO_NUM_PERIODS";
case OPTION_AUDIO_BUFFER_SIZE:
return "OPTION_AUDIO_BUFFER_SIZE";
case OPTION_AUDIO_SAMPLE_RATE:
return "OPTION_AUDIO_SAMPLE_RATE";
case OPTION_AUDIO_DEVICE:
return "OPTION_AUDIO_DEVICE";
case OPTION_PATH_RESOURCES:
return "OPTION_PATH_RESOURCES";
#ifndef BUILD_BRIDGE
case OPTION_PATH_BRIDGE_NATIVE:
return "OPTION_PATH_BRIDGE_NATIVE";
case OPTION_PATH_BRIDGE_POSIX32:
return "OPTION_PATH_BRIDGE_POSIX32";
case OPTION_PATH_BRIDGE_POSIX64:
return "OPTION_PATH_BRIDGE_POSIX64";
case OPTION_PATH_BRIDGE_WIN32:
return "OPTION_PATH_BRIDGE_WIN32";
case OPTION_PATH_BRIDGE_WIN64:
return "OPTION_PATH_BRIDGE_WIN64";
#endif
#ifdef WANT_LV2
case OPTION_PATH_BRIDGE_LV2_EXTERNAL:
return "OPTION_PATH_BRIDGE_LV2_EXTERNAL";
case OPTION_PATH_BRIDGE_LV2_GTK2:
return "OPTION_PATH_BRIDGE_LV2_GTK2";
case OPTION_PATH_BRIDGE_LV2_GTK3:
return "OPTION_PATH_BRIDGE_LV2_GTK3";
case OPTION_PATH_BRIDGE_LV2_QT4:
return "OPTION_PATH_BRIDGE_LV2_QT4";
case OPTION_PATH_BRIDGE_LV2_QT5:
return "OPTION_PATH_BRIDGE_LV2_QT5";
case OPTION_PATH_BRIDGE_LV2_COCOA:
return "OPTION_PATH_BRIDGE_LV2_COCOA";
case OPTION_PATH_BRIDGE_LV2_WINDOWS:
return "OPTION_PATH_BRIDGE_LV2_WINDOWS";
case OPTION_PATH_BRIDGE_LV2_X11:
return "OPTION_PATH_BRIDGE_LV2_X11";
#endif
#ifdef WANT_VST
case OPTION_PATH_BRIDGE_VST_MAC:
return "OPTION_PATH_BRIDGE_VST_MAC";
case OPTION_PATH_BRIDGE_VST_HWND:
return "OPTION_PATH_BRIDGE_VST_HWND";
case OPTION_PATH_BRIDGE_VST_X11:
return "OPTION_PATH_BRIDGE_VST_X11";
#endif
case ENGINE_CALLBACK_DEBUG:
return "ENGINE_CALLBACK_DEBUG";
case ENGINE_CALLBACK_PLUGIN_ADDED:
return "ENGINE_CALLBACK_PLUGIN_ADDED";
case ENGINE_CALLBACK_PLUGIN_REMOVED:
return "ENGINE_CALLBACK_PLUGIN_REMOVED";
case ENGINE_CALLBACK_PLUGIN_RENAMED:
return "ENGINE_CALLBACK_PLUGIN_RENAMED";
case ENGINE_CALLBACK_PLUGIN_DISABLED:
return "ENGINE_CALLBACK_PLUGIN_DISABLED";
case ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED:
return "ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED";
case ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED:
return "ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED";
case ENGINE_CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
return "ENGINE_CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED";
case ENGINE_CALLBACK_PARAMETER_MIDI_CC_CHANGED:
return "ENGINE_CALLBACK_PARAMETER_MIDI_CC_CHANGED";
case ENGINE_CALLBACK_PROGRAM_CHANGED:
return "ENGINE_CALLBACK_PROGRAM_CHANGED";
case ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED:
return "ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED";
case ENGINE_CALLBACK_UI_STATE_CHANGED:
return "ENGINE_CALLBACK_UI_STATE_CHANGED";
case ENGINE_CALLBACK_NOTE_ON:
return "ENGINE_CALLBACK_NOTE_ON";
case ENGINE_CALLBACK_NOTE_OFF:
return "ENGINE_CALLBACK_NOTE_OFF";
case ENGINE_CALLBACK_UPDATE:
return "ENGINE_CALLBACK_UPDATE";
case ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED:
return "ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED";
case ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED:
return "ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED";
case ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED:
return "ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED";
case ENGINE_CALLBACK_PATCHBAY_PORT_ADDED:
return "ENGINE_CALLBACK_PATCHBAY_PORT_ADDED";
case ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED:
return "ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED";
case ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED:
return "ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED";
case ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED:
return "ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED";
case ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED:
return "ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED";
case ENGINE_CALLBACK_PATCHBAY_ICON_CHANGED:
return "ENGINE_CALLBACK_PATCHBAY_ICON_CHANGED";
case ENGINE_CALLBACK_RELOAD_INFO:
return "ENGINE_CALLBACK_RELOAD_INFO";
case ENGINE_CALLBACK_RELOAD_PARAMETERS:
return "ENGINE_CALLBACK_RELOAD_PARAMETERS";
case ENGINE_CALLBACK_RELOAD_PROGRAMS:
return "ENGINE_CALLBACK_RELOAD_PROGRAMS";
case ENGINE_CALLBACK_RELOAD_ALL:
return "ENGINE_CALLBACK_RELOAD_ALL";
case ENGINE_CALLBACK_BUFFER_SIZE_CHANGED:
return "ENGINE_CALLBACK_BUFFER_SIZE_CHANGED";
case ENGINE_CALLBACK_SAMPLE_RATE_CHANGED:
return "ENGINE_CALLBACK_SAMPLE_RATE_CHANGED";
case ENGINE_CALLBACK_PROCESS_MODE_CHANGED:
return "ENGINE_CALLBACK_PROCESS_MODE_CHANGED";
case ENGINE_CALLBACK_ENGINE_STARTED:
return "ENGINE_CALLBACK_ENGINE_STARTED";
case ENGINE_CALLBACK_ENGINE_STOPPED:
return "ENGINE_CALLBACK_ENGINE_STOPPED";
case ENGINE_CALLBACK_NSM_ANNOUNCE:
return "ENGINE_CALLBACK_NSM_ANNOUNCE";
case ENGINE_CALLBACK_NSM_OPEN:
return "ENGINE_CALLBACK_NSM_OPEN";
case ENGINE_CALLBACK_NSM_SAVE:
return "ENGINE_CALLBACK_NSM_SAVE";
case ENGINE_CALLBACK_ERROR:
return "ENGINE_CALLBACK_ERROR";
case ENGINE_CALLBACK_INFO:
return "ENGINE_CALLBACK_INFO";
case ENGINE_CALLBACK_QUIT:
return "ENGINE_CALLBACK_QUIT";
} }


carla_stderr("CarlaBackend::OptionsType2Str(%i) - invalid option", option);
carla_stderr("CarlaBackend::EngineCallbackOpcode2Str(%i) - invalid opcode", opcode);
return nullptr; return nullptr;
} }


static inline static inline
const char* CallbackType2Str(const CallbackType type)
const char* EngineOption2Str(const EngineOption option)
{ {
switch (type)
switch (option)
{ {
case CALLBACK_DEBUG:
return "CALLBACK_DEBUG";
case CALLBACK_PLUGIN_ADDED:
return "CALLBACK_PLUGIN_ADDED";
case CALLBACK_PLUGIN_REMOVED:
return "CALLBACK_PLUGIN_REMOVED";
case CALLBACK_PLUGIN_RENAMED:
return "CALLBACK_PLUGIN_RENAMED";
case CALLBACK_PARAMETER_VALUE_CHANGED:
return "CALLBACK_PARAMETER_VALUE_CHANGED";
case CALLBACK_PARAMETER_DEFAULT_CHANGED:
return "CALLBACK_PARAMETER_DEFAULT_CHANGED";
case CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
return "CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED";
case CALLBACK_PARAMETER_MIDI_CC_CHANGED:
return "CALLBACK_PARAMETER_MIDI_CC_CHANGED";
case CALLBACK_PROGRAM_CHANGED:
return "CALLBACK_PROGRAM_CHANGED";
case CALLBACK_MIDI_PROGRAM_CHANGED:
return "CALLBACK_MIDI_PROGRAM_CHANGED";
case CALLBACK_NOTE_ON:
return "CALLBACK_NOTE_ON";
case CALLBACK_NOTE_OFF:
return "CALLBACK_NOTE_OFF";
case CALLBACK_SHOW_GUI:
return "CALLBACK_SHOW_GUI";
case CALLBACK_UPDATE:
return "CALLBACK_UPDATE";
case CALLBACK_PATCHBAY_CLIENT_ADDED:
return "CALLBACK_PATCHBAY_CLIENT_ADDED";
case CALLBACK_PATCHBAY_CLIENT_REMOVED:
return "CALLBACK_PATCHBAY_CLIENT_REMOVED";
case CALLBACK_PATCHBAY_CLIENT_RENAMED:
return "CALLBACK_PATCHBAY_CLIENT_RENAMED";
case CALLBACK_PATCHBAY_PORT_ADDED:
return "CALLBACK_PATCHBAY_PORT_ADDED";
case CALLBACK_PATCHBAY_PORT_REMOVED:
return "CALLBACK_PATCHBAY_PORT_REMOVED";
case CALLBACK_PATCHBAY_PORT_RENAMED:
return "CALLBACK_PATCHBAY_PORT_RENAMED";
case CALLBACK_PATCHBAY_CONNECTION_ADDED:
return "CALLBACK_PATCHBAY_CONNECTION_ADDED";
case CALLBACK_PATCHBAY_CONNECTION_REMOVED:
return "CALLBACK_PATCHBAY_CONNECTION_REMOVED";
case CALLBACK_PATCHBAY_ICON_CHANGED:
return "CALLBACK_PATCHBAY_ICON_CHANGED";
case CALLBACK_RELOAD_INFO:
return "CALLBACK_RELOAD_INFO";
case CALLBACK_RELOAD_PARAMETERS:
return "CALLBACK_RELOAD_PARAMETERS";
case CALLBACK_RELOAD_PROGRAMS:
return "CALLBACK_RELOAD_PROGRAMS";
case CALLBACK_RELOAD_ALL:
return "CALLBACK_RELOAD_ALL";
case CALLBACK_BUFFER_SIZE_CHANGED:
return "CALLBACK_BUFFER_SIZE_CHANGED";
case CALLBACK_SAMPLE_RATE_CHANGED:
return "CALLBACK_SAMPLE_RATE_CHANGED";
case CALLBACK_PROCESS_MODE_CHANGED:
return "CALLBACK_PROCESS_MODE_CHANGED";
case CALLBACK_ENGINE_STARTED:
return "CALLBACK_ENGINE_STARTED";
case CALLBACK_ENGINE_STOPPED:
return "CALLBACK_ENGINE_STOPPED";
case CALLBACK_NSM_ANNOUNCE:
return "CALLBACK_NSM_ANNOUNCE";
case CALLBACK_NSM_OPEN:
return "CALLBACK_NSM_OPEN";
case CALLBACK_NSM_SAVE:
return "CALLBACK_NSM_SAVE";
case CALLBACK_ERROR:
return "CALLBACK_ERROR";
case CALLBACK_INFO:
return "CALLBACK_INFO";
case CALLBACK_QUIT:
return "CALLBACK_QUIT";
case ENGINE_OPTION_PROCESS_NAME:
return "ENGINE_OPTION_PROCESS_NAME";
case ENGINE_OPTION_PROCESS_MODE:
return "ENGINE_OPTION_PROCESS_MODE";
case ENGINE_OPTION_TRANSPORT_MODE:
return "ENGINE_OPTION_TRANSPORT_MODE";
case ENGINE_OPTION_FORCE_STEREO:
return "ENGINE_OPTION_FORCE_STEREO";
case ENGINE_OPTION_PREFER_PLUGIN_BRIDGES:
return "ENGINE_OPTION_PREFER_PLUGIN_BRIDGES";
case ENGINE_OPTION_PREFER_UI_BRIDGES:
return "ENGINE_OPTION_PREFER_UI_BRIDGES";
case ENGINE_OPTION_UIS_ALWAYS_ON_TOP:
return "ENGINE_OPTION_UIS_ALWAYS_ON_TOP";
case ENGINE_OPTION_MAX_PARAMETERS:
return "ENGINE_OPTION_MAX_PARAMETERS";
case ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
return "ENGINE_OPTION_UI_BRIDGES_TIMEOUT";
case ENGINE_OPTION_AUDIO_NUM_PERIODS:
return "ENGINE_OPTION_AUDIO_NUM_PERIODS";
case ENGINE_OPTION_AUDIO_BUFFER_SIZE:
return "ENGINE_OPTION_AUDIO_BUFFER_SIZE";
case ENGINE_OPTION_AUDIO_SAMPLE_RATE:
return "ENGINE_OPTION_AUDIO_SAMPLE_RATE";
case ENGINE_OPTION_AUDIO_DEVICE:
return "ENGINE_OPTION_AUDIO_DEVICE";
case ENGINE_OPTION_PATH_RESOURCES:
return "ENGINE_OPTION_PATH_RESOURCES";
#ifndef BUILD_BRIDGE
case ENGINE_OPTION_PATH_BRIDGE_NATIVE:
return "ENGINE_OPTION_PATH_BRIDGE_NATIVE";
case ENGINE_OPTION_PATH_BRIDGE_POSIX32:
return "ENGINE_OPTION_PATH_BRIDGE_POSIX32";
case ENGINE_OPTION_PATH_BRIDGE_POSIX64:
return "ENGINE_OPTION_PATH_BRIDGE_POSIX64";
case ENGINE_OPTION_PATH_BRIDGE_WIN32:
return "ENGINE_OPTION_PATH_BRIDGE_WIN32";
case ENGINE_OPTION_PATH_BRIDGE_WIN64:
return "ENGINE_OPTION_PATH_BRIDGE_WIN64";
#endif
#ifdef WANT_LV2
case ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL";
case ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2";
case ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3";
case ENGINE_OPTION_PATH_BRIDGE_LV2_NTK:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_NTK";
case ENGINE_OPTION_PATH_BRIDGE_LV2_QT4:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_QT4";
case ENGINE_OPTION_PATH_BRIDGE_LV2_QT5:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_QT5";
case ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA";
case ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS";
case ENGINE_OPTION_PATH_BRIDGE_LV2_X11:
return "ENGINE_OPTION_PATH_BRIDGE_LV2_X11";
#endif
#ifdef WANT_VST
case ENGINE_OPTION_PATH_BRIDGE_VST_MAC:
return "ENGINE_OPTION_PATH_BRIDGE_VST_MAC";
case ENGINE_OPTION_PATH_BRIDGE_VST_HWND:
return "ENGINE_OPTION_PATH_BRIDGE_VST_HWND";
case ENGINE_OPTION_PATH_BRIDGE_VST_X11:
return "ENGINE_OPTION_PATH_BRIDGE_VST_X11";
#endif
} }


carla_stderr("CarlaBackend::CallbackType2Str(%i) - invalid type", type);
carla_stderr("CarlaBackend::EngineOption2Str(%i) - invalid option", option);
return nullptr; return nullptr;
} }


static inline static inline
const char* ProcessMode2Str(const ProcessMode mode)
const char* EngineProcessMode2Str(const EngineProcessMode mode)
{ {
switch (mode) switch (mode)
{ {
case PROCESS_MODE_SINGLE_CLIENT:
return "PROCESS_MODE_SINGLE_CLIENT";
case PROCESS_MODE_MULTIPLE_CLIENTS:
return "PROCESS_MODE_MULTIPLE_CLIENTS";
case PROCESS_MODE_CONTINUOUS_RACK:
return "PROCESS_MODE_CONTINUOUS_RACK";
case PROCESS_MODE_PATCHBAY:
return "PROCESS_MODE_PATCHBAY";
case PROCESS_MODE_BRIDGE:
return "PROCESS_MODE_BRIDGE";
case ENGINE_PROCESS_MODE_SINGLE_CLIENT:
return "ENGINE_PROCESS_MODE_SINGLE_CLIENT";
case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS:
return "ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS";
case ENGINE_PROCESS_MODE_CONTINUOUS_RACK:
return "ENGINE_PROCESS_MODE_CONTINUOUS_RACK";
case ENGINE_PROCESS_MODE_PATCHBAY:
return "ENGINE_PROCESS_MODE_PATCHBAY";
case ENGINE_PROCESS_MODE_BRIDGE:
return "ENGINE_PROCESS_MODE_BRIDGE";
} }


carla_stderr("CarlaBackend::ProcessMode2Str(%i) - invalid mode", mode);
carla_stderr("CarlaBackend::EngineProcessMode2Str(%i) - invalid mode", mode);
return nullptr; return nullptr;
} }


static inline static inline
const char* TransportMode2Str(const TransportMode mode)
const char* EngineTransportMode2Str(const EngineTransportMode mode)
{ {
switch (mode) switch (mode)
{ {
case TRANSPORT_MODE_INTERNAL:
return "TRANSPORT_MODE_INTERNAL";
case TRANSPORT_MODE_JACK:
return "TRANSPORT_MODE_JACK";
case TRANSPORT_MODE_PLUGIN:
return "TRANSPORT_MODE_PLUGIN";
case TRANSPORT_MODE_BRIDGE:
return "TRANSPORT_MODE_BRIDGE";
case ENGINE_TRANSPORT_MODE_INTERNAL:
return "ENGINE_TRANSPORT_MODE_INTERNAL";
case ENGINE_TRANSPORT_MODE_JACK:
return "ENGINE_TRANSPORT_MODE_JACK";
case ENGINE_TRANSPORT_MODE_PLUGIN:
return "ENGINE_TRANSPORT_MODE_PLUGIN";
case ENGINE_TRANSPORT_MODE_BRIDGE:
return "ENGINE_TRANSPORT_MODE_BRIDGE";
} }


carla_stderr("CarlaBackend::TransportMode2Str(%i) - invalid mode", mode);
carla_stderr("CarlaBackend::EngineTransportMode2Str(%i) - invalid mode", mode);
return nullptr; return nullptr;
} }


@@ -425,7 +425,7 @@ T* getPointerFromAddress(uintptr_t& addr)
static inline static inline
const char* getPluginTypeAsString(const PluginType type) const char* getPluginTypeAsString(const PluginType type)
{ {
carla_debug("CarlaBackend::getPluginTypeAsString(%s)", PluginType2Str(type));
carla_debug("CarlaBackend::getPluginTypeAsString(%i:%s)", type, PluginType2Str(type));


switch (type) switch (type)
{ {
@@ -518,6 +518,10 @@ PluginCategory getPluginCategoryFromName(const char* const name)
if (sname.contains("filter")) if (sname.contains("filter"))
return PLUGIN_CATEGORY_FILTER; return PLUGIN_CATEGORY_FILTER;


// distortion
if (sname.contains("distortion"))
return PLUGIN_CATEGORY_DISTORTION;

// dynamics // dynamics
if (sname.contains("dynamics")) if (sname.contains("dynamics"))
return PLUGIN_CATEGORY_DYNAMICS; return PLUGIN_CATEGORY_DYNAMICS;


+ 5
- 1
source/utils/CarlaStateUtils.hpp View File

@@ -22,7 +22,9 @@
#include "CarlaMIDI.h" #include "CarlaMIDI.h"
#include "List.hpp" #include "List.hpp"


#include "juce_core.h"
#ifdef USE_JUCE
# include "juce_core.h"
#endif


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -211,6 +213,7 @@ struct SaveState {
CARLA_DECLARE_NON_COPY_STRUCT(SaveState) CARLA_DECLARE_NON_COPY_STRUCT(SaveState)
}; };


#ifdef USE_JUCE
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


static inline static inline
@@ -578,6 +581,7 @@ void fillXmlStringFromSaveState(juce::String& content, const SaveState& saveStat
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
#endif


CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_END_NAMESPACE




+ 2
- 1
source/utils/CarlaString.hpp View File

@@ -18,7 +18,7 @@
#ifndef CARLA_STRING_HPP_INCLUDED #ifndef CARLA_STRING_HPP_INCLUDED
#define CARLA_STRING_HPP_INCLUDED #define CARLA_STRING_HPP_INCLUDED


#include "CarlaUtils.hpp"
#include "CarlaJuceUtils.hpp"


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// CarlaString class // CarlaString class
@@ -677,6 +677,7 @@ private:
} }
} }


CARLA_LEAK_DETECTOR(CarlaString)
CARLA_PREVENT_HEAP_ALLOCATION CARLA_PREVENT_HEAP_ALLOCATION
}; };




+ 3
- 4
source/utils/CarlaThread.hpp View File

@@ -40,7 +40,7 @@ protected:
/* /*
* Destructor. * Destructor.
*/ */
~CarlaThread()
virtual ~CarlaThread()
{ {
CARLA_SAFE_ASSERT(! isRunning()); CARLA_SAFE_ASSERT(! isRunning());


@@ -155,7 +155,7 @@ public:


private: private:
const CarlaString fName; // Thread name const CarlaString fName; // Thread name
volatile CarlaMutex fLock; // Thread lock
CarlaMutex fLock; // Thread lock
volatile pthread_t fHandle; // Handle for this thread volatile pthread_t fHandle; // Handle for this thread
volatile bool fShouldExit; // true if thread should exit volatile bool fShouldExit; // true if thread should exit


@@ -186,8 +186,7 @@ private:
return nullptr; return nullptr;
} }


CARLA_PREVENT_HEAP_ALLOCATION
CARLA_DECLARE_NON_COPY_CLASS(CarlaThread)
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaThread)
}; };


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


+ 70
- 1
source/utils/CarlaUtils.hpp View File

@@ -231,7 +231,7 @@ const char* carla_strdup_free(char* const strBuf)
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// math functions
// math functions (base)


/* /*
* Return the lower of 2 values, with 'min' as the minimum possible value. * Return the lower of 2 values, with 'min' as the minimum possible value.
@@ -299,6 +299,36 @@ void carla_add(T* dataDst, const T* dataSrc, const size_t size)
*dataDst++ += *dataSrc++; *dataDst++ += *dataSrc++;
} }


/*
* Copy array values to another array.
*/
template<typename T>
static inline
void carla_copy(T* dataDst, T* dataSrc, const size_t size)
{
CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,);
CARLA_SAFE_ASSERT_RETURN(size > 0,);

for (size_t i=0; i < size; ++i)
*dataDst++ = *dataSrc++;
}

/*
* Copy array values to another array.
*/
template<typename T>
static inline
void carla_copy(T* dataDst, const T* dataSrc, const size_t size)
{
CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,);
CARLA_SAFE_ASSERT_RETURN(size > 0,);

for (size_t i=0; i < size; ++i)
*dataDst++ = *dataSrc++;
}

/* /*
* Fill an array with a fixed value. * Fill an array with a fixed value.
*/ */
@@ -313,6 +343,36 @@ void carla_fill(T* data, const size_t size, const T v)
*data++ = v; *data++ = v;
} }


// -----------------------------------------------------------------------
// math functions (extended)

/*
* Add float array values to another float array.
*/
static inline
void carla_addFloat(float* dataDst, float* dataSrc, const size_t numSamples)
{
CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,);
CARLA_SAFE_ASSERT_RETURN(numSamples > 0,);

for (size_t i=0; i < numSamples; ++i)
*dataDst++ += *dataSrc++;
}

/*
* Copy float array values to another float array.
*/
static inline
void carla_copyFloat(float* const dataDst, float* const dataSrc, const size_t numSamples)
{
CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,);
CARLA_SAFE_ASSERT_RETURN(numSamples > 0,);

std::memcpy(dataDst, dataSrc, numSamples*sizeof(float));
}

#if defined(CARLA_OS_MAC) && ! defined(DISTRHO_OS_MAC) #if defined(CARLA_OS_MAC) && ! defined(DISTRHO_OS_MAC)
/* /*
* Missing functions in OSX. * Missing functions in OSX.
@@ -346,6 +406,15 @@ void carla_zeroChar(C* const data, const size_t numChars)
std::memset(data, 0, numChars*sizeof(C)); std::memset(data, 0, numChars*sizeof(C));
} }


/*
* Clear a float array.
*/
static inline
void carla_zeroFloat(float* const data, const size_t numSamples)
{
std::memset(data, 0, numSamples*sizeof(float));
}

/* /*
* Clear a memory location. * Clear a memory location.
*/ */


Loading…
Cancel
Save