Browse Source

Cleanup; Complete JACK bridge (JACK build always enabled now)

tags/1.9.4
falkTX 12 years ago
parent
commit
07b47a25bf
20 changed files with 491 additions and 363 deletions
  1. +0
    -6
      source/Makefile.mk
  2. +0
    -2
      source/backend/CarlaEngine.hpp
  3. +0
    -4
      source/backend/Makefile
  4. +0
    -12
      source/backend/Makefile.mk
  5. +7
    -11
      source/backend/engine/CarlaEngine.cpp
  6. +0
    -3
      source/backend/engine/CarlaEngine.pro
  7. +8
    -8
      source/backend/engine/CarlaEngineBridge.cpp
  8. +1
    -1
      source/backend/engine/CarlaEngineInternal.hpp
  9. +46
    -46
      source/backend/engine/CarlaEngineJack.cpp
  10. +5
    -18
      source/backend/engine/Makefile
  11. +4
    -22
      source/backend/native/Makefile
  12. +4
    -13
      source/backend/plugin/Makefile
  13. +6
    -3
      source/backend/standalone/CarlaStandalone.cpp
  14. +12
    -17
      source/backend/standalone/Makefile
  15. +1
    -1
      source/bridges/CarlaBridgePlugin.cpp
  16. +12
    -5
      source/bridges/Makefile
  17. +210
    -149
      source/libs/jackbridge/JackBridge.cpp
  18. +167
    -37
      source/libs/jackbridge/JackBridge.hpp
  19. +1
    -0
      source/libs/jackbridge/Makefile
  20. +7
    -5
      source/utils/CarlaLibUtils.hpp

+ 0
- 6
source/Makefile.mk View File

@@ -48,7 +48,6 @@ BUILD_CXX_FLAGS += -DVESTIGE_HEADER


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


HAVE_JACK = $(shell pkg-config --exists jack && echo true)
HAVE_OPENGL = $(shell pkg-config --exists gl && echo true) HAVE_OPENGL = $(shell pkg-config --exists gl && echo true)
HAVE_QT4 = $(shell pkg-config --exists QtCore && echo true) HAVE_QT4 = $(shell pkg-config --exists QtCore && echo true)


@@ -57,11 +56,6 @@ HAVE_MF_DEPS = $(shell pkg-config --exists smf && echo true)
HAVE_ZYN_DEPS = $(shell pkg-config --exists fftw3 mxml zlib && echo true) HAVE_ZYN_DEPS = $(shell pkg-config --exists fftw3 mxml zlib && echo true)
HAVE_ZYN_UI_DEPS = $(shell pkg-config --exists ntk ntk_images && echo true) HAVE_ZYN_UI_DEPS = $(shell pkg-config --exists ntk ntk_images && echo true)


ifeq ($(HAVE_JACK),true)
HAVE_JACK_LATENCY = $(shell pkg-config --atleast-version=0.121.0 jack && echo true)
HAVE_JACK2 = $(shell pkg-config --atleast-version=1.9.0 jack && echo true)
endif

ifeq ($(CARLA_SAMPLERS_SUPPORT),true) ifeq ($(CARLA_SAMPLERS_SUPPORT),true)
HAVE_FLUIDSYNTH = $(shell pkg-config --exists fluidsynth && echo true) HAVE_FLUIDSYNTH = $(shell pkg-config --exists fluidsynth && echo true)
HAVE_LINUXSAMPLER = $(shell pkg-config --exists linuxsampler && echo true) HAVE_LINUXSAMPLER = $(shell pkg-config --exists linuxsampler && echo true)


+ 0
- 2
source/backend/CarlaEngine.hpp View File

@@ -1028,9 +1028,7 @@ protected:
# endif # endif


private: private:
# ifdef WANT_JACK
static CarlaEngine* newJack(); static CarlaEngine* newJack();
# endif
# ifdef WANT_RTAUDIO # ifdef WANT_RTAUDIO
enum RtAudioApi { enum RtAudioApi {
RTAUDIO_DUMMY = 0, RTAUDIO_DUMMY = 0,


+ 0
- 4
source/backend/Makefile View File

@@ -44,11 +44,7 @@ ifeq ($(HAVE_ALSA),true)
else else
@echo "ALSA: $(ANS_NO)" @echo "ALSA: $(ANS_NO)"
endif endif
ifeq ($(HAVE_JACK),true)
@echo "JACK: $(ANS_YES)" @echo "JACK: $(ANS_YES)"
else
@echo "JACK: $(ANS_NO)"
endif
ifeq ($(HAVE_PULSEAUDIO),true) ifeq ($(HAVE_PULSEAUDIO),true)
@echo "PulseAudio:$(ANS_YES)" @echo "PulseAudio:$(ANS_YES)"
else else


+ 0
- 12
source/backend/Makefile.mk View File

@@ -30,18 +30,6 @@ endif


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


ifeq ($(HAVE_JACK),true)
BUILD_CXX_FLAGS += -DWANT_JACK
endif

ifeq ($(HAVE_JACK_LATENCY),true)
# BUILD_CXX_FLAGS += -DWANT_JACK_LATENCY # unfinished
endif

ifeq ($(HAVE_JACK2),true)
BUILD_CXX_FLAGS += -DWANT_JACK_PORT_RENAME
endif

ifeq ($(HAVE_FLUIDSYNTH),true) ifeq ($(HAVE_FLUIDSYNTH),true)
BUILD_CXX_FLAGS += -DWANT_FLUIDSYNTH BUILD_CXX_FLAGS += -DWANT_FLUIDSYNTH
endif endif


+ 7
- 11
source/backend/engine/CarlaEngine.cpp View File

@@ -444,11 +444,8 @@ unsigned int CarlaEngine::getDriverCount()
{ {
carla_debug("CarlaEngine::getDriverCount()"); carla_debug("CarlaEngine::getDriverCount()");


unsigned int count = 0;
unsigned int count = 1;


#ifdef WANT_JACK
count += 1;
#endif
#ifdef WANT_RTAUDIO #ifdef WANT_RTAUDIO
count += getRtAudioApiCount(); count += getRtAudioApiCount();
#endif #endif
@@ -460,12 +457,10 @@ const char* CarlaEngine::getDriverName(unsigned int index)
{ {
carla_debug("CarlaEngine::getDriverName(%i)", index); carla_debug("CarlaEngine::getDriverName(%i)", index);


#ifdef WANT_JACK
if (index == 0) if (index == 0)
return "JACK"; return "JACK";
else else
index -= 1; index -= 1;
#endif


#ifdef WANT_RTAUDIO #ifdef WANT_RTAUDIO
if (index < getRtAudioApiCount()) if (index < getRtAudioApiCount())
@@ -480,10 +475,8 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName)
{ {
carla_debug("CarlaEngine::newDriverByName(\"%s\")", driverName); carla_debug("CarlaEngine::newDriverByName(\"%s\")", driverName);


#ifdef WANT_JACK
if (std::strcmp(driverName, "JACK") == 0) if (std::strcmp(driverName, "JACK") == 0)
return newJack(); return newJack();
#endif


#ifdef WANT_RTAUDIO #ifdef WANT_RTAUDIO
# ifdef __LINUX_ALSA__ # ifdef __LINUX_ALSA__
@@ -558,6 +551,9 @@ bool CarlaEngine::init(const char* const clientName)
kData->aboutToClose = false; kData->aboutToClose = false;
kData->curPluginCount = 0; kData->curPluginCount = 0;


#ifdef BUILD_BRIDGE
kData->maxPluginNumber = 1;
#else
switch (fOptions.processMode) switch (fOptions.processMode)
{ {
case PROCESS_MODE_CONTINUOUS_RACK: case PROCESS_MODE_CONTINUOUS_RACK:
@@ -568,13 +564,11 @@ bool CarlaEngine::init(const char* const clientName)
case PROCESS_MODE_PATCHBAY: case PROCESS_MODE_PATCHBAY:
kData->maxPluginNumber = MAX_PATCHBAY_PLUGINS; kData->maxPluginNumber = MAX_PATCHBAY_PLUGINS;
break; break;
case PROCESS_MODE_BRIDGE:
kData->maxPluginNumber = 1;
break;
default: default:
kData->maxPluginNumber = MAX_DEFAULT_PLUGINS; kData->maxPluginNumber = MAX_DEFAULT_PLUGINS;
break; break;
} }
#endif


//kData->pluginsPool.resize(maxPluginNumber, 999); //kData->pluginsPool.resize(maxPluginNumber, 999);
kData->plugins = new EnginePluginData[kData->maxPluginNumber]; kData->plugins = new EnginePluginData[kData->maxPluginNumber];
@@ -627,6 +621,7 @@ bool CarlaEngine::close()
kData->plugins = nullptr; kData->plugins = nullptr;
} }


#ifndef BUILD_BRIDGE
if (kData->rack.in != nullptr) if (kData->rack.in != nullptr)
{ {
delete[] kData->rack.in; delete[] kData->rack.in;
@@ -638,6 +633,7 @@ bool CarlaEngine::close()
delete[] kData->rack.out; delete[] kData->rack.out;
kData->rack.out = nullptr; kData->rack.out = nullptr;
} }
#endif


fName.clear(); fName.clear();




+ 0
- 3
source/backend/engine/CarlaEngine.pro View File

@@ -23,9 +23,6 @@ DEFINES += WANT_LV2
DEFINES += WANT_VST DEFINES += WANT_VST
DEFINES += WANT_PLUGIN DEFINES += WANT_PLUGIN
DEFINES += WANT_RTAUDIO DEFINES += WANT_RTAUDIO
DEFINES += WANT_JACK
DEFINES += WANT_JACK_LATENCY
DEFINES += WANT_JACK_PORT_RENAME
DEFINES += WANT_FLUIDSYNTH DEFINES += WANT_FLUIDSYNTH
DEFINES += WANT_LINUXSAMPLER DEFINES += WANT_LINUXSAMPLER
DEFINES += WANT_OPENGL DEFINES += WANT_OPENGL


+ 8
- 8
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -21,10 +21,10 @@
#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


#include "../CarlaBridge.hpp"
#include "CarlaBridgeUtils.hpp"
#include "CarlaShmUtils.hpp" #include "CarlaShmUtils.hpp"


#include "jackbridge/jackbridge.h"
#include "jackbridge/JackBridge.hpp"


#include <ctime> #include <ctime>


@@ -41,7 +41,7 @@ CARLA_BACKEND_START_NAMESPACE
// ----------------------------------------- // -----------------------------------------


class CarlaEngineBridge : public CarlaEngine, class CarlaEngineBridge : public CarlaEngine,
public CarlaThread
public QThread
{ {
public: public:
CarlaEngineBridge(const char* const audioBaseName, const char* const controlBaseName) CarlaEngineBridge(const char* const audioBaseName, const char* const controlBaseName)
@@ -123,7 +123,7 @@ public:
fQuitNow = false; fQuitNow = false;
fIsRunning = true; fIsRunning = true;


CarlaThread::start();
QThread::start();
CarlaEngine::init(clientName); CarlaEngine::init(clientName);
return true; return true;
} }
@@ -134,7 +134,7 @@ public:
CarlaEngine::close(); CarlaEngine::close();


fQuitNow = true; fQuitNow = true;
CarlaThread::stop();
QThread::wait();


_cleanup(); _cleanup();


@@ -185,7 +185,7 @@ public:
ts_timeout.tv_sec++; ts_timeout.tv_sec++;
} }


if (linux_sem_timedwait(&fShmControl.data->runServer, &ts_timeout))
//if (linux_sem_timedwait(&fShmControl.data->runServer, &ts_timeout))
{ {
if (errno == ETIMEDOUT) if (errno == ETIMEDOUT)
{ {
@@ -243,8 +243,8 @@ public:
} }
} }


if (linux_sem_post(&fShmControl.data->runClient) != 0)
carla_stderr2("Could not post to semaphore");
//if (linux_sem_post(&fShmControl.data->runClient) != 0)
// carla_stderr2("Could not post to semaphore");
} }


fIsRunning = false; fIsRunning = false;


+ 1
- 1
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -173,6 +173,7 @@ struct CarlaEngineProtectedData {
: in(nullptr), : in(nullptr),
out(nullptr) {} out(nullptr) {}
} rack; } rack;
#endif


