Browse Source

Use CarlaThread in CarlaPluginThread; add aboutToClose to standalone

tags/1.9.4
falkTX 12 years ago
parent
commit
0848bdf804
13 changed files with 161 additions and 149 deletions
  1. +1
    -0
      source/backend/CarlaStandalone.hpp
  2. +70
    -61
      source/backend/plugin/CarlaPlugin.cpp
  3. +29
    -47
      source/backend/plugin/CarlaPlugin.pro
  4. +7
    -5
      source/backend/plugin/CarlaPluginInternal.hpp
  5. +19
    -6
      source/backend/plugin/CarlaPluginThread.cpp
  6. +5
    -3
      source/backend/plugin/CarlaPluginThread.hpp
  7. +10
    -23
      source/backend/plugin/DssiPlugin.cpp
  8. +9
    -0
      source/backend/standalone/CarlaStandalone.cpp
  9. +1
    -1
      source/backend/standalone/Makefile
  10. +1
    -0
      source/carla.py
  11. +7
    -1
      source/carla_backend.py
  12. +1
    -1
      source/tests/ANSI.cpp
  13. +1
    -1
      source/tests/Makefile

+ 1
- 0
source/backend/CarlaStandalone.hpp View File

@@ -159,6 +159,7 @@ CARLA_EXPORT bool carla_engine_init(const char* driverName, const char* clientNa
CARLA_EXPORT bool carla_engine_close(); CARLA_EXPORT bool carla_engine_close();
CARLA_EXPORT void carla_engine_idle(); CARLA_EXPORT void carla_engine_idle();
CARLA_EXPORT bool carla_is_engine_running(); CARLA_EXPORT bool carla_is_engine_running();
CARLA_EXPORT void carla_set_engine_about_to_close();


CARLA_EXPORT bool carla_load_project(const char* filename); CARLA_EXPORT bool carla_load_project(const char* filename);
CARLA_EXPORT bool carla_save_project(const char* filename); CARLA_EXPORT bool carla_save_project(const char* filename);


+ 70
- 61
source/backend/plugin/CarlaPlugin.cpp View File

@@ -17,7 +17,6 @@


#include "CarlaPluginInternal.hpp" #include "CarlaPluginInternal.hpp"
#include "CarlaLibUtils.hpp" #include "CarlaLibUtils.hpp"
#include "CarlaStateUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


//#include <QtGui/QtEvents> //#include <QtGui/QtEvents>
@@ -60,12 +59,12 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)
fHints(0x0), fHints(0x0),
fOptions(0x0), fOptions(0x0),
fEnabled(false), fEnabled(false),
kData(new CarlaPluginProtectedData(engine))
kData(new CarlaPluginProtectedData(engine, this, CarlaPluginThread::PLUGIN_THREAD_NULL))
{ {
CARLA_ASSERT(kData != nullptr); CARLA_ASSERT(kData != nullptr);
CARLA_ASSERT(engine != nullptr); CARLA_ASSERT(engine != nullptr);
CARLA_ASSERT(id < engine->maxPluginNumber()); CARLA_ASSERT(id < engine->maxPluginNumber());
qDebug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id);
carla_debug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id);


switch (engine->getProccessMode()) switch (engine->getProccessMode())
{ {
@@ -90,7 +89,7 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)


CarlaPlugin::~CarlaPlugin() CarlaPlugin::~CarlaPlugin()
{ {
qDebug("CarlaPlugin::~CarlaPlugin()");
carla_debug("CarlaPlugin::~CarlaPlugin()");


// Remove client and ports // Remove client and ports
if (kData->client != nullptr) if (kData->client != nullptr)
@@ -163,7 +162,7 @@ uint32_t CarlaPlugin::parameterScalePointCount(const uint32_t parameterId) const
return 0; return 0;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


uint32_t CarlaPlugin::programCount() const uint32_t CarlaPlugin::programCount() const
@@ -235,7 +234,7 @@ int32_t CarlaPlugin::chunkData(void** const dataPtr)
return 0; return 0;


// unused // unused
Q_UNUSED(dataPtr);
(void)dataPtr;
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -247,7 +246,7 @@ float CarlaPlugin::getParameterValue(const uint32_t parameterId)
return 0.0f; return 0.0f;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId) float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId)
@@ -257,8 +256,8 @@ float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const
return 0.0f; return 0.0f;


// unused // unused
Q_UNUSED(parameterId);
Q_UNUSED(scalePointId);
(void)parameterId;
(void)scalePointId;
} }


