@@ -93,7 +93,7 @@ const unsigned int PLUGIN_OPTION_SEND_ALL_SOUND_OFF = 0x100; //!< Send MIDI a | |||
const unsigned int PARAMETER_IS_BOOLEAN = 0x001; //!< Parameter values are boolean (always at minimum or maximum values). | |||
const unsigned int PARAMETER_IS_INTEGER = 0x002; //!< Parameter values are integer. | |||
const unsigned int PARAMETER_IS_LOGARITHMIC = 0x004; //!< Parameter values are logarithmic. | |||
const unsigned int PARAMETER_IS_ENABLED = 0x008; //!< Parameter is enabled (can be viewed and changed). | |||
const unsigned int PARAMETER_IS_ENABLED = 0x008; //!< Parameter is enabled (can be viewed, changed and stored). | |||
const unsigned int PARAMETER_IS_AUTOMABLE = 0x010; //!< Parameter is automable (realtime safe). | |||
const unsigned int PARAMETER_IS_READ_ONLY = 0x020; //!< Parameter is read-only. | |||
const unsigned int PARAMETER_USES_SAMPLERATE = 0x040; //!< Parameter needs sample rate to work (value and ranges are multiplied by SR on usage, divided by SR on save). | |||
@@ -378,7 +378,7 @@ public: | |||
* | |||
* \see getParameterCount() | |||
*/ | |||
void getParameterCountInfo(uint32_t* const ins, uint32_t* const outs, uint32_t* const total) const; | |||
void getParameterCountInfo(uint32_t& ins, uint32_t& outs, uint32_t& total) const; | |||
// ------------------------------------------------------------------- | |||
// Set data (state) | |||
@@ -547,7 +547,6 @@ public: | |||
*/ | |||
void setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback); | |||
#ifndef BUILD_BRIDGE | |||
/*! | |||
* Set parameter's \a parameterId MIDI channel to \a channel.\n | |||
* \a channel must be between 0 and 15. | |||
@@ -559,7 +558,6 @@ public: | |||
* \a cc must be between 0 and 95 (0x5F), or -1 for invalid. | |||
*/ | |||
void setParameterMidiCC(const uint32_t parameterId, int16_t cc, const bool sendOsc, const bool sendCallback); | |||
#endif | |||
/*! | |||
* Add a custom data set.\n | |||
@@ -1432,8 +1432,10 @@ void CarlaEngine::setOption(const OptionsType option, const int value, const cha | |||
{ | |||
carla_debug("CarlaEngine::setOption(%s, %i, \"%s\")", OptionsType2Str(option), value, valueStr); | |||
#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); | |||
#endif | |||
switch (option) | |||
{ | |||
@@ -21,8 +21,8 @@ | |||
#include "CarlaEngine.hpp" | |||
#include "CarlaEngineOsc.hpp" | |||
#include "CarlaEngineThread.hpp" | |||
#include "CarlaPlugin.hpp" | |||
#include "CarlaMutex.hpp" | |||
#include "RtList.hpp" | |||
@@ -140,6 +140,8 @@ struct EnginePluginData { | |||
insPeak[0] = insPeak[1] = 0.0f; | |||
outsPeak[0] = outsPeak[1] = 0.0f; | |||
} | |||
CARLA_DECLARE_NON_COPY_STRUCT(EnginePluginData) | |||
}; | |||
// ----------------------------------------------------------------------- | |||
@@ -22,8 +22,6 @@ | |||
#include "juce_core.h" | |||
using juce::Thread; | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
@@ -32,7 +30,7 @@ CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------------------------------------- | |||
class CarlaEngineThread : public Thread | |||
class CarlaEngineThread : public juce::Thread | |||
{ | |||
public: | |||
CarlaEngineThread(CarlaEngine* const engine); | |||
@@ -1,153 +0,0 @@ | |||
/* | |||
* Carla Plugin | |||
* Copyright (C) 2011-2013 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 doc/GPL.txt file. | |||
*/ | |||
#include "CarlaPluginGui.hpp" | |||
#if 0 | |||
#include <QtCore/QSettings> | |||
#ifdef Q_WS_X11 | |||
# include <QtGui/QX11EmbedContainer> | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
#include "moc_CarlaPluginGui.cpp" | |||
// ------------------------------------------------------------------- | |||
// CarlaPluginGUI | |||
CarlaPluginGui::CarlaPluginGui(CarlaEngine* const engine, Callback* const callback, const Options& options, const QByteArray& lastGeometry) | |||
: QMainWindow(nullptr), | |||
kCallback(callback), | |||
fContainer(nullptr), | |||
fOptions(options) | |||
{ | |||
CARLA_ASSERT(callback != nullptr); | |||
carla_debug("CarlaPluginGui::CarlaPluginGui(%p, %p)", engine, callback); | |||
setWindowIcon(QIcon::fromTheme("carla", QIcon(":/scalable/carla.svg"))); | |||
if (options.parented) | |||
{ | |||
#ifdef Q_WS_X11 | |||
fContainer = new QX11EmbedContainer(this); | |||
#else | |||
fContainer = new QWidget(this); | |||
#endif | |||
setCentralWidget(fContainer); | |||
} | |||
#ifdef Q_OS_WIN | |||
if (! options.resizable) | |||
setWindowFlags(windowFlags()|Qt::MSWindowsFixedSizeDialogHint); | |||
#endif | |||
connect(this, SIGNAL(setSizeSafeSignal(int,int)), SLOT(setSizeSafeSlot(int,int))); | |||
{ | |||
QSettings settings; | |||
if (settings.value("Engine/UIsAlwaysOnTop", true).toBool()) | |||
setWindowFlags(windowFlags()|Qt::WindowStaysOnTopHint); | |||
if (! lastGeometry.isNull()) | |||
restoreGeometry(lastGeometry); | |||
} | |||
} | |||
CarlaPluginGui::~CarlaPluginGui() | |||
{ | |||
carla_debug("CarlaPluginGui::~CarlaPluginGui()"); | |||
if (fOptions.parented) | |||
{ | |||
CARLA_ASSERT(fContainer != nullptr); | |||
if (fContainer != nullptr) | |||
{ | |||
#ifdef Q_WS_X11 | |||
delete (QX11EmbedContainer*)fContainer; | |||
#else | |||
delete fContainer; | |||
#endif | |||
fContainer = nullptr; | |||
} | |||
} | |||
} | |||
void CarlaPluginGui::setSize(const int width, const int height) | |||
{ | |||
CARLA_ASSERT_INT(width > 0, width); | |||
CARLA_ASSERT_INT(height > 0, height); | |||
carla_debug("CarlaPluginGui::setSize(%i, %i)", width, height); | |||
if (width <= 0) | |||
return; | |||
if (height <= 0) | |||
return; | |||
emit setSizeSafeSignal(width, height); | |||
} | |||
void* CarlaPluginGui::getContainerWinId() | |||
{ | |||
CARLA_ASSERT(fContainer != nullptr); | |||
carla_debug("CarlaPluginGui::getContainerWinId()"); | |||
return (fContainer != nullptr) ? (void*)fContainer->winId() : nullptr; | |||
} | |||
void CarlaPluginGui::setWidget(QWidget* const widget) | |||
{ | |||
CARLA_ASSERT(fContainer == nullptr); | |||
carla_debug("CarlaPluginGui::setWidget(%p)", widget); | |||
setCentralWidget(widget); | |||
widget->setParent(this); | |||
fContainer = widget; | |||
} | |||
void CarlaPluginGui::closeEvent(QCloseEvent* const event) | |||
{ | |||
CARLA_ASSERT(event != nullptr); | |||
carla_debug("CarlaPluginGui::closeEvent(%p)", event); | |||
if (event == nullptr) | |||
return; | |||
if (event->spontaneous() && kCallback != nullptr) | |||
kCallback->guiClosedCallback(); | |||
QMainWindow::closeEvent(event); | |||
} | |||
void CarlaPluginGui::setSizeSafeSlot(int width, int height) | |||
{ | |||
carla_debug("CarlaPluginGui::setSizeSafeSlot(%i, %i)", width, height); | |||
if (fOptions.resizable) | |||
resize(width, height); | |||
else | |||
setFixedSize(width, height); | |||
} | |||
// ------------------------------------------------------------------- | |||
CARLA_BACKEND_END_NAMESPACE | |||
#endif |
@@ -1,90 +0,0 @@ | |||
/* | |||
* Carla Plugin | |||
* Copyright (C) 2011-2013 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 GPL.txt file | |||
*/ | |||
#ifndef CARLA_PLUGIN_GUI_HPP_INCLUDED | |||
#define CARLA_PLUGIN_GUI_HPP_INCLUDED | |||
#include "CarlaPluginInternal.hpp" | |||
#include "juce_gui_basics.h" | |||
#if 0 | |||
#include <QtGui/QCloseEvent> | |||
# if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) | |||
# include <QtWidgets/QMainWindow> | |||
#else | |||
# include <QtGui/QMainWindow> | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
class CarlaPluginGui : public QMainWindow | |||
{ | |||
Q_OBJECT | |||
public: | |||
class Callback | |||
{ | |||
public: | |||
virtual ~Callback() {} | |||
virtual void guiClosedCallback() = 0; | |||
}; | |||
struct Options { | |||
bool parented; | |||
bool resizable; | |||
}; | |||
CarlaPluginGui(CarlaEngine* const engine, Callback* const callback, const Options& options, const QByteArray& lastGeometry); | |||
~CarlaPluginGui(); | |||
void setSize(const int width, const int height); | |||
// Parent UIs | |||
void* getContainerWinId(); | |||
// Qt UIs | |||
void setWidget(QWidget* widget); | |||
protected: | |||
void closeEvent(QCloseEvent* const event); | |||
private: | |||
Callback* const kCallback; | |||
QWidget* fContainer; | |||
const Options fOptions; | |||
signals: | |||
void setSizeSafeSignal(int, int); | |||
private slots: | |||
void setSizeSafeSlot(int width, int height); | |||
#ifndef MOC_PARSING | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginGui) | |||
#endif | |||
}; | |||
CARLA_BACKEND_END_NAMESPACE | |||
#endif | |||
#endif // CARLA_PLUGIN_GUI_HPP_INCLUDED |
@@ -24,6 +24,7 @@ | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaOscUtils.hpp" | |||
#include "CarlaStateUtils.hpp" | |||
#include "CarlaMutex.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "RtList.hpp" | |||
@@ -40,9 +41,9 @@ CARLA_BACKEND_START_NAMESPACE | |||
const unsigned short kPluginMaxMidiEvents = 512; | |||
const unsigned int PLUGIN_HINT_HAS_MIDI_IN = 0x1; | |||
const unsigned int PLUGIN_HINT_HAS_MIDI_OUT = 0x2; | |||
const unsigned int PLUGIN_HINT_CAN_RUN_RACK = 0x4; | |||
const unsigned int PLUGIN_EXTRA_HINT_HAS_MIDI_IN = 0x1; | |||
const unsigned int PLUGIN_EXTRA_HINT_HAS_MIDI_OUT = 0x2; | |||
const unsigned int PLUGIN_EXTRA_HINT_CAN_RUN_RACK = 0x4; | |||
// ----------------------------------------------------------------------- | |||
@@ -56,7 +57,7 @@ const unsigned int PLUGIN_HINT_CAN_RUN_RACK = 0x4; | |||
enum PluginPostRtEventType { | |||
kPluginPostRtEventNull, | |||
kPluginPostRtEventDebug, | |||
kPluginPostRtEventParameterChange, // param, SP*, value (SP: if 1, don't report change to Callback and OSC) | |||
kPluginPostRtEventParameterChange, // param, SP (*), value (SP: if 1, don't report change to Callback and OSC) | |||
kPluginPostRtEventProgramChange, // index | |||
kPluginPostRtEventMidiProgramChange, // index | |||
kPluginPostRtEventNoteOn, // channel, note, velo | |||
@@ -86,7 +87,7 @@ struct PluginAudioPort { | |||
uint32_t rindex; | |||
CarlaEngineAudioPort* port; | |||
PluginAudioPort() | |||
PluginAudioPort() noexcept | |||
: rindex(0), | |||
port(nullptr) {} | |||
@@ -102,7 +103,7 @@ struct PluginAudioData { | |||
uint32_t count; | |||
PluginAudioPort* ports; | |||
PluginAudioData() | |||
PluginAudioData() noexcept | |||
: count(0), | |||
ports(nullptr) {} | |||
@@ -164,7 +165,7 @@ struct PluginCVPort { | |||
uint32_t param; | |||
CarlaEngineCVPort* port; | |||
PluginCVPort() | |||
PluginCVPort() noexcept | |||
: rindex(0), | |||
param(0), | |||
port(nullptr) {} | |||
@@ -181,7 +182,7 @@ struct PluginCVData { | |||
uint32_t count; | |||
PluginCVPort* ports; | |||
PluginCVData() | |||
PluginCVData() noexcept | |||
: count(0), | |||
ports(nullptr) {} | |||
@@ -242,7 +243,7 @@ struct PluginEventData { | |||
CarlaEngineEventPort* portIn; | |||
CarlaEngineEventPort* portOut; | |||
PluginEventData() | |||
PluginEventData() noexcept | |||
: portIn(nullptr), | |||
portOut(nullptr) {} | |||
@@ -286,7 +287,7 @@ struct PluginParameterData { | |||
ParameterData* data; | |||
ParameterRanges* ranges; | |||
PluginParameterData() | |||
PluginParameterData() noexcept | |||
: count(0), | |||
data(nullptr), | |||
ranges(nullptr) {} | |||
@@ -348,7 +349,7 @@ struct PluginProgramData { | |||
int32_t current; | |||
ProgramName* names; | |||
PluginProgramData() | |||
PluginProgramData() noexcept | |||
: count(0), | |||
current(-1), | |||
names(nullptr) {} | |||
@@ -408,7 +409,7 @@ struct PluginMidiProgramData { | |||
int32_t current; | |||
MidiProgramData* data; | |||
PluginMidiProgramData() | |||
PluginMidiProgramData() noexcept | |||
: count(0), | |||
current(-1), | |||
data(nullptr) {} | |||
@@ -467,11 +468,11 @@ struct PluginMidiProgramData { | |||
// ----------------------------------------------------------------------- | |||
struct ExternalMidiNote { | |||
int8_t channel; // invalid == -1 | |||
int8_t channel; // invalid if -1 | |||
uint8_t note; | |||
uint8_t velo; // note-off if 0 | |||
ExternalMidiNote() | |||
ExternalMidiNote() noexcept | |||
: channel(-1), | |||
note(0), | |||
velo(0) {} | |||
@@ -479,13 +480,9 @@ struct ExternalMidiNote { | |||
// ----------------------------------------------------------------------- | |||
class CarlaPluginGui; | |||
struct CarlaPluginProtectedData { | |||
CarlaEngine* const engine; | |||
CarlaEngineClient* client; | |||
CarlaPluginGui* gui; | |||
//QByteArray guiGeometry; | |||
bool active; | |||
bool needsReset; | |||
@@ -510,6 +507,8 @@ struct CarlaPluginProtectedData { | |||
PluginMidiProgramData midiprog; | |||
NonRtList<CustomData> custom; | |||
SaveState saveState; | |||
CarlaMutex masterMutex; // global master lock | |||
CarlaMutex singleMutex; // small lock used only in processSingle() | |||
@@ -590,7 +589,7 @@ struct CarlaPluginProtectedData { | |||
float balanceRight; | |||
float panning; | |||
PostProc() | |||
PostProc() noexcept | |||
: dryWet(1.0f), | |||
volume(1.0f), | |||
balanceLeft(-1.0f), | |||
@@ -611,17 +610,13 @@ struct CarlaPluginProtectedData { | |||
#ifdef CARLA_PROPER_CPP11_SUPPORT | |||
OSC() = delete; | |||
OSC(OSC&) = delete; | |||
OSC(const OSC&) = delete; | |||
CARLA_DECLARE_NON_COPY_STRUCT(OSC) | |||
#endif | |||
CARLA_LEAK_DETECTOR(OSC) | |||
} osc; | |||
CarlaPluginProtectedData(CarlaEngine* const engine_, CarlaPlugin* const plugin) | |||
: engine(engine_), | |||
CarlaPluginProtectedData(CarlaEngine* const eng, CarlaPlugin* const plug) | |||
: engine(eng), | |||
client(nullptr), | |||
gui(nullptr), | |||
active(false), | |||
needsReset(false), | |||
lib(nullptr), | |||
@@ -630,7 +625,7 @@ struct CarlaPluginProtectedData { | |||
extraHints(0x0), | |||
latency(0), | |||
latencyBuffers(nullptr), | |||
osc(engine, plugin) {} | |||
osc(eng, plug) {} | |||
#ifdef CARLA_PROPER_CPP11_SUPPORT | |||
CarlaPluginProtectedData() = delete; | |||
@@ -639,7 +634,6 @@ struct CarlaPluginProtectedData { | |||
~CarlaPluginProtectedData() | |||
{ | |||
CARLA_ASSERT(gui == nullptr); | |||
CARLA_ASSERT(client == nullptr); | |||
CARLA_ASSERT(! active); | |||
CARLA_ASSERT(lib == nullptr); | |||
@@ -655,6 +649,7 @@ struct CarlaPluginProtectedData { | |||
void cleanup() | |||
{ | |||
{ | |||
// mutex MUST have been locked before | |||
const bool lockMaster(masterMutex.tryLock()); | |||
const bool lockSingle(singleMutex.tryLock()); | |||
CARLA_ASSERT(! lockMaster); | |||
@@ -720,6 +715,8 @@ struct CarlaPluginProtectedData { | |||
{ | |||
if (latencyBuffers != nullptr) | |||
{ | |||
CARLA_ASSERT(audioIn.count > 0); | |||
for (uint32_t i=0; i < audioIn.count; ++i) | |||
{ | |||
CARLA_ASSERT(latencyBuffers[i] != nullptr); | |||
@@ -735,6 +732,10 @@ struct CarlaPluginProtectedData { | |||
latencyBuffers = nullptr; | |||
latency = 0; | |||
} | |||
else | |||
{ | |||
CARLA_ASSERT(latency == 0); | |||
} | |||
audioIn.clear(); | |||
audioOut.clear(); | |||
@@ -746,6 +747,8 @@ struct CarlaPluginProtectedData { | |||
{ | |||
if (latencyBuffers != nullptr) | |||
{ | |||
CARLA_ASSERT(audioIn.count > 0); | |||
for (uint32_t i=0; i < audioIn.count; ++i) | |||
{ | |||
CARLA_ASSERT(latencyBuffers[i] != nullptr); | |||
@@ -778,6 +781,8 @@ struct CarlaPluginProtectedData { | |||
void postponeRtEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const float value3) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(type != kPluginPostRtEventNull,); | |||
PluginPostRtEvent event; | |||
event.type = type; | |||
event.value1 = value1; | |||
@@ -23,8 +23,6 @@ | |||
#include "juce_core.h" | |||
using juce::Thread; | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
@@ -33,7 +31,7 @@ CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------------------------------------- | |||
class CarlaPluginThread : public Thread | |||
class CarlaPluginThread : public juce::Thread | |||
{ | |||
public: | |||
enum Mode { | |||
@@ -19,8 +19,7 @@ | |||
#ifdef WANT_DSSI | |||
#include "CarlaLadspaUtils.hpp" | |||
#include "dssi/dssi.h" | |||
#include "CarlaDssiUtils.hpp" | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -788,10 +787,10 @@ public: | |||
pData->extraHints = 0x0; | |||
if (mIns > 0) | |||
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_HAS_MIDI_IN; | |||
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0)) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
// check latency | |||
if (fHints & PLUGIN_CAN_DRYWET) | |||
@@ -1910,8 +1909,15 @@ public: | |||
if (guiFilename != nullptr) | |||
{ | |||
fGuiFilename = guiFilename; | |||
pData->osc.thread.setOscData(guiFilename, fDescriptor->Label); | |||
} | |||
else if (const char* const guiFilename2 = find_dssi_ui(filename, fDescriptor->Label)) | |||
{ | |||
fGuiFilename = guiFilename2; | |||
delete[] guiFilename2; | |||
} | |||
if (fGuiFilename.isNotEmpty()) | |||
pData->osc.thread.setOscData((const char*)fGuiFilename, fDescriptor->Label); | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
@@ -880,8 +880,8 @@ public: | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
bufferSizeChanged(pData->engine->getBufferSize()); | |||
reloadPrograms(true); | |||
@@ -760,7 +760,7 @@ public: | |||
pData->extraHints = 0x0; | |||
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0)) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
// check latency | |||
if (fHints & PLUGIN_CAN_DRYWET) | |||
@@ -426,8 +426,8 @@ public: | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
bufferSizeChanged(pData->engine->getBufferSize()); | |||
reloadPrograms(true); | |||
@@ -19,7 +19,6 @@ | |||
#ifdef WANT_LV2 | |||
#include "CarlaPluginGui.hpp" | |||
#include "CarlaLv2Utils.hpp" | |||
#include "Lv2AtomQueue.hpp" | |||
@@ -2149,17 +2148,17 @@ public: | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
// extra plugin hints | |||
pData->extraHints &= ~PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints &= ~PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
if (fExt.state != nullptr || fExt.worker != nullptr) | |||
{ | |||
if ((aIns == 0 || aIns == 2) && (aOuts == 0 || aOuts == 2) && evIns.count() <= 1 && evOuts.count() <= 1) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
} | |||
else | |||
{ | |||
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0) && evIns.count() <= 1 && evOuts.count() <= 1) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
} | |||
bufferSizeChanged(pData->engine->getBufferSize()); | |||
@@ -3912,7 +3911,6 @@ protected: | |||
int handleUiResize(const int width, const int height) | |||
{ | |||
CARLA_ASSERT(pData->gui != nullptr); | |||
CARLA_ASSERT(width > 0); | |||
CARLA_ASSERT(height > 0); | |||
@@ -1181,7 +1181,7 @@ public: | |||
pData->extraHints = 0x0; | |||
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0) && mIns <= 1 && mOuts <= 1) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
bufferSizeChanged(pData->engine->getBufferSize()); | |||
reloadPrograms(true); | |||
@@ -19,7 +19,6 @@ | |||
#ifdef WANT_VST | |||
#include "CarlaPluginGui.hpp" | |||
#include "CarlaVstUtils.hpp" | |||
//#ifdef Q_WS_X11 | |||
@@ -827,13 +826,13 @@ public: | |||
pData->extraHints = 0x0; | |||
if (mIns > 0) | |||
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_HAS_MIDI_IN; | |||
if (mOuts > 0) | |||
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_OUT; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_HAS_MIDI_OUT; | |||
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0)) | |||
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK; | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
// dummy pre-start to get latency and wantEvents() on old plugins | |||
{ | |||
@@ -1970,7 +1969,7 @@ protected: | |||
break; | |||
case audioMasterSizeWindow: | |||
if (pData->gui != nullptr) | |||
//if (pData->gui != nullptr) | |||
{ | |||
CARLA_SAFE_ASSERT(fGui.isVisible); | |||
//if (fGui.isVisible) | |||
@@ -375,6 +375,9 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||
if (gStandalone.engine->init(clientName)) | |||
{ | |||
if (gStandalone.callback != nullptr) | |||
gStandalone.engine->setCallback(gStandalone.callback, gStandalone.callbackPtr); | |||
gStandalone.lastError = "no error"; | |||
gStandalone.init(); | |||
return true; | |||
@@ -1034,7 +1037,7 @@ const CarlaPortCountInfo* carla_get_parameter_count_info(unsigned int pluginId) | |||
if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId)) | |||
{ | |||
plugin->getParameterCountInfo(&info.ins, &info.outs, &info.total); | |||
plugin->getParameterCountInfo(info.ins, info.outs, info.total); | |||
return &info; | |||
} | |||
@@ -123,7 +123,7 @@ void CarlaBridgeClient::oscInit(const char* const url) | |||
fOsc.init(url); | |||
} | |||
bool CarlaBridgeClient::oscIdle() | |||
bool CarlaBridgeClient::oscIdle() const | |||
{ | |||
fOsc.idle(); | |||
@@ -141,12 +141,12 @@ void CarlaBridgeClient::oscClose() | |||
fOsc.close(); | |||
} | |||
bool CarlaBridgeClient::isOscControlRegistered() const | |||
bool CarlaBridgeClient::isOscControlRegistered() const noexcept | |||
{ | |||
return fOsc.isControlRegistered(); | |||
} | |||
void CarlaBridgeClient::sendOscUpdate() | |||
void CarlaBridgeClient::sendOscUpdate() const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscUpdate()"); | |||
@@ -155,7 +155,7 @@ void CarlaBridgeClient::sendOscUpdate() | |||
} | |||
#ifdef BUILD_BRIDGE_PLUGIN | |||
void CarlaBridgeClient::sendOscBridgeUpdate() | |||
void CarlaBridgeClient::sendOscBridgeUpdate() const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()"); | |||
@@ -163,7 +163,7 @@ void CarlaBridgeClient::sendOscBridgeUpdate() | |||
osc_send_bridge_update(fOscData, fOscData.path); | |||
} | |||
void CarlaBridgeClient::sendOscBridgeError(const char* const error) | |||
void CarlaBridgeClient::sendOscBridgeError(const char* const error) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); | |||
@@ -174,7 +174,7 @@ void CarlaBridgeClient::sendOscBridgeError(const char* const error) | |||
// --------------------------------------------------------------------- | |||
void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) | |||
void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value); | |||
@@ -182,7 +182,7 @@ void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* cons | |||
osc_send_configure(fOscData, key, value); | |||
} | |||
void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) | |||
void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value); | |||
@@ -190,7 +190,7 @@ void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) | |||
osc_send_control(fOscData, index, value); | |||
} | |||
void CarlaBridgeClient::sendOscProgram(const int32_t index) | |||
void CarlaBridgeClient::sendOscProgram(const int32_t index) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index); | |||
@@ -198,7 +198,7 @@ void CarlaBridgeClient::sendOscProgram(const int32_t index) | |||
osc_send_program(fOscData, index); | |||
} | |||
void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) | |||
void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index); | |||
@@ -206,7 +206,7 @@ void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) | |||
osc_send_midi_program(fOscData, index); | |||
} | |||
void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) | |||
void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf); | |||
@@ -214,7 +214,7 @@ void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) | |||
osc_send_midi(fOscData, midiBuf); | |||
} | |||
void CarlaBridgeClient::sendOscExiting() | |||
void CarlaBridgeClient::sendOscExiting() const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscExiting()"); | |||
@@ -223,7 +223,7 @@ void CarlaBridgeClient::sendOscExiting() | |||
} | |||
#ifdef BRIDGE_LV2 | |||
void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf) | |||
void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\")", portIndex, atomBuf); | |||
@@ -231,7 +231,7 @@ void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const ch | |||
osc_send_lv2_atom_transfer(fOscData, portIndex, atomBuf); | |||
} | |||
void CarlaBridgeClient::sendOscLv2UridMap(const uint32_t urid, const char* const uri) | |||
void CarlaBridgeClient::sendOscLv2UridMap(const uint32_t urid, const char* const uri) const | |||
{ | |||
carla_debug("CarlaBridgeClient::sendOscLv2UridMap(%i, \"%s\")", urid, uri); | |||
@@ -70,43 +70,34 @@ public: | |||
void toolkitQuit(); | |||
#endif | |||
#ifdef BUILD_BRIDGE_PLUGIN | |||
// --------------------------------------------------------------------- | |||
// plugin management | |||
virtual void saveNow() = 0; | |||
virtual void setCustomData(const char* const type, const char* const key, const char* const value) = 0; | |||
virtual void setChunkData(const char* const filePath) = 0; | |||
#endif | |||
// --------------------------------------------------------------------- | |||
// osc stuff | |||
void oscInit(const char* const url); | |||
bool oscIdle(); | |||
bool oscIdle() const; | |||
void oscClose(); | |||
bool isOscControlRegistered() const; | |||
void sendOscUpdate(); | |||
bool isOscControlRegistered() const noexcept; | |||
void sendOscUpdate() const; | |||
#ifdef BUILD_BRIDGE_PLUGIN | |||
void sendOscBridgeUpdate(); | |||
void sendOscBridgeError(const char* const error); | |||
void sendOscBridgeUpdate() const; | |||
void sendOscBridgeError(const char* const error) const; | |||
#endif | |||
// --------------------------------------------------------------------- | |||
protected: | |||
void sendOscConfigure(const char* const key, const char* const value); | |||
void sendOscControl(const int32_t index, const float value); | |||
void sendOscProgram(const int32_t index); | |||
void sendOscMidiProgram(const int32_t index); | |||
void sendOscMidi(const uint8_t midiBuf[4]); | |||
void sendOscExiting(); | |||
void sendOscConfigure(const char* const key, const char* const value) const; | |||
void sendOscControl(const int32_t index, const float value) const; | |||
void sendOscProgram(const int32_t index) const; | |||
void sendOscMidiProgram(const int32_t index) const; | |||
void sendOscMidi(const uint8_t midiBuf[4]) const; | |||
void sendOscExiting() const; | |||
#ifdef BRIDGE_LV2 | |||
void sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf); | |||
void sendOscLv2UridMap(const uint32_t urid, const char* const uri); | |||
void sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf) const; | |||
void sendOscLv2UridMap(const uint32_t urid, const char* const uri) const; | |||
#endif | |||
// --------------------------------------------------------------------- | |||
@@ -84,7 +84,7 @@ void CarlaBridgeOsc::init(const char* const url) | |||
CARLA_ASSERT(fServerPath.isNotEmpty()); | |||
} | |||
void CarlaBridgeOsc::idle() | |||
void CarlaBridgeOsc::idle() const | |||
{ | |||
if (fServer == nullptr) | |||
return; | |||
@@ -125,6 +125,7 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const | |||
CARLA_SAFE_ASSERT_RETURN(fServerPath.isNotEmpty(), 1); | |||
CARLA_SAFE_ASSERT_RETURN(fServer != nullptr, 1); | |||
CARLA_SAFE_ASSERT_RETURN(path != nullptr, 1); | |||
CARLA_SAFE_ASSERT_RETURN(msg != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg); | |||
const size_t nameSize(fName.length()); | |||
@@ -146,22 +147,7 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const | |||
return 1; | |||
} | |||
#ifdef BUILD_BRIDGE_UI | |||
// Common UI methods | |||
if (std::strcmp(method, "configure") == 0) | |||
return handleMsgConfigure(argc, argv, types); | |||
if (std::strcmp(method, "control") == 0) | |||
return handleMsgControl(argc, argv, types); | |||
if (std::strcmp(method, "program") == 0) | |||
return handleMsgProgram(argc, argv, types); | |||
if (std::strcmp(method, "midi-program") == 0) | |||
return handleMsgMidiProgram(argc, argv, types); | |||
if (std::strcmp(method, "midi") == 0) | |||
return handleMsgMidi(argc, argv, types); | |||
if (std::strcmp(method, "sample-rate") == 0) | |||
return 0; // unused | |||
#endif | |||
// Common methods | |||
if (std::strcmp(method, "show") == 0) | |||
return handleMsgShow(); | |||
if (std::strcmp(method, "hide") == 0) | |||
@@ -177,6 +163,22 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const | |||
return handleMsgLv2UridMap(argc, argv, types); | |||
#endif | |||
#ifdef BUILD_BRIDGE_UI | |||
// UI methods | |||
if (std::strcmp(method, "configure") == 0) | |||
return handleMsgConfigure(argc, argv, types); | |||
if (std::strcmp(method, "control") == 0) | |||
return handleMsgControl(argc, argv, types); | |||
if (std::strcmp(method, "program") == 0) | |||
return handleMsgProgram(argc, argv, types); | |||
if (std::strcmp(method, "midi-program") == 0) | |||
return handleMsgMidiProgram(argc, argv, types); | |||
if (std::strcmp(method, "midi") == 0) | |||
return handleMsgMidi(argc, argv, types); | |||
if (std::strcmp(method, "sample-rate") == 0) | |||
return 0; // unused | |||
#endif | |||
#ifdef BUILD_BRIDGE_PLUGIN | |||
// Plugin methods | |||
if (std::strcmp(method, "plugin_save_now") == 0) | |||
@@ -196,6 +198,36 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const | |||
} | |||
#ifdef BUILD_BRIDGE_UI | |||
int CarlaBridgeOsc::handleMsgShow() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgShow()"); | |||
fClient->toolkitShow(); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgHide() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgHide()"); | |||
fClient->toolkitHide(); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgQuit() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgQuit()"); | |||
fClient->toolkitQuit(); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
{ | |||
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | |||
@@ -292,36 +324,6 @@ int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgShow() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgShow()"); | |||
fClient->toolkitShow(); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgHide() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgHide()"); | |||
fClient->toolkitHide(); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgQuit() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgQuit()"); | |||
fClient->toolkitQuit(); | |||
return 0; | |||
} | |||
#endif // BUILD_BRIDGE_UI | |||
CARLA_BRIDGE_END_NAMESPACE |
@@ -60,22 +60,22 @@ public: | |||
~CarlaBridgeOsc(); | |||
void init(const char* const url); | |||
void idle(); | |||
void idle() const; | |||
void close(); | |||
// ------------------------------------------------------------------- | |||
bool isControlRegistered() const | |||
bool isControlRegistered() const noexcept | |||
{ | |||
return (fControlData.target != nullptr); | |||
} | |||
const CarlaOscData& getControlData() const | |||
const CarlaOscData& getControlData() const noexcept | |||
{ | |||
return fControlData; | |||
} | |||
const char* getServerPath() const | |||
const char* getServerPath() const noexcept | |||
{ | |||
return (const char*)fServerPath; | |||
} | |||
@@ -16,36 +16,26 @@ | |||
*/ | |||
#include "CarlaBridgeClient.hpp" | |||
#include "CarlaBridgeToolkit.hpp" | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaBridgeUtils.hpp" | |||
#include "CarlaHost.hpp" | |||
#include "CarlaEngine.hpp" | |||
#include "CarlaPlugin.hpp" | |||
#include "CarlaHost.hpp" | |||
//#include <QtCore/QDir> | |||
//#include <QtCore/QFile> | |||
//#include <QtCore/QTextStream> | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaBridgeUtils.hpp" | |||
//#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) | |||
//# include <QtWidgets/QApplication> | |||
//#else | |||
//# include <QtGui/QApplication> | |||
//#endif | |||
#include "juce_core.h" | |||
#ifdef CARLA_OS_UNIX | |||
# include <signal.h> | |||
#endif | |||
#include "juce_core.h" | |||
using juce::File; | |||
// ------------------------------------------------------------------------- | |||
static bool gCloseNow = false; | |||
static bool gSaveNow = false; | |||
static volatile bool gCloseNow = false; | |||
static volatile bool gSaveNow = false; | |||
#ifdef CARLA_OS_WIN | |||
BOOL WINAPI closeSignalHandler(DWORD dwCtrlType) | |||
@@ -59,11 +49,11 @@ BOOL WINAPI closeSignalHandler(DWORD dwCtrlType) | |||
return FALSE; | |||
} | |||
#else | |||
void closeSignalHandler(int) | |||
static void closeSignalHandler(int) | |||
{ | |||
gCloseNow = true; | |||
} | |||
void saveSignalHandler(int) | |||
static void saveSignalHandler(int) | |||
{ | |||
gSaveNow = true; | |||
} | |||
@@ -99,9 +89,6 @@ void initSignalHandler() | |||
} | |||
// ------------------------------------------------------------------------- | |||
// Helpers | |||
extern CarlaBackend::CarlaEngine* carla_get_standalone_engine(); | |||
CARLA_BRIDGE_START_NAMESPACE | |||
@@ -111,41 +98,38 @@ CARLA_BRIDGE_START_NAMESPACE | |||
// ------------------------------------------------------------------------- | |||
class CarlaPluginClient : public CarlaBridgeClient/*, | |||
public QObject*/ | |||
class CarlaPluginClient : public CarlaBridgeClient | |||
{ | |||
public: | |||
CarlaPluginClient(const bool useBridge, const char* const driverName, const char* audioBaseName, const char* controlBaseName) | |||
: CarlaBridgeClient(nullptr), | |||
// QObject(nullptr), | |||
fEngine(nullptr), | |||
fPlugin(nullptr), | |||
fTimerId(0) | |||
fPlugin(nullptr) | |||
{ | |||
CARLA_ASSERT(driverName != nullptr); | |||
carla_debug("CarlaPluginClient::CarlaPluginClient(%s, \"%s\", %s, %s)", bool2str(useBridge), driverName, audioBaseName, controlBaseName); | |||
if (useBridge) | |||
carla_engine_init_bridge(audioBaseName, controlBaseName, driverName); | |||
else | |||
carla_engine_init("JACK", driverName); | |||
carla_set_engine_callback(callback, this); | |||
File curDir(File::getSpecialLocation(File::currentApplicationFile).getParentDirectory()); | |||
if (curDir.getChildFile("resources").exists()) | |||
carla_set_engine_option(CarlaBackend::OPTION_PATH_RESOURCES, 0, curDir.getChildFile("resources").getFullPathName().toRawUTF8()); | |||
else if (curDir.getChildFile("../../modules/carla_native/resources").exists()) | |||
carla_set_engine_option(CarlaBackend::OPTION_PATH_RESOURCES, 0, curDir.getChildFile("../../modules/carla_native/resources").getFullPathName().toRawUTF8()); | |||
else | |||
carla_set_engine_option(CarlaBackend::OPTION_PATH_RESOURCES, 0, curDir.getChildFile("../modules/carla_native/resources").getFullPathName().toRawUTF8()); | |||
if (useBridge) | |||
carla_engine_init_bridge(audioBaseName, controlBaseName, driverName); | |||
else | |||
carla_engine_init("JACK", driverName); | |||
} | |||
~CarlaPluginClient() | |||
~CarlaPluginClient() override | |||
{ | |||
CARLA_ASSERT(fTimerId == 0); | |||
carla_debug("CarlaPluginClient::~CarlaPluginClient()"); | |||
carla_set_engine_about_to_close(); | |||
carla_engine_close(); | |||
} | |||
@@ -159,8 +143,6 @@ public: | |||
void ready(const bool doSaveLoad) | |||
{ | |||
CARLA_ASSERT(fTimerId == 0); | |||
fEngine = carla_get_standalone_engine(); | |||
fPlugin = fEngine->getPlugin(0); | |||
@@ -169,44 +151,37 @@ public: | |||
fProjFileName = fPlugin->getName(); | |||
fProjFileName += ".carxs"; | |||
fPlugin->loadStateFromFile(fProjFileName); | |||
} | |||
if (! File::isAbsolutePath((const char*)fProjFileName)) | |||
fProjFileName = File::getCurrentWorkingDirectory().getChildFile((const char*)fProjFileName).getFullPathName().toRawUTF8(); | |||
//fTimerId = startTimer(50); | |||
if (! fPlugin->loadStateFromFile(fProjFileName)) | |||
carla_stderr("Plugin preset load failed, error was:\n%s", fEngine->getLastError()); | |||
} | |||
} | |||
void idle() | |||
{ | |||
if (fEngine != nullptr) | |||
fEngine->idle(); | |||
CARLA_SAFE_ASSERT_RETURN(fEngine != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
fEngine->idle(); | |||
CarlaBridgeClient::oscIdle(); | |||
if (gSaveNow) | |||
{ | |||
gSaveNow = false; | |||
CARLA_ASSERT(fPlugin != nullptr); | |||
if (fPlugin != nullptr && fProjFileName.isNotEmpty()) | |||
fPlugin->saveStateToFile(fProjFileName); | |||
if (fProjFileName.isNotEmpty()) | |||
{ | |||
if (! fPlugin->saveStateToFile(fProjFileName)) | |||
carla_stderr("Plugin preset save failed, error was:\n%s", fEngine->getLastError()); | |||
} | |||
} | |||
if (gCloseNow) | |||
{ | |||
gCloseNow = false; | |||
if (fTimerId != 0) | |||
{ | |||
//killTimer(fTimerId); | |||
fTimerId = 0; | |||
} | |||
// if (QApplication* const app = qApp) | |||
// { | |||
// if (! app->closingDown()) | |||
// app->quit(); | |||
// } | |||
//gCloseNow = false; | |||
// close something? | |||
} | |||
} | |||
@@ -215,7 +190,7 @@ public: | |||
while (! gCloseNow) | |||
{ | |||
idle(); | |||
carla_msleep(50); | |||
carla_msleep(30); | |||
} | |||
} | |||
@@ -224,12 +199,9 @@ public: | |||
void saveNow() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fEngine != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::saveNow()"); | |||
CARLA_ASSERT(fEngine != nullptr); | |||
CARLA_ASSERT(fPlugin != nullptr); | |||
if (fPlugin == nullptr || fEngine == nullptr) | |||
return; | |||
fPlugin->prepareForSave(); | |||
@@ -272,22 +244,34 @@ public: | |||
fEngine->oscSend_bridge_configure(CARLA_BRIDGE_MSG_SAVED, ""); | |||
} | |||
void setParameterMidiChannel(const int32_t index, const int32_t channel) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setParameterMidiChannel(%i, %i)", index, channel); | |||
fPlugin->setParameterMidiChannel(index, channel, false, false); | |||
} | |||
void setParameterMidiCC(const int32_t index, const int32_t cc) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setParameterMidiCC(%i, %i)", index, cc); | |||
fPlugin->setParameterMidiCC(index, cc, false, false); | |||
} | |||
void setCustomData(const char* const type, const char* const key, const char* const value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setCustomData(\"%s\", \"%s\", \"%s\")", type, key, value); | |||
CARLA_ASSERT(fPlugin != nullptr); | |||
if (fPlugin != nullptr) | |||
fPlugin->setCustomData(type, key, value, true); | |||
fPlugin->setCustomData(type, key, value, true); | |||
} | |||
void setChunkData(const char* const filePath) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setChunkData(\"%s\")", filePath); | |||
CARLA_ASSERT(fPlugin != nullptr); | |||
if (fPlugin == nullptr) | |||
return; | |||
#if 0 | |||
QString chunkFilePath(filePath); | |||
@@ -315,16 +299,6 @@ public: | |||
} | |||
// --------------------------------------------------------------------- | |||
// processing | |||
void setParameter(const int32_t rindex, const float value) | |||
{ | |||
carla_debug("CarlaPluginClient::setParameter(%i, %f)", rindex, value); | |||
CARLA_ASSERT(fPlugin != nullptr); | |||
if (fPlugin != nullptr) | |||
fPlugin->setParameterValueByRealIndex(rindex, value, true, true, false); | |||
} | |||
protected: | |||
void handleCallback(const CarlaBackend::CallbackType action, const int value1, const int value2, const float value3, const char* const valueStr) | |||
@@ -367,22 +341,14 @@ private: | |||
CarlaBackend::CarlaPlugin* fPlugin; | |||
CarlaString fProjFileName; | |||
int fTimerId; | |||
// void timerEvent(QTimerEvent* const event) | |||
// { | |||
// if (event->timerId() == fTimerId) | |||
// idle(); | |||
// QObject::timerEvent(event); | |||
// } | |||
static void callback(void* ptr, CarlaBackend::CallbackType action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) | |||
{ | |||
return ((CarlaPluginClient*)ptr)->handleCallback(action, value1, value2, value3, valueStr); | |||
carla_debug("CarlaPluginClient::callback(%p, %i:%s, %i, %i, %i, %f, \"%s\")", ptr, action, CarlaBackend::CallbackType2Str(action), pluginId, value1, value2, value3, valueStr); | |||
CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId == 0,); | |||
// unused | |||
(void)pluginId; | |||
return ((CarlaPluginClient*)ptr)->handleCallback(action, value1, value2, value3, valueStr); | |||
} | |||
}; | |||
@@ -416,7 +382,7 @@ int CarlaBridgeOsc::handleMsgQuit() | |||
int CarlaBridgeOsc::handleMsgPluginSaveNow() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient == nullptr, 1); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSaveNow()"); | |||
CarlaPluginClient* const plugClient((CarlaPluginClient*)fClient); | |||
@@ -427,22 +393,30 @@ int CarlaBridgeOsc::handleMsgPluginSaveNow() | |||
int CarlaBridgeOsc::handleMsgPluginSetParameterMidiChannel(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
{ | |||
//CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "s"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient == nullptr, 1); | |||
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSetParameterMidiChannel()"); | |||
// TODO | |||
const int32_t index = argv[0]->i; | |||
const int32_t channel = argv[1]->i; | |||
CarlaPluginClient* const plugClient((CarlaPluginClient*)fClient); | |||
plugClient->setParameterMidiChannel(index, channel); | |||
return 0; | |||
} | |||
int CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
{ | |||
//CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "s"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient == nullptr, 1); | |||
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC()"); | |||
// TODO | |||
const int32_t index = argv[0]->i; | |||
const int32_t cc = argv[1]->i; | |||
CarlaPluginClient* const plugClient((CarlaPluginClient*)fClient); | |||
plugClient->setParameterMidiCC(index, cc); | |||
return 0; | |||
} | |||
@@ -450,8 +424,8 @@ int CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC(CARLA_BRIDGE_OSC_HANDLE_AR | |||
int CarlaBridgeOsc::handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
{ | |||
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "s"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient == nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSaveNow()"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSetChunk()"); | |||
const char* const chunkFile = (const char*)&argv[0]->s; | |||
@@ -464,8 +438,8 @@ int CarlaBridgeOsc::handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
int CarlaBridgeOsc::handleMsgPluginSetCustomData(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
{ | |||
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(3, "sss"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient == nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSaveNow()"); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||
carla_debug("CarlaBridgeOsc::handleMsgPluginSetCustomData()"); | |||
const char* const type = (const char*)&argv[0]->s; | |||
const char* const key = (const char*)&argv[1]->s; | |||
@@ -481,9 +455,14 @@ int CarlaBridgeOsc::handleMsgPluginSetCustomData(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||
CARLA_BRIDGE_END_NAMESPACE | |||
// ------------------------------------------------------------------------- | |||
int main(int argc, char* argv[]) | |||
{ | |||
CARLA_BRIDGE_USE_NAMESPACE | |||
CARLA_BRIDGE_USE_NAMESPACE; | |||
// --------------------------------------------------------------------- | |||
// Check argument count | |||
if (argc != 6 && argc != 7) | |||
{ | |||
@@ -491,12 +470,18 @@ int main(int argc, char* argv[]) | |||
return 1; | |||
} | |||
// --------------------------------------------------------------------- | |||
// Get args | |||
const char* const oscUrl = argv[1]; | |||
const char* const stype = argv[2]; | |||
const char* const filename = argv[3]; | |||
const char* name = argv[4]; | |||
const char* label = argv[5]; | |||
// --------------------------------------------------------------------- | |||
// Setup args | |||
const bool useBridge = (argc == 7); | |||
const bool useOsc = std::strcmp(oscUrl, "null"); | |||
@@ -506,15 +491,25 @@ int main(int argc, char* argv[]) | |||
if (std::strlen(label) == 0) | |||
label = nullptr; | |||
char bridgeBaseAudioName[6+1] = { 0 }; | |||
char bridgeBaseControlName[6+1] = { 0 }; | |||
char bridgeBaseAudioName[6+1]; | |||
char bridgeBaseControlName[6+1]; | |||
if (useBridge) | |||
{ | |||
std::strncpy(bridgeBaseAudioName, argv[6], 6); | |||
std::strncpy(bridgeBaseAudioName, argv[6], 6); | |||
std::strncpy(bridgeBaseControlName, argv[6]+6, 6); | |||
bridgeBaseAudioName[6] = '\0'; | |||
bridgeBaseControlName[6] = '\0'; | |||
} | |||
else | |||
{ | |||
bridgeBaseAudioName[0] = '\0'; | |||
bridgeBaseControlName[0] = '\0'; | |||
} | |||
// --------------------------------------------------------------------- | |||
// Check plugin type | |||
CarlaBackend::PluginType itype(CarlaBackend::getPluginTypeFromString(stype)); | |||
if (itype == CarlaBackend::PLUGIN_NONE) | |||
@@ -523,34 +518,53 @@ int main(int argc, char* argv[]) | |||
return 1; | |||
} | |||
//QApplication app(argc, argv, true); | |||
//app.setQuitOnLastWindowClosed(false); | |||
// --------------------------------------------------------------------- | |||
// Set client name | |||
CarlaString clientName((name != nullptr) ? name : label); | |||
if (clientName.isEmpty()) | |||
{ | |||
//QFileInfo fileinfo(filename); | |||
//clientName = fileinfo.baseName().toUtf8().constData(); | |||
File file(filename); | |||
clientName = file.getFileNameWithoutExtension().toRawUTF8(); | |||
} | |||
if (itype >= CarlaBackend::PLUGIN_GIG && itype <= CarlaBackend::PLUGIN_SFZ && label == nullptr) | |||
label = clientName; | |||
// --------------------------------------------------------------------- | |||
// Set extraStuff | |||
const void* extraStuff = nullptr; | |||
if (itype == CarlaBackend::PLUGIN_GIG || itype == CarlaBackend::PLUGIN_SF2 || itype == CarlaBackend::PLUGIN_SFZ) | |||
{ | |||
if (label == nullptr) | |||
label = clientName; | |||
if (std::strstr(label, " (16 outs)") == 0) | |||
extraStuff = (const void*)label; // dummy non-null pointer | |||
} | |||
// --------------------------------------------------------------------- | |||
// Init plugin client | |||
// Init Plugin client | |||
CarlaPluginClient client(useBridge, (const char*)clientName, bridgeBaseAudioName, bridgeBaseControlName); | |||
// --------------------------------------------------------------------- | |||
// Init OSC | |||
if (useOsc) | |||
client.oscInit(oscUrl); | |||
// --------------------------------------------------------------------- | |||
// Listen for ctrl+c or sigint/sigterm events | |||
initSignalHandler(); | |||
// --------------------------------------------------------------------- | |||
// Init plugin | |||
int ret; | |||
if (carla_add_plugin(CarlaBackend::BINARY_NATIVE, itype, filename, name, label, nullptr)) | |||
if (carla_add_plugin(CarlaBackend::BINARY_NATIVE, itype, filename, name, label, extraStuff)) | |||
{ | |||
if (useOsc) | |||
{ | |||
@@ -569,14 +583,15 @@ int main(int argc, char* argv[]) | |||
} | |||
client.ready(!useOsc); | |||
//ret = app.exec(); | |||
client.exec(); | |||
carla_remove_plugin(0); | |||
ret = 0; | |||
} | |||
else | |||
{ | |||
const char* const lastError = carla_get_last_error(); | |||
const char* const lastError(carla_get_last_error()); | |||
carla_stderr("Plugin failed to load, error was:\n%s", lastError); | |||
if (useOsc) | |||
@@ -585,7 +600,9 @@ int main(int argc, char* argv[]) | |||
ret = 1; | |||
} | |||
// --------------------------------------------------------------------- | |||
// Close OSC | |||
if (useOsc) | |||
client.oscClose(); | |||
@@ -29,7 +29,7 @@ DEFINES += WANT_OPENGL | |||
DEFINES += WANT_AUDIOFILE | |||
DEFINES += WANT_MIDIFILE | |||
DEFINES += WANT_ZYNADDSUBFX | |||
# DEFINES += WANT_ZYNADDSUBFX_UI | |||
DEFINES += WANT_ZYNADDSUBFX_UI | |||
# Engine | |||
PKGCONFIG = liblo | |||
@@ -51,8 +51,7 @@ PKGCONFIG += smf | |||
PKGCONFIG += gl | |||
# ZynAddSubFX | |||
PKGCONFIG += fftw3 mxml zlib | |||
# ntk ntk_images | |||
PKGCONFIG += fftw3 mxml zlib ntk ntk_images | |||
# ----------------------------------------------------------- | |||
@@ -82,7 +81,6 @@ SOURCES += \ | |||
# Plugin | |||
SOURCES += \ | |||
../../backend/plugin/CarlaPlugin.cpp \ | |||
../../backend/plugin/CarlaPluginGui.cpp \ | |||
../../backend/plugin/CarlaPluginThread.cpp \ | |||
../../backend/plugin/BridgePlugin.cpp \ | |||
../../backend/plugin/NativePlugin.cpp \ | |||
@@ -102,58 +100,29 @@ SOURCES += \ | |||
# common | |||
HEADERS += \ | |||
../../backend/CarlaBackend.hpp \ | |||
../../backend/CarlaEngine.hpp \ | |||
../../backend/CarlaPlugin.hpp \ | |||
../../backend/CarlaHost.hpp | |||
../../backend/*.hpp | |||
# engine | |||
HEADERS += \ | |||
../../backend/engine/CarlaEngineInternal.hpp \ | |||
../../backend/engine/CarlaEngineOsc.hpp \ | |||
../../backend/engine/CarlaEngineThread.hpp | |||
../../backend/engine/*.hpp | |||
# plugin | |||
HEADERS += \ | |||
../../backend/plugin/CarlaPluginInternal.hpp \ | |||
../../backend/plugin/CarlaPluginGui.hpp \ | |||
../../backend/plugin/CarlaPluginThread.hpp | |||
../../backend/plugin/*.hpp | |||
# includes | |||
HEADERS += \ | |||
../../includes/CarlaDefines.hpp \ | |||
../../includes/CarlaMIDI.h | |||
../../includes/*.h \ | |||
../../includes/*.hpp | |||
# modules | |||
HEADERS += \ | |||
../../modules/CarlaNative.h \ | |||
../../modules/CarlaNative.hpp \ | |||
../../modules/juce_audio_basics.h \ | |||
../../modules/juce_core.h \ | |||
../../modules/ladspa_rdf.hpp \ | |||
../../modules/lv2_rdf.hpp | |||
../../modules/*.h \ | |||
../../modules/*.hpp | |||
# utils | |||
HEADERS += \ | |||
../../utils/CarlaUtils.hpp \ | |||
../../utils/CarlaBackendUtils.hpp \ | |||
../../utils/CarlaBridgeUtils.hpp \ | |||
../../utils/CarlaDssiUtils.hpp \ | |||
../../utils/CarlaJuceUtils.hpp \ | |||
../../utils/CarlaLadspaUtils.hpp \ | |||
../../utils/CarlaLibUtils.hpp \ | |||
../../utils/CarlaLogThread.hpp \ | |||
../../utils/CarlaLv2Utils.hpp \ | |||
../../utils/CarlaOscUtils.hpp \ | |||
../../utils/CarlaPipeUtils.hpp \ | |||
../../utils/CarlaShmUtils.hpp \ | |||
../../utils/CarlaStateUtils.hpp \ | |||
../../utils/CarlaVstUtils.hpp \ | |||
../../utils/CarlaMutex.hpp \ | |||
../../utils/CarlaRingBuffer.hpp \ | |||
../../utils/CarlaString.hpp \ | |||
../../utils/Lv2AtomQueue.hpp \ | |||
../../utils/RtList.hpp | |||
../../utils/*.hpp | |||
INCLUDEPATH = .. \ | |||
../../backend \ | |||
@@ -169,6 +138,8 @@ LIBS = -ldl -lpthread -lrt | |||
LIBS += ../../modules/carla_native.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/rtmempool.a | |||
LIBS += ../../modules/dgl.a | |||
@@ -29,6 +29,30 @@ juce_audio_basics_%: | |||
# -------------------------------------------------------------- | |||
juce_audio_devices: | |||
$(MAKE) -C juce_audio_devices | |||
juce_audio_devices_%: | |||
$(MAKE) -C juce_audio_devices $* | |||
# -------------------------------------------------------------- | |||
juce_audio_formats: | |||
$(MAKE) -C juce_audio_formats | |||
juce_audio_formats_%: | |||
$(MAKE) -C juce_audio_formats $* | |||
# -------------------------------------------------------------- | |||
juce_audio_processors: | |||
$(MAKE) -C juce_audio_processors | |||
juce_audio_processors_%: | |||
$(MAKE) -C juce_audio_processors $* | |||
# -------------------------------------------------------------- | |||
juce_core: | |||
$(MAKE) -C juce_core | |||
@@ -37,6 +61,38 @@ juce_core_%: | |||
# -------------------------------------------------------------- | |||
juce_data_structures: | |||
$(MAKE) -C juce_data_structures | |||
juce_data_structures_%: | |||
$(MAKE) -C juce_data_structures $* | |||
# -------------------------------------------------------------- | |||
juce_events: | |||
$(MAKE) -C juce_events | |||
juce_events_%: | |||
$(MAKE) -C juce_events $* | |||
# -------------------------------------------------------------- | |||
juce_graphics: | |||
$(MAKE) -C juce_graphics | |||
juce_graphics_%: | |||
$(MAKE) -C juce_graphics $* | |||
# -------------------------------------------------------------- | |||
juce_gui_basics: | |||
$(MAKE) -C juce_gui_basics | |||
juce_gui_basics_%: | |||
$(MAKE) -C juce_gui_basics $* | |||
# -------------------------------------------------------------- | |||
lilv: | |||
$(MAKE) -C lilv | |||
@@ -81,7 +137,14 @@ clean: | |||
$(MAKE) clean -C distrho/dgl | |||
$(MAKE) clean -C jackbridge | |||
$(MAKE) clean -C juce_audio_basics | |||
$(MAKE) clean -C juce_audio_devices | |||
$(MAKE) clean -C juce_audio_formats | |||
$(MAKE) clean -C juce_audio_processors | |||
$(MAKE) clean -C juce_core | |||
$(MAKE) clean -C juce_data_structures | |||
$(MAKE) clean -C juce_events | |||
$(MAKE) clean -C juce_graphics | |||
$(MAKE) clean -C juce_gui_basics | |||
$(MAKE) clean -C lilv | |||
$(MAKE) clean -C rtmempool | |||
$(MAKE) clean -C theme | |||
@@ -89,4 +152,6 @@ clean: | |||
# -------------------------------------------------------------- | |||
.PHONY: carla_native dgl juce_audio_basics juce_core lilv rtmempool theme | |||
.PHONY: carla_native dgl juce_audio_basics juce_audio_devices juce_audio_formats juce_audio_processors juce_core juce_data_structures juce_events juce_graphics juce_gui_basics lilv rtmempool theme | |||
# -------------------------------------------------------------- |
@@ -118,10 +118,10 @@ class ExternalUI(object): | |||
except IOError: | |||
return False | |||
if msg == "": | |||
if not msg: | |||
return True | |||
if msg == "control": | |||
elif msg == "control": | |||
index = int(self.fPipeRecv.readline()) | |||
value = float(self.fPipeRecv.readline()) | |||
self.d_parameterChanged(index, value) | |||
@@ -23,6 +23,8 @@ | |||
#include "juce_core.h" | |||
using namespace juce; | |||
// ----------------------------------------------------------------------- | |||
static inline | |||
@@ -30,11 +32,10 @@ const char* find_dssi_ui(const char* const filename, const char* const label) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr, nullptr); | |||
CARLA_SAFE_ASSERT_RETURN(label != nullptr, nullptr); | |||
using namespace juce; | |||
carla_debug("find_dssi_ui(\"%s\", \"%s\")", filename, label); | |||
File pluginFile(filename); | |||
File pluginDir(pluginFile.getParentDirectory()); | |||
File pluginDir(pluginFile.getParentDirectory().getFullPathName() + File::separatorString + pluginFile.getFileNameWithoutExtension()); | |||
Array<File> results; | |||
@@ -46,7 +47,7 @@ const char* find_dssi_ui(const char* const filename, const char* const label) | |||
for (int i=0, count=results.size(); i < count; ++i) | |||
{ | |||
const File& file(results[i]); | |||
guiFiles.add(file.getFullPathName()); | |||
guiFiles.add(file.getFileName()); | |||
} | |||
String pluginDirName(pluginDir.getFullPathName()); | |||
@@ -0,0 +1,120 @@ | |||
/* | |||
* Carla library counter | |||
* Copyright (C) 2013 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 doc/GPL.txt file. | |||
*/ | |||
#ifndef CARLA_LIB_COUNTER_HPP_INCLUDED | |||
#define CARLA_LIB_COUNTER_HPP_INCLUDED | |||
#include "CarlaLibUtils.hpp" | |||
#include "CarlaMutex.hpp" | |||
#include "RtList.hpp" | |||
// ----------------------------------------------------------------------- | |||
class LibCounter | |||
{ | |||
public: | |||
LibCounter() {} | |||
~LibCounter() | |||
{ | |||
CARLA_ASSERT(libs.isEmpty()); | |||
} | |||
void* open(const char* const filename) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr, nullptr); | |||
const CarlaMutex::ScopedLocker sl(mutex); | |||
for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | |||
{ | |||
Lib& lib(*it); | |||
CARLA_ASSERT(lib.count > 0); | |||
CARLA_SAFE_ASSERT_CONTINUE(lib.filename != nullptr); | |||
if (std::strcmp(lib.filename, filename) == 0) | |||
{ | |||
++lib.count; | |||
return lib.lib; | |||
} | |||
} | |||
void* const libPtr(lib_open(filename)); | |||
if (libPtr == nullptr) | |||
return nullptr; | |||
Lib lib; | |||
lib.lib = libPtr; | |||
lib.filename = carla_strdup(filename); | |||
lib.count = 1; | |||
libs.append(lib); | |||
return libPtr; | |||
} | |||
bool close(void* const libPtr) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(libPtr != nullptr, false); | |||
const CarlaMutex::ScopedLocker sl(mutex); | |||
for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | |||
{ | |||
Lib& lib(*it); | |||
CARLA_ASSERT(lib.count > 0); | |||
CARLA_SAFE_ASSERT_CONTINUE(lib.lib != nullptr); | |||
if (lib.lib != libPtr) | |||
continue; | |||
if (--lib.count == 0) | |||
{ | |||
if (lib.filename != nullptr) | |||
{ | |||
delete[] lib.filename; | |||
lib.filename = nullptr; | |||
} | |||
lib_close(lib.lib); | |||
lib.lib = nullptr; | |||
libs.remove(it); | |||
} | |||
return true; | |||
} | |||
CARLA_ASSERT(false); // invalid pointer | |||
return false; | |||
} | |||
private: | |||
struct Lib { | |||
void* lib; | |||
const char* filename; | |||
int count; | |||
}; | |||
CarlaMutex mutex; | |||
NonRtList<Lib> libs; | |||
}; | |||
// ----------------------------------------------------------------------- | |||
#endif // CARLA_LIB_COUNTER_HPP_INCLUDED |
@@ -26,12 +26,11 @@ | |||
#include <fcntl.h> | |||
using CarlaBackend::CallbackFunc; | |||
using juce::Thread; | |||
// ----------------------------------------------------------------------- | |||
// Log thread | |||
class CarlaLogThread : public Thread | |||
class CarlaLogThread : public juce::Thread | |||
{ | |||
public: | |||
CarlaLogThread() | |||
@@ -24,9 +24,6 @@ | |||
#include "juce_core.h" | |||
using juce::String; | |||
using juce::XmlElement; | |||
CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------------------------------------- | |||
@@ -217,9 +214,9 @@ struct SaveState { | |||
// ----------------------------------------------------------------------- | |||
static inline | |||
String xmlSafeString(const String& string, const bool toXml) | |||
juce::String xmlSafeString(const juce::String& string, const bool toXml) | |||
{ | |||
String newString(string); | |||
juce::String newString(string); | |||
if (toXml) | |||
return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); | |||
@@ -228,7 +225,7 @@ String xmlSafeString(const String& string, const bool toXml) | |||
} | |||
static inline | |||
const char* xmlSafeStringCharDup(const String& string, const bool toXml) | |||
const char* xmlSafeStringCharDup(const juce::String& string, const bool toXml) | |||
{ | |||
return carla_strdup(xmlSafeString(string, toXml).toRawUTF8()); | |||
} | |||
@@ -236,9 +233,11 @@ const char* xmlSafeStringCharDup(const String& string, const bool toXml) | |||
// ----------------------------------------------------------------------- | |||
static inline | |||
void fillSaveStateFromXmlElement(SaveState& saveState, const XmlElement& xmlElement) | |||
void fillSaveStateFromXmlElement(SaveState& saveState, const juce::XmlElement* const xmlElement) | |||
{ | |||
for (XmlElement* elem = xmlElement.getFirstChildElement(); elem != nullptr; elem = elem->getNextElement()) | |||
using namespace juce; | |||
for (XmlElement* elem = xmlElement->getFirstChildElement(); elem != nullptr; elem = elem->getNextElement()) | |||
{ | |||
// --------------------------------------------------------------- | |||
// Info | |||
@@ -422,8 +421,10 @@ void fillSaveStateFromXmlElement(SaveState& saveState, const XmlElement& xmlElem | |||
// ----------------------------------------------------------------------- | |||
static inline | |||
void fillXmlStringFromSaveState(String& content, const SaveState& saveState) | |||
void fillXmlStringFromSaveState(juce::String& content, const SaveState& saveState) | |||
{ | |||
using namespace juce; | |||
{ | |||
String info(" <Info>\n"); | |||