struct Time { struct Time {
bool playing; bool playing;
@@ -182,7 +183,6 @@ struct CarlaEngineProtectedData {
: playing(false), : playing(false),
frame(0) {} frame(0) {}
} time; } time;
#endif


EnginePluginData* plugins; EnginePluginData* plugins;




+ 46
- 46
source/backend/engine/CarlaEngineJack.cpp View File

@@ -15,13 +15,15 @@
* For a full copy of the GNU General Public License see the GPL.txt file * For a full copy of the GNU General Public License see the GPL.txt file
*/ */


#ifdef WANT_JACK

#include "CarlaEngineInternal.hpp" #include "CarlaEngineInternal.hpp"
#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


#include "jackbridge/JackBridge.cpp"
#ifdef BUILD_BRIDGE
# include "jackbridge/JackBridge.hpp"
#else
# include "jackbridge/JackBridge.cpp"
#endif


#include <cmath> #include <cmath>
#include <QtCore/QStringList> #include <QtCore/QStringList>
@@ -182,7 +184,7 @@ public:


jack_midi_event_t jackEvent; jack_midi_event_t jackEvent;


if (jackbridge_midi_event_get(&jackEvent, fJackBuffer, index) != 0 || jackEvent.size > 3)
if ((! jackbridge_midi_event_get(&jackEvent, fJackBuffer, index)) || jackEvent.size > 4)
return kFallbackJackEngineEvent; return kFallbackJackEngineEvent;


fRetEvent.clear(); fRetEvent.clear();
@@ -204,19 +206,19 @@ public:


fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank; fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank;
fRetEvent.ctrl.param = midiBank; fRetEvent.ctrl.param = midiBank;
fRetEvent.ctrl.value = 0.0;
fRetEvent.ctrl.value = 0.0f;
} }
else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF) else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
{ {
fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff; fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
fRetEvent.ctrl.param = 0; fRetEvent.ctrl.param = 0;
fRetEvent.ctrl.value = 0.0;
fRetEvent.ctrl.value = 0.0f;
} }
else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF) else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
{ {
fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff; fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
fRetEvent.ctrl.param = 0; fRetEvent.ctrl.param = 0;
fRetEvent.ctrl.value = 0.0;
fRetEvent.ctrl.value = 0.0f;
} }
else else
{ {
@@ -224,7 +226,7 @@ public:


fRetEvent.ctrl.type = kEngineControlEventTypeParameter; fRetEvent.ctrl.type = kEngineControlEventTypeParameter;
fRetEvent.ctrl.param = midiControl; fRetEvent.ctrl.param = midiControl;
fRetEvent.ctrl.value = double(midiValue)/127.0;
fRetEvent.ctrl.value = float(midiValue)/127.0f;
} }
} }
else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus)) else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
@@ -234,7 +236,7 @@ public:


fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram; fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
fRetEvent.ctrl.param = midiProgram; fRetEvent.ctrl.param = midiProgram;
fRetEvent.ctrl.value = 0.0;
fRetEvent.ctrl.value = 0.0f;
} }
else else
{ {
@@ -432,7 +434,7 @@ public:
return CarlaEngineClient::isOk(); return CarlaEngineClient::isOk();
} }


#if WANT_JACK_LATENCY
#if 0
void setLatency(const uint32_t samples) override void setLatency(const uint32_t samples) override
{ {
CarlaEngineClient::setLatency(samples); CarlaEngineClient::setLatency(samples);
@@ -583,7 +585,7 @@ public:
jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this); jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
jackbridge_set_process_callback(fClient, carla_jack_process_callback, this); jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
# if WANT_JACK_LATENCY
# if 0
jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this); jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
# endif # endif


@@ -606,7 +608,7 @@ public:
fRackPorts[rackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); fRackPorts[rackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
} }


if (jackbridge_activate(fClient) == 0)
if (jackbridge_activate(fClient))
{ {
return CarlaEngine::init(jackClientName); return CarlaEngine::init(jackClientName);
} }
@@ -648,7 +650,7 @@ public:
fHasQuit = true; fHasQuit = true;
return true; return true;
#else #else
if (jackbridge_deactivate(fClient) == 0)
if (jackbridge_deactivate(fClient))
{ {
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
{ {
@@ -660,7 +662,7 @@ public:
jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]); jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]);
} }


if (jackbridge_client_close(fClient) == 0)
if (jackbridge_client_close(fClient))
{ {
fClient = nullptr; fClient = nullptr;
return true; return true;
@@ -714,7 +716,7 @@ public:
jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this); jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
jackbridge_set_process_callback(client, carla_jack_process_callback, this); jackbridge_set_process_callback(client, carla_jack_process_callback, this);
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
# if WANT_JACK_LATENCY
# if 0
jackbridge_set_latency_callback(client, carla_jack_latency_callback, this); jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
# endif # endif
#else #else
@@ -726,7 +728,7 @@ public:
{ {
client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr); client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin); jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
# if WANT_JACK_LATENCY
# if 0
jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin); jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
# endif # endif
} }
@@ -752,7 +754,7 @@ public:
const char* const portNameA = getFullPortName(portA).toUtf8().constData(); const char* const portNameA = getFullPortName(portA).toUtf8().constData();
const char* const portNameB = getFullPortName(portB).toUtf8().constData(); const char* const portNameB = getFullPortName(portB).toUtf8().constData();


