Browse Source

Carla: Rework of ui-bridges

tags/v0.9.0
falkTX 12 years ago
parent
commit
7836513083
21 changed files with 1056 additions and 782 deletions
  1. +2
    -0
      c++/Makefile.mk
  2. +42
    -15
      c++/carla-bridge/Makefile
  3. +3
    -3
      c++/carla-bridge/carla_bridge.hpp
  4. +332
    -0
      c++/carla-bridge/carla_bridge_client.cpp
  5. +44
    -240
      c++/carla-bridge/carla_bridge_client.hpp
  6. +126
    -58
      c++/carla-bridge/carla_bridge_osc.cpp
  7. +43
    -22
      c++/carla-bridge/carla_bridge_osc.hpp
  8. +23
    -17
      c++/carla-bridge/carla_bridge_toolkit-gtk.cpp
  9. +0
    -202
      c++/carla-bridge/carla_bridge_toolkit-gtk3.cpp
  10. +160
    -108
      c++/carla-bridge/carla_bridge_toolkit-qt.cpp
  11. +50
    -0
      c++/carla-bridge/carla_bridge_toolkit.cpp
  12. +17
    -31
      c++/carla-bridge/carla_bridge_toolkit.hpp
  13. +30
    -31
      c++/carla-bridge/carla_bridge_ui-vst.cpp
  14. +10
    -10
      c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro
  15. +10
    -10
      c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk3.pro
  16. +10
    -10
      c++/carla-bridge/qtcreator/carla-bridge-lv2-qt4.pro
  17. +41
    -0
      c++/carla-bridge/qtcreator/carla-bridge-lv2-qt5.pro
  18. +11
    -11
      c++/carla-bridge/qtcreator/carla-bridge-lv2-x11.pro
  19. +81
    -0
      c++/carla-bridge/qtcreator/carla-bridge-plugin.pro
  20. +20
    -13
      c++/carla-bridge/qtcreator/carla-bridge-vst-x11.pro
  21. +1
    -1
      c++/carla-plugin/lv2.cpp

+ 2
- 0
c++/Makefile.mk View File

@@ -54,6 +54,8 @@ BUILD_CXX_FLAGS += -DVESTIGE_HEADER


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


HAVE_QT5 = $(shell pkg-config --atleast-version 5 QtCore && echo true)

HAVE_JACK = $(shell pkg-config --exists jack && echo true) HAVE_JACK = $(shell pkg-config --exists jack && echo true)
# HAVE_JACKSESSION = $(shell pkg-config --atleast-version=0.121.0 jack && echo true) # HAVE_JACKSESSION = $(shell pkg-config --atleast-version=0.121.0 jack && echo true)




+ 42
- 15
c++/carla-bridge/Makefile View File

@@ -17,13 +17,21 @@ ifeq ($(CARLA_PLUGIN_SUPPORT),true)
BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST
endif endif


ifeq ($(HAVE_QT5), true)
QT_UI_FLAGS = $(shell pkg-config --cflags QtWidgets)
QT_UI_LIBS = $(shell pkg-config --libs QtWidgets)
else
QT_UI_FLAGS = $(shell pkg-config --cflags QtGui)
QT_UI_LIBS = $(shell pkg-config --libs QtGui)
endif

# -------------------------------------------------------------- # --------------------------------------------------------------
# Plugin bridges # Plugin bridges


BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS)
BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN
BUILD_PLUGIN_FLAGS += -DCARLA_ENGINE_JACK -I../carla-backend -I../carla-engine -I../carla-jackbridge -I../carla-plugin BUILD_PLUGIN_FLAGS += -DCARLA_ENGINE_JACK -I../carla-backend -I../carla-engine -I../carla-jackbridge -I../carla-plugin
BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags jack QtGui)
BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags jack) $(QT_UI_FLAGS)


LINK_PLUGIN_FLAGS = $(LINK_FLAGS) LINK_PLUGIN_FLAGS = $(LINK_FLAGS)
LINK_PLUGIN_FLAGS += $(shell pkg-config --libs QtGui) LINK_PLUGIN_FLAGS += $(shell pkg-config --libs QtGui)
@@ -47,26 +55,29 @@ LINK_UI_FLAGS = $(LINK_FLAGS) -ldl
BUILD_UI_LV2_FLAGS = $(BUILD_UI_FLAGS) -DBRIDGE_LV2 BUILD_UI_LV2_FLAGS = $(BUILD_UI_FLAGS) -DBRIDGE_LV2
BUILD_UI_VST_FLAGS = $(BUILD_UI_FLAGS) -DBRIDGE_VST BUILD_UI_VST_FLAGS = $(BUILD_UI_FLAGS) -DBRIDGE_VST


BUILD_UI_LV2_GTK2_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_LV2_GTK2 $(shell pkg-config --cflags gtk+-2.0)
BUILD_UI_LV2_GTK2_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK2 -DBRIDGE_LV2_GTK2 $(shell pkg-config --cflags gtk+-2.0)
LINK_UI_LV2_GTK2_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-2.0) LINK_UI_LV2_GTK2_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-2.0)


BUILD_UI_LV2_GTK3_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_LV2_GTK3 $(shell pkg-config --cflags gtk+-3.0)
BUILD_UI_LV2_GTK3_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK3 -DBRIDGE_LV2_GTK3 $(shell pkg-config --cflags gtk+-3.0)
LINK_UI_LV2_GTK3_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-3.0) LINK_UI_LV2_GTK3_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-3.0)


BUILD_UI_LV2_QT4_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_LV2_QT4 $(shell pkg-config --cflags QtGui)
BUILD_UI_LV2_QT4_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT4 -DBRIDGE_LV2_QT4 $(shell pkg-config --cflags QtGui)
LINK_UI_LV2_QT4_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtGui) LINK_UI_LV2_QT4_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtGui)


BUILD_UI_LV2_QT5_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_LV2_QT5 $(shell pkg-config --cflags QtWidgets)
BUILD_UI_LV2_QT5_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT5 -DBRIDGE_LV2_QT5 $(shell pkg-config --cflags QtWidgets)
LINK_UI_LV2_QT5_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtWidgets) LINK_UI_LV2_QT5_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtWidgets)


BUILD_UI_LV2_X11_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_LV2_X11 $(shell pkg-config --cflags QtGui)
LINK_UI_LV2_X11_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtGui)
BUILD_UI_LV2_HWND_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_HWND -DBRIDGE_LV2_HWND $(QT_UI_FLAGS)
LINK_UI_LV2_HWND_FLAGS = $(LINK_FLAGS) $(QT_UI_LIBS) -mwindows -static

BUILD_UI_LV2_X11_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_X11 -DBRIDGE_LV2_X11 $(QT_UI_FLAGS)
LINK_UI_LV2_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS)


BUILD_UI_VST_HWND_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_VST_HWND $(shell pkg-config --cflags QtGui)
LINK_UI_VST_HWND_FLAGS = $(LINK_FLAGS) $(shell pkg-config --libs QtGui) -mwindows -static
BUILD_UI_VST_HWND_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_HWND -DBRIDGE_VST_HWND $(QT_UI_FLAGS)
LINK_UI_VST_HWND_FLAGS = $(LINK_FLAGS) $(QT_UI_LIBS) -mwindows -static


BUILD_UI_VST_X11_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_VST_X11 $(shell pkg-config --cflags QtGui)
LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtGui)
BUILD_UI_VST_X11_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_X11 -DBRIDGE_VST_X11 $(QT_UI_FLAGS)
LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS)


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


@@ -207,32 +218,48 @@ carla_bridge_osc__lv2-x11.o: carla_bridge_osc.cpp
# ui_vst-hwnd # ui_vst-hwnd


OBJS_UI_VST_HWND = \ OBJS_UI_VST_HWND = \
carla_bridge_ui-vst__vst-hwnd.o carla_bridge_toolkit-qt__vst-hwnd.o carla_bridge_osc__vst.o
carla_bridge_client__vst-hwnd.o carla_bridge_osc__vst.o \
carla_bridge_toolkit__vst-hwnd.o carla_bridge_toolkit-qt__vst-hwnd.o \
carla_bridge_ui-vst__vst-hwnd.o


carla-bridge-vst-hwnd.exe: $(OBJS_UI_VST_HWND) carla-bridge-vst-hwnd.exe: $(OBJS_UI_VST_HWND)
$(CXX) $^ $(LINK_UI_VST_HWND_FLAGS) -o $@ && $(STRIP) $@ $(CXX) $^ $(LINK_UI_VST_HWND_FLAGS) -o $@ && $(STRIP) $@


