@@ -15,22 +15,20 @@ | |||||
* For a full copy of the GNU General Public License see the COPYING file | * For a full copy of the GNU General Public License see the COPYING file | ||||
*/ | */ | ||||
#include "carla_shared.hpp" | |||||
#include "carla_engine.hpp" | |||||
#ifndef CARLA_BACKEND_UTILS_HPP | |||||
#define CARLA_BACKEND_UTILS_HPP | |||||
//#ifndef BUILD_BRIDGE | |||||
//# include "carla_native.h" | |||||
//#endif | |||||
#include "carla_backend.hpp" | |||||
#include <QtCore/QString> | #include <QtCore/QString> | ||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
static const char* carlaLastError = nullptr; | |||||
class CarlaEngine; | |||||
class CarlaPlugin; | |||||
// ------------------------------------------------------------------------------------------------------------------- | |||||
const char* BinaryType2str(const BinaryType type) | |||||
static inline | |||||
const char* BinaryType2Str(const BinaryType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -52,7 +50,8 @@ const char* BinaryType2str(const BinaryType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* PluginType2str(const PluginType type) | |||||
static inline | |||||
const char* PluginType2Str(const PluginType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -80,7 +79,8 @@ const char* PluginType2str(const PluginType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* PluginCategory2str(const PluginCategory category) | |||||
static inline | |||||
const char* PluginCategory2Str(const PluginCategory category) | |||||
{ | { | ||||
switch (category) | switch (category) | ||||
{ | { | ||||
@@ -108,7 +108,8 @@ const char* PluginCategory2str(const PluginCategory category) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* ParameterType2str(const ParameterType type) | |||||
static inline | |||||
const char* ParameterType2Str(const ParameterType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -132,7 +133,8 @@ const char* ParameterType2str(const ParameterType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* InternalParametersIndex2str(const InternalParametersIndex index) | |||||
static inline | |||||
const char* InternalParametersIndex2Str(const InternalParametersIndex index) | |||||
{ | { | ||||
switch (index) | switch (index) | ||||
{ | { | ||||
@@ -154,7 +156,8 @@ const char* InternalParametersIndex2str(const InternalParametersIndex index) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* CustomDataType2str(const CustomDataType type) | |||||
static inline | |||||
const char* CustomDataType2Str(const CustomDataType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -174,7 +177,8 @@ const char* CustomDataType2str(const CustomDataType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* GuiType2str(const GuiType type) | |||||
static inline | |||||
const char* GuiType2Str(const GuiType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -200,7 +204,8 @@ const char* GuiType2str(const GuiType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* OptionsType2str(const OptionsType type) | |||||
static inline | |||||
const char* OptionsType2Str(const OptionsType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -266,7 +271,8 @@ const char* OptionsType2str(const OptionsType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* CallbackType2str(const CallbackType type) | |||||
static inline | |||||
const char* CallbackType2Str(const CallbackType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -318,7 +324,8 @@ const char* CallbackType2str(const CallbackType type) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const char* ProcessModeType2str(const ProcessModeType type) | |||||
static inline | |||||
const char* ProcessModeType2Str(const ProcessModeType type) | |||||
{ | { | ||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -336,6 +343,7 @@ const char* ProcessModeType2str(const ProcessModeType type) | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
static inline | |||||
CustomDataType getCustomDataStringType(const char* const stype) | CustomDataType getCustomDataStringType(const char* const stype) | ||||
{ | { | ||||
qDebug("CarlaBackend::getCustomDataStringType(\"%s\")", stype); | qDebug("CarlaBackend::getCustomDataStringType(\"%s\")", stype); | ||||
@@ -351,9 +359,10 @@ CustomDataType getCustomDataStringType(const char* const stype) | |||||
return CUSTOM_DATA_INVALID; | return CUSTOM_DATA_INVALID; | ||||
} | } | ||||
static inline | |||||
const char* getCustomDataTypeString(const CustomDataType type) | const char* getCustomDataTypeString(const CustomDataType type) | ||||
{ | { | ||||
qDebug("CarlaBackend::getCustomDataTypeString(%s)", CustomDataType2str(type)); | |||||
qDebug("CarlaBackend::getCustomDataTypeString(%s)", CustomDataType2Str(type)); | |||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -370,30 +379,10 @@ const char* getCustomDataTypeString(const CustomDataType type) | |||||
} | } | ||||
} | } | ||||
const char* getBinaryBidgePath(const BinaryType type) | |||||
{ | |||||
qDebug("CarlaBackend::getBinaryBidgePath(%s)", BinaryType2str(type)); | |||||
switch (type) | |||||
{ | |||||
#ifndef BUILD_BRIDGE | |||||
// case BINARY_POSIX32: | |||||
// return CarlaEngine::options.bridge_posix32; | |||||
// case BINARY_POSIX64: | |||||
// return CarlaEngine::options.bridge_posix64; | |||||
// case BINARY_WIN32: | |||||
// return CarlaEngine::options.bridge_win32; | |||||
// case BINARY_WIN64: | |||||
// return CarlaEngine::options.bridge_win64; | |||||
#endif | |||||
default: | |||||
return nullptr; | |||||
} | |||||
} | |||||
static inline | |||||
const char* getPluginTypeString(const PluginType type) | const char* getPluginTypeString(const PluginType type) | ||||
{ | { | ||||
qDebug("CarlaBackend::getPluginTypeString(%s)", PluginType2str(type)); | |||||
qDebug("CarlaBackend::getPluginTypeString(%s)", PluginType2Str(type)); | |||||
switch (type) | switch (type) | ||||
{ | { | ||||
@@ -422,6 +411,7 @@ const char* getPluginTypeString(const PluginType type) | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
static inline | |||||
void* getPointer(const uintptr_t addr) | void* getPointer(const uintptr_t addr) | ||||
{ | { | ||||
CARLA_ASSERT(addr != 0); | CARLA_ASSERT(addr != 0); | ||||
@@ -431,6 +421,7 @@ void* getPointer(const uintptr_t addr) | |||||
return (void*)ptr; | return (void*)ptr; | ||||
} | } | ||||
static inline | |||||
PluginCategory getPluginCategoryFromName(const char* const name) | PluginCategory getPluginCategoryFromName(const char* const name) | ||||
{ | { | ||||
CARLA_ASSERT(name); | CARLA_ASSERT(name); | ||||
@@ -506,41 +497,6 @@ PluginCategory getPluginCategoryFromName(const char* const name) | |||||
return PLUGIN_CATEGORY_NONE; | return PLUGIN_CATEGORY_NONE; | ||||
} | } | ||||
// ------------------------------------------------------------------------------------------------------------------- | |||||
const char* getLastError() | |||||
{ | |||||
qDebug("CarlaBackend::getLastError()"); | |||||
return carlaLastError; | |||||
} | |||||
void setLastError(const char* const error) | |||||
{ | |||||
qDebug("CarlaBackend::setLastError(\"%s\")", error); | |||||
if (carlaLastError) | |||||
free((void*)carlaLastError); | |||||
carlaLastError = error ? strdup(error) : nullptr; | |||||
} | |||||
// ------------------------------------------------------------------------------------------------------------------- | |||||
#ifndef BUILD_BRIDGE | |||||
uint32_t getPluginHintsFromNative(const uint32_t nativeHints) | |||||
{ | |||||
uint32_t realHints = 0; | |||||
// if (nativeHints & ::PLUGIN_IS_SYNTH) | |||||
// realHints |= PLUGIN_IS_SYNTH; | |||||
// if (nativeHints & ::PLUGIN_HAS_GUI) | |||||
// realHints |= PLUGIN_HAS_GUI; | |||||
// if (nativeHints & ::PLUGIN_USES_SINGLE_THREAD) | |||||
// realHints |= PLUGIN_USES_SINGLE_THREAD; | |||||
return realHints; | |||||
} | |||||
#endif // BUILD_BRIDGE | |||||
CARLA_BACKEND_END_NAMESPACE | CARLA_BACKEND_END_NAMESPACE | ||||
#endif // CARLA_BACKEND_UTILS_HPP |
@@ -34,6 +34,45 @@ double abs_d(const double& value) | |||||
return (value < 0.0) ? -value : value; | return (value < 0.0) ? -value : value; | ||||
} | } | ||||
static const char* carlaLastError = nullptr; | |||||
// ------------------------------------------------------------------------------------------------------------------- | |||||
// ------------------------------------------------------------------------------------------------------------------- | |||||
const char* getLastError() | |||||
{ | |||||
qDebug("CarlaBackend::getLastError()"); | |||||
return carlaLastError; | |||||
} | |||||
void setLastError(const char* const error) | |||||
{ | |||||
qDebug("CarlaBackend::setLastError(\"%s\")", error); | |||||
if (carlaLastError) | |||||
free((void*)carlaLastError); | |||||
carlaLastError = error ? strdup(error) : nullptr; | |||||
} | |||||
#ifndef BUILD_BRIDGE | |||||
uint32_t getPluginHintsFromNative(const uint32_t nativeHints) | |||||
{ | |||||
uint32_t realHints = 0; | |||||
// if (nativeHints & ::PLUGIN_IS_SYNTH) | |||||
// realHints |= PLUGIN_IS_SYNTH; | |||||
// if (nativeHints & ::PLUGIN_HAS_GUI) | |||||
// realHints |= PLUGIN_HAS_GUI; | |||||
// if (nativeHints & ::PLUGIN_USES_SINGLE_THREAD) | |||||
// realHints |= PLUGIN_USES_SINGLE_THREAD; | |||||
return realHints; | |||||
} | |||||
#endif // BUILD_BRIDGE | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
unsigned short CarlaEngine::m_maxPluginNumber = 0; | unsigned short CarlaEngine::m_maxPluginNumber = 0; | ||||
@@ -4,7 +4,7 @@ | |||||
# Project related configuration options | # Project related configuration options | ||||
#--------------------------------------------------------------------------- | #--------------------------------------------------------------------------- | ||||
DOXYFILE_ENCODING = UTF-8 | DOXYFILE_ENCODING = UTF-8 | ||||
PROJECT_NAME = "Carla Native" | |||||
PROJECT_NAME = "Carla Engine" | |||||
PROJECT_NUMBER = | PROJECT_NUMBER = | ||||
PROJECT_BRIEF = | PROJECT_BRIEF = | ||||
PROJECT_LOGO = | PROJECT_LOGO = | ||||
@@ -19,8 +19,7 @@ | |||||
#define CARLA_ENGINE_HPP | #define CARLA_ENGINE_HPP | ||||
#include "carla_engine_osc.hpp" | #include "carla_engine_osc.hpp" | ||||
#include "carla_shared.hpp" // FIXME - remove | |||||
#include "carla_threads.hpp" // FIXME - remove | |||||
#include "carla_engine_thread.hpp" | |||||
#ifdef CARLA_ENGINE_JACK | #ifdef CARLA_ENGINE_JACK | ||||
typedef struct _jack_client jack_client_t; | typedef struct _jack_client jack_client_t; | ||||
@@ -315,6 +314,12 @@ public: | |||||
void callback(const CallbackType action, const unsigned short pluginId, const int value1, const int value2, const double value3); | void callback(const CallbackType action, const unsigned short pluginId, const int value1, const int value2, const double value3); | ||||
void setCallback(const CallbackFunc func, void* const ptr); | void setCallback(const CallbackFunc func, void* const ptr); | ||||
// ------------------------------------------------------------------- | |||||
// Error handling | |||||
void setLastError(const char* error); | |||||
const char* getLastError(); | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Mutex locks | // Mutex locks | ||||
@@ -445,7 +450,7 @@ protected: | |||||
void startCheckThread(); | void startCheckThread(); | ||||
private: | private: | ||||
CarlaCheckThread m_checkThread; | |||||
CarlaEngineThread m_thread; | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
CarlaEngineOsc m_osc; | CarlaEngineOsc m_osc; | ||||
@@ -21,19 +21,21 @@ TEMPLATE = lib | |||||
VERSION = 0.5.0 | VERSION = 0.5.0 | ||||
SOURCES = \ | SOURCES = \ | ||||
carla_engine.cpp \ | |||||
carla_engine_osc.cpp \ | |||||
jack.cpp \ | |||||
rtaudio.cpp | |||||
carla_engine.cpp \ | |||||
carla_engine_osc.cpp \ | |||||
carla_engine_thread.cpp \ | |||||
jack.cpp \ | |||||
rtaudio.cpp | |||||
# FIXME - remove these | # FIXME - remove these | ||||
SOURCES += \ | SOURCES += \ | ||||
carla_shared.cpp \ | |||||
carla_threads.cpp | |||||
carla_shared.cpp \ | |||||
carla_threads.cpp | |||||
HEADERS = \ | HEADERS = \ | ||||
carla_engine.hpp \ | carla_engine.hpp \ | ||||
carla_engine_osc.hpp | |||||
carla_engine_osc.hpp \ | |||||
carla_engine_thread.hpp | |||||
INCLUDEPATH = . \ | INCLUDEPATH = . \ | ||||
../carla-backend \ | ../carla-backend \ | ||||
@@ -0,0 +1,156 @@ | |||||
/* | |||||
* Carla Engine | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#include "carla_engine_thread.hpp" | |||||
#include "carla_plugin.hpp" | |||||
CarlaCheckThread::CarlaCheckThread(CarlaBackend::CarlaEngine* const engine_, QObject* const parent) | |||||
: QThread(parent), | |||||
engine(engine_) | |||||
{ | |||||
qDebug("CarlaCheckThread::CarlaCheckThread(%p, %p)", engine, parent); | |||||
CARLA_ASSERT(engine); | |||||
} | |||||
CarlaCheckThread::~CarlaCheckThread() | |||||
{ | |||||
qDebug("CarlaCheckThread::~CarlaCheckThread()"); | |||||
} | |||||
void CarlaCheckThread::startNow() | |||||
{ | |||||
qDebug("CarlaCheckThread::startNow()"); | |||||
start(QThread::HighPriority); | |||||
} | |||||
void CarlaCheckThread::stopNow() | |||||
{ | |||||
if (m_stopNow) | |||||
return; | |||||
m_stopNow = true; | |||||
// TESTING - let processing finish first | |||||
QMutexLocker(&this->mutex); // FIXME | |||||
if (isRunning() && ! wait(200)) | |||||
{ | |||||
quit(); | |||||
if (isRunning() && ! wait(300)) | |||||
terminate(); | |||||
} | |||||
} | |||||
void CarlaCheckThread::run() | |||||
{ | |||||
qDebug("CarlaCheckThread::run()"); | |||||
using namespace CarlaBackend; | |||||
bool oscControlRegisted, usesSingleThread; | |||||
unsigned short id, maxPluginNumber = CarlaEngine::maxPluginNumber(); | |||||
double value; | |||||
m_stopNow = false; | |||||
while (engine->isRunning() && ! m_stopNow) | |||||
{ | |||||
const ScopedLocker m(this); | |||||
oscControlRegisted = engine->isOscControlRegisted(); | |||||
#ifndef BUILD_BRIDGE | |||||
if (engine->getType() != CarlaEngineTypePlugin) | |||||
engine->oscWaitEvents(); | |||||
#endif | |||||
for (unsigned short i=0; i < maxPluginNumber; i++) | |||||
{ | |||||
CarlaPlugin* const plugin = engine->getPluginUnchecked(i); | |||||
if (plugin && plugin->enabled()) | |||||
{ | |||||
id = plugin->id(); | |||||
usesSingleThread = (plugin->hints() & PLUGIN_USES_SINGLE_THREAD); | |||||
// ------------------------------------------------------- | |||||
// Process postponed events | |||||
if (! usesSingleThread) | |||||
plugin->postEventsRun(); | |||||
// ------------------------------------------------------- | |||||
// Update parameter outputs | |||||
if (oscControlRegisted || ! usesSingleThread) | |||||
{ | |||||
for (uint32_t i=0; i < plugin->parameterCount(); i++) | |||||
{ | |||||
if (plugin->parameterIsOutput(i)) | |||||
{ | |||||
value = plugin->getParameterValue(i); | |||||
// Update UI | |||||
if (! usesSingleThread) | |||||
plugin->uiParameterChange(i, value); | |||||
// Update OSC control client | |||||
if (oscControlRegisted) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_parameter_value(i, value); | |||||
#else | |||||
engine->osc_send_control_set_parameter_value(id, i, value); | |||||
#endif | |||||
} | |||||
} | |||||
} | |||||
} | |||||
// ------------------------------------------------------- | |||||
// Update OSC control client | |||||
if (oscControlRegisted) | |||||
{ | |||||
// Peak values | |||||
if (plugin->audioInCount() > 0) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_inpeak(1, engine->getInputPeak(id, 0)); | |||||
engine->osc_send_bridge_set_inpeak(2, engine->getInputPeak(id, 1)); | |||||
#else | |||||
engine->osc_send_control_set_input_peak_value(id, 1, engine->getInputPeak(id, 0)); | |||||
engine->osc_send_control_set_input_peak_value(id, 2, engine->getInputPeak(id, 1)); | |||||
#endif | |||||
} | |||||
if (plugin->audioOutCount() > 0) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_outpeak(1, engine->getOutputPeak(id, 0)); | |||||
engine->osc_send_bridge_set_outpeak(2, engine->getOutputPeak(id, 1)); | |||||
#else | |||||
engine->osc_send_control_set_output_peak_value(id, 1, engine->getOutputPeak(id, 0)); | |||||
engine->osc_send_control_set_output_peak_value(id, 2, engine->getOutputPeak(id, 1)); | |||||
#endif | |||||
} | |||||
} | |||||
} | |||||
} | |||||
msleep(50); | |||||
} | |||||
} |
@@ -0,0 +1,71 @@ | |||||
/* | |||||
* Carla Engine | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#ifndef CARLA_ENGINE_THREAD_HPP | |||||
#define CARLA_ENGINE_THREAD_HPP | |||||
#include "carla_backend_utils.hpp" | |||||
class CarlaEngine; | |||||
class CarlaPlugin; | |||||
#include <QtCore/QMutex> | |||||
#include <QtCore/QThread> | |||||
CARLA_BACKEND_START_NAMESPACE | |||||
class CarlaEngineThread : public QThread | |||||
{ | |||||
public: | |||||
CarlaEngineThread(CarlaBackend::CarlaEngine* const engine, QObject* const parent = nullptr); | |||||
~CarlaEngineThread(); | |||||
void startNow(); | |||||
void stopNow(); | |||||
protected: | |||||
void run(); | |||||
private: | |||||
CarlaBackend::CarlaEngine* const engine; | |||||
QMutex mutex; | |||||
bool m_stopNow; | |||||
// ---------------------------------------------- | |||||
class ScopedLocker | |||||
{ | |||||
public: | |||||
ScopedLocker(CarlaEngineThread* const thread) | |||||
: m_thread(thread) | |||||
{ | |||||
m_thread->mutex.lock(); | |||||
} | |||||
~ScopedLocker() | |||||
{ | |||||
m_thread->mutex.unlock(); | |||||
} | |||||
private: | |||||
CarlaEngineThread* const m_thread; | |||||
}; | |||||
}; | |||||
CARLA_BACKEND_END_NAMESPACE | |||||
#endif // CARLA_ENGINE_THREAD_HPP |
@@ -1,61 +0,0 @@ | |||||
/* | |||||
* Carla Backend | |||||
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#ifndef CARLA_SHARED_H | |||||
#define CARLA_SHARED_H | |||||
#include "carla_backend.hpp" | |||||
CARLA_BACKEND_START_NAMESPACE | |||||
/*! | |||||
* @defgroup CarlaBackendShared Carla Backend Shared Code | |||||
* | |||||
* @{ | |||||
*/ | |||||
const char* BinaryType2str(const BinaryType type); | |||||
const char* PluginType2str(const PluginType type); | |||||
const char* PluginCategory2str(const PluginCategory category); | |||||
const char* ParameterType2str(const ParameterType type); | |||||
const char* InternalParametersIndex2str(const InternalParametersIndex index); | |||||
const char* CustomDataType2str(const CustomDataType type); | |||||
const char* GuiType2str(const GuiType type); | |||||
const char* OptionsType2str(const OptionsType type); | |||||
const char* CallbackType2str(const CallbackType type); | |||||
const char* ProcessModeType2str(const ProcessModeType type); | |||||
CustomDataType getCustomDataStringType(const char* const stype); | |||||
const char* getCustomDataTypeString(const CustomDataType type); | |||||
const char* getBinaryBidgePath(const BinaryType type); | |||||
const char* getPluginTypeString(const PluginType type); | |||||
void* getPointer(const uintptr_t addr); | |||||
PluginCategory getPluginCategoryFromName(const char* const name); | |||||
const char* getLastError(); | |||||
void setLastError(const char* const error); | |||||
#ifndef BUILD_BRIDGE | |||||
uint32_t getPluginHintsFromNative(const uint32_t nativeHints); | |||||
#endif | |||||
/**@}*/ | |||||
CARLA_BACKEND_END_NAMESPACE | |||||
#endif // CARLA_SHARED_H |
@@ -1,111 +0,0 @@ | |||||
/* | |||||
* Carla Backend | |||||
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#ifndef CARLA_THREADS_H | |||||
#define CARLA_THREADS_H | |||||
#include "carla_backend.hpp" | |||||
#include <QtCore/QMutex> | |||||
#include <QtCore/QThread> | |||||
CARLA_BACKEND_START_NAMESPACE | |||||
class CarlaEngine; | |||||
class CarlaPlugin; | |||||
CARLA_BACKEND_END_NAMESPACE | |||||
// -------------------------------------------------------------------------------------------------------- | |||||
// CarlaCheckThread | |||||
class CarlaCheckThread : public QThread | |||||
{ | |||||
public: | |||||
CarlaCheckThread(CarlaBackend::CarlaEngine* const engine, QObject* const parent = nullptr); | |||||
~CarlaCheckThread(); | |||||
void startNow(); | |||||
void stopNow(); | |||||
protected: | |||||
void run(); | |||||
private: | |||||
CarlaBackend::CarlaEngine* const engine; | |||||
QMutex mutex; | |||||
bool m_stopNow; | |||||
// ---------------------------------------------- | |||||
class ScopedLocker | |||||
{ | |||||
public: | |||||
ScopedLocker(CarlaCheckThread* const thread) | |||||
: m_thread(thread) | |||||
{ | |||||
m_thread->mutex.lock(); | |||||
} | |||||
~ScopedLocker() | |||||
{ | |||||
m_thread->mutex.unlock(); | |||||
} | |||||
private: | |||||
CarlaCheckThread* const m_thread; | |||||
}; | |||||
}; | |||||
// -------------------------------------------------------------------------------------------------------- | |||||
// CarlaPluginThread | |||||
#ifndef BUILD_BRIDGE | |||||
class QProcess; | |||||
class CarlaPluginThread : public QThread | |||||
{ | |||||
public: | |||||
enum PluginThreadMode { | |||||
PLUGIN_THREAD_DSSI_GUI, | |||||
PLUGIN_THREAD_LV2_GUI, | |||||
PLUGIN_THREAD_VST_GUI, | |||||
PLUGIN_THREAD_BRIDGE | |||||
}; | |||||
CarlaPluginThread(CarlaBackend::CarlaEngine* const engine, CarlaBackend::CarlaPlugin* const plugin, const PluginThreadMode mode, QObject* const parent = nullptr); | |||||
~CarlaPluginThread(); | |||||
void setOscData(const char* const binary, const char* const label, const char* const data1=""); | |||||
protected: | |||||
void run(); | |||||
private: | |||||
CarlaBackend::CarlaEngine* const engine; | |||||
CarlaBackend::CarlaPlugin* const plugin; | |||||
const PluginThreadMode mode; | |||||
QString m_binary; | |||||
QString m_label; | |||||
QString m_data1; | |||||
QProcess* m_process; | |||||
}; | |||||
#endif | |||||
#endif // CARLA_THREADS_H |
@@ -44,14 +44,16 @@ BUILD_CXX_FLAGS += $(shell pkg-config --cflags linuxsampler) -DWANT_LINUXSAMPLER | |||||
endif | endif | ||||
OBJS = \ | OBJS = \ | ||||
carla_bridge.o \ | |||||
native.o \ | |||||
ladspa.o \ | |||||
dssi.o \ | |||||
lv2.o \ | |||||
vst.o \ | |||||
fluidsynth.o \ | |||||
linuxsampler.o | |||||
carla_plugin.o \ | |||||
carla_plugin_thread.o \ | |||||
carla_bridge.o \ | |||||
native.o \ | |||||
ladspa.o \ | |||||
dssi.o \ | |||||
lv2.o \ | |||||
vst.o \ | |||||
fluidsynth.o \ | |||||
linuxsampler.o | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -56,6 +56,27 @@ struct BridgeParamInfo { | |||||
: value(0.0) {} | : value(0.0) {} | ||||
}; | }; | ||||
const char* getBinaryBidgePath(const BinaryType type) | |||||
{ | |||||
qDebug("CarlaBackend::getBinaryBidgePath(%s)", BinaryType2Str(type)); | |||||
switch (type) | |||||
{ | |||||
#ifndef BUILD_BRIDGE | |||||
// case BINARY_POSIX32: | |||||
// return CarlaEngine::options.bridge_posix32; | |||||
// case BINARY_POSIX64: | |||||
// return CarlaEngine::options.bridge_posix64; | |||||
// case BINARY_WIN32: | |||||
// return CarlaEngine::options.bridge_win32; | |||||
// case BINARY_WIN64: | |||||
// return CarlaEngine::options.bridge_win64; | |||||
#endif | |||||
default: | |||||
return nullptr; | |||||
} | |||||
} | |||||
class BridgePlugin : public CarlaPlugin | class BridgePlugin : public CarlaPlugin | ||||
{ | { | ||||
public: | public: | ||||
@@ -730,7 +751,7 @@ public: | |||||
m_initiated = true; | m_initiated = true; | ||||
m_initError = true; | m_initError = true; | ||||
setLastError(error); | |||||
x_engine->setLastError(error); | |||||
break; | break; | ||||
} | } | ||||
@@ -929,7 +950,7 @@ public: | |||||
if (! bridgeBinary) | if (! bridgeBinary) | ||||
{ | { | ||||
setLastError("Bridge not possible, bridge-binary not found"); | |||||
x_engine->setLastError("Bridge not possible, bridge-binary not found"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -957,7 +978,7 @@ public: | |||||
x_engine->__bridgePluginRegister(m_id, nullptr); | x_engine->__bridgePluginRegister(m_id, nullptr); | ||||
osc.thread->terminate(); | osc.thread->terminate(); | ||||
setLastError("Timeout while waiting for a response from plugin-bridge\n(or the plugin crashed on initialization?)"); | |||||
x_engine->setLastError("Timeout while waiting for a response from plugin-bridge\n(or the plugin crashed on initialization?)"); | |||||
return false; | return false; | ||||
} | } | ||||
else if (m_initError) | else if (m_initError) | ||||
@@ -997,13 +1018,13 @@ private: | |||||
CarlaPlugin* CarlaPlugin::newBridge(const initializer& init, BinaryType btype, PluginType ptype) | CarlaPlugin* CarlaPlugin::newBridge(const initializer& init, BinaryType btype, PluginType ptype) | ||||
{ | { | ||||
qDebug("CarlaPlugin::newBridge(%p, \"%s\", \"%s\", \"%s\", %s, %s)", init.engine, init.filename, init.name, init.label, BinaryType2str(btype), PluginType2str(ptype)); | |||||
qDebug("CarlaPlugin::newBridge(%p, \"%s\", \"%s\", \"%s\", %s, %s)", init.engine, init.filename, init.name, init.label, BinaryType2Str(btype), PluginType2Str(ptype)); | |||||
short id = init.engine->getNewPluginId(); | short id = init.engine->getNewPluginId(); | ||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -21,17 +21,20 @@ TEMPLATE = lib | |||||
VERSION = 0.5.0 | VERSION = 0.5.0 | ||||
SOURCES = \ | SOURCES = \ | ||||
carla_bridge.cpp \ | |||||
native.cpp \ | |||||
ladspa.cpp \ | |||||
dssi.cpp \ | |||||
lv2.cpp \ | |||||
vst.cpp \ | |||||
fluidsynth.cpp \ | |||||
linuxsampler.cpp | |||||
carla_plugin.cpp \ | |||||
carla_plugin_thread.cpp \ | |||||
carla_bridge.cpp \ | |||||
native.cpp \ | |||||
ladspa.cpp \ | |||||
dssi.cpp \ | |||||
lv2.cpp \ | |||||
vst.cpp \ | |||||
fluidsynth.cpp \ | |||||
linuxsampler.cpp | |||||
HEADERS = \ | HEADERS = \ | ||||
carla_plugin.hpp | |||||
carla_plugin.hpp \ | |||||
carla_plugin_thread.hpp | |||||
INCLUDEPATH = . \ | INCLUDEPATH = . \ | ||||
../carla-backend \ | ../carla-backend \ | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Backend | |||||
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||||
* Carla Plugin | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
@@ -15,156 +15,12 @@ | |||||
* For a full copy of the GNU General Public License see the COPYING file | * For a full copy of the GNU General Public License see the COPYING file | ||||
*/ | */ | ||||
#include "carla_threads.hpp" | |||||
#include "carla_engine.hpp" | |||||
#include "carla_plugin.hpp" | #include "carla_plugin.hpp" | ||||
#include <QtCore/QDebug> | |||||
#include <QtCore/QProcess> | #include <QtCore/QProcess> | ||||
// ----------------------------------------------------------------------- | |||||
// CarlaCheckThread | |||||
CarlaCheckThread::CarlaCheckThread(CarlaBackend::CarlaEngine* const engine_, QObject* const parent) | |||||
: QThread(parent), | |||||
engine(engine_) | |||||
{ | |||||
qDebug("CarlaCheckThread::CarlaCheckThread(%p, %p)", engine, parent); | |||||
CARLA_ASSERT(engine); | |||||
} | |||||
CarlaCheckThread::~CarlaCheckThread() | |||||
{ | |||||
qDebug("CarlaCheckThread::~CarlaCheckThread()"); | |||||
} | |||||
void CarlaCheckThread::startNow() | |||||
{ | |||||
qDebug("CarlaCheckThread::startNow()"); | |||||
start(QThread::HighPriority); | |||||
} | |||||
void CarlaCheckThread::stopNow() | |||||
{ | |||||
if (m_stopNow) | |||||
return; | |||||
m_stopNow = true; | |||||
// TESTING - let processing finish first | |||||
QMutexLocker(&this->mutex); // FIXME | |||||
if (isRunning() && ! wait(200)) | |||||
{ | |||||
quit(); | |||||
if (isRunning() && ! wait(300)) | |||||
terminate(); | |||||
} | |||||
} | |||||
void CarlaCheckThread::run() | |||||
{ | |||||
qDebug("CarlaCheckThread::run()"); | |||||
using namespace CarlaBackend; | |||||
bool oscControlRegisted, usesSingleThread; | |||||
unsigned short id, maxPluginNumber = CarlaEngine::maxPluginNumber(); | |||||
double value; | |||||
m_stopNow = false; | |||||
while (engine->isRunning() && ! m_stopNow) | |||||
{ | |||||
const ScopedLocker m(this); | |||||
oscControlRegisted = engine->isOscControlRegisted(); | |||||
#ifndef BUILD_BRIDGE | |||||
if (engine->getType() != CarlaEngineTypePlugin) | |||||
engine->oscWaitEvents(); | |||||
#endif | |||||
for (unsigned short i=0; i < maxPluginNumber; i++) | |||||
{ | |||||
CarlaPlugin* const plugin = engine->getPluginUnchecked(i); | |||||
if (plugin && plugin->enabled()) | |||||
{ | |||||
id = plugin->id(); | |||||
usesSingleThread = (plugin->hints() & PLUGIN_USES_SINGLE_THREAD); | |||||
// ------------------------------------------------------- | |||||
// Process postponed events | |||||
if (! usesSingleThread) | |||||
plugin->postEventsRun(); | |||||
// ------------------------------------------------------- | |||||
// Update parameter outputs | |||||
if (oscControlRegisted || ! usesSingleThread) | |||||
{ | |||||
for (uint32_t i=0; i < plugin->parameterCount(); i++) | |||||
{ | |||||
if (plugin->parameterIsOutput(i)) | |||||
{ | |||||
value = plugin->getParameterValue(i); | |||||
// Update UI | |||||
if (! usesSingleThread) | |||||
plugin->uiParameterChange(i, value); | |||||
// Update OSC control client | |||||
if (oscControlRegisted) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_parameter_value(i, value); | |||||
#else | |||||
engine->osc_send_control_set_parameter_value(id, i, value); | |||||
#endif | |||||
} | |||||
} | |||||
} | |||||
} | |||||
// ------------------------------------------------------- | |||||
// Update OSC control client | |||||
if (oscControlRegisted) | |||||
{ | |||||
// Peak values | |||||
if (plugin->audioInCount() > 0) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_inpeak(1, engine->getInputPeak(id, 0)); | |||||
engine->osc_send_bridge_set_inpeak(2, engine->getInputPeak(id, 1)); | |||||
#else | |||||
engine->osc_send_control_set_input_peak_value(id, 1, engine->getInputPeak(id, 0)); | |||||
engine->osc_send_control_set_input_peak_value(id, 2, engine->getInputPeak(id, 1)); | |||||
#endif | |||||
} | |||||
if (plugin->audioOutCount() > 0) | |||||
{ | |||||
#ifdef BUILD_BRIDGE | |||||
engine->osc_send_bridge_set_outpeak(1, engine->getOutputPeak(id, 0)); | |||||
engine->osc_send_bridge_set_outpeak(2, engine->getOutputPeak(id, 1)); | |||||
#else | |||||
engine->osc_send_control_set_output_peak_value(id, 1, engine->getOutputPeak(id, 0)); | |||||
engine->osc_send_control_set_output_peak_value(id, 2, engine->getOutputPeak(id, 1)); | |||||
#endif | |||||
} | |||||
} | |||||
} | |||||
} | |||||
msleep(50); | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// CarlaPluginThread | |||||
#ifndef BUILD_BRIDGE | |||||
CARLA_BACKEND_START_NAMESPACE | |||||
const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode) | const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode) | ||||
{ | { | ||||
@@ -294,7 +150,7 @@ void CarlaPluginThread::run() | |||||
QString errorString = QString("Plugin '%1' has crashed!\n" | QString errorString = QString("Plugin '%1' has crashed!\n" | ||||
"Saving now will lose its current settings.\n" | "Saving now will lose its current settings.\n" | ||||
"Please remove this plugin, and not rely on it from this point.").arg(plugin->name()); | "Please remove this plugin, and not rely on it from this point.").arg(plugin->name()); | ||||
CarlaBackend::setLastError(errorString.toUtf8().constData()); | |||||
//CarlaBackend::setLastError(errorString.toUtf8().constData()); | |||||
engine->callback(CarlaBackend::CALLBACK_ERROR, plugin->id(), 0, 0, 0.0); | engine->callback(CarlaBackend::CALLBACK_ERROR, plugin->id(), 0, 0, 0.0); | ||||
} | } | ||||
@@ -303,4 +159,4 @@ void CarlaPluginThread::run() | |||||
} | } | ||||
} | } | ||||
#endif | |||||
CARLA_BACKEND_END_NAMESPACE |
@@ -0,0 +1,61 @@ | |||||
/* | |||||
* Carla Plugin | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#ifndef CARLA_PLUGIN_THREAD_HPP | |||||
#define CARLA_PLUGIN_THREAD_HPP | |||||
#include "carla_backend_utils.hpp" | |||||
#include <QtCore/QThread> | |||||
class QProcess; | |||||
CARLA_BACKEND_START_NAMESPACE | |||||
class CarlaPluginThread : public QThread | |||||
{ | |||||
public: | |||||
enum PluginThreadMode { | |||||
PLUGIN_THREAD_DSSI_GUI, | |||||
PLUGIN_THREAD_LV2_GUI, | |||||
PLUGIN_THREAD_VST_GUI, | |||||
PLUGIN_THREAD_BRIDGE | |||||
}; | |||||
CarlaPluginThread(CarlaEngine* const engine, CarlaPlugin* const plugin, const PluginThreadMode mode, QObject* const parent = nullptr); | |||||
~CarlaPluginThread(); | |||||
void setOscData(const char* const binary, const char* const label, const char* const data1=""); | |||||
protected: | |||||
void run(); | |||||
private: | |||||
CarlaEngine* const engine; | |||||
CarlaPlugin* const plugin; | |||||
const PluginThreadMode mode; | |||||
QString m_binary; | |||||
QString m_label; | |||||
QString m_data1; | |||||
QProcess* m_process; | |||||
}; | |||||
CARLA_BACKEND_END_NAMESPACE | |||||
#endif // CARLA_PLUGIN_THREAD_HPP |
@@ -221,13 +221,13 @@ public: | |||||
CARLA_ASSERT(value); | CARLA_ASSERT(value); | ||||
if (type != CUSTOM_DATA_STRING) | if (type != CUSTOM_DATA_STRING) | ||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is not string", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is not string", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! key) | if (! key) | ||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! value) | if (! value) | ||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("DssiPlugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
descriptor->configure(handle, key, value); | descriptor->configure(handle, key, value); | ||||
if (h2) descriptor->configure(h2, key, value); | if (h2) descriptor->configure(h2, key, value); | ||||
@@ -1512,7 +1512,7 @@ public: | |||||
if (! libOpen(filename)) | if (! libOpen(filename)) | ||||
{ | { | ||||
setLastError(libError(filename)); | |||||
x_engine->setLastError(libError(filename)); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1523,7 +1523,7 @@ public: | |||||
if (! descFn) | if (! descFn) | ||||
{ | { | ||||
setLastError("Could not find the DSSI Descriptor in the plugin library"); | |||||
x_engine->setLastError("Could not find the DSSI Descriptor in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1540,7 +1540,7 @@ public: | |||||
if (! descriptor) | if (! descriptor) | ||||
{ | { | ||||
setLastError("Could not find the requested plugin Label in the plugin library"); | |||||
x_engine->setLastError("Could not find the requested plugin Label in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1561,7 +1561,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1572,7 +1572,7 @@ public: | |||||
if (! handle) | if (! handle) | ||||
{ | { | ||||
setLastError("Plugin failed to initialize"); | |||||
x_engine->setLastError("Plugin failed to initialize"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1622,7 +1622,7 @@ CarlaPlugin* CarlaPlugin::newDSSI(const initializer& init, const void* const ext | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -1641,7 +1641,7 @@ CarlaPlugin* CarlaPlugin::newDSSI(const initializer& init, const void* const ext | |||||
{ | { | ||||
if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | ||||
{ | { | ||||
setLastError("Carla's rack mode can only work with Mono or Stereo DSSI plugins, sorry!"); | |||||
init.engine->setLastError("Carla's rack mode can only work with Mono or Stereo DSSI plugins, sorry!"); | |||||
delete plugin; | delete plugin; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -1247,7 +1247,7 @@ public: | |||||
if (f_id < 0) | if (f_id < 0) | ||||
{ | { | ||||
setLastError("Failed to load SoundFont file"); | |||||
x_engine->setLastError("Failed to load SoundFont file"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1269,7 +1269,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1323,13 +1323,13 @@ CarlaPlugin* CarlaPlugin::newSF2(const initializer& init) | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (! fluid_is_soundfont(init.filename)) | if (! fluid_is_soundfont(init.filename)) | ||||
{ | { | ||||
setLastError("Requested file is not a valid SoundFont"); | |||||
init.engine->setLastError("Requested file is not a valid SoundFont"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -1128,7 +1128,7 @@ public: | |||||
if (! libOpen(filename)) | if (! libOpen(filename)) | ||||
{ | { | ||||
setLastError(libError(filename)); | |||||
x_engine->setLastError(libError(filename)); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1139,7 +1139,7 @@ public: | |||||
if (! descFn) | if (! descFn) | ||||
{ | { | ||||
setLastError("Could not find the LASDPA Descriptor in the plugin library"); | |||||
x_engine->setLastError("Could not find the LASDPA Descriptor in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1155,7 +1155,7 @@ public: | |||||
if (! descriptor) | if (! descriptor) | ||||
{ | { | ||||
setLastError("Could not find the requested plugin Label in the plugin library"); | |||||
x_engine->setLastError("Could not find the requested plugin Label in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1181,7 +1181,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1192,7 +1192,7 @@ public: | |||||
if (! handle) | if (! handle) | ||||
{ | { | ||||
setLastError("Plugin failed to initialize"); | |||||
x_engine->setLastError("Plugin failed to initialize"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1226,7 +1226,7 @@ CarlaPlugin* CarlaPlugin::newLADSPA(const initializer& init, const void* const e | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -1245,7 +1245,7 @@ CarlaPlugin* CarlaPlugin::newLADSPA(const initializer& init, const void* const e | |||||
{ | { | ||||
if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | ||||
{ | { | ||||
setLastError("Carla's rack mode can only work with Mono or Stereo LADSPA plugins, sorry!"); | |||||
init.engine->setLastError("Carla's rack mode can only work with Mono or Stereo LADSPA plugins, sorry!"); | |||||
delete plugin; | delete plugin; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -827,7 +827,7 @@ public: | |||||
} | } | ||||
catch (LinuxSampler::Exception& e) | catch (LinuxSampler::Exception& e) | ||||
{ | { | ||||
setLastError(e.what()); | |||||
x_engine->setLastError(e.what()); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -836,7 +836,7 @@ public: | |||||
} | } | ||||
catch (LinuxSampler::Exception& e) | catch (LinuxSampler::Exception& e) | ||||
{ | { | ||||
setLastError(e.what()); | |||||
x_engine->setLastError(e.what()); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -845,7 +845,7 @@ public: | |||||
} | } | ||||
catch (LinuxSampler::Exception& e) | catch (LinuxSampler::Exception& e) | ||||
{ | { | ||||
setLastError(e.what()); | |||||
x_engine->setLastError(e.what()); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -880,13 +880,13 @@ public: | |||||
if (x_client->isOk()) | if (x_client->isOk()) | ||||
return true; | return true; | ||||
else | else | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
} | } | ||||
else | else | ||||
setLastError("Failed to find any instruments"); | |||||
x_engine->setLastError("Failed to find any instruments"); | |||||
} | } | ||||
else | else | ||||
setLastError("Requested file is not valid or does not exist"); | |||||
x_engine->setLastError("Requested file is not valid or does not exist"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -920,7 +920,7 @@ CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const initializer& init, bool i | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -19,6 +19,7 @@ | |||||
#ifdef WANT_LV2 | #ifdef WANT_LV2 | ||||
#include "carla_lib_utils.hpp" | |||||
#include "carla_lv2_utils.hpp" | #include "carla_lv2_utils.hpp" | ||||
#include "lv2_atom_queue.hpp" | #include "lv2_atom_queue.hpp" | ||||
@@ -27,6 +28,7 @@ | |||||
#include <set> | #include <set> | ||||
#include <QtCore/QDir> | #include <QtCore/QDir> | ||||
#include <QtGui/QDialog> | |||||
#include <QtGui/QLayout> | #include <QtGui/QLayout> | ||||
#ifdef HAVE_SUIL | #ifdef HAVE_SUIL | ||||
@@ -853,13 +855,13 @@ public: | |||||
CARLA_ASSERT(value); | CARLA_ASSERT(value); | ||||
if (type == CUSTOM_DATA_INVALID) | if (type == CUSTOM_DATA_INVALID) | ||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is invalid", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is invalid", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! key) | if (! key) | ||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! value) | if (! value) | ||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("Lv2Plugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
CarlaPlugin::setCustomData(type, key, value, sendGui); | CarlaPlugin::setCustomData(type, key, value, sendGui); | ||||
@@ -3199,7 +3201,7 @@ public: | |||||
if (dtype == CUSTOM_DATA_INVALID) | if (dtype == CUSTOM_DATA_INVALID) | ||||
{ | { | ||||
qCritical("Lv2Plugin::handleStateStore(%i, %p, " P_SIZE ", %i, %i) - invalid type '%s'", key, value, size, type, flags, CustomDataType2str(dtype)); | |||||
qCritical("Lv2Plugin::handleStateStore(%i, %p, " P_SIZE ", %i, %i) - invalid type '%s'", key, value, size, type, flags, CustomDataType2Str(dtype)); | |||||
return LV2_STATE_ERR_BAD_TYPE; | return LV2_STATE_ERR_BAD_TYPE; | ||||
} | } | ||||
@@ -3291,7 +3293,7 @@ public: | |||||
return chunk.constData(); | return chunk.constData(); | ||||
} | } | ||||
qCritical("Lv2Plugin::handleStateRetrieve(%i, %p, %p, %p) - invalid key type '%s'", key, size, type, flags, CustomDataType2str(dtype)); | |||||
qCritical("Lv2Plugin::handleStateRetrieve(%i, %p, %p, %p) - invalid key type '%s'", key, size, type, flags, CustomDataType2Str(dtype)); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -3937,7 +3939,7 @@ public: | |||||
if (! rdf_descriptor) | if (! rdf_descriptor) | ||||
{ | { | ||||
setLastError("Failed to find the requested plugin in the LV2 Bundle"); | |||||
x_engine->setLastError("Failed to find the requested plugin in the LV2 Bundle"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -3946,7 +3948,7 @@ public: | |||||
if (! libOpen(rdf_descriptor->Binary)) | if (! libOpen(rdf_descriptor->Binary)) | ||||
{ | { | ||||
setLastError(libError(rdf_descriptor->Binary)); | |||||
x_engine->setLastError(libError(rdf_descriptor->Binary)); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4061,7 +4063,7 @@ public: | |||||
if (! libDesc) | if (! libDesc) | ||||
{ | { | ||||
setLastError("Plugin failed to return library descriptor"); | |||||
x_engine->setLastError("Plugin failed to return library descriptor"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4092,7 +4094,7 @@ public: | |||||
if (! descFn) | if (! descFn) | ||||
{ | { | ||||
setLastError("Could not find the LV2 Descriptor in the plugin library"); | |||||
x_engine->setLastError("Could not find the LV2 Descriptor in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4109,7 +4111,7 @@ public: | |||||
if (! descriptor) | if (! descriptor) | ||||
{ | { | ||||
setLastError("Could not find the requested plugin URI in the plugin library"); | |||||
x_engine->setLastError("Could not find the requested plugin URI in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4126,7 +4128,7 @@ public: | |||||
{ | { | ||||
if (! LV2_IS_PORT_OPTIONAL(rdf_descriptor->Ports[i].Properties)) | if (! LV2_IS_PORT_OPTIONAL(rdf_descriptor->Ports[i].Properties)) | ||||
{ | { | ||||
setLastError("Plugin requires a port that is not currently supported"); | |||||
x_engine->setLastError("Plugin requires a port that is not currently supported"); | |||||
canContinue = false; | canContinue = false; | ||||
break; | break; | ||||
} | } | ||||
@@ -4139,7 +4141,7 @@ public: | |||||
if (LV2_IS_FEATURE_REQUIRED(rdf_descriptor->Features[i].Type) && ! is_lv2_feature_supported(rdf_descriptor->Features[i].URI)) | if (LV2_IS_FEATURE_REQUIRED(rdf_descriptor->Features[i].Type) && ! is_lv2_feature_supported(rdf_descriptor->Features[i].URI)) | ||||
{ | { | ||||
QString msg = QString("Plugin requires a feature that is not supported:\n%1").arg(rdf_descriptor->Features[i].URI); | QString msg = QString("Plugin requires a feature that is not supported:\n%1").arg(rdf_descriptor->Features[i].URI); | ||||
setLastError(msg.toUtf8().constData()); | |||||
x_engine->setLastError(msg.toUtf8().constData()); | |||||
canContinue = false; | canContinue = false; | ||||
break; | break; | ||||
} | } | ||||
@@ -4185,7 +4187,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4196,7 +4198,7 @@ public: | |||||
if (! handle) | if (! handle) | ||||
{ | { | ||||
setLastError("Plugin failed to initialize"); | |||||
x_engine->setLastError("Plugin failed to initialize"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -4673,7 +4675,7 @@ CarlaPlugin* CarlaPlugin::newLV2(const initializer& init) | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -4692,7 +4694,7 @@ CarlaPlugin* CarlaPlugin::newLV2(const initializer& init) | |||||
{ | { | ||||
if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | ||||
{ | { | ||||
setLastError("Carla's rack mode can only work with Mono (simple) or Stereo LV2 plugins, sorry!"); | |||||
init.engine->setLastError("Carla's rack mode can only work with Mono (simple) or Stereo LV2 plugins, sorry!"); | |||||
delete plugin; | delete plugin; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -365,13 +365,13 @@ public: | |||||
CARLA_ASSERT(value); | CARLA_ASSERT(value); | ||||
if (type != CUSTOM_DATA_STRING) | if (type != CUSTOM_DATA_STRING) | ||||
return qCritical("NativePlugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is not string", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("NativePlugin::setCustomData(%s, \"%s\", \"%s\", %s) - type is not string", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! key) | if (! key) | ||||
return qCritical("NativePlugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("NativePlugin::setCustomData(%s, \"%s\", \"%s\", %s) - key is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (! value) | if (! value) | ||||
return qCritical("Nativelugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2str(type), key, value, bool2str(sendGui)); | |||||
return qCritical("Nativelugin::setCustomData(%s, \"%s\", \"%s\", %s) - value is null", CustomDataType2Str(type), key, value, bool2str(sendGui)); | |||||
if (descriptor) | if (descriptor) | ||||
{ | { | ||||
@@ -1602,7 +1602,7 @@ public: | |||||
if (! descriptor) | if (! descriptor) | ||||
{ | { | ||||
setLastError("Invalid internal plugin"); | |||||
x_engine->setLastError("Invalid internal plugin"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1613,7 +1613,7 @@ public: | |||||
if (! handle) | if (! handle) | ||||
{ | { | ||||
setLastError("Plugin failed to initialize"); | |||||
x_engine->setLastError("Plugin failed to initialize"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1632,7 +1632,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -1665,7 +1665,7 @@ CarlaPlugin* CarlaPlugin::newNative(const initializer& init) | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -1683,7 +1683,7 @@ CarlaPlugin* CarlaPlugin::newNative(const initializer& init) | |||||
{ | { | ||||
if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | ||||
{ | { | ||||
setLastError("Carla's rack mode can only work with Mono or Stereo Internal plugins, sorry!"); | |||||
init.engine->setLastError("Carla's rack mode can only work with Mono or Stereo Internal plugins, sorry!"); | |||||
delete plugin; | delete plugin; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -2200,7 +2200,7 @@ public: | |||||
if (! libOpen(filename)) | if (! libOpen(filename)) | ||||
{ | { | ||||
setLastError(libError(filename)); | |||||
x_engine->setLastError(libError(filename)); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -2215,7 +2215,7 @@ public: | |||||
if (! vstFn) | if (! vstFn) | ||||
{ | { | ||||
setLastError("Could not find the VST main entry in the plugin library"); | |||||
x_engine->setLastError("Could not find the VST main entry in the plugin library"); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -2229,7 +2229,7 @@ public: | |||||
if ((! effect) || effect->magic != kEffectMagic) | if ((! effect) || effect->magic != kEffectMagic) | ||||
{ | { | ||||
setLastError("Plugin failed to initialize"); | |||||
x_engine->setLastError("Plugin failed to initialize"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -2269,7 +2269,7 @@ public: | |||||
if (! x_client->isOk()) | if (! x_client->isOk()) | ||||
{ | { | ||||
setLastError("Failed to register plugin client"); | |||||
x_engine->setLastError("Failed to register plugin client"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -2387,7 +2387,7 @@ CarlaPlugin* CarlaPlugin::newVST(const initializer& init) | |||||
if (id < 0 || id > CarlaEngine::maxPluginNumber()) | if (id < 0 || id > CarlaEngine::maxPluginNumber()) | ||||
{ | { | ||||
setLastError("Maximum number of plugins reached"); | |||||
init.engine->setLastError("Maximum number of plugins reached"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -2406,7 +2406,7 @@ CarlaPlugin* CarlaPlugin::newVST(const initializer& init) | |||||
{ | { | ||||
if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | if (! (plugin->hints() & PLUGIN_CAN_FORCE_STEREO)) | ||||
{ | { | ||||
setLastError("Carla's rack mode can only work with Stereo VST plugins, sorry!"); | |||||
init.engine->setLastError("Carla's rack mode can only work with Stereo VST plugins, sorry!"); | |||||
delete plugin; | delete plugin; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||