if (jack_connect(fClient, portNameA, portNameB) != 0)
if (! jackbridge_connect(fClient, portNameA, portNameB))
{ {
setLastError("JACK operation failed"); setLastError("JACK operation failed");
return false; return false;
@@ -778,7 +780,7 @@ public:
const char* const portNameA = getFullPortName(fUsedConnections[i].portOut).toUtf8().constData(); const char* const portNameA = getFullPortName(fUsedConnections[i].portOut).toUtf8().constData();
const char* const portNameB = getFullPortName(fUsedConnections[i].portIn).toUtf8().constData(); const char* const portNameB = getFullPortName(fUsedConnections[i].portIn).toUtf8().constData();


if (jack_disconnect(fClient, portNameA, portNameB) != 0)
if (! jackbridge_disconnect(fClient, portNameA, portNameB))
{ {
setLastError("JACK operation failed"); setLastError("JACK operation failed");
return false; return false;
@@ -1147,7 +1149,7 @@ protected:
proccessPendingEvents(); proccessPendingEvents();
} }


#if WANT_JACK_LATENCY
#if 0
void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
{ {
if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT) if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
@@ -1192,18 +1194,18 @@ protected:


void handleJackPortRegistrationCallback(jack_port_id_t port, bool reg) void handleJackPortRegistrationCallback(jack_port_id_t port, bool reg)
{ {
jack_port_t* jackPort = jack_port_by_id(fClient, port);
jack_port_t* jackPort = jackbridge_port_by_id(fClient, port);


QString fullName(jack_port_name(jackPort));
QString fullName(jackbridge_port_name(jackPort));
QString groupName = fullName.split(":").at(0); QString groupName = fullName.split(":").at(0);
int groupId = getGroupId(groupName); int groupId = getGroupId(groupName);


const char* portName = jack_port_short_name(jackPort);
const char* portName = jackbridge_port_short_name(jackPort);


if (reg) if (reg)
{ {
bool portIsInput = (jack_port_flags(jackPort) & JackPortIsInput);
bool portIsAudio = (std::strcmp(jack_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
bool portIsInput = (jackbridge_port_flags(jackPort) & JackPortIsInput);
bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);


unsigned int portFlags = 0x0; unsigned int portFlags = 0x0;
portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT; portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
@@ -1235,11 +1237,11 @@ protected:


void handleJackPortConnectCallback(jack_port_id_t a, jack_port_id_t b, bool connect) void handleJackPortConnectCallback(jack_port_id_t a, jack_port_id_t b, bool connect)
{ {
jack_port_t* jackPortA = jack_port_by_id(fClient, a);
jack_port_t* jackPortB = jack_port_by_id(fClient, b);
jack_port_t* jackPortA = jackbridge_port_by_id(fClient, a);
jack_port_t* jackPortB = jackbridge_port_by_id(fClient, b);


int portIdA = getPortId(QString(jack_port_name(jackPortA)));
int portIdB = getPortId(QString(jack_port_name(jackPortB)));
int portIdA = getPortId(QString(jackbridge_port_name(jackPortA)));
int portIdB = getPortId(QString(jackbridge_port_name(jackPortB)));


if (connect) if (connect)
{ {
@@ -1268,13 +1270,13 @@ protected:


void handleJackPortRenameCallback(jack_port_id_t port, const char* oldName, const char* newName) void handleJackPortRenameCallback(jack_port_id_t port, const char* oldName, const char* newName)
{ {
jack_port_t* jackPort = jack_port_by_id(fClient, port);
jack_port_t* jackPort = jackbridge_port_by_id(fClient, port);


QString fullName(oldName); QString fullName(oldName);
QString groupName = fullName.split(":").at(0); QString groupName = fullName.split(":").at(0);
int groupId = getGroupId(groupName); int groupId = getGroupId(groupName);


const char* portName = jack_port_short_name(jackPort);
const char* portName = jackbridge_port_short_name(jackPort);


for (int i=0, count=fUsedPortNames.count(); i < count; ++i) for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
{ {
@@ -1416,12 +1418,12 @@ private:
parsedGroups.append(QString(ourName)); parsedGroups.append(QString(ourName));
} }


if (const char** ports = jack_get_ports(fClient, nullptr, nullptr, 0))
if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, 0))
{ {
for (int i=0; ports[i] != nullptr; ++i) for (int i=0; ports[i] != nullptr; ++i)
{ {
jack_port_t* jackPort = jack_port_by_name(fClient, ports[i]);
const char* portName = jack_port_short_name(jackPort);
jack_port_t* jackPort = jackbridge_port_by_name(fClient, ports[i]);
const char* portName = jackbridge_port_short_name(jackPort);


QString fullName(ports[i]); QString fullName(ports[i]);
QString groupName(fullName.split(":").at(0)); QString groupName(fullName.split(":").at(0));
@@ -1448,8 +1450,8 @@ private:
callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName.toUtf8().constData()); callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName.toUtf8().constData());
} }


bool portIsInput = (jack_port_flags(jackPort) & JackPortIsInput);
bool portIsAudio = (std::strcmp(jack_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
bool portIsInput = (jackbridge_port_flags(jackPort) & JackPortIsInput);
bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);


unsigned int portFlags = 0x0; unsigned int portFlags = 0x0;
portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT; portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
@@ -1466,19 +1468,19 @@ private:
fLastPortId++; fLastPortId++;
} }


jack_free(ports);
jackbridge_free(ports);
} }


// query connections, after all ports are in place // query connections, after all ports are in place
if (const char** ports = jack_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
{ {
for (int i=0; ports[i] != nullptr; ++i) for (int i=0; ports[i] != nullptr; ++i)
{ {
jack_port_t* jackPort = jack_port_by_name(fClient, ports[i]);
jack_port_t* jackPort = jackbridge_port_by_name(fClient, ports[i]);


int thisPortId = getPortId(QString(ports[i])); int thisPortId = getPortId(QString(ports[i]));


if (const char** jackConnections = jack_port_get_connections(jackPort))
if (const char** jackConnections = jackbridge_port_get_connections(jackPort))
{ {
for (int j=0; jackConnections[j] != nullptr; ++j) for (int j=0; jackConnections[j] != nullptr; ++j)
{ {
@@ -1494,11 +1496,11 @@ private:
fLastConnectionId++; fLastConnectionId++;
} }


jack_free(jackConnections);
jackbridge_free(jackConnections);
} }
} }


jack_free(ports);
jackbridge_free(ports);
} }
} }
#endif #endif
@@ -1560,7 +1562,7 @@ private:
setPeaks(plugin->id(), inPeaks, outPeaks); setPeaks(plugin->id(), inPeaks, outPeaks);
} }


#if WANT_JACK_LATENCY
#if 0
void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode) void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
{ {
const uint32_t inCount = plugin->audioInCount(); const uint32_t inCount = plugin->audioInCount();
@@ -1630,7 +1632,7 @@ private:
return 0; return 0;
} }


#if WANT_JACK_LATENCY
#if 0
static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg) static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
{ {
handlePtr->handleJackLatencyCallback(mode); handlePtr->handleJackLatencyCallback(mode);
@@ -1689,7 +1691,7 @@ private:
return 0; return 0;
} }


# if WANT_JACK_LATENCY
# if 0
static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg) static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
{ {
CarlaPlugin* const plugin = (CarlaPlugin*)arg; CarlaPlugin* const plugin = (CarlaPlugin*)arg;
@@ -1717,5 +1719,3 @@ CarlaEngine* CarlaEngine::newJack()
// ----------------------------------------- // -----------------------------------------


CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_END_NAMESPACE

#endif // CARLA_ENGINE_JACK

+ 5
- 18
source/backend/engine/Makefile View File

@@ -8,15 +8,13 @@ include ../Makefile.mk


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


BUILD_CXX_FLAGS += -D__UNIX_JACK__
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo)
LINK_FLAGS += $(shell pkg-config --libs liblo)


ifeq ($(HAVE_QT5),true) ifeq ($(HAVE_QT5),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml) BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml)
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml)
else else
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtXml) BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtXml)
LINK_FLAGS += $(shell pkg-config --libs QtCore QtXml)
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------
@@ -33,17 +31,10 @@ endif


ifeq ($(HAVE_ALSA),true) ifeq ($(HAVE_ALSA),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags alsa) -D__LINUX_ALSA__ -D__LINUX_ALSASEQ__ BUILD_CXX_FLAGS += $(shell pkg-config --cflags alsa) -D__LINUX_ALSA__ -D__LINUX_ALSASEQ__
LINK_FLAGS += $(shell pkg-config --libs alsa)
endif

ifeq ($(HAVE_JACK),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags jack) -D__UNIX_JACK__
LINK_FLAGS += $(shell pkg-config --libs jack)
endif endif


ifeq ($(HAVE_PULSEAUDIO),true) ifeq ($(HAVE_PULSEAUDIO),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags libpulse-simple) -D__LINUX_PULSE__ BUILD_CXX_FLAGS += $(shell pkg-config --cflags libpulse-simple) -D__LINUX_PULSE__
LINK_FLAGS += $(shell pkg-config --libs libpulse-simple)
endif endif


ifeq ($(MACOS),true) ifeq ($(MACOS),true)
@@ -83,15 +74,14 @@ OBJS += \
endif endif
endif endif


SHARED = ../libcarla_engine.so
STATIC = ../libcarla_engine.a
TARGET = ../libcarla_engine.a


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


all: $(STATIC)
all: $(TARGET)


clean: clean:
rm -f $(OBJS) $(SHARED) $(STATIC)
rm -f $(OBJS) $(TARGET)


debug: debug:
$(MAKE) DEBUG=true $(MAKE) DEBUG=true
@@ -110,8 +100,5 @@ debug:
%.cpp.vst.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp %.cpp.vst.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaEngineInternal.hpp CarlaEngineOsc.hpp CarlaEngineThread.hpp
$(CXX) $< $(PLUGIN_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_VST -c -o $@ $(CXX) $< $(PLUGIN_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_VST -c -o $@


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

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

+ 4
- 22
source/backend/native/Makefile View File

@@ -9,14 +9,11 @@ include ../Makefile.mk
# -------------------------------------------------------------- # --------------------------------------------------------------


BUILD_CXX_FLAGS += -I. -I../../libs/distrho -I../../widgets BUILD_CXX_FLAGS += -I. -I../../libs/distrho -I../../widgets
LINK_FLAGS += $(shell pkg-config --libs liblo)


ifeq ($(HAVE_QT5),true) ifeq ($(HAVE_QT5),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets) BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets)
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Widgets)
else else
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui)
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui)
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------
@@ -28,29 +25,24 @@ CARLA_CXX_FLAGS += -I../engine
ifeq ($(HAVE_AF_DEPS),true) ifeq ($(HAVE_AF_DEPS),true)
AF_C_FLAGS = $(BUILD_C_FLAGS) AF_C_FLAGS = $(BUILD_C_FLAGS)
AF_C_FLAGS += $(shell pkg-config --cflags libavcodec libavformat libavutil sndfile) AF_C_FLAGS += $(shell pkg-config --cflags libavcodec libavformat libavutil sndfile)
LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat libavutil sndfile)
endif endif


ifeq ($(HAVE_MF_DEPS),true) ifeq ($(HAVE_MF_DEPS),true)
MF_CXX_FLAGS = $(BUILD_CXX_FLAGS) MF_CXX_FLAGS = $(BUILD_CXX_FLAGS)
MF_CXX_FLAGS += $(shell pkg-config --cflags smf) MF_CXX_FLAGS += $(shell pkg-config --cflags smf)
LINK_FLAGS += $(shell pkg-config --libs smf)
endif endif


ifeq ($(HAVE_OPENGL),true) ifeq ($(HAVE_OPENGL),true)
GL_CXX_FLAGS = $(BUILD_CXX_FLAGS) GL_CXX_FLAGS = $(BUILD_CXX_FLAGS)
GL_CXX_FLAGS += $(shell pkg-config --cflags gl) GL_CXX_FLAGS += $(shell pkg-config --cflags gl)
LINK_FLAGS += $(shell pkg-config --cflags gl)
endif endif


ifeq ($(HAVE_ZYN_DEPS),true) ifeq ($(HAVE_ZYN_DEPS),true)
ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS)
ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib) ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml zlib)
LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml zlib)
ifeq ($(HAVE_ZYN_UI_DEPS),true) ifeq ($(HAVE_ZYN_UI_DEPS),true)
ZYN_CXX_FLAGS += -DNTK_GUI ZYN_CXX_FLAGS += -DNTK_GUI
ZYN_CXX_FLAGS += $(shell pkg-config --cflags ntk ntk_images) ZYN_CXX_FLAGS += $(shell pkg-config --cflags ntk ntk_images)
LINK_FLAGS += $(shell pkg-config --libs ntk ntk_images)
endif endif
endif endif


@@ -146,21 +138,14 @@ ZYN_UI_FILES_H = \
endif endif
endif endif


SHARED = ../libcarla_native.so
STATIC = ../libcarla_native.a