carla_bridge_ui-vst__vst-hwnd.o: carla_bridge_ui-vst.cpp
carla_bridge_client__vst-hwnd.o: carla_bridge_client.cpp
$(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@

carla_bridge_toolkit__vst-hwnd.o: carla_bridge_toolkit.cpp
$(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@


carla_bridge_toolkit-qt__vst-hwnd.o: carla_bridge_toolkit-qt.cpp carla_bridge_toolkit-qt__vst-hwnd.o: carla_bridge_toolkit-qt.cpp
$(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@


carla_bridge_ui-vst__vst-hwnd.o: carla_bridge_ui-vst.cpp
$(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@

# -------------------------------------------------------------- # --------------------------------------------------------------
# ui_vst-x11 # ui_vst-x11


OBJS_UI_VST_X11 = \ OBJS_UI_VST_X11 = \
carla_bridge_ui-vst__vst-x11.o carla_bridge_toolkit-qt__vst-x11.o carla_bridge_osc__vst.o
carla_bridge_client__vst-x11.o carla_bridge_osc__vst.o \
carla_bridge_toolkit__vst-x11.o carla_bridge_toolkit-qt__vst-x11.o \
carla_bridge_ui-vst__vst-x11.o


carla-bridge-vst-x11: $(OBJS_UI_VST_X11) carla-bridge-vst-x11: $(OBJS_UI_VST_X11)
$(CXX) $^ $(LINK_UI_VST_X11_FLAGS) -o $@ && $(STRIP) $@ $(CXX) $^ $(LINK_UI_VST_X11_FLAGS) -o $@ && $(STRIP) $@


carla_bridge_ui-vst__vst-x11.o: carla_bridge_ui-vst.cpp
carla_bridge_client__vst-x11.o: carla_bridge_client.cpp
$(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@

carla_bridge_toolkit__vst-x11.o: carla_bridge_toolkit.cpp
$(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@


carla_bridge_toolkit-qt__vst-x11.o: carla_bridge_toolkit-qt.cpp carla_bridge_toolkit-qt__vst-x11.o: carla_bridge_toolkit-qt.cpp
$(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@


carla_bridge_ui-vst__vst-x11.o: carla_bridge_ui-vst.cpp
$(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@

# -------------------------------------------------------------- # --------------------------------------------------------------
# posix32 # posix32




+ 3
- 3
c++/carla-bridge/carla_bridge.hpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla bridge code
* Carla Bridge
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -26,8 +26,8 @@


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


class CarlaClient;
class CarlaToolkit;
class CarlaBridgeClient;
class CarlaBridgeToolkit;


CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE




+ 332
- 0
c++/carla-bridge/carla_bridge_client.cpp View File

@@ -0,0 +1,332 @@
/*
* Carla Bridge Client
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the COPYING file
*/

#include "carla_bridge_client.hpp"
#include "carla_bridge_toolkit.hpp"

#ifdef BUILD_BRIDGE_PLUGIN
# include "carla_engine.hpp"
#else
# include "carla_lib_utils.hpp"
#endif

#include <cmath>
#include <cstdio>
#include <cstdint>
#include <cstdlib>

CARLA_BRIDGE_START_NAMESPACE

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

CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle)
: m_osc(this),
m_toolkit(CarlaBridgeToolkit::createNew(this, uiTitle))
{
qDebug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle);

m_oscData = nullptr;

#ifdef BUILD_BRIDGE_UI
m_uiFilename = nullptr;
m_uiLib = nullptr;
m_uiQuit = false;
#endif

m_toolkit->init();
}

CarlaBridgeClient::~CarlaBridgeClient()
{
qDebug("CarlaBridgeClient::~CarlaBridgeClient()");

#ifdef BUILD_BRIDGE_UI
if (m_uiFilename)
free(m_uiFilename);
#endif
}

// ---------------------------------------------------------------------
// ui initialization

#ifdef BUILD_BRIDGE_UI
bool CarlaBridgeClient::init(const char* const, const char* const)
{
qDebug("CarlaBridgeClient::init()");

m_uiQuit = false;
return false;
}

void CarlaBridgeClient::close()
{
qDebug("CarlaBridgeClient::close()");

if (! m_uiQuit)
{
m_uiQuit = true;

if (isOscControlRegistered())
sendOscExiting();
}

m_toolkit->quit();
}
#endif

// ---------------------------------------------------------------------
// osc stuff

bool CarlaBridgeClient::oscInit(const char* const url)
{
qDebug("CarlaBridgeClient::oscInit(\"%s\")", url);

bool ret = m_osc.init(url);
m_oscData = m_osc.getControlData();

return ret;
}

bool CarlaBridgeClient::oscIdle()
{
m_osc .idle();

#ifdef BUILD_BRIDGE_UI
return ! m_uiQuit;
#else
return true;
#endif
}

void CarlaBridgeClient::oscClose()
{
qDebug("CarlaBridgeClient::oscClose()");
CARLA_ASSERT(m_oscData);

m_osc.close();
m_oscData = nullptr;
}

bool CarlaBridgeClient::isOscControlRegistered() const
{
return m_osc.isControlRegistered();
}

void CarlaBridgeClient::sendOscUpdate()
{
qDebug("CarlaBridgeClient::sendOscUpdate()");
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_update(m_oscData, m_osc.getServerPath());
}

#ifdef BUILD_BRIDGE_PLUGIN
void CarlaBridgeClient::sendOscBridgeError(const char* const error)
{
qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error);
CARLA_ASSERT(m_oscData);
CARLA_ASSERT(error);

if (m_oscData->target)
osc_send_bridge_error(m_oscData, error);
}

void CarlaBridgeClient::registerOscEngine(CarlaBackend::CarlaEngine* const engine)
{
qDebug("CarlaBridgeClient::registerOscEngine(%p)", engine);
engine->setOscBridgeData(m_oscData);
}
#endif

// ---------------------------------------------------------------------
// toolkit

void CarlaBridgeClient::toolkitShow()
{
qDebug("CarlaBridgeClient::toolkitShow()");

m_toolkit->show();
}

void CarlaBridgeClient::toolkitHide()
{
qDebug("CarlaBridgeClient::toolkitHide()");

m_toolkit->hide();
}

void CarlaBridgeClient::toolkitResize(int width, int height)
{
qDebug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height);

m_toolkit->resize(width, height);
}

void CarlaBridgeClient::toolkitExec(const bool showGui)
{
qDebug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui));

m_toolkit->exec(showGui);
}

void CarlaBridgeClient::toolkitQuit()
{
qDebug("CarlaBridgeClient::toolkitQuit()");

#ifdef BUILD_BRIDGE_UI
m_uiQuit = true;
#endif
m_toolkit->quit();
}

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

void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value)
{
qDebug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_configure(m_oscData, key, value);
}

void CarlaBridgeClient::sendOscControl(const int32_t index, const float value)
{
qDebug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_control(m_oscData, index, value);
}

void CarlaBridgeClient::sendOscProgram(const int32_t index)
{
qDebug("CarlaBridgeClient::sendOscProgram(%i)", index);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_program(m_oscData, index);
}

void CarlaBridgeClient::sendOscMidiProgram(const int32_t index)
{
qDebug("CarlaBridgeClient::sendOscMidiProgram(%i)", index);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_midi_program(m_oscData, index);
}

void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4])
{
qDebug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_midi(m_oscData, midiBuf);
}

void CarlaBridgeClient::sendOscExiting()
{
qDebug("CarlaBridgeClient::sendOscExiting()");
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_exiting(m_oscData);
}

#ifdef BUILD_BRIDGE_PLUGIN
void CarlaBridgeClient::sendOscBridgeUpdate()
{
qDebug("CarlaBridgeClient::sendOscBridgeUpdate()");
CARLA_ASSERT(m_oscData);
CARLA_ASSERT(m_oscData->target && m_osc.m_serverPath);

if (m_oscData->target && m_osc.m_serverPath)
osc_send_bridge_update(m_oscData, m_osc.m_serverPath);
}
#endif

#ifdef BRIDGE_LV2
void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
{
qDebug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_lv2_transfer_atom(m_oscData, portIndex, typeStr, atomBuf);
}