void CarlaPlugin::getLabel(char* const strBuf) void CarlaPlugin::getLabel(char* const strBuf)
@@ -288,7 +287,7 @@ void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBu
return; return;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf) void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf)
@@ -298,7 +297,7 @@ void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const str
return; return;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf) void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf)
@@ -308,7 +307,7 @@ void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBu
return; return;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf) void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf)
@@ -318,7 +317,7 @@ void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBu
return; return;


// unused // unused
Q_UNUSED(parameterId);
(void)parameterId;
} }


void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf)
@@ -329,8 +328,8 @@ void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const
return; return;


// unused // unused
Q_UNUSED(parameterId);
Q_UNUSED(scalePointId);
(void)parameterId;
(void)scalePointId;
} }


void CarlaPlugin::getProgramName(const uint32_t index, char* const strBuf) void CarlaPlugin::getProgramName(const uint32_t index, char* const strBuf)
@@ -380,6 +379,7 @@ void CarlaPlugin::getParameterCountInfo(uint32_t* const ins, uint32_t* const out
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


#if 0
const SaveState& CarlaPlugin::getSaveState() const SaveState& CarlaPlugin::getSaveState()
{ {
static SaveState saveState; static SaveState saveState;
@@ -393,6 +393,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)
// TODO // TODO
Q_UNUSED(saveState); Q_UNUSED(saveState);
} }
#endif


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (internal stuff) // Set data (internal stuff)
@@ -420,7 +421,8 @@ void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool se
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, value); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, value);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -443,7 +445,8 @@ void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool se
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -466,7 +469,8 @@ void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool se
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -489,7 +493,8 @@ void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bo
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -512,7 +517,8 @@ void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const b
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -535,7 +541,8 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue); kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -546,13 +553,6 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s
#endif #endif
} }


#if 0 //ndef BUILD_BRIDGE
int CarlaPlugin::setOscBridgeInfo(const PluginBridgeInfoType, const int, const lo_arg* const* const, const char* const)
{
return 1;
}
#endif

// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (plugin-specific stuff) // Set data (plugin-specific stuff)


@@ -567,7 +567,8 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_value(fId, parameterId, value); kData->engine->osc_send_control_set_parameter_value(fId, parameterId, value);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -616,7 +617,8 @@ void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t ch
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_midi_channel(fId, parameterId, channel); kData->engine->osc_send_control_set_parameter_midi_channel(fId, parameterId, channel);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -637,7 +639,8 @@ void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, con
if (sendOsc) if (sendOsc)
kData->engine->osc_send_control_set_parameter_midi_cc(fId, parameterId, cc); kData->engine->osc_send_control_set_parameter_midi_cc(fId, parameterId, cc);
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -651,13 +654,13 @@ void CarlaPlugin::setCustomData(const char* const type, const char* const key, c
CARLA_ASSERT(value != nullptr); CARLA_ASSERT(value != nullptr);


if (type == nullptr) if (type == nullptr)
return qCritical("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - type is invalid", type, key, value, bool2str(sendGui));
return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - type is invalid", type, key, value, bool2str(sendGui));


if (key == nullptr) if (key == nullptr)
return qCritical("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - key is null", type, key, value, bool2str(sendGui));
return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - key is null", type, key, value, bool2str(sendGui));


if (value == nullptr) if (value == nullptr)
return qCritical("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - value is null", type, key, value, bool2str(sendGui));
return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - value is null", type, key, value, bool2str(sendGui));


bool saveData = true; bool saveData = true;


@@ -700,7 +703,7 @@ void CarlaPlugin::setChunkData(const char* const stringData)
return; return;


// unused // unused
Q_UNUSED(stringData);
(void)stringData;
} }