LIBS = ../../libs/widgets.a

ifeq ($(HAVE_OPENGL),true)
LIBS += ../../libs/dgl.a
endif
TARGET = ../libcarla_native.a


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


all: $(STATIC)
all: $(TARGET)


clean: clean:
rm -f $(OBJS) $(SHARED) $(STATIC)
rm -f $(OBJS) $(TARGET)
rm -f $(ZYN_UI_FILES_CPP) rm -f $(ZYN_UI_FILES_CPP)
rm -f $(ZYN_UI_FILES_H) rm -f $(ZYN_UI_FILES_H)
rm -f moc_*.cpp rm -f moc_*.cpp
@@ -176,10 +161,7 @@ debug:
%.cpp.o: %.cpp ../CarlaNative.h ../CarlaNative.hpp %.cpp.o: %.cpp ../CarlaNative.h ../CarlaNative.hpp
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@


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

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


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


+ 4
- 13
source/backend/plugin/Makefile View File

@@ -9,26 +9,21 @@ include ../Makefile.mk
# -------------------------------------------------------------- # --------------------------------------------------------------


BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo)
LINK_FLAGS += $(shell pkg-config --libs liblo)


ifeq ($(HAVE_QT5),true) ifeq ($(HAVE_QT5),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml Qt5Widgets) BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml Qt5Widgets)
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml Qt5Widgets)
else else
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui QtXml) BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui QtXml)
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml)
endif endif


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


ifeq ($(HAVE_FLUIDSYNTH),true) ifeq ($(HAVE_FLUIDSYNTH),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags fluidsynth) BUILD_CXX_FLAGS += $(shell pkg-config --cflags fluidsynth)
LINK_FLAGS += $(shell pkg-config --libs fluidsynth)
endif endif


ifeq ($(HAVE_LINUXSAMPLER),true) ifeq ($(HAVE_LINUXSAMPLER),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags linuxsampler) BUILD_CXX_FLAGS += $(shell pkg-config --cflags linuxsampler)
LINK_FLAGS += $(shell pkg-config --libs linuxsampler)
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------
@@ -47,15 +42,14 @@ OBJS = \
FluidSynthPlugin.cpp.o \ FluidSynthPlugin.cpp.o \
LinuxSamplerPlugin.cpp.o LinuxSamplerPlugin.cpp.o


SHARED = ../libcarla_plugin.so
STATIC = ../libcarla_plugin.a
TARGET = ../libcarla_plugin.a


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


all: $(STATIC)
all: $(TARGET)


clean: clean:
rm -f $(OBJS) $(SHARED) $(STATIC)
rm -f $(OBJS) $(TARGET)


debug: debug:
$(MAKE) DEBUG=true $(MAKE) DEBUG=true
@@ -68,8 +62,5 @@ debug:
moc_%.cpp: %.hpp moc_%.cpp: %.hpp
$(MOC) $< -DMOC_PARSING -o $@ $(MOC) $< -DMOC_PARSING -o $@


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

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

+ 6
- 3
source/backend/standalone/CarlaStandalone.cpp View File

@@ -23,7 +23,10 @@
#include "CarlaPlugin.hpp" #include "CarlaPlugin.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"
#include "CarlaNative.h" #include "CarlaNative.h"
#include "CarlaStyle.hpp"

#ifndef BUILD_BRIDGE
# include "CarlaStyle.hpp"
#endif


#include <QtCore/QSettings> #include <QtCore/QSettings>


@@ -48,9 +51,7 @@ struct CarlaBackendStandalone {
CarlaEngine* engine; CarlaEngine* engine;
CarlaString lastError; CarlaString lastError;
CarlaString procName; CarlaString procName;
#ifndef BUILD_BRIDGE
EngineOptions options; EngineOptions options;
#endif


QApplication* app; QApplication* app;
bool needsInit; bool needsInit;
@@ -62,6 +63,7 @@ struct CarlaBackendStandalone {
app(qApp), app(qApp),
needsInit(app == nullptr) needsInit(app == nullptr)
{ {
#ifndef BUILD_BRIDGE
if (app != nullptr) if (app != nullptr)
{ {
QSettings settings; QSettings settings;
@@ -82,6 +84,7 @@ struct CarlaBackendStandalone {
style->setColorScheme(CarlaStyle::COLOR_BLACK); style->setColorScheme(CarlaStyle::COLOR_BLACK);
} }
} }
#endif
} }


~CarlaBackendStandalone() ~CarlaBackendStandalone()


+ 12
- 17
source/backend/standalone/Makefile View File

@@ -11,9 +11,9 @@ include ../Makefile.mk
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) -I../../theme BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) -I../../theme


ifeq ($(HAVE_QT5),true) ifeq ($(HAVE_QT5),true)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets)
else else
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore)
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui)
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------
@@ -22,7 +22,7 @@ endif
LINK_FLAGS += $(shell pkg-config --libs liblo) LINK_FLAGS += $(shell pkg-config --libs liblo)


ifeq ($(HAVE_QT5),true) ifeq ($(HAVE_QT5),true)
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml Qt5Widgets)
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Xml Qt5Widgets)
else else
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml) LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml)
endif endif
@@ -34,16 +34,12 @@ ifeq ($(HAVE_ALSA),true)
LINK_FLAGS += $(shell pkg-config --libs alsa) LINK_FLAGS += $(shell pkg-config --libs alsa)
endif endif


ifeq ($(HAVE_JACK),true)
LINK_FLAGS += $(shell pkg-config --libs jack)
endif

ifeq ($(HAVE_PULSEAUDIO),true) ifeq ($(HAVE_PULSEAUDIO),true)
LINK_FLAGS += $(shell pkg-config --libs libpulse-simple) LINK_FLAGS += $(shell pkg-config --libs libpulse-simple)
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------
# Plugin
# Samplers


ifeq ($(HAVE_FLUIDSYNTH),true) ifeq ($(HAVE_FLUIDSYNTH),true)
LINK_FLAGS += $(shell pkg-config --libs fluidsynth) LINK_FLAGS += $(shell pkg-config --libs fluidsynth)
@@ -106,20 +102,22 @@ endif
OBJS = \ OBJS = \
CarlaStandalone.cpp.o CarlaStandalone.cpp.o


STATIC = ../libcarla_standalone.a

ifeq ($(WIN32),true) ifeq ($(WIN32),true)
SHARED = ../libcarla_standalone.dll
TARGET = ../libcarla_standalone.dll
else else
SHARED = ../libcarla_standalone.so
ifeq ($(MACOS),true)
TARGET = ../libcarla_standalone.dylib
else
TARGET = ../libcarla_standalone.so
endif
endif endif


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


all: $(SHARED)
all: $(TARGET)


clean: clean:
rm -f $(OBJS) $(SHARED) $(STATIC)
rm -f $(OBJS) $(TARGET)


debug: debug:
$(MAKE) DEBUG=true $(MAKE) DEBUG=true
@@ -129,9 +127,6 @@ debug:
%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp %.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@


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

../libcarla_standalone.dll: $(OBJS) $(LIBS) ../libcarla_standalone.dll: $(OBJS) $(LIBS)
$(CXX) $^ -shared $(LINK_FLAGS) $(W32_LIBS) -Wl,--output-def,$@.def -o $@ && $(STRIP) $@ $(CXX) $^ -shared $(LINK_FLAGS) $(W32_LIBS) -Wl,--output-def,$@.def -o $@ && $(STRIP) $@




+ 1
- 1
source/bridges/CarlaBridgePlugin.cpp View File

@@ -298,7 +298,7 @@ public:
CARLA_ASSERT(fPlugin != nullptr); CARLA_ASSERT(fPlugin != nullptr);


if (fPlugin != nullptr) if (fPlugin != nullptr)
fPlugin->setParameterValueByRIndex(rindex, value, true, true, false);
fPlugin->setParameterValueByRealIndex(rindex, value, true, true, false);
} }


void setProgram(const uint32_t index) void setProgram(const uint32_t index)


+ 12
- 5
source/bridges/Makefile View File

@@ -30,9 +30,9 @@ LINK_FLAGS += $(shell pkg-config --libs liblo QtCore)
# Plugin bridges # Plugin bridges


BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS)
BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN -DBRIDGE_PLUGIN
BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN -DBRIDGE_PLUGIN -DWANT_JACK
BUILD_PLUGIN_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST BUILD_PLUGIN_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST
BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin -I../libs
BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin -I../libs -I../theme
BUILD_PLUGIN_FLAGS += $(QT_UI_FLAGS) $(shell pkg-config --cflags QtXml) BUILD_PLUGIN_FLAGS += $(QT_UI_FLAGS) $(shell pkg-config --cflags QtXml)


LINK_PLUGIN_FLAGS = $(LINK_FLAGS) LINK_PLUGIN_FLAGS = $(LINK_FLAGS)
@@ -60,7 +60,7 @@ WIN_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) -mwindows -lwinspool -lole32 -luuid -
NATIVE_BUILD_FLAGS = $(POSIX_BUILD_FLAGS) NATIVE_BUILD_FLAGS = $(POSIX_BUILD_FLAGS)
NATIVE_LINK_FLAGS = $(POSIX_LINK_FLAGS) NATIVE_LINK_FLAGS = $(POSIX_LINK_FLAGS)


NATIVE_BUILD_FLAGS += -DWANT_JACK -DWANT_NATIVE
NATIVE_BUILD_FLAGS += -DWANT_NATIVE