void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
{
qDebug("CarlaBridgeClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);
CARLA_ASSERT(m_oscData);

if (m_oscData->target)
osc_send_lv2_transfer_event(m_oscData, portIndex, typeStr, atomBuf);
}
#endif

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

#ifdef BUILD_BRIDGE_UI
void* CarlaBridgeClient::getContainerId()
{
return m_toolkit->getContainerId();
}

bool CarlaBridgeClient::uiLibOpen(const char* const filename)
{
CARLA_ASSERT(filename);

if (m_uiFilename)
free(m_uiFilename);

m_uiLib = lib_open(filename);
m_uiFilename = strdup(filename ? filename : "");

return bool(m_uiLib);
}

bool CarlaBridgeClient::uiLibClose()
{
if (m_uiLib)
{
const bool closed = lib_close(m_uiLib);
m_uiLib = nullptr;
return closed;
}

return false;
}

void* CarlaBridgeClient::uiLibSymbol(const char* const symbol)
{
if (m_uiLib)
return lib_symbol(m_uiLib, symbol);

return nullptr;
}

const char* CarlaBridgeClient::uiLibError()
{
return lib_error(m_uiFilename);
}
#endif

CARLA_BRIDGE_END_NAMESPACE

+ 44
- 240
c++/carla-bridge/carla_bridge_client.hpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla bridge code
* Carla Bridge Client
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -19,18 +19,7 @@
#define CARLA_BRIDGE_CLIENT_H #define CARLA_BRIDGE_CLIENT_H


#include "carla_bridge_osc.hpp" #include "carla_bridge_osc.hpp"
#include "carla_bridge_toolkit.hpp"


#ifdef BUILD_BRIDGE_PLUGIN
# include "carla_engine.hpp"
#else
# include "carla_lib_utils.hpp"
#endif

#include <cmath>
#include <cstdio>
#include <cstdint>
#include <cstdlib>
#include <QtCore/QMutex> #include <QtCore/QMutex>


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE
@@ -42,62 +31,27 @@ CARLA_BRIDGE_START_NAMESPACE
* @{ * @{
*/ */


#ifdef BUILD_BRIDGE_PLUGIN
const char* const carlaClientName = "carla-bridge-plugin";
#else
const char* const carlaClientName = "carla-bridge-ui";
#endif

class CarlaClient
class CarlaBridgeClient
{ {
public: public:
CarlaClient(CarlaToolkit* const toolkit)
: m_osc(this, carlaClientName),
m_toolkit(toolkit)
{
#ifdef BUILD_BRIDGE_UI
m_filename = nullptr;
m_lib = nullptr;
m_quit = false;
#endif
m_toolkit->m_client = this;
}
CarlaBridgeClient(const char* const uiTitle);
virtual ~CarlaBridgeClient();


virtual ~CarlaClient()
{
#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
if (m_filename)
free(m_filename);
#endif
}

// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// ui initialization // ui initialization


#ifdef BUILD_BRIDGE_UI
virtual bool init(const char* const, const char* const)
{
m_quit = false;
return false;
}

virtual void close()
{
if (! m_quit)
{
m_quit = true;
sendOscExiting();
}
}
virtual bool init(const char* const, const char* const);
virtual void close();
#endif #endif


#ifdef BUILD_BRIDGE_UI
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// ui management // ui management


#ifdef BUILD_BRIDGE_UI
virtual void* getWidget() const = 0; virtual void* getWidget() const = 0;
virtual bool isResizable() const = 0;
virtual bool needsReparent() const = 0;
virtual bool isResizable() const = 0;
virtual bool needsReparent() const = 0;
#endif #endif


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -114,230 +68,80 @@ public:
virtual void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) = 0; virtual void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) = 0;
virtual void noteOff(const uint8_t channel, const uint8_t note) = 0; virtual void noteOff(const uint8_t channel, const uint8_t note) = 0;


#ifdef BUILD_BRIDGE_PLUGIN
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// plugin // plugin


#ifdef BUILD_BRIDGE_PLUGIN
virtual void saveNow() = 0; virtual void saveNow() = 0;
virtual void setCustomData(const char* const type, const char* const key, const char* const value) = 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; virtual void setChunkData(const char* const filePath) = 0;
#endif #endif


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// osc stuff


bool oscInit(const char* const url)
{
qDebug("CarlaClient::oscInit(\"%s\")", url);
return m_osc.init(url);
}

bool oscIdle()
{
if (m_osc.m_server)
while (lo_server_recv_noblock(m_osc.m_server, 0) != 0) {}

#ifdef BUILD_BRIDGE_UI
return ! m_quit;
#else
return true;
#endif
}

void oscClose()
{
qDebug("CarlaClient::oscClose()");
m_osc.close();
}

void sendOscUpdate()
{
qDebug("CarlaClient::sendOscUpdate()");
CARLA_ASSERT(m_osc.m_controlData.target);
bool oscInit(const char* const url);
bool oscIdle();
void oscClose();


if (m_osc.m_controlData.target)
osc_send_update(&m_osc.m_controlData, m_osc.m_serverPath);
}
bool isOscControlRegistered() const;
void sendOscUpdate();


#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN
void sendOscBridgeError(const char* const error)
{
qDebug("CarlaClient::sendOscBridgeError(\"%s\")", error);
CARLA_ASSERT(m_osc.m_controlData.target);
CARLA_ASSERT(error);

if (m_osc.m_controlData.target)
osc_send_bridge_error(&m_osc.m_controlData, error);
}

void registerOscEngine(CarlaBackend::CarlaEngine* const engine)
{
qDebug("CarlaClient::registerOscEngine(%p)", engine);
engine->setOscBridgeData(&m_osc.m_controlData);
}
void sendOscBridgeError(const char* const error);
void registerOscEngine(CarlaBackend::CarlaEngine* const engine);
#endif #endif


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// toolkit


void toolkitShow()
{
m_toolkit->show();
}

void toolkitHide()
{
m_toolkit->hide();
}

void toolkitResize(int width, int height)
{
m_toolkit->resize(width, height);
}

void toolkitQuit()
{
#ifdef BUILD_BRIDGE_UI
m_quit = true;
#endif
m_toolkit->quit();
}
void toolkitShow();
void toolkitHide();
void toolkitResize(int width, int height);
void toolkitExec(const bool showGui);
void toolkitQuit();


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


protected: protected:
void sendOscConfigure(const char* const key, const char* const value)
{
qDebug("CarlaClient::sendOscConfigure(\"%s\", \"%s\")", key, value);

if (m_osc.m_controlData.target)
osc_send_configure(&m_osc.m_controlData, key, value);
}

void sendOscControl(const int32_t index, const float value)
{
qDebug("CarlaClient::sendOscControl(%i, %f)", index, value);

if (m_osc.m_controlData.target)
osc_send_control(&m_osc.m_controlData, index, value);
}

void sendOscProgram(const int32_t index)
{
qDebug("CarlaClient::sendOscProgram(%i)", index);

if (m_osc.m_controlData.target)
osc_send_program(&m_osc.m_controlData, index);
}

void sendOscMidiProgram(const int32_t index)
{
qDebug("CarlaClient::sendOscMidiProgram(%i)", index);

if (m_osc.m_controlData.target)
osc_send_midi_program(&m_osc.m_controlData, index);
}

void sendOscMidi(const uint8_t midiBuf[4])
{
qDebug("CarlaClient::sendOscMidi(%p)", midiBuf);

if (m_osc.m_controlData.target)
osc_send_midi(&m_osc.m_controlData, midiBuf);
}

void sendOscExiting()
{
qDebug("CarlaClient::sendOscExiting()");

if (m_osc.m_controlData.target)
osc_send_exiting(&m_osc.m_controlData);
}
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();


#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN
void sendOscBridgeUpdate()
{
qDebug("CarlaClient::sendOscBridgeUpdate()");
CARLA_ASSERT(m_osc.m_controlData.target && m_osc.m_serverPath);

if (m_osc.m_controlData.target && m_osc.m_serverPath)
osc_send_bridge_update(&m_osc.m_controlData, m_osc.m_serverPath);
}
void sendOscBridgeUpdate();
#endif #endif


#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
void sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
{
qDebug("CarlaClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);

if (m_osc.m_controlData.target)
osc_send_lv2_transfer_atom(&m_osc.m_controlData, portIndex, typeStr, atomBuf);
}

void sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
{
qDebug("CarlaClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);

if (m_osc.m_controlData.target)
osc_send_lv2_transfer_event(&m_osc.m_controlData, portIndex, typeStr, atomBuf);
}
void sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf);
void sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf);
#endif #endif


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


#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
void* getContainerId()
{
return m_toolkit->getContainerId();
}

bool libOpen(const char* const filename)
{
CARLA_ASSERT(filename);

if (m_filename)
free(m_filename);

m_lib = lib_open(filename);
m_filename = strdup(filename ? filename : "");

return bool(m_lib);
}

bool libClose()
{
if (m_lib)
{
const bool closed = lib_close(m_lib);
m_lib = nullptr;
return closed;
}

return false;
}

void* libSymbol(const char* const symbol)
{
if (m_lib)
return lib_symbol(m_lib, symbol);

return nullptr;
}

const char* libError()
{
return lib_error(m_filename);
}
void* getContainerId();
bool uiLibOpen(const char* const filename);
bool uiLibClose();
void* uiLibSymbol(const char* const symbol);
const char* uiLibError();
#endif #endif


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


private: private:
CarlaBridgeOsc m_osc; CarlaBridgeOsc m_osc;
CarlaToolkit* const m_toolkit;
CarlaBridgeToolkit* const m_toolkit;

const CarlaOscData* m_oscData;


#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
char* m_filename;
void* m_lib;
bool m_quit;
char* m_uiFilename;
void* m_uiLib;
bool m_uiQuit;
#endif #endif
}; };




+ 126
- 58
c++/carla-bridge/carla_bridge_osc.cpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla Plugin bridge code
* Carla Bridge OSC
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -18,99 +18,154 @@
#include "carla_bridge_osc.hpp" #include "carla_bridge_osc.hpp"
#include "carla_bridge_client.hpp" #include "carla_bridge_client.hpp"
#include "carla_midi.h" #include "carla_midi.h"
#include "carla_utils.hpp"


#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QStringList> #include <QtCore/QStringList>


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


unsigned int uintMin(unsigned int value1, unsigned int value2)
{
return value1 < value2 ? value1 : value2;
}

void osc_error_handler(const int num, const char* const msg, const char* const path)
{
qCritical("osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path);
}

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


CarlaBridgeOsc::CarlaBridgeOsc(CarlaClient* const client_, const char* const name)
CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client_)
: client(client_) : client(client_)
{ {
qDebug("CarlaBridgeOsc::CarlaOsc(%p, \"%s\")", client, name);
qDebug("CarlaBridgeOsc::CarlaBridgeOsc(%p)", client);
CARLA_ASSERT(client); CARLA_ASSERT(client);
CARLA_ASSERT(name);

m_name = nullptr;
m_nameSize = 0;


m_server = nullptr; m_server = nullptr;
m_serverPath = nullptr; m_serverPath = nullptr;
m_controlData.path = nullptr;
m_controlData.source = nullptr; // unused
m_controlData.target = nullptr;

m_name = strdup(name ? name : "");
m_nameSize = strlen(m_name);
} }


CarlaBridgeOsc::~CarlaBridgeOsc() CarlaBridgeOsc::~CarlaBridgeOsc()
{ {
qDebug("CarlaBridgeOsc::~CarlaOsc()");
if (m_name)
free(m_name);
qDebug("CarlaBridgeOsc::~CarlaBridgeOsc()");
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_server);
CARLA_ASSERT(! m_serverPath);
} }


bool CarlaBridgeOsc::init(const char* const url) bool CarlaBridgeOsc::init(const char* const url)
{ {
qDebug("CarlaBridgeOsc::init(\"%s\")", url); qDebug("CarlaBridgeOsc::init(\"%s\")", url);
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_server); CARLA_ASSERT(! m_server);
CARLA_ASSERT(! m_serverPath); CARLA_ASSERT(! m_serverPath);
CARLA_ASSERT(url); CARLA_ASSERT(url);


char* host = lo_url_get_hostname(url);
char* port = lo_url_get_port(url);
if (! url)
{
qWarning("CarlaBridgeOsc::init(\"%s\") - invalid url", url);
return false;
}


m_controlData.path = lo_url_get_path(url);
#ifdef BUILD_BRIDGE_PLUGIN
m_name = strdup("carla-bridge-plugin");
#else
m_name = strdup("carla-bridge-ui");
#endif
m_nameSize = strlen(m_name);

char* const host = lo_url_get_hostname(url);
char* const path = lo_url_get_path(url);
char* const port = lo_url_get_port(url);

if (! host)
{
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to get url hostname", url);
return false;
}

if (! path)
{
free(host);
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to get url path", url);
return false;
}

if (! port)
{
free(host);
free(path);
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to get url port", url);
return false;
}

m_controlData.path = path;
m_controlData.target = lo_address_new_with_proto(LO_TCP, host, port); m_controlData.target = lo_address_new_with_proto(LO_TCP, host, port);


free(host); free(host);
free(port); free(port);


if (! m_controlData.path)
if (! m_controlData.target)
{ {
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to init OSC", url);
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to get new url address for host '%s' and port '%s'", url, host, port);
return false; return false;
} }


// create new OSC thread
m_server = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler); m_server = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler);


