@@ -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_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_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) | |||
HAVE_FLUIDSYNTH = $(shell pkg-config --exists fluidsynth && echo true) | |||
HAVE_LINUXSAMPLER = $(shell pkg-config --exists linuxsampler && echo true) | |||
@@ -1028,9 +1028,7 @@ protected: | |||
# endif | |||
private: | |||
# ifdef WANT_JACK | |||
static CarlaEngine* newJack(); | |||
# endif | |||
# ifdef WANT_RTAUDIO | |||
enum RtAudioApi { | |||
RTAUDIO_DUMMY = 0, | |||
@@ -44,11 +44,7 @@ ifeq ($(HAVE_ALSA),true) | |||
else | |||
@echo "ALSA: $(ANS_NO)" | |||
endif | |||
ifeq ($(HAVE_JACK),true) | |||
@echo "JACK: $(ANS_YES)" | |||
else | |||
@echo "JACK: $(ANS_NO)" | |||
endif | |||
ifeq ($(HAVE_PULSEAUDIO),true) | |||
@echo "PulseAudio:$(ANS_YES)" | |||
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) | |||
BUILD_CXX_FLAGS += -DWANT_FLUIDSYNTH | |||
endif | |||
@@ -444,11 +444,8 @@ unsigned int CarlaEngine::getDriverCount() | |||
{ | |||
carla_debug("CarlaEngine::getDriverCount()"); | |||
unsigned int count = 0; | |||
unsigned int count = 1; | |||
#ifdef WANT_JACK | |||
count += 1; | |||
#endif | |||
#ifdef WANT_RTAUDIO | |||
count += getRtAudioApiCount(); | |||
#endif | |||
@@ -460,12 +457,10 @@ const char* CarlaEngine::getDriverName(unsigned int index) | |||
{ | |||
carla_debug("CarlaEngine::getDriverName(%i)", index); | |||
#ifdef WANT_JACK | |||
if (index == 0) | |||
return "JACK"; | |||
else | |||
index -= 1; | |||
#endif | |||
#ifdef WANT_RTAUDIO | |||
if (index < getRtAudioApiCount()) | |||
@@ -480,10 +475,8 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | |||
{ | |||
carla_debug("CarlaEngine::newDriverByName(\"%s\")", driverName); | |||
#ifdef WANT_JACK | |||
if (std::strcmp(driverName, "JACK") == 0) | |||
return newJack(); | |||
#endif | |||
#ifdef WANT_RTAUDIO | |||
# ifdef __LINUX_ALSA__ | |||
@@ -558,6 +551,9 @@ bool CarlaEngine::init(const char* const clientName) | |||
kData->aboutToClose = false; | |||
kData->curPluginCount = 0; | |||
#ifdef BUILD_BRIDGE | |||
kData->maxPluginNumber = 1; | |||
#else | |||
switch (fOptions.processMode) | |||
{ | |||
case PROCESS_MODE_CONTINUOUS_RACK: | |||
@@ -568,13 +564,11 @@ bool CarlaEngine::init(const char* const clientName) | |||
case PROCESS_MODE_PATCHBAY: | |||
kData->maxPluginNumber = MAX_PATCHBAY_PLUGINS; | |||
break; | |||
case PROCESS_MODE_BRIDGE: | |||
kData->maxPluginNumber = 1; | |||
break; | |||
default: | |||
kData->maxPluginNumber = MAX_DEFAULT_PLUGINS; | |||
break; | |||
} | |||
#endif | |||
//kData->pluginsPool.resize(maxPluginNumber, 999); | |||
kData->plugins = new EnginePluginData[kData->maxPluginNumber]; | |||
@@ -627,6 +621,7 @@ bool CarlaEngine::close() | |||
kData->plugins = nullptr; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
if (kData->rack.in != nullptr) | |||
{ | |||
delete[] kData->rack.in; | |||
@@ -638,6 +633,7 @@ bool CarlaEngine::close() | |||
delete[] kData->rack.out; | |||
kData->rack.out = nullptr; | |||
} | |||
#endif | |||
fName.clear(); | |||
@@ -23,9 +23,6 @@ DEFINES += WANT_LV2 | |||
DEFINES += WANT_VST | |||
DEFINES += WANT_PLUGIN | |||
DEFINES += WANT_RTAUDIO | |||
DEFINES += WANT_JACK | |||
DEFINES += WANT_JACK_LATENCY | |||
DEFINES += WANT_JACK_PORT_RENAME | |||
DEFINES += WANT_FLUIDSYNTH | |||
DEFINES += WANT_LINUXSAMPLER | |||
DEFINES += WANT_OPENGL | |||
@@ -21,10 +21,10 @@ | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "../CarlaBridge.hpp" | |||
#include "CarlaBridgeUtils.hpp" | |||
#include "CarlaShmUtils.hpp" | |||
#include "jackbridge/jackbridge.h" | |||
#include "jackbridge/JackBridge.hpp" | |||
#include <ctime> | |||
@@ -41,7 +41,7 @@ CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------- | |||
class CarlaEngineBridge : public CarlaEngine, | |||
public CarlaThread | |||
public QThread | |||
{ | |||
public: | |||
CarlaEngineBridge(const char* const audioBaseName, const char* const controlBaseName) | |||
@@ -123,7 +123,7 @@ public: | |||
fQuitNow = false; | |||
fIsRunning = true; | |||
CarlaThread::start(); | |||
QThread::start(); | |||
CarlaEngine::init(clientName); | |||
return true; | |||
} | |||
@@ -134,7 +134,7 @@ public: | |||
CarlaEngine::close(); | |||
fQuitNow = true; | |||
CarlaThread::stop(); | |||
QThread::wait(); | |||
_cleanup(); | |||
@@ -185,7 +185,7 @@ public: | |||
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) | |||
{ | |||
@@ -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; | |||
@@ -173,6 +173,7 @@ struct CarlaEngineProtectedData { | |||
: in(nullptr), | |||
out(nullptr) {} | |||
} rack; | |||
#endif | |||
struct Time { | |||
bool playing; | |||
@@ -182,7 +183,6 @@ struct CarlaEngineProtectedData { | |||
: playing(false), | |||
frame(0) {} | |||
} time; | |||
#endif | |||
EnginePluginData* plugins; | |||
@@ -15,13 +15,15 @@ | |||
* For a full copy of the GNU General Public License see the GPL.txt file | |||
*/ | |||
#ifdef WANT_JACK | |||
#include "CarlaEngineInternal.hpp" | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "jackbridge/JackBridge.cpp" | |||
#ifdef BUILD_BRIDGE | |||
# include "jackbridge/JackBridge.hpp" | |||
#else | |||
# include "jackbridge/JackBridge.cpp" | |||
#endif | |||
#include <cmath> | |||
#include <QtCore/QStringList> | |||
@@ -182,7 +184,7 @@ public: | |||
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; | |||
fRetEvent.clear(); | |||
@@ -204,19 +206,19 @@ public: | |||
fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank; | |||
fRetEvent.ctrl.param = midiBank; | |||
fRetEvent.ctrl.value = 0.0; | |||
fRetEvent.ctrl.value = 0.0f; | |||
} | |||
else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF) | |||
{ | |||
fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff; | |||
fRetEvent.ctrl.param = 0; | |||
fRetEvent.ctrl.value = 0.0; | |||
fRetEvent.ctrl.value = 0.0f; | |||
} | |||
else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF) | |||
{ | |||
fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff; | |||
fRetEvent.ctrl.param = 0; | |||
fRetEvent.ctrl.value = 0.0; | |||
fRetEvent.ctrl.value = 0.0f; | |||
} | |||
else | |||
{ | |||
@@ -224,7 +226,7 @@ public: | |||
fRetEvent.ctrl.type = kEngineControlEventTypeParameter; | |||
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)) | |||
@@ -234,7 +236,7 @@ public: | |||
fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram; | |||
fRetEvent.ctrl.param = midiProgram; | |||
fRetEvent.ctrl.value = 0.0; | |||
fRetEvent.ctrl.value = 0.0f; | |||
} | |||
else | |||
{ | |||
@@ -432,7 +434,7 @@ public: | |||
return CarlaEngineClient::isOk(); | |||
} | |||
#if WANT_JACK_LATENCY | |||
#if 0 | |||
void setLatency(const uint32_t samples) override | |||
{ | |||
CarlaEngineClient::setLatency(samples); | |||
@@ -583,7 +585,7 @@ public: | |||
jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this); | |||
jackbridge_set_process_callback(fClient, carla_jack_process_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); | |||
# endif | |||
@@ -606,7 +608,7 @@ public: | |||
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); | |||
} | |||
@@ -648,7 +650,7 @@ public: | |||
fHasQuit = true; | |||
return true; | |||
#else | |||
if (jackbridge_deactivate(fClient) == 0) | |||
if (jackbridge_deactivate(fClient)) | |||
{ | |||
if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | |||
{ | |||
@@ -660,7 +662,7 @@ public: | |||
jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]); | |||
} | |||
if (jackbridge_client_close(fClient) == 0) | |||
if (jackbridge_client_close(fClient)) | |||
{ | |||
fClient = nullptr; | |||
return true; | |||
@@ -714,7 +716,7 @@ public: | |||
jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this); | |||
jackbridge_set_process_callback(client, carla_jack_process_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); | |||
# endif | |||
#else | |||
@@ -726,7 +728,7 @@ public: | |||
{ | |||
client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr); | |||
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); | |||
# endif | |||
} | |||
@@ -752,7 +754,7 @@ public: | |||
const char* const portNameA = getFullPortName(portA).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"); | |||
return false; | |||
@@ -778,7 +780,7 @@ public: | |||
const char* const portNameA = getFullPortName(fUsedConnections[i].portOut).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"); | |||
return false; | |||
@@ -1147,7 +1149,7 @@ protected: | |||
proccessPendingEvents(); | |||
} | |||
#if WANT_JACK_LATENCY | |||
#if 0 | |||
void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) | |||
{ | |||
if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT) | |||
@@ -1192,18 +1194,18 @@ protected: | |||
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); | |||
int groupId = getGroupId(groupName); | |||
const char* portName = jack_port_short_name(jackPort); | |||
const char* portName = jackbridge_port_short_name(jackPort); | |||
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; | |||
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) | |||
{ | |||
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) | |||
{ | |||
@@ -1268,13 +1270,13 @@ protected: | |||
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 groupName = fullName.split(":").at(0); | |||
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) | |||
{ | |||
@@ -1416,12 +1418,12 @@ private: | |||
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) | |||
{ | |||
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 groupName(fullName.split(":").at(0)); | |||
@@ -1448,8 +1450,8 @@ private: | |||
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; | |||
portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT; | |||
@@ -1466,19 +1468,19 @@ private: | |||
fLastPortId++; | |||
} | |||
jack_free(ports); | |||
jackbridge_free(ports); | |||
} | |||
// 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) | |||
{ | |||
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])); | |||
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) | |||
{ | |||
@@ -1494,11 +1496,11 @@ private: | |||
fLastConnectionId++; | |||
} | |||
jack_free(jackConnections); | |||
jackbridge_free(jackConnections); | |||
} | |||
} | |||
jack_free(ports); | |||
jackbridge_free(ports); | |||
} | |||
} | |||
#endif | |||
@@ -1560,7 +1562,7 @@ private: | |||
setPeaks(plugin->id(), inPeaks, outPeaks); | |||
} | |||
#if WANT_JACK_LATENCY | |||
#if 0 | |||
void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode) | |||
{ | |||
const uint32_t inCount = plugin->audioInCount(); | |||
@@ -1630,7 +1632,7 @@ private: | |||
return 0; | |||
} | |||
#if WANT_JACK_LATENCY | |||
#if 0 | |||
static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg) | |||
{ | |||
handlePtr->handleJackLatencyCallback(mode); | |||
@@ -1689,7 +1691,7 @@ private: | |||
return 0; | |||
} | |||
# if WANT_JACK_LATENCY | |||
# if 0 | |||
static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg) | |||
{ | |||
CarlaPlugin* const plugin = (CarlaPlugin*)arg; | |||
@@ -1717,5 +1719,3 @@ CarlaEngine* CarlaEngine::newJack() | |||
// ----------------------------------------- | |||
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) | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
ifeq ($(HAVE_QT5),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml) | |||
else | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtXml) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtXml) | |||
endif | |||
# -------------------------------------------------------------- | |||
@@ -33,17 +31,10 @@ endif | |||
ifeq ($(HAVE_ALSA),true) | |||
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 | |||
ifeq ($(HAVE_PULSEAUDIO),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags libpulse-simple) -D__LINUX_PULSE__ | |||
LINK_FLAGS += $(shell pkg-config --libs libpulse-simple) | |||
endif | |||
ifeq ($(MACOS),true) | |||
@@ -83,15 +74,14 @@ OBJS += \ | |||
endif | |||
endif | |||
SHARED = ../libcarla_engine.so | |||
STATIC = ../libcarla_engine.a | |||
TARGET = ../libcarla_engine.a | |||
# -------------------------------------------------------------- | |||
all: $(STATIC) | |||
all: $(TARGET) | |||
clean: | |||
rm -f $(OBJS) $(SHARED) $(STATIC) | |||
rm -f $(OBJS) $(TARGET) | |||
debug: | |||
$(MAKE) DEBUG=true | |||
@@ -110,8 +100,5 @@ debug: | |||
%.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 $@ | |||
$(SHARED): $(OBJS) | |||
$(CXX) $^ -shared $(LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
$(STATIC): $(OBJS) | |||
$(TARGET): $(OBJS) | |||
$(AR) rs $@ $^ |
@@ -9,14 +9,11 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I. -I../../libs/distrho -I../../widgets | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
ifeq ($(HAVE_QT5),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Widgets) | |||
else | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | |||
endif | |||
# -------------------------------------------------------------- | |||
@@ -28,29 +25,24 @@ CARLA_CXX_FLAGS += -I../engine | |||
ifeq ($(HAVE_AF_DEPS),true) | |||
AF_C_FLAGS = $(BUILD_C_FLAGS) | |||
AF_C_FLAGS += $(shell pkg-config --cflags libavcodec libavformat libavutil sndfile) | |||
LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat libavutil sndfile) | |||
endif | |||
ifeq ($(HAVE_MF_DEPS),true) | |||
MF_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
MF_CXX_FLAGS += $(shell pkg-config --cflags smf) | |||
LINK_FLAGS += $(shell pkg-config --libs smf) | |||
endif | |||
ifeq ($(HAVE_OPENGL),true) | |||
GL_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
GL_CXX_FLAGS += $(shell pkg-config --cflags gl) | |||
LINK_FLAGS += $(shell pkg-config --cflags gl) | |||
endif | |||
ifeq ($(HAVE_ZYN_DEPS),true) | |||
ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
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) | |||
ZYN_CXX_FLAGS += -DNTK_GUI | |||
ZYN_CXX_FLAGS += $(shell pkg-config --cflags ntk ntk_images) | |||
LINK_FLAGS += $(shell pkg-config --libs ntk ntk_images) | |||
endif | |||
endif | |||
@@ -146,21 +138,14 @@ ZYN_UI_FILES_H = \ | |||
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: | |||
rm -f $(OBJS) $(SHARED) $(STATIC) | |||
rm -f $(OBJS) $(TARGET) | |||
rm -f $(ZYN_UI_FILES_CPP) | |||
rm -f $(ZYN_UI_FILES_H) | |||
rm -f moc_*.cpp | |||
@@ -176,10 +161,7 @@ debug: | |||
%.cpp.o: %.cpp ../CarlaNative.h ../CarlaNative.hpp | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(SHARED): $(OBJS) $(LIBS) | |||
$(CXX) $^ -shared $(LINK_FLAGS) -o $@ | |||
$(STATIC): $(OBJS) | |||
$(TARGET): $(OBJS) | |||
$(AR) rs $@ $^ | |||
# -------------------------------------------------------------- | |||
@@ -9,26 +9,21 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
ifeq ($(HAVE_QT5),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Xml Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml Qt5Widgets) | |||
else | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui QtXml) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml) | |||
endif | |||
# -------------------------------------------------------------- | |||
ifeq ($(HAVE_FLUIDSYNTH),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags fluidsynth) | |||
LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | |||
endif | |||
ifeq ($(HAVE_LINUXSAMPLER),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags linuxsampler) | |||
LINK_FLAGS += $(shell pkg-config --libs linuxsampler) | |||
endif | |||
# -------------------------------------------------------------- | |||
@@ -47,15 +42,14 @@ OBJS = \ | |||
FluidSynthPlugin.cpp.o \ | |||
LinuxSamplerPlugin.cpp.o | |||
SHARED = ../libcarla_plugin.so | |||
STATIC = ../libcarla_plugin.a | |||
TARGET = ../libcarla_plugin.a | |||
# -------------------------------------------------------------- | |||
all: $(STATIC) | |||
all: $(TARGET) | |||
clean: | |||
rm -f $(OBJS) $(SHARED) $(STATIC) | |||
rm -f $(OBJS) $(TARGET) | |||
debug: | |||
$(MAKE) DEBUG=true | |||
@@ -68,8 +62,5 @@ debug: | |||
moc_%.cpp: %.hpp | |||
$(MOC) $< -DMOC_PARSING -o $@ | |||
$(SHARED): $(OBJS) | |||
$(CXX) $^ -shared $(LINK_FLAGS) -o $@ | |||
$(STATIC): $(OBJS) | |||
$(TARGET): $(OBJS) | |||
$(AR) rs $@ $^ |
@@ -23,7 +23,10 @@ | |||
#include "CarlaPlugin.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "CarlaNative.h" | |||
#include "CarlaStyle.hpp" | |||
#ifndef BUILD_BRIDGE | |||
# include "CarlaStyle.hpp" | |||
#endif | |||
#include <QtCore/QSettings> | |||
@@ -48,9 +51,7 @@ struct CarlaBackendStandalone { | |||
CarlaEngine* engine; | |||
CarlaString lastError; | |||
CarlaString procName; | |||
#ifndef BUILD_BRIDGE | |||
EngineOptions options; | |||
#endif | |||
QApplication* app; | |||
bool needsInit; | |||
@@ -62,6 +63,7 @@ struct CarlaBackendStandalone { | |||
app(qApp), | |||
needsInit(app == nullptr) | |||
{ | |||
#ifndef BUILD_BRIDGE | |||
if (app != nullptr) | |||
{ | |||
QSettings settings; | |||
@@ -82,6 +84,7 @@ struct CarlaBackendStandalone { | |||
style->setColorScheme(CarlaStyle::COLOR_BLACK); | |||
} | |||
} | |||
#endif | |||
} | |||
~CarlaBackendStandalone() | |||
@@ -11,9 +11,9 @@ include ../Makefile.mk | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) -I../../theme | |||
ifeq ($(HAVE_QT5),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Widgets) | |||
else | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
endif | |||
# -------------------------------------------------------------- | |||
@@ -22,7 +22,7 @@ endif | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
ifeq ($(HAVE_QT5),true) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Xml Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Xml Qt5Widgets) | |||
else | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml) | |||
endif | |||
@@ -34,16 +34,12 @@ ifeq ($(HAVE_ALSA),true) | |||
LINK_FLAGS += $(shell pkg-config --libs alsa) | |||
endif | |||
ifeq ($(HAVE_JACK),true) | |||
LINK_FLAGS += $(shell pkg-config --libs jack) | |||
endif | |||
ifeq ($(HAVE_PULSEAUDIO),true) | |||
LINK_FLAGS += $(shell pkg-config --libs libpulse-simple) | |||
endif | |||
# -------------------------------------------------------------- | |||
# Plugin | |||
# Samplers | |||
ifeq ($(HAVE_FLUIDSYNTH),true) | |||
LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | |||
@@ -106,20 +102,22 @@ endif | |||
OBJS = \ | |||
CarlaStandalone.cpp.o | |||
STATIC = ../libcarla_standalone.a | |||
ifeq ($(WIN32),true) | |||
SHARED = ../libcarla_standalone.dll | |||
TARGET = ../libcarla_standalone.dll | |||
else | |||
SHARED = ../libcarla_standalone.so | |||
ifeq ($(MACOS),true) | |||
TARGET = ../libcarla_standalone.dylib | |||
else | |||
TARGET = ../libcarla_standalone.so | |||
endif | |||
endif | |||
# -------------------------------------------------------------- | |||
all: $(SHARED) | |||
all: $(TARGET) | |||
clean: | |||
rm -f $(OBJS) $(SHARED) $(STATIC) | |||
rm -f $(OBJS) $(TARGET) | |||
debug: | |||
$(MAKE) DEBUG=true | |||
@@ -129,9 +127,6 @@ debug: | |||
%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(STATIC): $(OBJS) $(LIBS) | |||
$(AR) rs $@ $^ | |||
../libcarla_standalone.dll: $(OBJS) $(LIBS) | |||
$(CXX) $^ -shared $(LINK_FLAGS) $(W32_LIBS) -Wl,--output-def,$@.def -o $@ && $(STRIP) $@ | |||
@@ -298,7 +298,7 @@ public: | |||
CARLA_ASSERT(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) | |||
@@ -30,9 +30,9 @@ LINK_FLAGS += $(shell pkg-config --libs liblo QtCore) | |||
# Plugin bridges | |||
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 += -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) | |||
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_LINK_FLAGS = $(POSIX_LINK_FLAGS) | |||
NATIVE_BUILD_FLAGS += -DWANT_JACK -DWANT_NATIVE | |||
NATIVE_BUILD_FLAGS += -DWANT_NATIVE | |||
ifeq ($(HAVE_FLUIDSYNTH),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_FLUIDSYNTH | |||
@@ -302,6 +302,7 @@ OBJS_NATIVE += \ | |||
# carla-plugin | |||
OBJS_NATIVE += \ | |||
../backend/plugin/CarlaPlugin__native.o \ | |||
../backend/plugin/CarlaPluginGui__native.o \ | |||
../backend/plugin/CarlaPluginThread__native.o \ | |||
../backend/plugin/NativePlugin__native.o \ | |||
../backend/plugin/LadspaPlugin__native.o \ | |||
@@ -347,6 +348,7 @@ OBJS_POSIX32 += \ | |||
# carla-plugin | |||
OBJS_POSIX32 += \ | |||
../backend/plugin/CarlaPlugin__posix32.o \ | |||
../backend/plugin/CarlaPluginGui__posix32.o \ | |||
../backend/plugin/CarlaPluginThread__posix32.o \ | |||
../backend/plugin/NativePlugin__posix32.o \ | |||
../backend/plugin/LadspaPlugin__posix32.o \ | |||
@@ -390,6 +392,7 @@ OBJS_POSIX64 += \ | |||
# carla-plugin | |||
OBJS_POSIX64 += \ | |||
../backend/plugin/CarlaPlugin__posix64.o \ | |||
../backend/plugin/CarlaPluginGui__posix64.o \ | |||
../backend/plugin/CarlaPluginThread__posix64.o \ | |||
../backend/plugin/NativePlugin__posix64.o \ | |||
../backend/plugin/LadspaPlugin__posix64.o \ | |||
@@ -427,11 +430,13 @@ OBJS_WIN32 += \ | |||
../backend/engine/CarlaEngine__win32.o \ | |||
../backend/engine/CarlaEngineOsc__win32.o \ | |||
../backend/engine/CarlaEngineThread__win32.o \ | |||
../backend/engine/CarlaEngineBridge__win32.o | |||
../backend/engine/CarlaEngineBridge__win32.o \ | |||
../backend/engine/CarlaEngineJack__win32.o | |||
# carla-plugin | |||
OBJS_WIN32 += \ | |||
../backend/plugin/CarlaPlugin__win32.o \ | |||
../backend/plugin/CarlaPluginGui__win32.o \ | |||
../backend/plugin/CarlaPluginThread__win32.o \ | |||
../backend/plugin/NativePlugin__win32.o \ | |||
../backend/plugin/LadspaPlugin__win32.o \ | |||
@@ -469,11 +474,13 @@ OBJS_WIN64 += \ | |||
../backend/engine/CarlaEngine__win64.o \ | |||
../backend/engine/CarlaEngineOsc__win64.o \ | |||
../backend/engine/CarlaEngineThread__win64.o \ | |||
../backend/engine/CarlaEngineBridge__win64.o | |||
../backend/engine/CarlaEngineBridge__win64.o \ | |||
../backend/engine/CarlaEngineJack__win64.o | |||
# carla-plugin | |||
OBJS_WIN64 += \ | |||
../backend/plugin/CarlaPlugin__win64.o \ | |||
../backend/plugin/CarlaPluginGui__win64.o \ | |||
../backend/plugin/CarlaPluginThread__win64.o \ | |||
../backend/plugin/NativePlugin__win64.o \ | |||
../backend/plugin/LadspaPlugin__win64.o \ | |||
@@ -15,8 +15,17 @@ | |||
*/ | |||
#include "JackBridge.hpp" | |||
#ifdef __WINE__ | |||
# define __CARLA_UTILS_HPP__ | |||
# undef CARLA_ASSERT | |||
# define CARLA_ASSERT(...) | |||
#endif | |||
#include "CarlaLibUtils.hpp" | |||
#include <stdio.h> | |||
#ifndef JACKBRIDGE_DUMMY | |||
# include <time.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 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_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_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 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 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; | |||
jacksym_get_version_string get_version_string_ptr; | |||
@@ -108,6 +122,7 @@ struct JackBridge | |||
jacksym_port_short_name port_short_name_ptr; | |||
jacksym_port_flags port_flags_ptr; | |||
jacksym_port_type port_type_ptr; | |||
jacksym_port_get_connections port_get_connections_ptr; | |||
jacksym_port_set_name port_set_name_ptr; | |||
jacksym_connect connect_ptr; | |||
jacksym_disconnect disconnect_ptr; | |||
@@ -115,6 +130,9 @@ struct JackBridge | |||
jacksym_port_get_latency_range port_get_latency_range_ptr; | |||
jacksym_port_set_latency_range port_set_latency_range_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_midi_get_event_count midi_get_event_count_ptr; | |||
@@ -156,6 +174,7 @@ struct JackBridge | |||
port_short_name_ptr(nullptr), | |||
port_flags_ptr(nullptr), | |||
port_type_ptr(nullptr), | |||
port_get_connections_ptr(nullptr), | |||
port_set_name_ptr(nullptr), | |||
connect_ptr(nullptr), | |||
disconnect_ptr(nullptr), | |||
@@ -163,6 +182,9 @@ struct JackBridge | |||
port_get_latency_range_ptr(nullptr), | |||
port_set_latency_range_ptr(nullptr), | |||
recompute_total_latencies_ptr(nullptr), | |||
get_ports_ptr(nullptr), | |||
port_by_name_ptr(nullptr), | |||
port_by_id_ptr(nullptr), | |||
free_ptr(nullptr), | |||
midi_get_event_count_ptr(nullptr), | |||
midi_event_get_ptr(nullptr), | |||
@@ -176,14 +198,20 @@ struct JackBridge | |||
{ | |||
#if defined(CARLA_OS_MAC) | |||
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"); | |||
fprintf(stderr, "load JACK DLL FOR WINDOWS\n"); | |||
#else | |||
lib = lib_open("libjack.so"); | |||
fprintf(stderr, "load JACK DLL FOR LINUX\n"); | |||
#endif | |||
if (lib == nullptr) | |||
{ | |||
fprintf(stderr, "Failed to load JACK DLL\n"); | |||
return; | |||
} | |||
#define JOIN(a, b) a ## b | |||
#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_flags) | |||
LIB_SYMBOL(port_type) | |||
LIB_SYMBOL(port_get_connections) | |||
LIB_SYMBOL(port_set_name) | |||
LIB_SYMBOL(connect) | |||
LIB_SYMBOL(disconnect) | |||
@@ -221,6 +250,9 @@ struct JackBridge | |||
LIB_SYMBOL(port_get_latency_range) | |||
LIB_SYMBOL(port_set_latency_range) | |||
LIB_SYMBOL(recompute_total_latencies) | |||
LIB_SYMBOL(get_ports) | |||
LIB_SYMBOL(port_by_name) | |||
LIB_SYMBOL(port_by_id) | |||
LIB_SYMBOL(free) | |||
LIB_SYMBOL(midi_get_event_count) | |||
@@ -247,294 +279,318 @@ struct JackBridge | |||
static JackBridge bridge; | |||
int main(){return 0;} | |||
// ----------------------------------------------------------------------------- | |||
const char* jackbridge_get_version_string() | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.get_version_string_ptr != nullptr) | |||
return bridge.get_version_string_ptr(); | |||
#endif | |||
return nullptr; | |||
} | |||
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) | |||
return bridge.client_open_ptr(client_name, options, status); | |||
#endif | |||
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) | |||
return bridge.client_close_ptr(client); | |||
#endif | |||
return 0; | |||
return (bridge.client_close_ptr(client) == 0); | |||
return false; | |||
} | |||
int jackbridge_client_name_size() | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.client_name_size_ptr != nullptr) | |||
return bridge.client_name_size_ptr(); | |||
#endif | |||
return 0; | |||
} | |||
char* jackbridge_get_client_name(jack_client_t* client) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.get_client_name_ptr != nullptr) | |||
return bridge.get_client_name_ptr(client); | |||
#endif | |||
return nullptr; | |||
} | |||
// ----------------------------------------------------------------------------- | |||
int jackbridge_activate(jack_client_t* client) | |||
bool jackbridge_activate(jack_client_t* client) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.on_shutdown_ptr != nullptr) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.get_sample_rate_ptr != nullptr) | |||
return bridge.get_sample_rate_ptr(client); | |||
#endif | |||
return 0; | |||
} | |||
jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.get_buffer_size_ptr != nullptr) | |||
return bridge.get_buffer_size_ptr(client); | |||
#endif | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.port_register_ptr != nullptr) | |||
return bridge.port_register_ptr(client, port_name, port_type, flags, buffer_size); | |||
#endif | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.port_get_buffer_ptr != nullptr) | |||
return bridge.port_get_buffer_ptr(port, nframes); | |||
#endif | |||
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; | |||
} | |||
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; | |||
} | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.port_set_latency_range_ptr != nullptr) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.midi_get_event_count_ptr != nullptr) | |||
return bridge.midi_get_event_count_ptr(port_buffer); | |||
#endif | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.midi_clear_buffer_ptr != nullptr) | |||
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) | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.midi_event_reserve_ptr != nullptr) | |||
return bridge.midi_event_reserve_ptr(port_buffer, time, data_size); | |||
#endif | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
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) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.transport_start_ptr != nullptr) | |||
bridge.transport_start_ptr(client); | |||
#endif | |||
} | |||
void jackbridge_transport_stop(jack_client_t* client) | |||
{ | |||
#ifndef JACKBRIDGE_DUMMY | |||
if (bridge.transport_stop_ptr != nullptr) | |||
bridge.transport_stop_ptr(client); | |||
#endif | |||
} | |||
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) | |||
return bridge.transport_query_ptr(client, pos); | |||
#endif | |||
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 | |||
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 |
@@ -19,69 +19,200 @@ | |||
#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 | |||
# undef CARLA_EXPORT | |||
# define CARLA_EXPORT | |||
#endif | |||
#ifdef __WINE__ | |||
# define GNU_WIN32 // fix jack threads, always use pthread | |||
#endif | |||
#include <cstddef> | |||
#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 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 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 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_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 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); | |||
// 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 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 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 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 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 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 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__ |
@@ -10,6 +10,7 @@ include ../../Makefile.mk | |||
WINECXX ?= wineg++ | |||
BUILD_CXX_FLAGS += -DJACKBRIDGE_EXPORT | |||
BUILD_CXX_FLAGS += -I. -I../../includes -I../../utils | |||
ifeq ($(MACOS),true) | |||
@@ -20,7 +20,9 @@ | |||
#include "CarlaUtils.hpp" | |||
#ifndef CARLA_OS_WIN | |||
#if defined(CARLA_OS_WIN) && ! defined(__WINE__) | |||
# define CARLA_LIB_WINDOWS | |||
#else | |||
# include <dlfcn.h> | |||
#endif | |||
@@ -32,7 +34,7 @@ void* lib_open(const char* const filename) | |||
{ | |||
CARLA_ASSERT(filename != nullptr); | |||
#ifdef CARLA_OS_WIN | |||
#ifdef CARLA_LIB_WINDOWS | |||
return (void*)LoadLibraryA(filename); | |||
#else | |||
return dlopen(filename, RTLD_NOW|RTLD_LOCAL); | |||
@@ -47,7 +49,7 @@ bool lib_close(void* const lib) | |||
if (lib == nullptr) | |||
return false; | |||
#ifdef CARLA_OS_WIN | |||
#ifdef CARLA_LIB_WINDOWS | |||
return FreeLibrary((HMODULE)lib); | |||
#else | |||
return (dlclose(lib) == 0); | |||
@@ -63,7 +65,7 @@ void* lib_symbol(void* const lib, const char* const symbol) | |||
if (lib == nullptr && symbol == nullptr) | |||
return nullptr; | |||
#ifdef CARLA_OS_WIN | |||
#ifdef CARLA_LIB_WINDOWS | |||
return (void*)GetProcAddress((HMODULE)lib, symbol); | |||
#else | |||
return dlsym(lib, symbol); | |||
@@ -75,7 +77,7 @@ const char* lib_error(const char* const filename) | |||
{ | |||
CARLA_ASSERT(filename != nullptr); | |||
#ifdef CARLA_OS_WIN | |||
#ifdef CARLA_LIB_WINDOWS | |||
static char libError[2048]; | |||
carla_zeroMem(libError, sizeof(char)*2048); | |||