ifeq ($(HAVE_FLUIDSYNTH),true) ifeq ($(HAVE_FLUIDSYNTH),true)
NATIVE_BUILD_FLAGS += -DWANT_FLUIDSYNTH NATIVE_BUILD_FLAGS += -DWANT_FLUIDSYNTH
@@ -302,6 +302,7 @@ OBJS_NATIVE += \
# carla-plugin # carla-plugin
OBJS_NATIVE += \ OBJS_NATIVE += \
../backend/plugin/CarlaPlugin__native.o \ ../backend/plugin/CarlaPlugin__native.o \
../backend/plugin/CarlaPluginGui__native.o \
../backend/plugin/CarlaPluginThread__native.o \ ../backend/plugin/CarlaPluginThread__native.o \
../backend/plugin/NativePlugin__native.o \ ../backend/plugin/NativePlugin__native.o \
../backend/plugin/LadspaPlugin__native.o \ ../backend/plugin/LadspaPlugin__native.o \
@@ -347,6 +348,7 @@ OBJS_POSIX32 += \
# carla-plugin # carla-plugin
OBJS_POSIX32 += \ OBJS_POSIX32 += \
../backend/plugin/CarlaPlugin__posix32.o \ ../backend/plugin/CarlaPlugin__posix32.o \
../backend/plugin/CarlaPluginGui__posix32.o \
../backend/plugin/CarlaPluginThread__posix32.o \ ../backend/plugin/CarlaPluginThread__posix32.o \
../backend/plugin/NativePlugin__posix32.o \ ../backend/plugin/NativePlugin__posix32.o \
../backend/plugin/LadspaPlugin__posix32.o \ ../backend/plugin/LadspaPlugin__posix32.o \
@@ -390,6 +392,7 @@ OBJS_POSIX64 += \
# carla-plugin # carla-plugin
OBJS_POSIX64 += \ OBJS_POSIX64 += \
../backend/plugin/CarlaPlugin__posix64.o \ ../backend/plugin/CarlaPlugin__posix64.o \
../backend/plugin/CarlaPluginGui__posix64.o \
../backend/plugin/CarlaPluginThread__posix64.o \ ../backend/plugin/CarlaPluginThread__posix64.o \
../backend/plugin/NativePlugin__posix64.o \ ../backend/plugin/NativePlugin__posix64.o \
../backend/plugin/LadspaPlugin__posix64.o \ ../backend/plugin/LadspaPlugin__posix64.o \
@@ -427,11 +430,13 @@ OBJS_WIN32 += \
../backend/engine/CarlaEngine__win32.o \ ../backend/engine/CarlaEngine__win32.o \
../backend/engine/CarlaEngineOsc__win32.o \ ../backend/engine/CarlaEngineOsc__win32.o \
../backend/engine/CarlaEngineThread__win32.o \ ../backend/engine/CarlaEngineThread__win32.o \
../backend/engine/CarlaEngineBridge__win32.o
../backend/engine/CarlaEngineBridge__win32.o \
../backend/engine/CarlaEngineJack__win32.o


# carla-plugin # carla-plugin
OBJS_WIN32 += \ OBJS_WIN32 += \
../backend/plugin/CarlaPlugin__win32.o \ ../backend/plugin/CarlaPlugin__win32.o \
../backend/plugin/CarlaPluginGui__win32.o \
../backend/plugin/CarlaPluginThread__win32.o \ ../backend/plugin/CarlaPluginThread__win32.o \
../backend/plugin/NativePlugin__win32.o \ ../backend/plugin/NativePlugin__win32.o \
../backend/plugin/LadspaPlugin__win32.o \ ../backend/plugin/LadspaPlugin__win32.o \
@@ -469,11 +474,13 @@ OBJS_WIN64 += \
../backend/engine/CarlaEngine__win64.o \ ../backend/engine/CarlaEngine__win64.o \
../backend/engine/CarlaEngineOsc__win64.o \ ../backend/engine/CarlaEngineOsc__win64.o \
../backend/engine/CarlaEngineThread__win64.o \ ../backend/engine/CarlaEngineThread__win64.o \
../backend/engine/CarlaEngineBridge__win64.o
../backend/engine/CarlaEngineBridge__win64.o \
../backend/engine/CarlaEngineJack__win64.o


# carla-plugin # carla-plugin
OBJS_WIN64 += \ OBJS_WIN64 += \
../backend/plugin/CarlaPlugin__win64.o \ ../backend/plugin/CarlaPlugin__win64.o \
../backend/plugin/CarlaPluginGui__win64.o \
../backend/plugin/CarlaPluginThread__win64.o \ ../backend/plugin/CarlaPluginThread__win64.o \
../backend/plugin/NativePlugin__win64.o \ ../backend/plugin/NativePlugin__win64.o \
../backend/plugin/LadspaPlugin__win64.o \ ../backend/plugin/LadspaPlugin__win64.o \


+ 210
- 149
source/libs/jackbridge/JackBridge.cpp View File

@@ -15,8 +15,17 @@
*/ */


#include "JackBridge.hpp" #include "JackBridge.hpp"

#ifdef __WINE__
# define __CARLA_UTILS_HPP__
# undef CARLA_ASSERT
# define CARLA_ASSERT(...)
#endif

#include "CarlaLibUtils.hpp" #include "CarlaLibUtils.hpp"


#include <stdio.h>

#ifndef JACKBRIDGE_DUMMY #ifndef JACKBRIDGE_DUMMY
# include <time.h> # include <time.h>
# include <semaphore.h> # include <semaphore.h>
@@ -51,10 +60,11 @@ typedef jack_port_t* (*jacksym_port_register)(jack_client_t*, const char*, con
typedef int (*jacksym_port_unregister)(jack_client_t*, jack_port_t*); typedef int (*jacksym_port_unregister)(jack_client_t*, jack_port_t*);
typedef void* (*jacksym_port_get_buffer)(jack_port_t*, jack_nframes_t); typedef void* (*jacksym_port_get_buffer)(jack_port_t*, jack_nframes_t);


typedef const char* (*jacksym_port_name)(const jack_port_t*);
typedef const char* (*jacksym_port_short_name)(const jack_port_t*);
typedef int (*jacksym_port_flags)(const jack_port_t*);
typedef const char* (*jacksym_port_type)(const jack_port_t*);
typedef const char* (*jacksym_port_name)(const jack_port_t*);
typedef const char* (*jacksym_port_short_name)(const jack_port_t*);
typedef int (*jacksym_port_flags)(const jack_port_t*);
typedef const char* (*jacksym_port_type)(const jack_port_t*);
typedef const char** (*jacksym_port_get_connections)(const jack_port_t*);


typedef int (*jacksym_port_set_name)(jack_port_t*, const char*); typedef int (*jacksym_port_set_name)(jack_port_t*, const char*);
typedef int (*jacksym_connect)(jack_client_t*, const char*, const char*); typedef int (*jacksym_connect)(jack_client_t*, const char*, const char*);
@@ -63,6 +73,11 @@ typedef int (*jacksym_port_name_size)();
typedef void (*jacksym_port_get_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*); typedef void (*jacksym_port_get_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
typedef void (*jacksym_port_set_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*); typedef void (*jacksym_port_set_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
typedef int (*jacksym_recompute_total_latencies)(jack_client_t*); typedef int (*jacksym_recompute_total_latencies)(jack_client_t*);

typedef const char** (*jacksym_get_ports)(jack_client_t*, const char*, const char*, unsigned long);
typedef jack_port_t* (*jacksym_port_by_name)(jack_client_t*, const char*);
typedef jack_port_t* (*jacksym_port_by_id)(jack_client_t*, jack_port_id_t);

typedef void (*jacksym_free)(void*); typedef void (*jacksym_free)(void*);


typedef uint32_t (*jacksym_midi_get_event_count)(void*); typedef uint32_t (*jacksym_midi_get_event_count)(void*);
@@ -78,8 +93,7 @@ typedef jack_transport_state_t (*jacksym_transport_query)(const jack_client_t*,


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


struct JackBridge
{
struct JackBridge {
void* lib; void* lib;


jacksym_get_version_string get_version_string_ptr; jacksym_get_version_string get_version_string_ptr;
@@ -108,6 +122,7 @@ struct JackBridge
jacksym_port_short_name port_short_name_ptr; jacksym_port_short_name port_short_name_ptr;
jacksym_port_flags port_flags_ptr; jacksym_port_flags port_flags_ptr;
jacksym_port_type port_type_ptr; jacksym_port_type port_type_ptr;
jacksym_port_get_connections port_get_connections_ptr;
jacksym_port_set_name port_set_name_ptr; jacksym_port_set_name port_set_name_ptr;
jacksym_connect connect_ptr; jacksym_connect connect_ptr;
jacksym_disconnect disconnect_ptr; jacksym_disconnect disconnect_ptr;
@@ -115,6 +130,9 @@ struct JackBridge
jacksym_port_get_latency_range port_get_latency_range_ptr; jacksym_port_get_latency_range port_get_latency_range_ptr;
jacksym_port_set_latency_range port_set_latency_range_ptr; jacksym_port_set_latency_range port_set_latency_range_ptr;
jacksym_recompute_total_latencies recompute_total_latencies_ptr; jacksym_recompute_total_latencies recompute_total_latencies_ptr;
jacksym_get_ports get_ports_ptr;
jacksym_port_by_name port_by_name_ptr;
jacksym_port_by_id port_by_id_ptr;
jacksym_free free_ptr; jacksym_free free_ptr;


jacksym_midi_get_event_count midi_get_event_count_ptr; jacksym_midi_get_event_count midi_get_event_count_ptr;
@@ -156,6 +174,7 @@ struct JackBridge
port_short_name_ptr(nullptr), port_short_name_ptr(nullptr),
port_flags_ptr(nullptr), port_flags_ptr(nullptr),
port_type_ptr(nullptr), port_type_ptr(nullptr),
port_get_connections_ptr(nullptr),
port_set_name_ptr(nullptr), port_set_name_ptr(nullptr),
connect_ptr(nullptr), connect_ptr(nullptr),
disconnect_ptr(nullptr), disconnect_ptr(nullptr),
@@ -163,6 +182,9 @@ struct JackBridge
port_get_latency_range_ptr(nullptr), port_get_latency_range_ptr(nullptr),
port_set_latency_range_ptr(nullptr), port_set_latency_range_ptr(nullptr),
recompute_total_latencies_ptr(nullptr), recompute_total_latencies_ptr(nullptr),
get_ports_ptr(nullptr),
port_by_name_ptr(nullptr),
port_by_id_ptr(nullptr),
free_ptr(nullptr), free_ptr(nullptr),
midi_get_event_count_ptr(nullptr), midi_get_event_count_ptr(nullptr),
midi_event_get_ptr(nullptr), midi_event_get_ptr(nullptr),
@@ -176,14 +198,20 @@ struct JackBridge
{ {
#if defined(CARLA_OS_MAC) #if defined(CARLA_OS_MAC)
lib = lib_open("libjack.dylib"); lib = lib_open("libjack.dylib");
#elif defined(CARLA_OS_WIN)
fprintf(stderr, "load JACK DLL FOR MAC\n");
#elif defined(CARLA_OS_WIN) && ! defined(__WINE__)
lib = lib_open("libjack.dll"); lib = lib_open("libjack.dll");
fprintf(stderr, "load JACK DLL FOR WINDOWS\n");
#else #else
lib = lib_open("libjack.so"); lib = lib_open("libjack.so");
fprintf(stderr, "load JACK DLL FOR LINUX\n");
#endif #endif


if (lib == nullptr) if (lib == nullptr)
{
fprintf(stderr, "Failed to load JACK DLL\n");
return; return;
}


#define JOIN(a, b) a ## b #define JOIN(a, b) a ## b
#define LIB_SYMBOL(NAME) JOIN(NAME, _ptr) = (jacksym_##NAME)lib_symbol(lib, "jack_" #NAME); #define LIB_SYMBOL(NAME) JOIN(NAME, _ptr) = (jacksym_##NAME)lib_symbol(lib, "jack_" #NAME);
@@ -214,6 +242,7 @@ struct JackBridge
LIB_SYMBOL(port_short_name) LIB_SYMBOL(port_short_name)
LIB_SYMBOL(port_flags) LIB_SYMBOL(port_flags)
LIB_SYMBOL(port_type) LIB_SYMBOL(port_type)
LIB_SYMBOL(port_get_connections)
LIB_SYMBOL(port_set_name) LIB_SYMBOL(port_set_name)
LIB_SYMBOL(connect) LIB_SYMBOL(connect)
LIB_SYMBOL(disconnect) LIB_SYMBOL(disconnect)
@@ -221,6 +250,9 @@ struct JackBridge
LIB_SYMBOL(port_get_latency_range) LIB_SYMBOL(port_get_latency_range)
LIB_SYMBOL(port_set_latency_range) LIB_SYMBOL(port_set_latency_range)
LIB_SYMBOL(recompute_total_latencies) LIB_SYMBOL(recompute_total_latencies)
LIB_SYMBOL(get_ports)
LIB_SYMBOL(port_by_name)
LIB_SYMBOL(port_by_id)
LIB_SYMBOL(free) LIB_SYMBOL(free)


LIB_SYMBOL(midi_get_event_count) LIB_SYMBOL(midi_get_event_count)
@@ -247,294 +279,318 @@ struct JackBridge


static JackBridge bridge; static JackBridge bridge;


int main(){return 0;}

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


const char* jackbridge_get_version_string() const char* jackbridge_get_version_string()
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.get_version_string_ptr != nullptr) if (bridge.get_version_string_ptr != nullptr)
return bridge.get_version_string_ptr(); return bridge.get_version_string_ptr();
#endif
return nullptr; return nullptr;
} }


jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...) jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.client_open_ptr != nullptr) if (bridge.client_open_ptr != nullptr)
return bridge.client_open_ptr(client_name, options, status); return bridge.client_open_ptr(client_name, options, status);
#endif
return nullptr; return nullptr;
} }


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


int jackbridge_client_close(jack_client_t* client)
bool jackbridge_client_close(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.client_close_ptr != nullptr) if (bridge.client_close_ptr != nullptr)
return bridge.client_close_ptr(client);
#endif
return 0;
return (bridge.client_close_ptr(client) == 0);
return false;
} }


