@@ -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) | ||||
@@ -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, | ||||
@@ -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 | ||||
@@ -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 | ||||
@@ -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(); | ||||
@@ -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 | ||||
@@ -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; | ||||
@@ -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; | ||||
@@ -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 |
@@ -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 $@ $^ |
@@ -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 $@ $^ | ||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -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 $@ $^ |
@@ -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() | ||||
@@ -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) $@ | ||||
@@ -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) | ||||
@@ -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 \ | ||||
@@ -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 |
@@ -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__ |
@@ -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) | ||||
@@ -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); | ||||