@@ -7,10 +7,11 @@ | |||||
CC ?= gcc | CC ?= gcc | ||||
CXX ?= g++ | CXX ?= g++ | ||||
CARLA_BUILD_FLAGS = -Wall -std=c++0x -fPIC -I. -I../carla-includes `pkg-config --cflags jack fluidsynth liblo QtCore QtGui` $(CXXFLAGS) | |||||
# CARLA_BUILD_FLAGS += -DNDEBUG -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT -O2 -fvisibility=hidden -ffast-math -fomit-frame-pointer -mtune=generic -msse | |||||
CARLA_BUILD_FLAGS += -DDEBUG -O0 -g | |||||
CARLA_LINK_FLAGS = -shared -fPIC -ldl `pkg-config --libs jack fluidsynth liblo QtCore QtGui` $(LDFLAGS) | |||||
CARLA_C_FLAGS = -Wall -fPIC -I. -I../carla-includes $(CFLAGS) | |||||
CARLA_CXX_FLAGS = -Wall -std=c++0x -fPIC -I. -I../carla-includes `pkg-config --cflags jack fluidsynth liblo QtCore QtGui` $(CXXFLAGS) | |||||
#CARLA_CXX_FLAGS += -DNDEBUG -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT -O2 -fvisibility=hidden -ffast-math -fomit-frame-pointer -mtune=generic -msse | |||||
CARLA_CXX_FLAGS += -DDEBUG -O0 -g | |||||
CARLA_LINK_FLAGS = -shared -fPIC -ldl `pkg-config --libs jack fluidsynth liblo QtCore QtGui` $(LDFLAGS) | |||||
OBJS = carla_backend.o carla_bridge.o carla_jack.o carla_osc.o carla_shared.o carla_threads.o ladspa.o dssi.o lv2.o vst.o sf2.o lv2-rtmempool/rtmempool.o | OBJS = carla_backend.o carla_bridge.o carla_jack.o carla_osc.o carla_shared.o carla_threads.o ladspa.o dssi.o lv2.o vst.o sf2.o lv2-rtmempool/rtmempool.o | ||||
@@ -24,10 +25,10 @@ carla_backend.dll: $(OBJS) windows.def | |||||
$(CXX) $(OBJS) windows.def $(CARLA_LINK_FLAGS) -o carla_backend.dll | $(CXX) $(OBJS) windows.def $(CARLA_LINK_FLAGS) -o carla_backend.dll | ||||
.c.o: | .c.o: | ||||
$(CC) -c $< $(CARLA_BUILD_FLAGS) -o $@ | |||||
$(CC) -c $< $(CARLA_C_FLAGS) -o $@ | |||||
.cpp.o: | .cpp.o: | ||||
$(CXX) -c $< $(CARLA_BUILD_FLAGS) -o $@ | |||||
$(CXX) -c $< $(CARLA_CXX_FLAGS) -o $@ | |||||
clean: | clean: | ||||
rm -f *.o lv2-rtmempool/*.o *.so *.dll | rm -f *.o lv2-rtmempool/*.o *.so *.dll |
@@ -203,23 +203,29 @@ CarlaPluginThread::CarlaPluginThread(CarlaPlugin* plugin, PluginThreadMode mode) | |||||
{ | { | ||||
qDebug("CarlaPluginThread::CarlaPluginThread(%p, %i)", plugin, mode); | qDebug("CarlaPluginThread::CarlaPluginThread(%p, %i)", plugin, mode); | ||||
m_process = new QProcess(nullptr); | |||||
m_process = nullptr; | |||||
} | } | ||||
CarlaPluginThread::~CarlaPluginThread() | CarlaPluginThread::~CarlaPluginThread() | ||||
{ | { | ||||
delete m_process; | |||||
if (m_process) | |||||
delete m_process; | |||||
} | } | ||||
void CarlaPluginThread::setOscData(const char* binary, const char* label, const char* data1) | |||||
void CarlaPluginThread::setOscData(const char* binary, const char* label, const char* data1, const char* data2, const char* data3) | |||||
{ | { | ||||
m_binary = QString(binary); | m_binary = QString(binary); | ||||
m_label = QString(label); | m_label = QString(label); | ||||
m_data1 = QString(data1); | m_data1 = QString(data1); | ||||
m_data2 = QString(data2); | |||||
m_data3 = QString(data3); | |||||
} | } | ||||
void CarlaPluginThread::run() | void CarlaPluginThread::run() | ||||
{ | { | ||||
if (m_process == nullptr) | |||||
m_process = new QProcess(nullptr); | |||||
QStringList arguments; | QStringList arguments; | ||||
switch (m_mode) | switch (m_mode) | ||||
@@ -232,9 +238,12 @@ void CarlaPluginThread::run() | |||||
break; | break; | ||||
case PLUGIN_THREAD_LV2_GUI: | case PLUGIN_THREAD_LV2_GUI: | ||||
//arguments << QString("%1/%2").arg(get_host_osc_url()).arg(m_plugin->id()); | |||||
//arguments << m_label; | |||||
//arguments << QString("%1 (GUI)").arg(m_plugin->name()); | |||||
/* osc_url */ arguments << QString("%1/%2").arg(get_host_osc_url()).arg(m_plugin->id()); | |||||
/* URI */ arguments << m_label; | |||||
/* ui-URI */ arguments << m_data1; | |||||
/* ui-filename */ arguments << m_data2; | |||||
/* ui-bundle */ arguments << m_data3; | |||||
/* ui-title */ arguments << QString("%1 (GUI)").arg(m_plugin->name()); | |||||
break; | break; | ||||
case PLUGIN_THREAD_BRIDGE: | case PLUGIN_THREAD_BRIDGE: | ||||
@@ -243,6 +252,7 @@ void CarlaPluginThread::run() | |||||
/* filename */ arguments << m_plugin->filename(); | /* filename */ arguments << m_plugin->filename(); | ||||
/* label */ arguments << m_label; | /* label */ arguments << m_label; | ||||
break; | break; | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
@@ -253,6 +263,7 @@ void CarlaPluginThread::run() | |||||
switch (m_mode) | switch (m_mode) | ||||
{ | { | ||||
case PLUGIN_THREAD_DSSI_GUI: | case PLUGIN_THREAD_DSSI_GUI: | ||||
case PLUGIN_THREAD_LV2_GUI: | |||||
if (m_plugin->update_osc_gui()) | if (m_plugin->update_osc_gui()) | ||||
{ | { | ||||
m_process->waitForFinished(-1); | m_process->waitForFinished(-1); | ||||
@@ -50,7 +50,8 @@ public: | |||||
CarlaPluginThread(CarlaPlugin* plugin, PluginThreadMode mode); | CarlaPluginThread(CarlaPlugin* plugin, PluginThreadMode mode); | ||||
~CarlaPluginThread(); | ~CarlaPluginThread(); | ||||
void setOscData(const char* binary, const char* label, const char* data1=""); | |||||
void startNow(); | |||||
void setOscData(const char* binary, const char* label, const char* data1="", const char* data2="", const char* data3=""); | |||||
protected: | protected: | ||||
virtual void run(); | virtual void run(); | ||||
@@ -62,6 +63,8 @@ private: | |||||
QString m_binary; | QString m_binary; | ||||
QString m_label; | QString m_label; | ||||
QString m_data1; | QString m_data1; | ||||
QString m_data2; | |||||
QString m_data3; | |||||
QProcess* m_process; | QProcess* m_process; | ||||
}; | }; | ||||
@@ -19,8 +19,6 @@ | |||||
#include "dssi/dssi.h" | #include "dssi/dssi.h" | ||||
#include <QtCore/QStringList> | |||||
class DssiPlugin : public CarlaPlugin | class DssiPlugin : public CarlaPlugin | ||||
{ | { | ||||
public: | public: | ||||
@@ -50,7 +48,6 @@ public: | |||||
{ | { | ||||
if (osc.data.target) | if (osc.data.target) | ||||
{ | { | ||||
qDebug("DSSI GUI close - sending UI hide & quit"); | |||||
osc_send_hide(&osc.data); | osc_send_hide(&osc.data); | ||||
osc_send_quit(&osc.data); | osc_send_quit(&osc.data); | ||||
} | } | ||||
@@ -72,8 +69,6 @@ public: | |||||
delete osc.thread; | delete osc.thread; | ||||
} | } | ||||
else | |||||
qDebug("DSSI GUI close - no thread registered"); | |||||
osc_clear_data(&osc.data); | osc_clear_data(&osc.data); | ||||
} | } | ||||
@@ -387,7 +387,7 @@ rtsafe_memory_pool_create2( | |||||
void | void | ||||
rtmempool_allocator_init( | rtmempool_allocator_init( | ||||
struct lv2_rtsafe_memory_pool_provider * allocator_ptr) | |||||
lv2_rtsafe_memory_pool_provider * allocator_ptr) | |||||
{ | { | ||||
allocator_ptr->create = rtsafe_memory_pool_create2; | allocator_ptr->create = rtsafe_memory_pool_create2; | ||||
allocator_ptr->destroy = rtsafe_memory_pool_destroy; | allocator_ptr->destroy = rtsafe_memory_pool_destroy; | ||||
@@ -167,24 +167,31 @@ public: | |||||
break; | break; | ||||
case GUI_EXTERNAL_OSC: | case GUI_EXTERNAL_OSC: | ||||
// FIXME - fix dssi first, then copy | |||||
// if (gui.visible) | |||||
// osc_send_hide(&osc.data); | |||||
// osc_send_quit(&osc.data); | |||||
if (osc.data.target) | |||||
{ | |||||
osc_send_hide(&osc.data); | |||||
osc_send_quit(&osc.data); | |||||
} | |||||
// if (osc.thread) | |||||
// { | |||||
// osc.thread->quit(); | |||||
if (osc.thread) | |||||
{ | |||||
// Wait a bit first, try safe quit else force kill | |||||
if (osc.thread->isRunning()) | |||||
{ | |||||
if (osc.thread->wait(2000) == false) | |||||
osc.thread->quit(); | |||||
// if (!osc.thread->wait(3000)) // 3 sec | |||||
// qWarning("Failed to properly stop LV2 OSC GUI thread"); | |||||
if (osc.thread->isRunning() && osc.thread->wait(1000) == false) | |||||
{ | |||||
qWarning("Failed to properly stop LV2 OSC-GUI thread"); | |||||
osc.thread->terminate(); | |||||
} | |||||
} | |||||
// delete osc.thread; | |||||
// } | |||||
delete osc.thread; | |||||
} | |||||
// osc_clear_data(&osc.data); | |||||
osc_clear_data(&osc.data); | |||||
break; | break; | ||||
@@ -2081,31 +2088,34 @@ public: | |||||
if (is_bridged) | if (is_bridged) | ||||
{ | { | ||||
gui.type = GUI_EXTERNAL_OSC; | |||||
//osc.thread = lv2_thread; | |||||
//CarlaPluginThread* lv2ui_thread = new Lv2OscGuiThread(); | |||||
//lv2_thread->set_plugin_id(plugin->id); | |||||
//lv2_thread->set_ui_type(UiType); | |||||
//lv2_thread->start(); | |||||
const char* osc_binary; | |||||
switch (UiType) | switch (UiType) | ||||
{ | { | ||||
case LV2_UI_QT4: | case LV2_UI_QT4: | ||||
qDebug("Will use LV2 Qt4 UI, bridged"); | qDebug("Will use LV2 Qt4 UI, bridged"); | ||||
osc_binary = nullptr; | |||||
break; | break; | ||||
case LV2_UI_X11: | case LV2_UI_X11: | ||||
qDebug("Will use LV2 X11 UI, bridged"); | qDebug("Will use LV2 X11 UI, bridged"); | ||||
osc_binary = nullptr; | |||||
break; | break; | ||||
case LV2_UI_GTK2: | case LV2_UI_GTK2: | ||||
qDebug("Will use LV2 Gtk2 UI, bridged"); | qDebug("Will use LV2 Gtk2 UI, bridged"); | ||||
osc_binary = nullptr; | |||||
break; | break; | ||||
default: | default: | ||||
qDebug("Will use LV2 Unknown UI, bridged"); | qDebug("Will use LV2 Unknown UI, bridged"); | ||||
osc_binary = nullptr; | |||||
break; | break; | ||||
} | } | ||||
if (osc_binary) | |||||
{ | |||||
gui.type = GUI_EXTERNAL_OSC; | |||||
osc.thread = new CarlaPluginThread(this, CarlaPluginThread::PLUGIN_THREAD_LV2_GUI); | |||||
osc.thread->setOscData("lv2-gtk here", descriptor->URI, ui.descriptor->URI, ui.rdf_descriptor->Binary, ui.rdf_descriptor->Bundle); | |||||
} | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -65,7 +65,6 @@ public: | |||||
gui.width = 0; | gui.width = 0; | ||||
gui.height = 0; | gui.height = 0; | ||||
// FIXME? | |||||
memset(midi_events, 0, sizeof(VstMidiEvent)*MAX_MIDI_EVENTS); | memset(midi_events, 0, sizeof(VstMidiEvent)*MAX_MIDI_EVENTS); | ||||
for (unsigned short i=0; i<MAX_MIDI_EVENTS; i++) | for (unsigned short i=0; i<MAX_MIDI_EVENTS; i++) | ||||
@@ -115,8 +114,7 @@ public: | |||||
if (effect->flags & effFlagsIsSynth) | if (effect->flags & effFlagsIsSynth) | ||||
return PLUGIN_CATEGORY_SYNTH; | return PLUGIN_CATEGORY_SYNTH; | ||||
// TODO - try to get category from label | |||||
return PLUGIN_CATEGORY_NONE; | |||||
return get_category_from_name(m_name); | |||||
} | } | ||||
virtual long unique_id() | virtual long unique_id() | ||||
@@ -175,6 +173,7 @@ public: | |||||
virtual void set_parameter_value(uint32_t param_id, double value, bool gui_send, bool osc_send, bool callback_send) | virtual void set_parameter_value(uint32_t param_id, double value, bool gui_send, bool osc_send, bool callback_send) | ||||
{ | { | ||||
fix_parameter_value(value, param.ranges[param_id]); | |||||
effect->setParameter(effect, param_id, value); | effect->setParameter(effect, param_id, value); | ||||
CarlaPlugin::set_parameter_value(param_id, value, gui_send, osc_send, callback_send); | CarlaPlugin::set_parameter_value(param_id, value, gui_send, osc_send, callback_send); | ||||
} | } | ||||