int jackbridge_client_name_size() int jackbridge_client_name_size()
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.client_name_size_ptr != nullptr) if (bridge.client_name_size_ptr != nullptr)
return bridge.client_name_size_ptr(); return bridge.client_name_size_ptr();
#endif
return 0; return 0;
} }


char* jackbridge_get_client_name(jack_client_t* client) char* jackbridge_get_client_name(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.get_client_name_ptr != nullptr) if (bridge.get_client_name_ptr != nullptr)
return bridge.get_client_name_ptr(client); return bridge.get_client_name_ptr(client);
#endif
return nullptr; return nullptr;
} }


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


int jackbridge_activate(jack_client_t* client)
bool jackbridge_activate(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.activate_ptr != nullptr) if (bridge.activate_ptr != nullptr)
return bridge.activate_ptr(client);
#endif
return 0;
return (bridge.activate_ptr(client) == 0);
return false;
} }


int jackbridge_deactivate(jack_client_t* client)
bool jackbridge_deactivate(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.deactivate_ptr != nullptr) if (bridge.deactivate_ptr != nullptr)
return bridge.deactivate_ptr(client);
#endif
return 0;
return (bridge.deactivate_ptr(client) == 0);
return false;
} }


void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg) void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.on_shutdown_ptr != nullptr) if (bridge.on_shutdown_ptr != nullptr)
bridge.on_shutdown_ptr(client, shutdown_callback, arg); bridge.on_shutdown_ptr(client, shutdown_callback, arg);
#endif
} }


int jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg)
bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_process_callback_ptr != nullptr) if (bridge.set_process_callback_ptr != nullptr)
return bridge.set_process_callback_ptr(client, process_callback, arg);
#endif
return 0;
return (bridge.set_process_callback_ptr(client, process_callback, arg) == 0);
return false;
} }


int jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg)
bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_freewheel_callback_ptr != nullptr) if (bridge.set_freewheel_callback_ptr != nullptr)
return bridge.set_freewheel_callback_ptr(client, freewheel_callback, arg);
#endif
return 0;
return (bridge.set_freewheel_callback_ptr(client, freewheel_callback, arg) == 0);
return false;
} }


int jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg)
bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_buffer_size_callback_ptr != nullptr) if (bridge.set_buffer_size_callback_ptr != nullptr)
return bridge.set_buffer_size_callback_ptr(client, bufsize_callback, arg);
#endif
return 0;
return (bridge.set_buffer_size_callback_ptr(client, bufsize_callback, arg) == 0);
return false;
} }


int jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg)
bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_sample_rate_callback_ptr != nullptr) if (bridge.set_sample_rate_callback_ptr != nullptr)
return bridge.set_sample_rate_callback_ptr(client, srate_callback, arg);
#endif
return 0;
return (bridge.set_sample_rate_callback_ptr(client, srate_callback, arg) == 0);
return false;
} }


int jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg)
bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_client_registration_callback_ptr != nullptr) if (bridge.set_client_registration_callback_ptr != nullptr)
return bridge.set_client_registration_callback_ptr(client, registration_callback, arg);
#endif
return 0;
return (bridge.set_client_registration_callback_ptr(client, registration_callback, arg) == 0);
return false;
} }


int jackbridge_set_port_registration_callback (jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg)
bool jackbridge_set_port_registration_callback (jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_port_registration_callback_ptr != nullptr) if (bridge.set_port_registration_callback_ptr != nullptr)
return bridge.set_port_registration_callback_ptr(client, registration_callback, arg);
#endif
return 0;
return (bridge.set_port_registration_callback_ptr(client, registration_callback, arg) == 0);
return false;
} }


int jackbridge_set_port_connect_callback (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg)
bool jackbridge_set_port_connect_callback (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_port_connect_callback_ptr != nullptr) if (bridge.set_port_connect_callback_ptr != nullptr)
return bridge.set_port_connect_callback_ptr(client, connect_callback, arg);
#endif
return 0;
return (bridge.set_port_connect_callback_ptr(client, connect_callback, arg) == 0);
return false;
} }


int jackbridge_set_port_rename_callback (jack_client_t* client, JackPortRenameCallback rename_callback, void* arg)
bool jackbridge_set_port_rename_callback (jack_client_t* client, JackPortRenameCallback rename_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_port_rename_callback_ptr != nullptr) if (bridge.set_port_rename_callback_ptr != nullptr)
return bridge.set_port_rename_callback_ptr(client, rename_callback, arg);
#endif
return 0;
return (bridge.set_port_rename_callback_ptr(client, rename_callback, arg) == 0);
return false;
} }


int jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg)
bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.set_latency_callback_ptr != nullptr) if (bridge.set_latency_callback_ptr != nullptr)
return bridge.set_latency_callback_ptr(client, latency_callback, arg);
#endif
return 0;
return (bridge.set_latency_callback_ptr(client, latency_callback, arg) == 0);
return false;
} }


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


jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client) jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.get_sample_rate_ptr != nullptr) if (bridge.get_sample_rate_ptr != nullptr)
return bridge.get_sample_rate_ptr(client); return bridge.get_sample_rate_ptr(client);
#endif
return 0; return 0;
} }


jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client) jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.get_buffer_size_ptr != nullptr) if (bridge.get_buffer_size_ptr != nullptr)
return bridge.get_buffer_size_ptr(client); return bridge.get_buffer_size_ptr(client);
#endif
return 0; return 0;
} }


jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_register_ptr != nullptr) if (bridge.port_register_ptr != nullptr)
return bridge.port_register_ptr(client, port_name, port_type, flags, buffer_size); return bridge.port_register_ptr(client, port_name, port_type, flags, buffer_size);
#endif
return nullptr; return nullptr;
} }


int jackbridge_port_unregister(jack_client_t* client, jack_port_t* port)
bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_unregister_ptr != nullptr) if (bridge.port_unregister_ptr != nullptr)
return bridge.port_unregister_ptr(client, port);
#endif
return 0;
return (bridge.port_unregister_ptr(client, port) == 0);
return false;
} }


void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes) void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_get_buffer_ptr != nullptr) if (bridge.port_get_buffer_ptr != nullptr)
return bridge.port_get_buffer_ptr(port, nframes); return bridge.port_get_buffer_ptr(port, nframes);
#endif
return nullptr; return nullptr;
} }


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


// -----------------------------------------------------------------------------
const char* jackbridge_port_name(const jack_port_t* port)
{
if (bridge.port_name_ptr != nullptr)
return bridge.port_name_ptr(port);
return nullptr;
}


int jackbridge_port_name_size()
const char* jackbridge_port_short_name(const jack_port_t* port)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_name_size_ptr != nullptr)
return bridge.port_name_size_ptr();
#endif
if (bridge.port_short_name_ptr != nullptr)
return bridge.port_short_name_ptr(port);
return nullptr;
}