void CarlaPlugin::setProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool) void CarlaPlugin::setProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool)
@@ -806,7 +809,10 @@ void CarlaPlugin::setMidiProgramById(const uint32_t bank, const uint32_t program


void CarlaPlugin::showGui(const bool yesNo) void CarlaPlugin::showGui(const bool yesNo)
{ {
Q_UNUSED(yesNo);
return;

// unused
(void)yesNo;
} }


void CarlaPlugin::idleGui() void CarlaPlugin::idleGui()
@@ -1024,7 +1030,7 @@ void CarlaPlugin::registerToOscClient()
void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
{ {
// FIXME - remove debug prints later // FIXME - remove debug prints later
qWarning("CarlaPlugin::updateOscData(%p, \"%s\")", source, url);
carla_stdout("CarlaPlugin::updateOscData(%p, \"%s\")", source, url);


kData->osc.data.free(); kData->osc.data.free();


@@ -1035,7 +1041,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
const char* port = lo_address_get_port(source); const char* port = lo_address_get_port(source);
kData->osc.data.source = lo_address_new_with_proto(proto, host, port); kData->osc.data.source = lo_address_new_with_proto(proto, host, port);


qWarning("CarlaPlugin::updateOscData() - source: host \"%s\", port \"%s\"", host, port);
carla_stdout("CarlaPlugin::updateOscData() - source: host \"%s\", port \"%s\"", host, port);
} }


{ {
@@ -1043,7 +1049,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
char* port = lo_url_get_port(url); char* port = lo_url_get_port(url);
kData->osc.data.path = carla_strdup_free(lo_url_get_path(url)); kData->osc.data.path = carla_strdup_free(lo_url_get_path(url));
kData->osc.data.target = lo_address_new_with_proto(proto, host, port); kData->osc.data.target = lo_address_new_with_proto(proto, host, port);
qWarning("CarlaPlugin::updateOscData() - target: host \"%s\", port \"%s\", path \"%s\"", host, port, kData->osc.data.path);
carla_stdout("CarlaPlugin::updateOscData() - target: host \"%s\", port \"%s\", path \"%s\"", host, port, kData->osc.data.path);


std::free(host); std::free(host);
std::free(port); std::free(port);
@@ -1084,7 +1090,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
for (uint32_t i=0; i < kData->param.count; i++) for (uint32_t i=0; i < kData->param.count; i++)
osc_send_control(&kData->osc.data, kData->param.data[i].rindex, getParameterValue(i)); osc_send_control(&kData->osc.data, kData->param.data[i].rindex, getParameterValue(i));


qWarning("CarlaPlugin::updateOscData() - done");
carla_stdout("CarlaPlugin::updateOscData() - done");
} }


void CarlaPlugin::freeOscData() void CarlaPlugin::freeOscData()
@@ -1094,14 +1100,14 @@ void CarlaPlugin::freeOscData()


bool CarlaPlugin::waitForOscGuiShow() bool CarlaPlugin::waitForOscGuiShow()
{ {
qWarning("CarlaPlugin::waitForOscGuiShow()");
carla_stdout("CarlaPlugin::waitForOscGuiShow()");


// wait for UI 'update' call // wait for UI 'update' call
for (uint i=0, oscUiTimeout = kData->engine->getOptions().oscUiTimeout; i < oscUiTimeout; i++) for (uint i=0, oscUiTimeout = kData->engine->getOptions().oscUiTimeout; i < oscUiTimeout; i++)
{ {
if (kData->osc.data.target) if (kData->osc.data.target)
{ {
qWarning("CarlaPlugin::waitForOscGuiShow() - got response, asking UI to show itself now");
carla_stdout("CarlaPlugin::waitForOscGuiShow() - got response, asking UI to show itself now");
osc_send_show(&kData->osc.data); osc_send_show(&kData->osc.data);
return true; return true;
} }
@@ -1109,7 +1115,7 @@ bool CarlaPlugin::waitForOscGuiShow()
carla_msleep(100); carla_msleep(100);
} }


qWarning("CarlaPlugin::waitForOscGuiShow() - Timeout while waiting for UI to respond (waited %u msecs)", kData->engine->getOptions().oscUiTimeout);
carla_stdout("CarlaPlugin::waitForOscGuiShow() - Timeout while waiting for UI to respond (waited %u msecs)", kData->engine->getOptions().oscUiTimeout);
return false; return false;
} }


@@ -1151,7 +1157,8 @@ void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note,
kData->engine->osc_send_control_note_off(fId, channel, note); kData->engine->osc_send_control_note_off(fId, channel, note);
} }
#else #else
Q_UNUSED(sendOsc);
// unused
(void)sendOsc;
#endif #endif


if (sendCallback) if (sendCallback)
@@ -1314,8 +1321,8 @@ void CarlaPlugin::uiParameterChange(const uint32_t index, const float value)
return; return;


// unused // unused
Q_UNUSED(index);
Q_UNUSED(value);
(void)index;
(void)value;
} }


void CarlaPlugin::uiProgramChange(const uint32_t index) void CarlaPlugin::uiProgramChange(const uint32_t index)
@@ -1324,7 +1331,7 @@ void CarlaPlugin::uiProgramChange(const uint32_t index)
return; return;


// unused // unused
Q_UNUSED(index);
(void)index;
} }


void CarlaPlugin::uiMidiProgramChange(const uint32_t index) void CarlaPlugin::uiMidiProgramChange(const uint32_t index)
@@ -1333,7 +1340,7 @@ void CarlaPlugin::uiMidiProgramChange(const uint32_t index)
return; return;


// unused // unused
Q_UNUSED(index);
(void)index;
} }