// get our full OSC server path
char* const threadPath = lo_server_get_url(m_server);
m_serverPath = strdup(QString("%1%2").arg(threadPath).arg(m_name).toUtf8().constData());
free(threadPath);
if (! m_server)
{
qCritical("CarlaBridgeOsc::init(\"%s\") - failed to create new OSC server", url);
return false;
}

if (char* const serverUrl = lo_server_get_url(m_server))
{
m_serverPath = strdup(QString("%1%2").arg(serverUrl).arg(m_name).toUtf8().constData());
free(serverUrl);
}
else
m_serverPath = strdup(QString("%1carla-bridge").arg(serverUrl).toUtf8().constData());


// register message handler
lo_server_add_method(m_server, nullptr, nullptr, osc_message_handler, this); lo_server_add_method(m_server, nullptr, nullptr, osc_message_handler, this);


return true; return true;
} }


void CarlaBridgeOsc::idle()
{
CARLA_ASSERT(m_server);

if (m_server)
{
while (lo_server_recv_noblock(m_server, 0) != 0) {}
}
}

void CarlaBridgeOsc::close() void CarlaBridgeOsc::close()
{ {
qDebug("CarlaBridgeOsc::close()"); qDebug("CarlaBridgeOsc::close()");
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_server); CARLA_ASSERT(m_server);
CARLA_ASSERT(m_serverPath); CARLA_ASSERT(m_serverPath);


m_controlData.free();
m_nameSize = 0;


lo_server_del_method(m_server, nullptr, nullptr);
lo_server_free(m_server);
if (m_name)
{
free(m_name);
m_name = nullptr;
}


free((void*)m_serverPath);
m_serverPath = nullptr;
m_server = nullptr;
if (m_server)
{
lo_server_del_method(m_server, nullptr, nullptr);
lo_server_free(m_server);
m_server = nullptr;
}

if (m_serverPath)
{
free(m_serverPath);
m_serverPath = nullptr;
}

m_controlData.free();
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -118,15 +173,23 @@ void CarlaBridgeOsc::close()
int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg)
{ {
qDebug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg); qDebug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg);
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_server); CARLA_ASSERT(m_server);
CARLA_ASSERT(m_serverPath); CARLA_ASSERT(m_serverPath);
CARLA_ASSERT(m_name);
CARLA_ASSERT(path); CARLA_ASSERT(path);


if (! (m_name && path))
if (! path)
{
qCritical("CarlaBridgeOsc::handleMessage() - got invalid path");
return 1; return 1;
}

if (! (m_name && m_server && m_serverPath))
{
qCritical("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received message but client is offline", path);
return 1;
}


// Check if message is for this client
if (strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0) if (strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0)
{ {
qWarning("CarlaBridgeOsc::handleMessage() - message not for this client: '%s' != '/%s/'", path, m_name); qWarning("CarlaBridgeOsc::handleMessage() - message not for this client: '%s' != '/%s/'", path, m_name);
@@ -134,46 +197,51 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const
} }


char method[32] = { 0 }; char method[32] = { 0 };
memcpy(method, path + (m_nameSize + 1), uintMin(strlen(path), 32));
strncpy(method, path + (m_nameSize + 2), 31);


if (method[0] == 0 || method[0] != '/')
if (method[0] == '\0')
{
qWarning("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received message without method", path);
return 1; return 1;
}


// Common OSC methods // Common OSC methods
if (strcmp(method, "/configure") == 0)
if (strcmp(method, "configure") == 0)
return handleMsgConfigure(argc, argv, types); return handleMsgConfigure(argc, argv, types);
if (strcmp(method, "/control") == 0)
if (strcmp(method, "control") == 0)
return handleMsgControl(argc, argv, types); return handleMsgControl(argc, argv, types);
if (strcmp(method, "/program") == 0)
if (strcmp(method, "program") == 0)
return handleMsgProgram(argc, argv, types); return handleMsgProgram(argc, argv, types);
if (strcmp(method, "/midi_program") == 0)
if (strcmp(method, "midi_program") == 0)
return handleMsgMidiProgram(argc, argv, types); return handleMsgMidiProgram(argc, argv, types);
if (strcmp(method, "/midi") == 0)
if (strcmp(method, "midi") == 0)
return handleMsgMidi(argc, argv, types); return handleMsgMidi(argc, argv, types);
if (strcmp(method, "/sample-rate") == 0)
if (strcmp(method, "sample-rate") == 0)
return 0; // unused return 0; // unused
if (strcmp(method, "/show") == 0)
if (strcmp(method, "show") == 0)
return handleMsgShow(); return handleMsgShow();
if (strcmp(method, "/hide") == 0)
if (strcmp(method, "hide") == 0)
return handleMsgHide(); return handleMsgHide();
if (strcmp(method, "/quit") == 0)
if (strcmp(method, "quit") == 0)
return handleMsgQuit(); return handleMsgQuit();


#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
if (strcmp(method, "/lv2_atom_transfer") == 0)
// LV2 UI methods
if (strcmp(method, "lv2_atom_transfer") == 0)
return handleMsgLv2TransferAtom(argc, argv, types); return handleMsgLv2TransferAtom(argc, argv, types);
if (strcmp(method, "/lv2_event_transfer") == 0)
if (strcmp(method, "lv2_event_transfer") == 0)
return handleMsgLv2TransferEvent(argc, argv, types); return handleMsgLv2TransferEvent(argc, argv, types);
#endif #endif


#if 0 #if 0
// TODO
else if (strcmp(method, "set_parameter_midi_channel") == 0) else if (strcmp(method, "set_parameter_midi_channel") == 0)
return osc_set_parameter_midi_channel_handler(argv); return osc_set_parameter_midi_channel_handler(argv);
else if (strcmp(method, "set_parameter_midi_cc") == 0) else if (strcmp(method, "set_parameter_midi_cc") == 0)
return osc_set_parameter_midi_channel_handler(argv); return osc_set_parameter_midi_channel_handler(argv);
#endif #endif


qWarning("CarlaBridgeOsc::handleMessage(\"%s\", ...) - got unsupported OSC method '%s'", path, method);
qWarning("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received unsupported OSC method '%s'", path, method);
return 1; return 1;
} }




+ 43
- 22
c++/carla-bridge/carla_bridge_osc.hpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla bridge code
* Carla Bridge OSC
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -15,8 +15,8 @@
* For a full copy of the GNU General Public License see the COPYING file * For a full copy of the GNU General Public License see the COPYING file
*/ */


#ifndef CARLA_BRIDGE_OSC_H
#define CARLA_BRIDGE_OSC_H
#ifndef CARLA_BRIDGE_OSC_HPP
#define CARLA_BRIDGE_OSC_HPP


#include "carla_bridge.hpp" #include "carla_bridge.hpp"
#include "carla_osc_utils.hpp" #include "carla_osc_utils.hpp"
@@ -48,24 +48,39 @@


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


/*!
* @defgroup CarlaBridgeOSC Carla Bridge OSC
*
* The Carla Bridge OSC.
* @{
*/
#if 0
} // Fix editor indentation
#endif


class CarlaBridgeOsc class CarlaBridgeOsc
{ {
public: public:
CarlaBridgeOsc(CarlaClient* const client, const char* const name);
CarlaBridgeOsc(CarlaBridgeClient* const client);
~CarlaBridgeOsc(); ~CarlaBridgeOsc();


bool init(const char* const url); bool init(const char* const url);
void idle();
void close(); void close();


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


bool isControlRegistered() const
{
return bool(m_controlData.target);
}

const CarlaOscData* getControlData() const
{
return &m_controlData;
}

const char* getServerPath() const
{
return m_serverPath;
}

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

protected: protected:
int handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg); int handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg);
int handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS); int handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS);
@@ -84,30 +99,36 @@ protected:


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


private:
CarlaClient* const client;
protected:
CarlaBridgeClient* const client;


lo_server m_server;
const char* m_serverPath;
CarlaOscData m_controlData;
// -------------------------------------------------------------------


private:
char* m_name; char* m_name;
size_t m_nameSize; size_t m_nameSize;


lo_server m_server;
char* m_serverPath;

CarlaOscData m_controlData;

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


static void osc_error_handler(const int num, const char* const msg, const char* const path)
{
qWarning("CarlaBridgeOsc::osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path);
}

static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const user_data) static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const user_data)
{ {
CARLA_ASSERT(user_data); CARLA_ASSERT(user_data);
CarlaBridgeOsc* const _this_ = (CarlaBridgeOsc*)user_data;
return _this_->handleMessage(path, argc, argv, types, msg);
if (CarlaBridgeOsc* const _this_ = (CarlaBridgeOsc*)user_data)
return _this_->handleMessage(path, argc, argv, types, msg);
return -1;
} }

friend class CarlaClient;
}; };


/**@}*/

CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE


#endif // CARLA_BRIDGE_OSC_H
#endif // CARLA_BRIDGE_OSC_HPP

c++/carla-bridge/carla_bridge_toolkit-gtk2.cpp → c++/carla-bridge/carla_bridge_toolkit-gtk.cpp View File

@@ -17,8 +17,8 @@


#include "carla_bridge_client.hpp" #include "carla_bridge_client.hpp"


#ifdef BRIDGE_LV2_X11
# error X11 UI uses Qt4
#if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11)
# error Cocoa/HWND/X11 UI uses Qt
#endif #endif


#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -28,14 +28,14 @@ CARLA_BRIDGE_START_NAMESPACE


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