int jackbridge_port_flags(const jack_port_t* port)
{
if (bridge.port_flags_ptr != nullptr)
return bridge.port_flags_ptr(port);
return 0; return 0;
} }


int jackbridge_recompute_total_latencies(jack_client_t* client)
const char* jackbridge_port_type(const jack_port_t* port)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.recompute_total_latencies_ptr != nullptr)
return bridge.recompute_total_latencies_ptr(client);
#endif
if (bridge.port_type_ptr != nullptr)
return bridge.port_type_ptr(port);
return nullptr;
}

const char** jackbridge_port_get_connections(const jack_port_t* port)
{
if (bridge.port_get_connections_ptr != nullptr)
return bridge.port_get_connections_ptr(port);
return nullptr;
}

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

bool jackbridge_port_set_name(jack_port_t* port, const char* port_name)
{
if (bridge.port_set_name_ptr != nullptr)
return (bridge.port_set_name_ptr(port, port_name) == 0);
return false;
}

bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port)
{
if (bridge.connect_ptr != nullptr)
return (bridge.connect_ptr(client, source_port, destination_port) == 0);
return false;
}

bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port)
{
if (bridge.disconnect_ptr != nullptr)
return (bridge.disconnect_ptr(client, source_port, destination_port) == 0);
return false;
}

int jackbridge_port_name_size()
{
if (bridge.port_name_size_ptr != nullptr)
return bridge.port_name_size_ptr();
return 0; return 0;
} }


void jackbridge_port_get_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range) void jackbridge_port_get_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_get_latency_range_ptr != nullptr) if (bridge.port_get_latency_range_ptr != nullptr)
bridge.port_get_latency_range_ptr(port, mode, range); bridge.port_get_latency_range_ptr(port, mode, range);
#endif
} }


void jackbridge_port_set_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range) void jackbridge_port_set_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.port_set_latency_range_ptr != nullptr) if (bridge.port_set_latency_range_ptr != nullptr)
bridge.port_set_latency_range_ptr(port, mode, range); bridge.port_set_latency_range_ptr(port, mode, range);
#endif
}

bool jackbridge_recompute_total_latencies(jack_client_t* client)
{
if (bridge.recompute_total_latencies_ptr != nullptr)
return (bridge.recompute_total_latencies_ptr(client) == 0);
return false;
}

const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags)
{
if (bridge.get_ports_ptr != nullptr)
return bridge.get_ports_ptr(client, port_name_pattern, type_name_pattern, flags);
return nullptr;
}

jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name)
{
if (bridge.port_by_name_ptr != nullptr)
return bridge.port_by_name_ptr(client, port_name);
return nullptr;
}

jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id)
{
if (bridge.port_by_id_ptr != nullptr)
return bridge.port_by_id_ptr(client, port_id);
return nullptr;
}

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

void jackbridge_free(void* ptr)
{
if (bridge.free_ptr != nullptr)
return bridge.free_ptr(ptr);

// just in case
free(ptr);
} }


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


uint32_t jackbridge_midi_get_event_count(void* port_buffer) uint32_t jackbridge_midi_get_event_count(void* port_buffer)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.midi_get_event_count_ptr != nullptr) if (bridge.midi_get_event_count_ptr != nullptr)
return bridge.midi_get_event_count_ptr(port_buffer); return bridge.midi_get_event_count_ptr(port_buffer);
#endif
return 0; return 0;
} }


int jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index)
bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.midi_event_get_ptr != nullptr) if (bridge.midi_event_get_ptr != nullptr)
return bridge.midi_event_get_ptr(event, port_buffer, event_index);
#endif
return 0;
return (bridge.midi_event_get_ptr(event, port_buffer, event_index) == 0);
return false;
} }


void jackbridge_midi_clear_buffer(void* port_buffer) void jackbridge_midi_clear_buffer(void* port_buffer)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.midi_clear_buffer_ptr != nullptr) if (bridge.midi_clear_buffer_ptr != nullptr)
bridge.midi_clear_buffer_ptr(port_buffer); bridge.midi_clear_buffer_ptr(port_buffer);
#endif
} }


int jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size)
bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.midi_event_write_ptr != nullptr) if (bridge.midi_event_write_ptr != nullptr)
return bridge.midi_event_write_ptr(port_buffer, time, data, data_size);
#endif
return 0;
return (bridge.midi_event_write_ptr(port_buffer, time, data, data_size) == 0);
return false;
} }


jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size) jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.midi_event_reserve_ptr != nullptr) if (bridge.midi_event_reserve_ptr != nullptr)
return bridge.midi_event_reserve_ptr(port_buffer, time, data_size); return bridge.midi_event_reserve_ptr(port_buffer, time, data_size);
#endif
return nullptr; return nullptr;
} }


@@ -542,63 +598,68 @@ jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_


int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame) int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.transport_locate_ptr != nullptr) if (bridge.transport_locate_ptr != nullptr)
return bridge.transport_locate_ptr(client, frame);
#endif
return 0;
return (bridge.transport_locate_ptr(client, frame) == 0);
return false;
} }


void jackbridge_transport_start(jack_client_t* client) void jackbridge_transport_start(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.transport_start_ptr != nullptr) if (bridge.transport_start_ptr != nullptr)
bridge.transport_start_ptr(client); bridge.transport_start_ptr(client);
#endif
} }


void jackbridge_transport_stop(jack_client_t* client) void jackbridge_transport_stop(jack_client_t* client)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.transport_stop_ptr != nullptr) if (bridge.transport_stop_ptr != nullptr)
bridge.transport_stop_ptr(client); bridge.transport_stop_ptr(client);
#endif
} }


jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos) jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos)
{ {
#ifndef JACKBRIDGE_DUMMY
if (bridge.transport_query_ptr != nullptr) if (bridge.transport_query_ptr != nullptr)
return bridge.transport_query_ptr(client, pos); return bridge.transport_query_ptr(client, pos);
#endif
return JackTransportStopped; return JackTransportStopped;
} }


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


#if 0
void linux_clock_gettime_rt(struct timespec* ts)
#ifdef JACKBRIDGE_DUMMY
bool jackbridge_sem_post(void* sem)
{ {
#ifndef JACKBRIDGE_DUMMY
clock_gettime(CLOCK_REALTIME, ts);
#endif
return false;
} }


int linux_sem_post(void* sem)
bool jackbridge_sem_timedwait(void* sem, int secs)
{ {
#ifndef JACKBRIDGE_DUMMY
return sem_post(sem);
return false;
}
#else #else
return 1;
#endif
bool jackbridge_sem_post(void* sem)
{
return (sem_post((sem_t*)sem) == 0);
} }


int linux_sem_timedwait(void* sem, struct timespec* ts)
bool jackbridge_sem_timedwait(void* sem, int secs)
{ {
#ifndef JACKBRIDGE_DUMMY
return sem_timedwait(sem, ts);
#else
return 1;
#endif
# ifdef CARLA_OS_MAC
alarm(secs);
return (sem_wait((sem_t*)sem) == 0);
# else
timespec timeout;

# ifdef CARLA_LIB_WINDOWS
timeval now;
gettimeofday(&now, nullptr);
timeout.tv_sec = now.tv_sec;
timeout.tv_nsec = now.tv_usec * 1000;
# else
clock_gettime(CLOCK_REALTIME, &timeout);
# endif

timeout.tv_sec += secs;

return (sem_timedwait((sem_t*)sem, &timeout) == 0);
# endif
} }
#endif #endif

+ 167
- 37
source/libs/jackbridge/JackBridge.hpp View File

@@ -19,69 +19,200 @@


#include "CarlaDefines.hpp" #include "CarlaDefines.hpp"


#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE __attribute__((__packed__))

#define JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio"
#define JACK_DEFAULT_MIDI_TYPE "8 bit raw midi"

#ifndef JACKBRIDGE_EXPORT #ifndef JACKBRIDGE_EXPORT
# undef CARLA_EXPORT # undef CARLA_EXPORT
# define CARLA_EXPORT # define CARLA_EXPORT
#endif #endif


#ifdef __WINE__
# define GNU_WIN32 // fix jack threads, always use pthread
#endif

#include <cstddef>
#include <cstdint> #include <cstdint>
#include <sys/time.h>


#include <jack/jack.h>
#include <jack/midiport.h>
#include <jack/transport.h>
enum JackOptions {
JackNullOption = 0x00,
JackNoStartServer = 0x01,
JackUseExactName = 0x02,
JackServerName = 0x04,
JackLoadName = 0x08,
JackLoadInit = 0x10,
JackSessionID = 0x20
};

enum JackStatus {
JackFailure = 0x01,
JackInvalidOption = 0x02,
JackNameNotUnique = 0x04,
JackServerStarted = 0x08,
JackServerFailed = 0x10,
JackServerError = 0x20,
JackNoSuchClient = 0x40,
JackLoadFailure = 0x80,
JackInitFailure = 0x100,
JackShmFailure = 0x200,
JackVersionError = 0x400,
JackBackendError = 0x800,
JackClientZombie = 0x1000
};

enum JackLatencyCallbackMode {
JackCaptureLatency,
JackPlaybackLatency
};

enum JackPortFlags {
JackPortIsInput = 0x1,
JackPortIsOutput = 0x2,
JackPortIsPhysical = 0x4,
JackPortCanMonitor = 0x8,
JackPortIsTerminal = 0x10,
};

enum JackTransportFlags {
JackTransportStopped = 0,
JackTransportRolling = 1,
JackTransportLooping = 2,
JackTransportStarting = 3,
JackTransportNetStarting = 4
};

enum JackPositionBits {
JackPositionBBT = 0x010,
JackPositionTimecode = 0x020,
JackBBTFrameOffset = 0x040,
JackAudioVideoRatio = 0x080,
JackVideoFrameOffset = 0x100
};

enum JackTransportBits {
JackTransportState = 0x01,
JackTransportPosition = 0x02,
JackTransportLoop = 0x04,
JackTransportSMPTE = 0x08,
JackTransportBBT = 0x10
};

typedef uint32_t jack_nframes_t;
typedef uint32_t jack_port_id_t;
typedef uint64_t jack_time_t;
typedef uint64_t jack_unique_t;
typedef unsigned char jack_midi_data_t;