void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo)
@@ -1344,9 +1351,9 @@ void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint
return; return;


// unused // unused
Q_UNUSED(channel);
Q_UNUSED(note);
Q_UNUSED(velo);
(void)channel;
(void)note;
(void)velo;
} }


void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note) void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note)
@@ -1356,8 +1363,8 @@ void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note)
return; return;


// unused // unused
Q_UNUSED(channel);
Q_UNUSED(note);
(void)channel;
(void)note;
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -1372,14 +1379,14 @@ void CarlaPlugin::initBuffers()


void CarlaPlugin::deleteBuffers() void CarlaPlugin::deleteBuffers()
{ {
qDebug("CarlaPlugin::deleteBuffers() - start");
carla_debug("CarlaPlugin::deleteBuffers() - start");


kData->audioIn.clear(); kData->audioIn.clear();
kData->audioOut.clear(); kData->audioOut.clear();
kData->param.clear(); kData->param.clear();
kData->event.clear(); kData->event.clear();


qDebug("CarlaPlugin::deleteBuffers() - end");
carla_debug("CarlaPlugin::deleteBuffers() - end");
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -1432,11 +1439,12 @@ CarlaPlugin::ScopedDisabler::~ScopedDisabler()
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// CarlaPluginGUI // CarlaPluginGUI


#if 0
CarlaPluginGUI::CarlaPluginGUI(QWidget* const parent, Callback* const callback) CarlaPluginGUI::CarlaPluginGUI(QWidget* const parent, Callback* const callback)
: QMainWindow(parent), : QMainWindow(parent),
kCallback(callback) kCallback(callback)
{ {
qDebug("CarlaPluginGUI::CarlaPluginGUI(%p)", parent);
carla_debug("CarlaPluginGUI::CarlaPluginGUI(%p)", parent);
//CARLA_ASSERT(callback); //CARLA_ASSERT(callback);


//m_container = new GuiContainer(this); //m_container = new GuiContainer(this);
@@ -1455,12 +1463,13 @@ CarlaPluginGUI::CarlaPluginGUI(QWidget* const parent, Callback* const callback)


CarlaPluginGUI::~CarlaPluginGUI() CarlaPluginGUI::~CarlaPluginGUI()
{ {
qDebug("CarlaPluginGUI::~CarlaPluginGUI()");
carla_debug("CarlaPluginGUI::~CarlaPluginGUI()");
//CARLA_ASSERT(m_container); //CARLA_ASSERT(m_container);


// FIXME, automatically deleted by parent ? // FIXME, automatically deleted by parent ?
//delete m_container; //delete m_container;
} }
#endif


#if 0 #if 0


@@ -1480,7 +1489,7 @@ WId CarlaPluginGUI::getWinId() const


void CarlaPluginGUI::setNewSize(int width, int height) void CarlaPluginGUI::setNewSize(int width, int height)
{ {
qDebug("CarlaPluginGUI::setNewSize(%i, %i)", width, height);
carla_debug("CarlaPluginGUI::setNewSize(%i, %i)", width, height);


if (width < 30) if (width < 30)
width = 30; width = 30;
@@ -1517,7 +1526,7 @@ void CarlaPluginGUI::setTitle(const char* const title)


void CarlaPluginGUI::setVisible(const bool yesNo) void CarlaPluginGUI::setVisible(const bool yesNo)
{ {
qDebug("CarlaPluginGUI::setVisible(%s)", bool2str(yesNo));
carla_debug("CarlaPluginGUI::setVisible(%s)", bool2str(yesNo));


if (yesNo) if (yesNo)
{ {
@@ -1534,7 +1543,7 @@ void CarlaPluginGUI::setVisible(const bool yesNo)


void CarlaPluginGUI::hideEvent(QHideEvent* const event) void CarlaPluginGUI::hideEvent(QHideEvent* const event)
{ {
qDebug("CarlaPluginGUI::hideEvent(%p)", event);
carla_debug("CarlaPluginGUI::hideEvent(%p)", event);
CARLA_ASSERT(event); CARLA_ASSERT(event);


event->accept(); event->accept();
@@ -1543,7 +1552,7 @@ void CarlaPluginGUI::hideEvent(QHideEvent* const event)


void CarlaPluginGUI::closeEvent(QCloseEvent* const event) void CarlaPluginGUI::closeEvent(QCloseEvent* const event)
{ {
qDebug("CarlaPluginGUI::closeEvent(%p)", event);
carla_debug("CarlaPluginGUI::closeEvent(%p)", event);
CARLA_ASSERT(event); CARLA_ASSERT(event);


if (event->spontaneous()) if (event->spontaneous())


+ 29
- 47
source/backend/plugin/CarlaPlugin.pro View File

@@ -1,7 +1,9 @@
# QtCreator project file # QtCreator project file


QT = core gui

CONFIG = debug CONFIG = debug
CONFIG += link_pkgconfig shared warn_on
CONFIG += link_pkgconfig shared qt warn_on


DEFINES = DEBUG DEFINES = DEBUG
DEFINES += QTCREATOR_TEST DEFINES += QTCREATOR_TEST
@@ -22,65 +24,45 @@ DEFINES += WANT_SUIL


PKGCONFIG = liblo suil-0 fluidsynth linuxsampler PKGCONFIG = liblo suil-0 fluidsynth linuxsampler


TARGET = carla_plugin
TARGET = CarlaPlugin
TEMPLATE = lib TEMPLATE = lib
VERSION = 0.5.0 VERSION = 0.5.0


SOURCES = \ SOURCES = \
carla_plugin.cpp \
carla_plugin_thread.cpp \
carla_bridge.cpp \
native.cpp \
ladspa.cpp \
dssi.cpp \
lv2.cpp \
vst.cpp \
fluidsynth.cpp \
linuxsampler.cpp
CarlaPlugin.cpp \
CarlaPluginThread.cpp \
CarlaBridge.cpp \
NativePlugin.cpp \
LadspaPlugin.cpp \
DssiPlugin.cpp \
Lv2Plugin.cpp \
VstPlugin.cpp \
FluidSynthPlugin.cpp \
LinuxSamplerPlugin.cpp


HEADERS = \ HEADERS = \
carla_plugin_internal.hpp \
carla_plugin_thread.hpp
CarlaPluginInternal.hpp \
CarlaPluginThread.hpp


HEADERS += \ HEADERS += \
../carla_backend.hpp \
../carla_engine.hpp \
../carla_native.h \
../carla_native.hpp \
../carla_plugin.hpp
../CarlaBackend.hpp \
../CarlaEngine.hpp \
../CarlaNative.h \
../CarlaPlugin.hpp


HEADERS += \ HEADERS += \
../../utils/carla_juce_utils.hpp \
../../utils/carla_lib_utils.hpp \
../../utils/carla_osc_utils.hpp \
../../utils/carla_state_utils.hpp \
../../utils/carla_utils.hpp
../../utils/CarlaUtils.hpp \
../../utils/CarlaJuceUtils.hpp \
../../utils/CarlaLibUtils.hpp \
../../utils/CarlaOscUtils.hpp \
../../utils/CarlaStateUtils.hpp \
../../utils/CarlaMutex.hpp \
../../utils/CarlaString.hpp \
../../utils/CarlaThread.hpp


INCLUDEPATH = . .. \ INCLUDEPATH = . .. \
../../includes \ ../../includes \
../../libs \ ../../libs \
../../utils ../../utils


# ---------------------------------------------------------------------------------------

PKGCONFIG += QtCore QtGui

# Fake includes
INCLUDEPATH += \
/usr/include/qt4/ \
/opt/kxstudio/include/

# System includes
QMAKE_CXXFLAGS += -isystem /usr/include/qt4/
QMAKE_CXXFLAGS += -isystem /opt/kxstudio/include/

WARN_FLAGS = \
-ansi -pedantic -pedantic-errors -Wall -Wextra -Wunused-parameter -Wuninitialized \
-Wlogical-op -Wno-vla

#-fipa-pure-const -Wsuggest-attribute=const #pure,const,noreturn
#-Waggregate-return
#-Wcast-qual -Wconversion -Wsign-conversion -Wformat=2

QMAKE_CFLAGS += $${WARN_FLAGS} -std=c99 -Wc++-compat -Wunsuffixed-float-constants -Wwrite-strings
QMAKE_CXXFLAGS += $${WARN_FLAGS} -std=c++11 -Wzero-as-null-pointer-constant
QMAKE_CXXFLAGS += -std=c++0x

+ 7
- 5
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -18,6 +18,7 @@
#ifndef __CARLA_PLUGIN_INTERNAL_HPP__ #ifndef __CARLA_PLUGIN_INTERNAL_HPP__
#define __CARLA_PLUGIN_INTERNAL_HPP__ #define __CARLA_PLUGIN_INTERNAL_HPP__


#include "CarlaBackendUtils.hpp"
#include "CarlaPluginThread.hpp" #include "CarlaPluginThread.hpp"
#include "CarlaPlugin.hpp" #include "CarlaPlugin.hpp"
#include "CarlaEngine.hpp" #include "CarlaEngine.hpp"
@@ -483,13 +484,13 @@ struct CarlaPluginProtectedData {


struct OSC { struct OSC {
CarlaOscData data; CarlaOscData data;
CarlaPluginThread* thread;
CarlaPluginThread thread;


OSC()
: thread(nullptr) {}
OSC(CarlaEngine* const engine, CarlaPlugin* const plugin, const CarlaPluginThread::Mode mode)
: thread(engine, plugin, mode) {}
} osc; } osc;


CarlaPluginProtectedData(CarlaEngine* const engine_)
CarlaPluginProtectedData(CarlaEngine* const engine_, CarlaPlugin* const plugin, const CarlaPluginThread::Mode mode)
: engine(engine_), : engine(engine_),
client(nullptr), client(nullptr),
gui(nullptr), gui(nullptr),
@@ -499,7 +500,8 @@ struct CarlaPluginProtectedData {
ctrlInChannel(-1), ctrlInChannel(-1),
extraHints(0x0), extraHints(0x0),
latency(0), latency(0),
latencyBuffers(nullptr) {}
latencyBuffers(nullptr),
osc(engine_, plugin, mode) {}


CarlaPluginProtectedData() = delete; CarlaPluginProtectedData() = delete;
CarlaPluginProtectedData(CarlaPluginProtectedData&) = delete; CarlaPluginProtectedData(CarlaPluginProtectedData&) = delete;


+ 19
- 6
source/backend/plugin/CarlaPluginThread.cpp View File

@@ -24,10 +24,12 @@


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode)
const char* PluginThreadMode2str(const CarlaPluginThread::Mode mode)
{ {
switch (mode) switch (mode)
{ {
case CarlaPluginThread::PLUGIN_THREAD_NULL:
return "PLUGIN_THREAD_NULL";
case CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI: case CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI:
return "PLUGIN_THREAD_DSSI_GUI"; return "PLUGIN_THREAD_DSSI_GUI";
case CarlaPluginThread::PLUGIN_THREAD_LV2_GUI: case CarlaPluginThread::PLUGIN_THREAD_LV2_GUI:
@@ -42,10 +44,10 @@ const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode)
return nullptr; return nullptr;
} }


CarlaPluginThread::CarlaPluginThread(CarlaBackend::CarlaEngine* const engine, CarlaBackend::CarlaPlugin* const plugin, const PluginThreadMode mode)
CarlaPluginThread::CarlaPluginThread(CarlaBackend::CarlaEngine* const engine, CarlaBackend::CarlaPlugin* const plugin, const Mode mode)
: kEngine(engine), : kEngine(engine),
kPlugin(plugin), kPlugin(plugin),
kMode(mode),
fMode(mode),
fProcess(nullptr) fProcess(nullptr)
{ {
carla_debug("CarlaPluginThread::CarlaPluginThread(plugin:\"%s\", engine:\"%s\", %s)", plugin->name(), engine->getName(), PluginThreadMode2str(mode)); carla_debug("CarlaPluginThread::CarlaPluginThread(plugin:\"%s\", engine:\"%s\", %s)", plugin->name(), engine->getName(), PluginThreadMode2str(mode));
@@ -57,6 +59,11 @@ CarlaPluginThread::~CarlaPluginThread()
delete fProcess; delete fProcess;
} }


void CarlaPluginThread::setMode(const CarlaPluginThread::Mode mode)
{
fMode = mode;
}

void CarlaPluginThread::setOscData(const char* const binary, const char* const label, const char* const extra) void CarlaPluginThread::setOscData(const char* const binary, const char* const label, const char* const extra)
{ {
fBinary = binary; fBinary = binary;
@@ -73,15 +80,18 @@ void CarlaPluginThread::run()
fProcess = new QProcess(nullptr); fProcess = new QProcess(nullptr);
fProcess->setProcessChannelMode(QProcess::ForwardedChannels); fProcess->setProcessChannelMode(QProcess::ForwardedChannels);
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
fProcess->setProcessEnvironment(kEngine->getOptionsAsProcessEnvironment());
//fProcess->setProcessEnvironment(kEngine->getOptionsAsProcessEnvironment());
#endif #endif
} }


QString name(kPlugin->name() ? kPlugin->name() : "(none)"); QString name(kPlugin->name() ? kPlugin->name() : "(none)");
QStringList arguments; QStringList arguments;


switch (kMode)
switch (fMode)
{ {
case PLUGIN_THREAD_NULL:
break;

case PLUGIN_THREAD_DSSI_GUI: case PLUGIN_THREAD_DSSI_GUI:
/* osc_url */ arguments << QString("%1/%2").arg(kEngine->getOscServerPathUDP()).arg(kPlugin->id()); /* osc_url */ arguments << QString("%1/%2").arg(kEngine->getOscServerPathUDP()).arg(kPlugin->id());
/* filename */ arguments << kPlugin->filename(); /* filename */ arguments << kPlugin->filename();
@@ -114,8 +124,11 @@ void CarlaPluginThread::run()
fProcess->start((const char*)fBinary, arguments); fProcess->start((const char*)fBinary, arguments);
fProcess->waitForStarted(); fProcess->waitForStarted();


switch (kMode)
switch (fMode)
{ {
case PLUGIN_THREAD_NULL:
break;

case PLUGIN_THREAD_DSSI_GUI: case PLUGIN_THREAD_DSSI_GUI:
case PLUGIN_THREAD_LV2_GUI: case PLUGIN_THREAD_LV2_GUI:
case PLUGIN_THREAD_VST_GUI: case PLUGIN_THREAD_VST_GUI:


+ 5
- 3
source/backend/plugin/CarlaPluginThread.hpp View File

@@ -29,16 +29,18 @@ CARLA_BACKEND_START_NAMESPACE
class CarlaPluginThread : public CarlaThread class CarlaPluginThread : public CarlaThread
{ {
public: public:
enum PluginThreadMode {
enum Mode {
PLUGIN_THREAD_NULL,
PLUGIN_THREAD_DSSI_GUI, PLUGIN_THREAD_DSSI_GUI,
PLUGIN_THREAD_LV2_GUI, PLUGIN_THREAD_LV2_GUI,
PLUGIN_THREAD_VST_GUI, PLUGIN_THREAD_VST_GUI,
PLUGIN_THREAD_BRIDGE PLUGIN_THREAD_BRIDGE
}; };


CarlaPluginThread(CarlaEngine* const engine, CarlaPlugin* const plugin, const PluginThreadMode mode);
CarlaPluginThread(CarlaEngine* const engine, CarlaPlugin* const plugin, const Mode mode);
~CarlaPluginThread(); ~CarlaPluginThread();


void setMode(const CarlaPluginThread::Mode mode);
void setOscData(const char* const binary, const char* const label, const char* const extra=""); void setOscData(const char* const binary, const char* const label, const char* const extra="");


protected: protected:
@@ -47,8 +49,8 @@ protected:
private: private:
CarlaEngine* const kEngine; CarlaEngine* const kEngine;
CarlaPlugin* const kPlugin; CarlaPlugin* const kPlugin;
const PluginThreadMode kMode;


Mode fMode;
CarlaString fBinary; CarlaString fBinary;
CarlaString fLabel; CarlaString fLabel;
CarlaString fExtra; CarlaString fExtra;


+ 10
- 23
source/backend/plugin/DssiPlugin.cpp View File

@@ -53,16 +53,11 @@ public:
{ {
showGui(false); showGui(false);


if (kData->osc.thread != nullptr)
// Wait a bit first, try safe quit, then force kill
if (kData->osc.thread.isRunning() && ! kData->osc.thread.stop(kData->engine->getOptions().oscUiTimeout))
{ {
// Wait a bit first, try safe quit, then force kill
if (kData->osc.thread->isRunning() && ! kData->osc.thread->wait(kData->engine->getOptions().oscUiTimeout))
{
qWarning("Failed to properly stop DSSI GUI thread");
kData->osc.thread->terminate();
}

delete kData->osc.thread;
qWarning("Failed to properly stop DSSI GUI thread");
kData->osc.thread.terminate();
} }
} }


@@ -322,17 +317,9 @@ public:


void showGui(const bool yesNo) void showGui(const bool yesNo)
{ {
CARLA_ASSERT(kData->osc.thread != nullptr);

if (kData->osc.thread == nullptr)
{
qCritical("DssiPlugin::showGui(%s) - attempt to show gui, but it does not exist!", bool2str(yesNo));
return;
}

if (yesNo) if (yesNo)
{ {
kData->osc.thread->start();
kData->osc.thread.start();
} }
else else
{ {
@@ -343,8 +330,8 @@ public:
kData->osc.data.free(); kData->osc.data.free();
} }


if (! kData->osc.thread->wait(500))
kData->osc.thread->quit();
if (kData->osc.thread.isRunning() && ! kData->osc.thread.stop(kData->engine->getOptions().oscUiTimeout))
kData->osc.thread.terminate();
} }
} }


@@ -1711,10 +1698,10 @@ public:
// --------------------------------------------------------------- // ---------------------------------------------------------------
// gui stuff // gui stuff


if (guiFilename)
if (guiFilename != nullptr)
{ {
kData->osc.thread = new CarlaPluginThread(kData->engine, this, CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI);
kData->osc.thread->setOscData(guiFilename, fDescriptor->Label);
kData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI);
kData->osc.thread.setOscData(guiFilename, fDescriptor->Label);


fHints |= PLUGIN_HAS_GUI; fHints |= PLUGIN_HAS_GUI;
} }


+ 9
- 0
source/backend/standalone/CarlaStandalone.cpp View File

@@ -299,6 +299,15 @@ bool carla_is_engine_running()
return (standalone.engine != nullptr && standalone.engine->isRunning()); return (standalone.engine != nullptr && standalone.engine->isRunning());
} }


void carla_set_engine_about_to_close()
{
carla_debug("carla_set_engine_about_to_close()");
CARLA_ASSERT(standalone.engine != nullptr);

if (standalone.engine != nullptr)
standalone.engine->setAboutToClose();
}

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


bool carla_load_project(const char* filename) bool carla_load_project(const char* filename)


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

@@ -75,7 +75,7 @@ debug:
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@


$(SHARED): $(OBJS) $(LIBS) $(SHARED): $(OBJS) $(LIBS)
$(CXX) $^ -shared $(LINK_FLAGS) -o $@
$(CXX) $^ -shared $(LINK_FLAGS) -o $@ && $(STRIP) $@


$(STATIC): $(OBJS) $(LIBS) $(STATIC): $(OBJS) $(LIBS)
$(AR) rs $@ $^ $(AR) rs $@ $^


+ 1
- 0
source/carla.py View File

@@ -1169,6 +1169,7 @@ class CarlaMainW(QMainWindow):


self.saveSettings() self.saveSettings()


Carla.host.set_engine_about_to_close()
self.removeAllPlugins() self.removeAllPlugins()
self.stopEngine() self.stopEngine()




+ 7
- 1
source/carla_backend.py View File

@@ -173,6 +173,9 @@ class Host(object):


self.lib.carla_is_engine_running.argtypes = None self.lib.carla_is_engine_running.argtypes = None
self.lib.carla_is_engine_running.restype = c_bool self.lib.carla_is_engine_running.restype = c_bool
self.lib.carla_set_engine_about_to_close.argtypes = None
self.lib.carla_set_engine_about_to_close.restype = None


self.lib.carla_load_project.argtypes = [c_char_p] self.lib.carla_load_project.argtypes = [c_char_p]
self.lib.carla_load_project.restype = c_bool self.lib.carla_load_project.restype = c_bool
@@ -363,11 +366,14 @@ class Host(object):
return self.lib.carla_engine_close() return self.lib.carla_engine_close()


def engine_idle(self): def engine_idle(self):
return self.lib.carla_engine_idle()
self.lib.carla_engine_idle()


def is_engine_running(self): def is_engine_running(self):
return self.lib.carla_is_engine_running() return self.lib.carla_is_engine_running()


def set_engine_about_to_close(self):
self.lib.carla_set_engine_about_to_close()

def load_project(self, filename): def load_project(self, filename):
return self.lib.carla_load_project(filename.encode("utf-8")) return self.lib.carla_load_project(filename.encode("utf-8"))




+ 1
- 1
source/tests/ANSI.cpp View File

@@ -17,7 +17,7 @@


// still need qt classes check // still need qt classes check
//#include "CarlaPlugin.hpp" //#include "CarlaPlugin.hpp"
#include "plugin/CarlaPluginThread.cpp"
#include "plugin/CarlaPlugin.cpp"


#if 0 #if 0
#include "CarlaDefines.hpp" #include "CarlaDefines.hpp"


+ 1
- 1
source/tests/Makefile View File

@@ -10,7 +10,7 @@ include ../Makefile.mk


BUILD_CXX_FLAGS += -I../backend -I../includes -I../libs -I../utils -Wall -Wextra BUILD_CXX_FLAGS += -I../backend -I../includes -I../libs -I../utils -Wall -Wextra
BUILD_CXX_FLAGS += -DWANT_JACK -DWANT_RTAUDIO BUILD_CXX_FLAGS += -DWANT_JACK -DWANT_RTAUDIO
BUILD_CXX_FLAGS += -isystem /usr/include/qt4
# BUILD_CXX_FLAGS += -isystem /usr/include/qt4
# BUILD_CXX_FLAGS += -isystem ../backend/engine/rtaudio-4.0.11 # BUILD_CXX_FLAGS += -isystem ../backend/engine/rtaudio-4.0.11
# BUILD_CXX_FLAGS += -I/opt/mingw32/include # BUILD_CXX_FLAGS += -I/opt/mingw32/include




Loading…
Cancel
Save