class CarlaToolkitGtk2 : public CarlaToolkit
class CarlaToolkitGtk : public CarlaToolkit
{ {
public: public:
CarlaToolkitGtk2(const char* const title)
CarlaToolkitGtk(const char* const title)
: CarlaToolkit(title), : CarlaToolkit(title),
settings("Cadence", "Carla-Gtk2UIs") settings("Cadence", "Carla-Gtk2UIs")
{ {
qDebug("CarlaToolkitGtk2::CarlaToolkitGtk2(%s)", title);
qDebug("CarlaToolkitGtk::CarlaToolkitGtk(%s)", title);


window = nullptr; window = nullptr;


@@ -43,14 +43,14 @@ public:
lastWidth = lastHeight = 0; lastWidth = lastHeight = 0;
} }


~CarlaToolkitGtk2()
~CarlaToolkitGtk()
{ {
qDebug("CarlaToolkitGtk2::~CarlaToolkitGtk2()");
qDebug("CarlaToolkitGtk::~CarlaToolkitGtk()");
} }


void init() void init()
{ {
qDebug("CarlaToolkitGtk2::init()");
qDebug("CarlaToolkitGtk::init()");


static int argc = 0; static int argc = 0;
static char** argv = { nullptr }; static char** argv = { nullptr };
@@ -59,7 +59,7 @@ public:


void exec(CarlaClient* const client, const bool showGui) void exec(CarlaClient* const client, const bool showGui)
{ {
qDebug("CarlaToolkitGtk2::exec(%p)", client);
qDebug("CarlaToolkitGtk::exec(%p)", client);
CARLA_ASSERT(client); CARLA_ASSERT(client);


m_client = client; m_client = client;
@@ -101,7 +101,7 @@ public:


void quit() void quit()
{ {
qDebug("CarlaToolkitGtk2::quit()");
qDebug("CarlaToolkitGtk::quit()");


if (window) if (window)
{ {
@@ -116,7 +116,7 @@ public:


void show() void show()
{ {
qDebug("CarlaToolkitGtk2::show()");
qDebug("CarlaToolkitGtk::show()");
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (window) if (window)
@@ -125,16 +125,22 @@ public:


void hide() void hide()
{ {
qDebug("CarlaToolkitGtk2::hide()");
qDebug("CarlaToolkitGtk::hide()");
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (window) if (window)
{
#ifdef BRIDGE_GTK2
gtk_widget_hide_all(window); gtk_widget_hide_all(window);
#else
gtk_widget_hide(window);
#endif
}
} }


void resize(int width, int height) void resize(int width, int height)
{ {
qDebug("CarlaToolkitGtk2::resize(%i, %i)", width, height);
qDebug("CarlaToolkitGtk::resize(%i, %i)", width, height);
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (window) if (window)
@@ -146,7 +152,7 @@ public:
protected: protected:
void handleDestroy() void handleDestroy()
{ {
qDebug("CarlaToolkitGtk2::handleDestroy()");
qDebug("CarlaToolkitGtk::handleDestroy()");


window = nullptr; window = nullptr;
m_client = nullptr; m_client = nullptr;
@@ -179,7 +185,7 @@ private:


static void gtk_ui_destroy(GtkWidget*, gpointer data) static void gtk_ui_destroy(GtkWidget*, gpointer data)
{ {
CarlaToolkitGtk2* const _this_ = (CarlaToolkitGtk2*)data;
CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data;
_this_->handleDestroy(); _this_->handleDestroy();


gtk_main_quit(); gtk_main_quit();
@@ -187,7 +193,7 @@ private:


static gboolean gtk_ui_timeout(gpointer data) static gboolean gtk_ui_timeout(gpointer data)
{ {
CarlaToolkitGtk2* const _this_ = (CarlaToolkitGtk2*)data;
CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data;
return _this_->handleTimeout(); return _this_->handleTimeout();
} }
}; };
@@ -196,7 +202,7 @@ private:


CarlaToolkit* CarlaToolkit::createNew(const char* const title) CarlaToolkit* CarlaToolkit::createNew(const char* const title)
{ {
return new CarlaToolkitGtk2(title);
return new CarlaToolkitGtk(title);
} }


CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE

+ 0
- 202
c++/carla-bridge/carla_bridge_toolkit-gtk3.cpp View File

@@ -1,202 +0,0 @@
/*
* Carla UI bridge code
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the COPYING file
*/

#include "carla_bridge_client.hpp"

#ifdef BRIDGE_LV2_X11
# error X11 UI uses Qt4
#endif

#include <gtk/gtk.h>
#include <QtCore/QSettings>

CARLA_BRIDGE_START_NAMESPACE

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

class CarlaToolkitGtk3 : public CarlaToolkit
{
public:
CarlaToolkitGtk3(const char* const title)
: CarlaToolkit(title),
settings("Cadence", "Carla-Gtk3UIs")
{
qDebug("CarlaToolkitGtk3::CarlaToolkitGtk3(%s)", title);

window = nullptr;

lastX = lastY = 0;
lastWidth = lastHeight = 0;
}

~CarlaToolkitGtk3()
{
qDebug("CarlaToolkitGtk3::~CarlaToolkitGtk3()");
}

void init()
{
qDebug("CarlaToolkitGtk3::init()");

static int argc = 0;
static char** argv = { nullptr };
gtk_init(&argc, &argv);
}

void exec(CarlaClient* const client, const bool showGui)
{
qDebug("CarlaToolkitGtk3::exec(%p)", client);
CARLA_ASSERT(client);

m_client = client;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget());

gtk_window_set_resizable(GTK_WINDOW(window), client->isResizable());
gtk_window_set_title(GTK_WINDOW(window), m_title);

gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY);
gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight);

if (settings.contains(QString("%1/pos_x").arg(m_title)))
{
lastX = settings.value(QString("%1/pos_x").arg(m_title), lastX).toInt();
lastY = settings.value(QString("%1/pos_y").arg(m_title), lastY).toInt();
gtk_window_move(GTK_WINDOW(window), lastX, lastY);

if (client->isResizable())
{
lastWidth = settings.value(QString("%1/width").arg(m_title), lastWidth).toInt();
lastHeight = settings.value(QString("%1/height").arg(m_title), lastHeight).toInt();
gtk_window_resize(GTK_WINDOW(window), lastWidth, lastHeight);
}
}

g_timeout_add(50, gtk_ui_timeout, this);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_ui_destroy), this);

if (showGui)
show();
else
m_client->sendOscUpdate();

// Main loop
gtk_main();
}

void quit()
{
qDebug("CarlaToolkitGtk3::quit()");

if (window)
{
gtk_widget_destroy(window);
gtk_main_quit();

window = nullptr;
}

m_client = nullptr;
}

void show()
{
qDebug("CarlaToolkitGtk3::show()");
CARLA_ASSERT(window);

if (window)
gtk_widget_show_all(window);
}

void hide()
{
qDebug("CarlaToolkitGtk3::hide()");
CARLA_ASSERT(window);

if (window)
gtk_widget_hide(window);
}

void resize(int width, int height)
{
qDebug("CarlaToolkitGtk3::resize(%i, %i)", width, height);
CARLA_ASSERT(window);

if (window)
gtk_window_resize(GTK_WINDOW(window), width, height);
}

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

protected:
void handleDestroy()
{
qDebug("CarlaToolkitGtk3::handleDestroy()");

window = nullptr;
m_client = nullptr;

settings.setValue(QString("%1/pos_x").arg(m_title), lastX);
settings.setValue(QString("%1/pos_y").arg(m_title), lastY);
settings.setValue(QString("%1/width").arg(m_title), lastWidth);
settings.setValue(QString("%1/height").arg(m_title), lastHeight);
settings.sync();
}

gboolean handleTimeout()
{
if (window)
{
gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY);
gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight);
}

return m_client ? m_client->oscIdle() : false;
}

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

private:
GtkWidget* window;
QSettings settings;

gint lastX, lastY, lastWidth, lastHeight;

static void gtk_ui_destroy(GtkWidget*, gpointer data)
{
CarlaToolkitGtk3* const _this_ = (CarlaToolkitGtk3*)data;
_this_->handleDestroy();

gtk_main_quit();
}

static gboolean gtk_ui_timeout(gpointer data)
{
CarlaToolkitGtk3* const _this_ = (CarlaToolkitGtk3*)data;
return _this_->handleTimeout();
}
};

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

CarlaToolkit* CarlaToolkit::createNew(const char* const title)
{
return new CarlaToolkitGtk3(title);
}

CARLA_BRIDGE_END_NAMESPACE

+ 160
- 108
c++/carla-bridge/carla_bridge_toolkit-qt.cpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla UI bridge code
* Carla Bridge Toolkit, Qt version
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -16,126 +16,127 @@
*/ */


#include "carla_bridge_client.hpp" #include "carla_bridge_client.hpp"
#include "carla_bridge_toolkit.hpp"


#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtCore/QTimer>
#include <QtCore/QThread>
#include <QtCore/QTimerEvent> #include <QtCore/QTimerEvent>


#ifdef BRIDGE_LV2_QT5
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
# include <QtWidgets/QApplication> # include <QtWidgets/QApplication>
# include <QtWidgets/QMainWindow> # include <QtWidgets/QMainWindow>
# include <QtWidgets/QVBoxLayout>
# ifdef Q_WS_X11
# undef Q_WS_X11
# endif
#else #else
# include <QtGui/QApplication> # include <QtGui/QApplication>
# include <QtGui/QMainWindow> # include <QtGui/QMainWindow>
# include <QtGui/QVBoxLayout>
# ifdef Q_WS_X11
# include <QtGui/QX11EmbedContainer>
# endif
#endif #endif


#ifdef Q_WS_X11
# include <QtGui/QX11EmbedContainer>
#if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11)
# define BRIDGE_CONTAINER
# ifdef Q_WS_X11
typedef QX11EmbedContainer QEmbedContainer;
# else
typedef QWidget QEmbedContainer;
# endif
#endif #endif


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


static int qargc = 0;
static char* qargv[0] = {};

class BridgeApplication : public QApplication
{
public:
BridgeApplication()
: QApplication(qargc, qargv, true)
{
msgTimer = 0;
m_client = nullptr;
}

void exec(CarlaClient* const client)
{
m_client = client;
msgTimer = startTimer(50);

QApplication::exec();
}

protected:
void timerEvent(QTimerEvent* const event)
{
if (event->timerId() == msgTimer)
{
if (m_client && ! m_client->oscIdle())
killTimer(msgTimer);
}
// -------------------------------------------------------------------------


QApplication::timerEvent(event);
}
#if defined(BRIDGE_QT4)
static const char* const appName = "Carla-Qt4UIs";
#elif defined(BRIDGE_QT5)
static const char* const appName = "Carla-Qt5UIs";
#elif defined(BRIDGE_COCOA)
static const char* const appName = "Carla-CocoaUIs";
#elif defined(BRIDGE_HWND)
static const char* const appName = "Carla-HWNDUIs";
#elif defined(BRIDGE_X11)
static const char* const appName = "Carla-X11UIs";
#else
static const char* const appName = "Carla-UIs";
#endif


private:
int msgTimer;
CarlaClient* m_client;
};
static int qargc = 0;
static char* qargv[0] = {};


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


class CarlaToolkitQt: public CarlaToolkit
class CarlaBridgeToolkitQt: public CarlaBridgeToolkit,
public QObject
{ {
public: public:
CarlaToolkitQt(const char* const title)
: CarlaToolkit(title),
#if defined(BRIDGE_LV2_QT4)
settings("Cadence", "Carla-Qt4UIs")
#elif defined(BRIDGE_LV2_QT5)
settings("Cadence", "Carla-Qt5UIs")
#elif defined(BRIDGE_LV2_X11) || defined(BRIDGE_VST_X11)
settings("Cadence", "Carla-X11UIs")
#elif defined(BRIDGE_LV2_HWND) || defined(BRIDGE_VST_HWND)
settings("Cadence", "Carla-HWNDUIs")
#else
settings("Cadence", "Carla-UIs")
#endif
CarlaBridgeToolkitQt(CarlaBridgeClient* const client, const char* const title)
: CarlaBridgeToolkit(client, title),
QObject(nullptr),
settings("Cadence", appName)
{ {
qDebug("CarlaToolkitQt::CarlaToolkitQ4(%s)", title);
qDebug("CarlaBridgeToolkitQt::CarlaBridgeToolkitQt(\"%s\")", title);


app = nullptr; app = nullptr;
window = nullptr; window = nullptr;


#ifdef Q_WS_X11
x11Container = nullptr;
msgTimer = 0;

needsResize = false;
nextWidth = 0;
nextHeight = 0;

#ifdef BRIDGE_CONTAINER
embedContainer = nullptr;
#endif #endif
} }


~CarlaToolkitQt()
~CarlaBridgeToolkitQt()
{ {
qDebug("CarlaToolkitQt::~CarlaToolkitQt()");
qDebug("CarlaBridgeToolkitQt::~CarlaBridgeToolkitQt()");
CARLA_ASSERT(! app); CARLA_ASSERT(! app);
CARLA_ASSERT(! msgTimer);


if (window) if (window)
{ {
window->close(); window->close();
delete window; delete window;
} }

#ifdef BRIDGE_CONTAINER
// TESTING
if (embedContainer)
{
embedContainer->close();
delete embedContainer;
}
#endif
} }


void init() void init()
{ {
qDebug("CarlaToolkitQt::init()");
qDebug("CarlaBridgeToolkitQt::init()");
CARLA_ASSERT(! app); CARLA_ASSERT(! app);
CARLA_ASSERT(! window); CARLA_ASSERT(! window);
CARLA_ASSERT(! msgTimer);


app = new BridgeApplication;
app = new QApplication(qargc, qargv);


window = new QMainWindow(nullptr); window = new QMainWindow(nullptr);
window->resize(10, 10);
window->resize(30, 30);
window->hide(); window->hide();
} }


void exec(CarlaClient* const client, const bool showGui)
void exec(const bool showGui)
{ {
qDebug("CarlaToolkitQt::exec(%p)", client);
qDebug("CarlaBridgeToolkitQt::exec(%s)", bool2str(showGui));
CARLA_ASSERT(app); CARLA_ASSERT(app);
CARLA_ASSERT(window);
CARLA_ASSERT(client); CARLA_ASSERT(client);


#ifndef BRIDGE_LV2_X11
#if defined(BRIDGE_QT4) || defined(BRIDGE_QT5)
QWidget* const widget = (QWidget*)client->getWidget(); QWidget* const widget = (QWidget*)client->getWidget();


window->setCentralWidget(widget); window->setCentralWidget(widget);
@@ -146,46 +147,66 @@ public:
#endif #endif


if (! client->isResizable()) if (! client->isResizable())
{
window->setFixedSize(window->width(), window->height()); window->setFixedSize(window->width(), window->height());
#ifdef Q_OS_WIN
window->setWindowFlags(window->windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
#endif
}


window->setWindowTitle(m_title);
window->setWindowTitle(title);


if (settings.contains(QString("%1/pos_x").arg(m_title)))
if (settings.contains(QString("%1/pos_x").arg(title)))
{ {
int posX = settings.value(QString("%1/pos_x").arg(m_title), window->x()).toInt();
int posY = settings.value(QString("%1/pos_y").arg(m_title), window->y()).toInt();
window->move(posX, posY);
bool hasX, hasY;
int posX = settings.value(QString("%1/pos_x").arg(title), window->x()).toInt(&hasX);
int posY = settings.value(QString("%1/pos_y").arg(title), window->y()).toInt(&hasY);

if (hasX && hasY)
window->move(posX, posY);


if (client->isResizable()) if (client->isResizable())
{ {
int width = settings.value(QString("%1/width").arg(m_title), window->width()).toInt();
int height = settings.value(QString("%1/height").arg(m_title), window->height()).toInt();
window->resize(width, height);
bool hasWidth, hasHeight;
int width = settings.value(QString("%1/width").arg(title), window->width()).toInt(&hasWidth);
int height = settings.value(QString("%1/height").arg(title), window->height()).toInt(&hasHeight);

if (hasWidth && hasHeight)
window->resize(width, height);
} }
} }


if (showGui) if (showGui)
show(); show();
else else
m_client->sendOscUpdate();
client->sendOscUpdate();

// Timer
msgTimer = startTimer(50);


// Main loop // Main loop
app->exec(client);
app->exec();
} }


void quit() void quit()
{ {
qDebug("CarlaToolkitQt::quit()");
qDebug("CarlaBridgeToolkitQt::quit()");
CARLA_ASSERT(app); CARLA_ASSERT(app);


if (msgTimer != 0)
{
killTimer(msgTimer);
msgTimer = 0;
}

if (window) if (window)
{ {
if (m_client)
if (client)
{ {
settings.setValue(QString("%1/pos_x").arg(m_title), window->x());
settings.setValue(QString("%1/pos_y").arg(m_title), window->y());
settings.setValue(QString("%1/width").arg(m_title), window->width());
settings.setValue(QString("%1/height").arg(m_title), window->height());
settings.setValue(QString("%1/pos_x").arg(title), window->x());
settings.setValue(QString("%1/pos_y").arg(title), window->y());
settings.setValue(QString("%1/width").arg(title), window->width());
settings.setValue(QString("%1/height").arg(title), window->height());
settings.sync(); settings.sync();
} }


@@ -195,8 +216,6 @@ public:
window = nullptr; window = nullptr;
} }


m_client = nullptr;

if (app) if (app)
{ {
if (! app->closingDown()) if (! app->closingDown())
@@ -209,7 +228,7 @@ public:


void show() void show()
{ {
qDebug("CarlaToolkitQt::show()");
qDebug("CarlaBridgeToolkitQt::show()");
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (window) if (window)
@@ -218,62 +237,95 @@ public:


void hide() void hide()
{ {
qDebug("CarlaToolkitQt::hide()");
qDebug("CarlaBridgeToolkitQt::hide()");
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (window) if (window)
window->hide(); window->hide();
} }


void resize(int width, int height)
void resize(const int width, const int height)
{ {
qDebug("CarlaToolkitQt::resize(%i, %i)", width, height);
qDebug("CarlaBridgeToolkitQt::resize(%i, %i)", width, height);
CARLA_ASSERT(window); CARLA_ASSERT(window);


if (app->thread() != QThread::currentThread())
{
nextWidth = width;
nextHeight = height;
needsResize = true;
return;
}

if (window) if (window)
window->setFixedSize(width, height); window->setFixedSize(width, height);


#ifdef BRIDGE_LV2_X11
if (x11Container)
x11Container->setFixedSize(width, height);
#ifdef BRIDGE_CONTAINER
if (embedContainer)
embedContainer->setFixedSize(width, height);
#endif #endif
} }


#ifdef BRIDGE_CONTAINER
void* getContainerId() void* getContainerId()
{ {
#ifdef Q_WS_X11
if (! x11Container)
qDebug("CarlaBridgeToolkitQt::getContainerId()");
CARLA_ASSERT(window);

if (! embedContainer)
{ {
x11Container = new QX11EmbedContainer(window);
embedContainer = new QEmbedContainer(window);


window->setCentralWidget(x11Container);
window->setCentralWidget(embedContainer);
window->adjustSize(); window->adjustSize();


x11Container->setParent(window);
x11Container->show();
embedContainer->setParent(window);
embedContainer->show();
} }


return (void*)x11Container->winId();
#else
return nullptr;
#endif
return (void*)embedContainer->winId();
} }
#endif


private:
BridgeApplication* app;
protected:
QApplication* app;
QMainWindow* window; QMainWindow* window;
QSettings settings; QSettings settings;
int msgTimer;


#ifdef Q_WS_X11
QX11EmbedContainer* x11Container;
bool needsResize;
int nextWidth, nextHeight;

#ifdef BRIDGE_CONTAINER
QEmbedContainer* embedContainer;
#endif #endif

void timerEvent(QTimerEvent* const event)
{
if (event->timerId() == msgTimer && client)
{
if (needsResize)
{
client->toolkitResize(nextWidth, nextHeight);
needsResize = false;
}

if (client->isOscControlRegistered() && ! client->oscIdle())
{
killTimer(msgTimer);
msgTimer = 0;
}
}

QObject::timerEvent(event);
}
}; };


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


CarlaToolkit* CarlaToolkit::createNew(const char* const title)
CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(CarlaBridgeClient* const client, const char* const title)
{ {
return new CarlaToolkitQt(title);
return new CarlaBridgeToolkitQt(client, title);
} }


CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE

+ 50
- 0
c++/carla-bridge/carla_bridge_toolkit.cpp View File

@@ -0,0 +1,50 @@
/*
* Carla Bridge Toolkit
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the COPYING file
*/

#include "carla_bridge_toolkit.hpp"
#include "carla_utils.hpp"

#include <cstdlib>
#include <cstring>

CARLA_BRIDGE_START_NAMESPACE

CarlaBridgeToolkit::CarlaBridgeToolkit(CarlaBridgeClient* const client_, const char* const newTitle)
: client(client_)
{
qDebug("CarlaBridgeToolkit::CarlaBridgeToolkit(\"%s\")", newTitle);
CARLA_ASSERT(newTitle);

title = strdup(newTitle ? newTitle : "(null)");
}

CarlaBridgeToolkit::~CarlaBridgeToolkit()
{
qDebug("CarlaBridgeToolkit::~CarlaBridgeToolkit()");

free(title);
}

#if BUILD_BRIDGE_UI
void* CarlaBridgeToolkit::getContainerId()
{
qDebug("CarlaBridgeToolkit::getContainerId()");
return nullptr;
}
#endif

CARLA_BRIDGE_END_NAMESPACE

+ 17
- 31
c++/carla-bridge/carla_bridge_toolkit.hpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla bridge code
* Carla Bridge Toolkit
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -15,16 +15,17 @@
* For a full copy of the GNU General Public License see the COPYING file * For a full copy of the GNU General Public License see the COPYING file
*/ */


#ifndef CARLA_BRIDGE_TOOLKIT_H
#define CARLA_BRIDGE_TOOLKIT_H
#ifndef CARLA_BRIDGE_TOOLKIT_HPP
#define CARLA_BRIDGE_TOOLKIT_HPP


#include "carla_bridge.hpp" #include "carla_bridge.hpp"


#include <cstdlib>
#include <cstring>

CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


#if 0
} // Fix editor indentation
#endif

/*! /*!
* @defgroup CarlaBridgeToolkit Carla Bridge Toolkit * @defgroup CarlaBridgeToolkit Carla Bridge Toolkit
* *
@@ -32,48 +33,33 @@ CARLA_BRIDGE_START_NAMESPACE
* @{ * @{
*/ */


class CarlaToolkit
class CarlaBridgeToolkit
{ {
public: public:
CarlaToolkit(const char* const title)
{
CARLA_ASSERT(title);

m_title = strdup(title ? title : "(null)");
m_client = nullptr;
}

virtual ~CarlaToolkit()
{
if (m_title)
free(m_title);
}
CarlaBridgeToolkit(CarlaBridgeClient* const client, const char* const title);
virtual ~CarlaBridgeToolkit();


virtual void init() = 0; virtual void init() = 0;
virtual void exec(CarlaClient* const client, const bool showGui) = 0;
virtual void exec(const bool showGui) = 0;
virtual void quit() = 0; virtual void quit() = 0;


virtual void show() = 0; virtual void show() = 0;
virtual void hide() = 0; virtual void hide() = 0;
virtual void resize(int width, int height) = 0;
virtual void resize(const int width, const int height) = 0;


#if BUILD_BRIDGE_UI #if BUILD_BRIDGE_UI
virtual void* getContainerId()
{
return nullptr;
}
virtual void* getContainerId();


static CarlaToolkit* createNew(const char* const title);
static CarlaBridgeToolkit* createNew(CarlaBridgeClient* const client, const char* const title);
#endif #endif


protected: protected:
char* m_title;
CarlaClient* m_client;
friend class CarlaClient;
CarlaBridgeClient* const client;
char* title;
}; };


/**@}*/ /**@}*/


CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE


#endif // CARLA_BRIDGE_TOOLKIT_H
#endif // CARLA_BRIDGE_TOOLKIT_HPP

+ 30
- 31
c++/carla-bridge/carla_bridge_ui-vst.cpp View File

@@ -1,5 +1,5 @@
/* /*
* Carla UI bridge code
* Carla Bridge UI, VST version
* Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@@ -18,13 +18,14 @@
#ifdef BRIDGE_VST #ifdef BRIDGE_VST


#include "carla_bridge_client.hpp" #include "carla_bridge_client.hpp"
#include "carla_bridge_toolkit.hpp"
#include "carla_vst_utils.hpp" #include "carla_vst_utils.hpp"
#include "carla_midi.h" #include "carla_midi.h"


#include <QtCore/QObject>
#include <QtCore/QTimerEvent> #include <QtCore/QTimerEvent>
#include <QtGui/QDialog>


#ifdef Q_WS_X11
#if defined(Q_WS_X11) && (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
# include <QtGui/QX11Info> # include <QtGui/QX11Info>
#endif #endif


@@ -36,11 +37,12 @@ CARLA_BRIDGE_START_NAMESPACE
uint32_t bufferSize = 512; uint32_t bufferSize = 512;
double sampleRate = 44100.0; double sampleRate = 44100.0;


class CarlaVstClient : public CarlaClient, QObject
class CarlaVstClient : public CarlaBridgeClient,
public QObject
{ {
public: public:
CarlaVstClient(CarlaToolkit* const toolkit)
: CarlaClient(toolkit),
CarlaVstClient(const char* const uiTitle)
: CarlaBridgeClient(uiTitle),
QObject(nullptr) QObject(nullptr)
{ {
effect = nullptr; effect = nullptr;
@@ -65,24 +67,24 @@ public:
// ----------------------------------------------------------------- // -----------------------------------------------------------------
// init // init


CarlaClient::init(binary, nullptr);
CarlaBridgeClient::init(binary, nullptr);


// ----------------------------------------------------------------- // -----------------------------------------------------------------
// open DLL // open DLL


if (! libOpen(binary))
if (! uiLibOpen(binary))
{ {
qWarning("%s", libError());
qWarning("%s", uiLibError());
return false; return false;
} }


// ----------------------------------------------------------------- // -----------------------------------------------------------------
// get DLL main entry // get DLL main entry


VST_Function vstFn = (VST_Function)libSymbol("VSTPluginMain");
VST_Function vstFn = (VST_Function)uiLibSymbol("VSTPluginMain");


if (! vstFn) if (! vstFn)
vstFn = (VST_Function)libSymbol("main");
vstFn = (VST_Function)uiLibSymbol("main");


if (! vstFn) if (! vstFn)
return false; return false;
@@ -105,7 +107,7 @@ public:
#endif #endif


int32_t value = 0; int32_t value = 0;
#ifdef Q_WS_X11
#if defined(Q_WS_X11) && (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
value = (int64_t)QX11Info::display(); value = (int64_t)QX11Info::display();
#endif #endif


@@ -119,8 +121,9 @@ public:


if (effect->dispatcher(effect, effEditOpen, 0, value, getContainerId(), 0.0f) != 1) if (effect->dispatcher(effect, effEditOpen, 0, value, getContainerId(), 0.0f) != 1)
{ {
effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
return false;
//effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
//return false;
qWarning("VST UI failed to open, trying to init anyway...");
} }


// ----------------------------------------------------------------- // -----------------------------------------------------------------
@@ -145,7 +148,7 @@ public:


void close() void close()
{ {
CarlaClient::close();
CarlaBridgeClient::close();


if (effect) if (effect)
{ {
@@ -204,7 +207,9 @@ public:
void handleAudioMasterAutomate(const uint32_t index, const float value) void handleAudioMasterAutomate(const uint32_t index, const float value)
{ {
effect->setParameter(effect, index, value); effect->setParameter(effect, index, value);
sendOscControl(index, value);

if (isOscControlRegistered())
sendOscControl(index, value);
} }


intptr_t handleAudioMasterGetCurrentProcessLevel() intptr_t handleAudioMasterGetCurrentProcessLevel()
@@ -214,6 +219,9 @@ public:


intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents) intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents)
{ {
if (isOscControlRegistered())
return 1;

for (int32_t i=0; i < vstEvents->numEvents; i++) for (int32_t i=0; i < vstEvents->numEvents; i++)
{ {
if (! vstEvents->events[i]) if (! vstEvents->events[i])
@@ -246,7 +254,8 @@ public:


void handleAudioMasterUpdateDisplay() void handleAudioMasterUpdateDisplay()
{ {
sendOscConfigure("reloadprograms", "");
if (isOscControlRegistered())
sendOscConfigure("reloadprograms", "");
} }


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -470,18 +479,12 @@ int main(int argc, char* argv[])
if (sampleRateStr) if (sampleRateStr)
sampleRate = atof(sampleRateStr); sampleRate = atof(sampleRateStr);


// Init toolkit
CarlaToolkit* const toolkit = CarlaToolkit::createNew(uiTitle);
toolkit->init();

// Init VST-UI
CarlaVstClient client(toolkit);
// Init VST client
CarlaVstClient client(uiTitle);


// Init OSC // Init OSC
if (useOsc && ! client.oscInit(oscUrl)) if (useOsc && ! client.oscInit(oscUrl))
{ {
toolkit->quit();
delete toolkit;
return -1; return -1;
} }


@@ -490,7 +493,7 @@ int main(int argc, char* argv[])


if (client.init(binary, nullptr)) if (client.init(binary, nullptr))
{ {
toolkit->exec(&client, !useOsc);
client.toolkitExec(!useOsc);
ret = 0; ret = 0;
} }
else else
@@ -505,13 +508,9 @@ int main(int argc, char* argv[])
client.oscClose(); client.oscClose();
} }


// Close VST-UI
// Close VST client
client.close(); client.close();


// Close toolkit
toolkit->quit();
delete toolkit;

return ret; return ret;
} }




+ 10
- 10
c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro View File

@@ -12,19 +12,19 @@ VERSION = 0.5.0
SOURCES = \ SOURCES = \
../carla_bridge_osc.cpp \ ../carla_bridge_osc.cpp \
../carla_bridge_ui-lv2.cpp \ ../carla_bridge_ui-lv2.cpp \
../carla_bridge_toolkit-gtk2.cpp
../carla_bridge_toolkit-gtk.cpp


HEADERS = \ HEADERS = \
../carla_bridge.h \
../carla_bridge_client.h \
../carla_bridge_osc.h \
../carla_bridge_toolkit.h \
../../carla-includes/carla_includes.h \
../../carla-includes/carla_lib_includes.h \
../../carla-includes/carla_osc_includes.h \
../../carla-includes/carla_lv2.h \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \ ../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.h
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes ../../carla-includes


+ 10
- 10
c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk3.pro View File

@@ -12,19 +12,19 @@ VERSION = 0.5.0
SOURCES = \ SOURCES = \
../carla_bridge_osc.cpp \ ../carla_bridge_osc.cpp \
../carla_bridge_ui-lv2.cpp \ ../carla_bridge_ui-lv2.cpp \
../carla_bridge_toolkit-gtk3.cpp
../carla_bridge_toolkit-gtk.cpp


HEADERS = \ HEADERS = \
../carla_bridge.h \
../carla_bridge_client.h \
../carla_bridge_osc.h \
../carla_bridge_toolkit.h \
../../carla-includes/carla_includes.h \
../../carla-includes/carla_lib_includes.h \
../../carla-includes/carla_osc_includes.h \
../../carla-includes/carla_lv2.h \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \ ../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.h
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes ../../carla-includes


+ 10
- 10
c++/carla-bridge/qtcreator/carla-bridge-lv2-qt4.pro View File

@@ -12,19 +12,19 @@ VERSION = 0.5.0
SOURCES = \ SOURCES = \
../carla_bridge_osc.cpp \ ../carla_bridge_osc.cpp \
../carla_bridge_ui-lv2.cpp \ ../carla_bridge_ui-lv2.cpp \
../carla_bridge_toolkit-qt4.cpp
../carla_bridge_toolkit-qt.cpp


HEADERS = \ HEADERS = \
../carla_bridge.h \
../carla_bridge_client.h \
../carla_bridge_osc.h \
../carla_bridge_toolkit.h \
../../carla-includes/carla_includes.h \
../../carla-includes/carla_lib_includes.h \
../../carla-includes/carla_osc_includes.h \
../../carla-includes/carla_lv2.h \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \ ../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.h
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes ../../carla-includes


+ 41
- 0
c++/carla-bridge/qtcreator/carla-bridge-lv2-qt5.pro View File

@@ -0,0 +1,41 @@
# QtCreator project file

QT = core widgets

CONFIG = debug link_pkgconfig qt warn_on
PKGCONFIG = liblo

TARGET = carla-bridge-lv2-qt5
TEMPLATE = app
VERSION = 0.5.0

SOURCES = \
../carla_bridge_osc.cpp \
../carla_bridge_ui-lv2.cpp \
../carla_bridge_toolkit-qt.cpp

HEADERS = \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp

INCLUDEPATH = .. \
../../carla-includes \
../../carla-utils

LIBS = \
../../carla-lilv/carla_lilv.a \
../../carla-rtmempool/carla_rtmempool.a

DEFINES = QTCREATOR_TEST
DEFINES += DEBUG
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_LV2_QT5

QMAKE_CXXFLAGS *= -std=c++0x

+ 11
- 11
c++/carla-bridge/qtcreator/carla-bridge-lv2-x11.pro View File

@@ -12,19 +12,19 @@ VERSION = 0.5.0
SOURCES = \ SOURCES = \
../carla_bridge_osc.cpp \ ../carla_bridge_osc.cpp \
../carla_bridge_ui-lv2.cpp \ ../carla_bridge_ui-lv2.cpp \
../carla_bridge_toolkit-qt4.cpp
../carla_bridge_toolkit-qt.cpp


HEADERS = \ HEADERS = \
../carla_bridge.h \
../carla_bridge_client.h \
../carla_bridge_osc.h \
../carla_bridge_toolkit.h \
../../carla-includes/carla_includes.h \
../../carla-includes/carla_lib_includes.h \
../../carla-includes/carla_osc_includes.h \
../../carla-includes/carla_lv2.h \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \ ../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.h
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes ../../carla-includes
@@ -35,6 +35,6 @@ LIBS = \


DEFINES = QTCREATOR_TEST DEFINES = QTCREATOR_TEST
DEFINES += DEBUG DEFINES += DEBUG
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_LV2_X11
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_X11 BRIDGE_LV2_X11


QMAKE_CXXFLAGS *= -std=c++0x QMAKE_CXXFLAGS *= -std=c++0x

+ 81
- 0
c++/carla-bridge/qtcreator/carla-bridge-plugin.pro View File

@@ -0,0 +1,81 @@
# QtCreator project file

QT = core gui

CONFIG = debug link_pkgconfig qt warn_on
PKGCONFIG = jack liblo

TARGET = carla-bridge-qtcreator
TEMPLATE = app
VERSION = 0.5.0

SOURCES = \
../carla_bridge_osc.cpp \
../carla_bridge_plugin.cpp

SOURCES += \
../../carla-engine/carla_engine.cpp \
../../carla-engine/carla_engine_osc.cpp \
../../carla-engine/carla_engine_thread.cpp \
../../carla-engine/jack.cpp

SOURCES += \
../../carla-plugin/carla_plugin.cpp \
../../carla-plugin/carla_plugin_thread.cpp \
../../carla-plugin/ladspa.cpp \
../../carla-plugin/dssi.cpp \
../../carla-plugin/lv2.cpp \
../../carla-plugin/vst.cpp

HEADERS = \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \

HEADERS += \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \
../../carla-includes/ladspa_rdf.hpp \
../../carla-includes/lv2_rdf.hpp

HEADERS += \
../../carla-backend/carla_backend.hpp \
../../carla-backend/carla_backend_utils.hpp

HEADERS += \
../../carla-engine/carla_engine.hpp \
../../carla-engine/carla_engine_osc.hpp \
../../carla-engine/carla_engine_thread.hpp \

HEADERS += \
../../carla-plugin/carla_plugin.hpp \
../../carla-plugin/carla_plugin_thread.hpp

HEADERS += \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_ladspa_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp \
../../carla-utils/carla_vst_utils.hpp

INCLUDEPATH = .. \
../../carla-backend \
../../carla-engine \
../../carla-includes \
../../carla-jackbridge \
../../carla-plugin \
../../carla-utils

DEFINES = QTCREATOR_TEST
DEFINES += DEBUG
#DEFINES += VESTIGE_HEADER
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_PLUGIN
DEFINES += CARLA_ENGINE_JACK
DEFINES += WANT_LADSPA WANT_DSSI WANT_LV2 WANT_VST

LIBS = -ldl \
../../carla-lilv/carla_lilv.a \
../../carla-rtmempool/carla_rtmempool.a

QMAKE_CXXFLAGS *= -std=c++0x

+ 20
- 13
c++/carla-bridge/qtcreator/carla-bridge-vst-x11.pro View File

@@ -1,6 +1,10 @@
# QtCreator project file # QtCreator project file


contains(QT_VERSION, ^5.*) {
QT = core widgets
} else {
QT = core gui QT = core gui
}


CONFIG = debug link_pkgconfig qt warn_on CONFIG = debug link_pkgconfig qt warn_on
PKGCONFIG = liblo PKGCONFIG = liblo
@@ -10,26 +14,29 @@ TEMPLATE = app
VERSION = 0.5.0 VERSION = 0.5.0


SOURCES = \ SOURCES = \
../carla_bridge_client.cpp \
../carla_bridge_osc.cpp \ ../carla_bridge_osc.cpp \
../carla_bridge_ui-vst.cpp \
../carla_bridge_toolkit-qt4.cpp
../carla_bridge_toolkit.cpp \
../carla_bridge_toolkit-qt.cpp \
../carla_bridge_ui-vst.cpp


HEADERS = \ HEADERS = \
../carla_bridge.h \
../carla_bridge_client.h \
../carla_bridge_osc.h \
../carla_bridge_toolkit.h \
../../carla-includes/carla_includes.h \
../../carla-includes/carla_lib_includes.h \
../../carla-includes/carla_osc_includes.h \
../../carla-includes/carla_vst.h \
../../carla-includes/carla_midi.h
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_vst_utils.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes
../../carla-includes \
../../carla-utils


DEFINES = QTCREATOR_TEST DEFINES = QTCREATOR_TEST
DEFINES += DEBUG DEFINES += DEBUG
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_VST BRIDGE_VST_X11
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_VST BRIDGE_X11 BRIDGE_VST_X11


QMAKE_CXXFLAGS *= -std=c++0x QMAKE_CXXFLAGS *= -std=c++0x

+ 1
- 1
c++/carla-plugin/lv2.cpp View File

@@ -4293,7 +4293,7 @@ public:
else if (iSuil >= 0) else if (iSuil >= 0)
iFinal = iSuil; iFinal = iSuil;


const bool isBridged = (iFinal == eQt4 || iFinal == eCocoa || iFinal == eHWND || iFinal == eX11 || iFinal == eGtk2 || iFinal == eGtk3);
const bool isBridged = false; //(iFinal == eQt4 || iFinal == eCocoa || iFinal == eHWND || iFinal == eX11 || iFinal == eGtk2 || iFinal == eGtk3);
#ifdef WANT_SUIL #ifdef WANT_SUIL
const bool isSuil = (iFinal == iSuil && !isBridged); const bool isSuil = (iFinal == iSuil && !isBridged);
#endif #endif


Loading…
Cancel
Save