typedef enum JackOptions jack_options_t;
typedef enum JackStatus jack_status_t;
typedef enum JackLatencyCallbackMode jack_latency_callback_mode_t;
typedef enum JackTransportFlags jack_transport_state_t;
typedef enum JackPositionBits jack_position_bits_t;
typedef enum JackTransportBits jack_transport_bits_t;

struct _jack_midi_event {
jack_nframes_t time;
size_t size;
jack_midi_data_t* buffer;
};

PRE_PACKED_STRUCTURE
struct _jack_latency_range {
jack_nframes_t min;
jack_nframes_t max;
} POST_PACKED_STRUCTURE;

PRE_PACKED_STRUCTURE
struct _jack_position {
jack_unique_t unique_1;
jack_time_t usecs;
jack_nframes_t frame_rate;
jack_nframes_t frame;
jack_position_bits_t valid;
int32_t bar;
int32_t beat;
int32_t tick;
double bar_start_tick;
float beats_per_bar;
float beat_type;
double ticks_per_beat;
double beats_per_minute;
double frame_time;
double next_time;
jack_nframes_t bbt_offset;
float audio_frames_per_video_frame;
jack_nframes_t video_offset;
int32_t padding[7];
jack_unique_t unique_2;
} POST_PACKED_STRUCTURE;

typedef struct _jack_port jack_port_t;
typedef struct _jack_client jack_client_t;
typedef struct _jack_latency_range jack_latency_range_t;
typedef struct _jack_position jack_position_t;
typedef struct _jack_midi_event jack_midi_event_t;

typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void *arg);
typedef int (*JackProcessCallback)(jack_nframes_t nframes, void *arg);
typedef int (*JackBufferSizeCallback)(jack_nframes_t nframes, void *arg);
typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void *arg);
typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int register_, void *arg);
typedef void (*JackClientRegistrationCallback)(const char* name, int register_, void *arg);
typedef void (*JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg);
typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void *arg);
typedef void (*JackFreewheelCallback)(int starting, void *arg);
typedef void (*JackShutdownCallback)(void *arg);


CARLA_EXPORT const char* jackbridge_get_version_string(); CARLA_EXPORT const char* jackbridge_get_version_string();
CARLA_EXPORT jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...); CARLA_EXPORT jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...);


CARLA_EXPORT int jackbridge_client_close(jack_client_t* client);
CARLA_EXPORT bool jackbridge_client_close(jack_client_t* client);
CARLA_EXPORT int jackbridge_client_name_size(); CARLA_EXPORT int jackbridge_client_name_size();
CARLA_EXPORT char* jackbridge_get_client_name(jack_client_t* client); CARLA_EXPORT char* jackbridge_get_client_name(jack_client_t* client);


CARLA_EXPORT int jackbridge_activate(jack_client_t* client);
CARLA_EXPORT int jackbridge_deactivate(jack_client_t* client);
CARLA_EXPORT bool jackbridge_activate(jack_client_t* client);
CARLA_EXPORT bool jackbridge_deactivate(jack_client_t* client);
CARLA_EXPORT void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg); CARLA_EXPORT void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg);
CARLA_EXPORT int jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg);
CARLA_EXPORT int jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg);
CARLA_EXPORT int jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg);
CARLA_EXPORT int jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg);
CARLA_EXPORT int jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg);
CARLA_EXPORT int jackbridge_set_port_registration_callback (jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg);
CARLA_EXPORT int jackbridge_set_port_connect_callback (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg);
CARLA_EXPORT int jackbridge_set_port_rename_callback (jack_client_t* client, JackPortRenameCallback rename_callback, void* arg);
CARLA_EXPORT int jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_port_registration_callback (jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg);
CARLA_EXPORT bool jackbridge_set_port_connect_callback (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_port_rename_callback (jack_client_t* client, JackPortRenameCallback rename_callback, void* arg);
CARLA_EXPORT bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg);


CARLA_EXPORT jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client); CARLA_EXPORT jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client);
CARLA_EXPORT jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client); CARLA_EXPORT jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client);
CARLA_EXPORT jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size); CARLA_EXPORT jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);


CARLA_EXPORT int jackbridge_port_unregister(jack_client_t* client, jack_port_t* port);
CARLA_EXPORT bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port);
CARLA_EXPORT void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes); CARLA_EXPORT void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes);


// port_register_ptr(nullptr),
// port_unregister_ptr(nullptr),
// port_get_buffer_ptr(nullptr),
// port_name_ptr(nullptr),
// port_short_name_ptr(nullptr),
// port_flags_ptr(nullptr),
// port_type_ptr(nullptr),
// port_set_name_ptr(nullptr),
// connect_ptr(nullptr),
// disconnect_ptr(nullptr),
CARLA_EXPORT const char* jackbridge_port_name(const jack_port_t* port);
CARLA_EXPORT const char* jackbridge_port_short_name(const jack_port_t* port);
CARLA_EXPORT int jackbridge_port_flags(const jack_port_t* port);
CARLA_EXPORT const char* jackbridge_port_type(const jack_port_t* port);
CARLA_EXPORT const char** jackbridge_port_get_connections(const jack_port_t* port);


CARLA_EXPORT bool jackbridge_port_set_name(jack_port_t* port, const char* port_name);
CARLA_EXPORT bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port);
CARLA_EXPORT bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port);
CARLA_EXPORT int jackbridge_port_name_size(); CARLA_EXPORT int jackbridge_port_name_size();
CARLA_EXPORT void jackbridge_port_get_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range); CARLA_EXPORT void jackbridge_port_get_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range);
CARLA_EXPORT void jackbridge_port_set_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range); CARLA_EXPORT void jackbridge_port_set_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range);
CARLA_EXPORT int jackbridge_recompute_total_latencies(jack_client_t* client);
CARLA_EXPORT bool jackbridge_recompute_total_latencies(jack_client_t* client);

CARLA_EXPORT const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags);
CARLA_EXPORT jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name);
CARLA_EXPORT jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id);

CARLA_EXPORT void jackbridge_free(void* ptr);


CARLA_EXPORT uint32_t jackbridge_midi_get_event_count(void* port_buffer); CARLA_EXPORT uint32_t jackbridge_midi_get_event_count(void* port_buffer);
CARLA_EXPORT int jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index);
CARLA_EXPORT bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index);
CARLA_EXPORT void jackbridge_midi_clear_buffer(void* port_buffer); CARLA_EXPORT void jackbridge_midi_clear_buffer(void* port_buffer);
CARLA_EXPORT int jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size);
CARLA_EXPORT bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size);
CARLA_EXPORT jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size); CARLA_EXPORT jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size);


CARLA_EXPORT int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame); CARLA_EXPORT int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame);
@@ -89,8 +220,7 @@ CARLA_EXPORT void jackbridge_transport_start(jack_client_t* client);
CARLA_EXPORT void jackbridge_transport_stop(jack_client_t* client); CARLA_EXPORT void jackbridge_transport_stop(jack_client_t* client);
CARLA_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos); CARLA_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos);


// CARLA_EXPORT void jackbridge_clock_gettime_rt(struct timespec*);
// CARLA_EXPORT int jackbridge_sem_post(void*);
// CARLA_EXPORT int jackbridge_sem_timedwait(void*, struct timespec*);
CARLA_EXPORT bool jackbridge_sem_post(void* sem);
CARLA_EXPORT bool jackbridge_sem_timedwait(void* sem, int secs);


#endif // __JACKBRIDGE_HPP__ #endif // __JACKBRIDGE_HPP__

+ 1
- 0
source/libs/jackbridge/Makefile View File

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


WINECXX ?= wineg++ WINECXX ?= wineg++


BUILD_CXX_FLAGS += -DJACKBRIDGE_EXPORT
BUILD_CXX_FLAGS += -I. -I../../includes -I../../utils BUILD_CXX_FLAGS += -I. -I../../includes -I../../utils


ifeq ($(MACOS),true) ifeq ($(MACOS),true)


+ 7
- 5
source/utils/CarlaLibUtils.hpp View File

@@ -20,7 +20,9 @@


#include "CarlaUtils.hpp" #include "CarlaUtils.hpp"


#ifndef CARLA_OS_WIN
#if defined(CARLA_OS_WIN) && ! defined(__WINE__)
# define CARLA_LIB_WINDOWS
#else
# include <dlfcn.h> # include <dlfcn.h>
#endif #endif


@@ -32,7 +34,7 @@ void* lib_open(const char* const filename)
{ {
CARLA_ASSERT(filename != nullptr); CARLA_ASSERT(filename != nullptr);


#ifdef CARLA_OS_WIN
#ifdef CARLA_LIB_WINDOWS
return (void*)LoadLibraryA(filename); return (void*)LoadLibraryA(filename);
#else #else
return dlopen(filename, RTLD_NOW|RTLD_LOCAL); return dlopen(filename, RTLD_NOW|RTLD_LOCAL);
@@ -47,7 +49,7 @@ bool lib_close(void* const lib)
if (lib == nullptr) if (lib == nullptr)
return false; return false;


#ifdef CARLA_OS_WIN
#ifdef CARLA_LIB_WINDOWS
return FreeLibrary((HMODULE)lib); return FreeLibrary((HMODULE)lib);
#else #else
return (dlclose(lib) == 0); return (dlclose(lib) == 0);
@@ -63,7 +65,7 @@ void* lib_symbol(void* const lib, const char* const symbol)
if (lib == nullptr && symbol == nullptr) if (lib == nullptr && symbol == nullptr)
return nullptr; return nullptr;


#ifdef CARLA_OS_WIN
#ifdef CARLA_LIB_WINDOWS
return (void*)GetProcAddress((HMODULE)lib, symbol); return (void*)GetProcAddress((HMODULE)lib, symbol);
#else #else
return dlsym(lib, symbol); return dlsym(lib, symbol);
@@ -75,7 +77,7 @@ const char* lib_error(const char* const filename)
{ {
CARLA_ASSERT(filename != nullptr); CARLA_ASSERT(filename != nullptr);


#ifdef CARLA_OS_WIN
#ifdef CARLA_LIB_WINDOWS
static char libError[2048]; static char libError[2048];
carla_zeroMem(libError, sizeof(char)*2048); carla_zeroMem(libError, sizeof(char)*2048);




Loading…
Cancel
Save