DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit a9951390e653928673ab36f979bcd532c9aa6434
parent 478cb33f041b167ebaa07ba34c7cf438dc23d96a
Author: falkTX <falktx@falktx.com>
Date:   Sun,  3 Jul 2022 19:32:26 +0100

Cleanup jackbridge, use SDL for wasm

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/src/jackbridge/JackBridge.cpp | 276+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Mdistrho/src/jackbridge/JackBridge.hpp | 19++-----------------
Mdistrho/src/jackbridge/RtAudioBridge.hpp | 8++++----
Adistrho/src/jackbridge/SDLBridge.hpp | 216+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 393 insertions(+), 126 deletions(-)

diff --git a/distrho/src/jackbridge/JackBridge.cpp b/distrho/src/jackbridge/JackBridge.cpp @@ -1,6 +1,6 @@ /* * JackBridge for DPF - * Copyright (C) 2013-2021 Filipe Coelho <falktx@falktx.com> + * Copyright (C) 2013-2022 Filipe Coelho <falktx@falktx.com> * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -35,8 +35,10 @@ #include <cerrno> #include "../../extra/LibraryUtils.hpp" -// in case JACK fails, we fallback to RtAudio's native API -#if defined(DISTRHO_PROPER_CPP11_SUPPORT) && !defined(DPF_JACK_STANDALONE_SKIP_RTAUDIO_FALLBACK) +// in case JACK fails, we fallback to RtAudio or SDL native API +#if defined(DISTRHO_OS_WASM) +# include "SDLBridge.hpp" +#elif defined(DISTRHO_PROPER_CPP11_SUPPORT) && !defined(DPF_JACK_STANDALONE_SKIP_RTAUDIO_FALLBACK) # include "RtAudioBridge.hpp" # ifdef RTAUDIO_API_TYPE # include "rtaudio/RtAudio.cpp" @@ -312,7 +314,10 @@ struct JackBridge { jacksym_set_thread_creator set_thread_creator_ptr; #endif - static bool usingRtAudio; + static bool usingRtAudioOrSDL; +#ifdef DISTRHO_OS_WASM + static SDLBridge sdl; +#endif #ifdef RTAUDIO_API_TYPE static RtAudioBridge rtAudio; #endif @@ -415,6 +420,9 @@ struct JackBridge { , set_thread_creator_ptr(nullptr) #endif { +# ifdef DISTRHO_OS_WASM + return; +# endif # if defined(DISTRHO_OS_MAC) const char* const filename("libjack.dylib"); # elif defined(DISTRHO_OS_WINDOWS) && defined(_WIN64) @@ -576,7 +584,10 @@ struct JackBridge { DISTRHO_DECLARE_NON_COPYABLE(JackBridge); }; -bool JackBridge::usingRtAudio = false; +bool JackBridge::usingRtAudioOrSDL = false; +#ifdef DISTRHO_OS_WASM +SDLBridge JackBridge::sdl; +#endif #ifdef RTAUDIO_API_TYPE RtAudioBridge JackBridge::rtAudio; #endif @@ -808,7 +819,7 @@ bool jackbridge_is_ok() noexcept { #if defined(JACKBRIDGE_DUMMY) return false; -#elif defined(JACKBRIDGE_DIRECT) || defined(RTAUDIO_API_TYPE) +#elif defined(JACKBRIDGE_DIRECT) || defined(DISTRHO_OS_WASM) || defined(RTAUDIO_API_TYPE) return true; #else return (getBridgeInstance().lib != nullptr); @@ -817,7 +828,7 @@ bool jackbridge_is_ok() noexcept void jackbridge_init() { -#if defined(__WINE__) && ! defined(JACKBRIDGE_DIRECT) +#if defined(__WINE__) && !defined(JACKBRIDGE_DIRECT) if (getBridgeInstance().set_thread_creator_ptr != nullptr) getBridgeInstance().set_thread_creator_ptr(WineBridge::thread_creator); #endif @@ -831,7 +842,7 @@ void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* #elif defined(JACKBRIDGE_DIRECT) return jack_get_version(major_ptr, minor_ptr, micro_ptr, proto_ptr); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_version_ptr != nullptr) return getBridgeInstance().get_version_ptr(major_ptr, minor_ptr, micro_ptr, proto_ptr); #endif @@ -851,8 +862,12 @@ const char* jackbridge_get_version_string() #elif defined(JACKBRIDGE_DIRECT) return jack_get_version_string(); #else +# ifdef DISTRHO_OS_WASM + if (JackBridge::usingRtAudioOrSDL) + return "2"; // SDL_VERSION; +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) + if (JackBridge::usingRtAudioOrSDL) return RTAUDIO_VERSION; # endif if (getBridgeInstance().get_version_string_ptr != nullptr) @@ -869,14 +884,27 @@ jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, #elif defined(JACKBRIDGE_DIRECT) return jack_client_open(client_name, static_cast<jack_options_t>(options), status); #else +# ifdef DISTRHO_OS_WASM + if (JackBridge::sdl.open(client_name)) + { + d_stdout("SDL audio setup ok"); + JackBridge::usingRtAudioOrSDL = true; + return (jack_client_t*)0x1; // return non-null + // unused + (void)options; + } + d_stderr2("SDL audio setup failed"); +# else if (getBridgeInstance().client_open_ptr != nullptr) if (jack_client_t* const client = getBridgeInstance().client_open_ptr(client_name, static_cast<jack_options_t>(options), status)) return client; + // TODO +# endif # ifdef RTAUDIO_API_TYPE if (JackBridge::rtAudio.open()) { d_stdout("JACK setup failed, using RtAudio instead"); - JackBridge::usingRtAudio = true; + JackBridge::usingRtAudioOrSDL = true; return (jack_client_t*)0x1; // return non-null } # endif @@ -892,13 +920,16 @@ bool jackbridge_client_close(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_client_close(client) == 0); #else -# ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) + if (JackBridge::usingRtAudioOrSDL) { - JackBridge::usingRtAudio = false; + JackBridge::usingRtAudioOrSDL = false; +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.close(); +# endif +# ifdef RTAUDIO_API_TYPE return JackBridge::rtAudio.close(); - } # endif + } if (getBridgeInstance().client_close_ptr != nullptr) return (getBridgeInstance().client_close_ptr(client) == 0); #endif @@ -913,22 +944,22 @@ int jackbridge_client_name_size() #elif defined(JACKBRIDGE_DIRECT) return jack_client_name_size(); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().client_name_size_ptr != nullptr) return getBridgeInstance().client_name_size_ptr(); #endif return 33; } -char* jackbridge_get_client_name(jack_client_t* client) +const char* jackbridge_get_client_name(jack_client_t* client) { #if defined(JACKBRIDGE_DUMMY) #elif defined(JACKBRIDGE_DIRECT) return jack_get_client_name(client); #else - if (JackBridge::usingRtAudio) + if (JackBridge::usingRtAudioOrSDL) { - char* const name = (char*)DISTRHO_PLUGIN_NAME; + static const char* const name = DISTRHO_PLUGIN_NAME; return name; } if (getBridgeInstance().get_client_name_ptr != nullptr) @@ -945,7 +976,7 @@ char* jackbridge_client_get_uuid(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return jack_client_get_uuid(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (const jacksym_client_get_uuid func = getBridgeInstance().client_get_uuid_ptr) return func(client); #endif @@ -958,7 +989,7 @@ char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* nam #elif defined(JACKBRIDGE_DIRECT) return jack_get_uuid_for_client_name(client, name); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_uuid_for_client_name_ptr != nullptr) return getBridgeInstance().get_uuid_for_client_name_ptr(client, name); #endif @@ -971,7 +1002,7 @@ char* jackbridge_get_client_name_by_uuid(jack_client_t* client, const char* uuid #elif defined(JACKBRIDGE_DIRECT) return jack_get_client_name_by_uuid(client, uuid); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_client_name_by_uuid_ptr != nullptr) return getBridgeInstance().get_client_name_by_uuid_ptr(client, uuid); #endif @@ -986,7 +1017,7 @@ bool jackbridge_uuid_parse(const char* buf, jack_uuid_t* uuid) #elif defined(JACKBRIDGE_DIRECT) return (jack_uuid_parse(buf, uuid) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (const jacksym_uuid_parse func = getBridgeInstance().uuid_parse_ptr) return (func(buf, uuid) == 0); #endif @@ -999,7 +1030,7 @@ void jackbridge_uuid_unparse(jack_uuid_t uuid, char buf[JACK_UUID_STRING_SIZE]) #elif defined(JACKBRIDGE_DIRECT) jack_uuid_unparse(uuid, buf); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (const jacksym_uuid_unparse func = getBridgeInstance().uuid_unparse_ptr) return func(uuid, buf); #endif @@ -1013,10 +1044,15 @@ bool jackbridge_activate(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_activate(client) == 0); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.activate(); +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.activate(); # endif + } if (getBridgeInstance().activate_ptr != nullptr) return (getBridgeInstance().activate_ptr(client) == 0); #endif @@ -1029,10 +1065,15 @@ bool jackbridge_deactivate(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_deactivate(client) == 0); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.deactivate(); +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.deactivate(); # endif + } if (getBridgeInstance().deactivate_ptr != nullptr) return (getBridgeInstance().deactivate_ptr(client) == 0); #endif @@ -1045,7 +1086,7 @@ bool jackbridge_is_realtime(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return jack_is_realtime(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().is_realtime_ptr != nullptr) return getBridgeInstance().is_realtime_ptr(client); #endif @@ -1060,7 +1101,7 @@ bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCa #elif defined(JACKBRIDGE_DIRECT) return (jack_set_thread_init_callback(client, thread_init_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_thread_init_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_thread_init_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_thread_init(thread_init_callback); @@ -1079,7 +1120,7 @@ void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown #elif defined(JACKBRIDGE_DIRECT) jack_on_shutdown(client, shutdown_callback, arg); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().on_shutdown_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().on_shutdown_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_shutdown(shutdown_callback); @@ -1097,7 +1138,7 @@ void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback #elif defined(JACKBRIDGE_DIRECT) jack_on_info_shutdown(client, shutdown_callback, arg); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().on_info_shutdown_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().on_info_shutdown_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_info_shutdown(shutdown_callback); @@ -1115,14 +1156,19 @@ bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback #elif defined(JACKBRIDGE_DIRECT) return (jack_set_process_callback(client, process_callback, arg) == 0); #else -# ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) + if (JackBridge::usingRtAudioOrSDL) { +# ifdef DISTRHO_OS_WASM + JackBridge::sdl.jackProcessCallback = process_callback; + JackBridge::sdl.jackProcessArg = arg; + return true; +# endif +# ifdef RTAUDIO_API_TYPE JackBridge::rtAudio.jackProcessCallback = process_callback; JackBridge::rtAudio.jackProcessArg = arg; return true; - } # endif + } if (getBridgeInstance().set_process_callback_ptr != nullptr) { # ifdef __WINE__ @@ -1142,7 +1188,7 @@ bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallb #elif defined(JACKBRIDGE_DIRECT) return (jack_set_freewheel_callback(client, freewheel_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_freewheel_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_freewheel_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_freewheel(freewheel_callback); @@ -1161,7 +1207,7 @@ bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCa #elif defined(JACKBRIDGE_DIRECT) return (jack_set_buffer_size_callback(client, bufsize_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_buffer_size_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_buffer_size_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_bufsize(bufsize_callback); @@ -1180,7 +1226,7 @@ bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCa #elif defined(JACKBRIDGE_DIRECT) return (jack_set_sample_rate_callback(client, srate_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_sample_rate_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_sample_rate_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_srate(srate_callback); @@ -1199,7 +1245,7 @@ bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClie #elif defined(JACKBRIDGE_DIRECT) return (jack_set_client_registration_callback(client, registration_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_client_registration_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_client_registration_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_client_reg(registration_callback); @@ -1218,7 +1264,7 @@ bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRe #elif defined(JACKBRIDGE_DIRECT) return (jack_set_port_registration_callback(client, registration_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_port_registration_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_port_registration_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_port_reg(registration_callback); @@ -1237,7 +1283,7 @@ bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCa #elif defined(JACKBRIDGE_DIRECT) return (jack_set_port_rename_callback(client, rename_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_port_rename_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_port_rename_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_port_rename(rename_callback); @@ -1256,7 +1302,7 @@ bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnect #elif defined(JACKBRIDGE_DIRECT) return (jack_set_port_connect_callback(client, connect_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_port_connect_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_port_connect_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_port_conn(connect_callback); @@ -1275,7 +1321,7 @@ bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCa #elif defined(JACKBRIDGE_DIRECT) return (jack_set_graph_order_callback(client, graph_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_graph_order_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_graph_order_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_graph_order(graph_callback); @@ -1294,7 +1340,7 @@ bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_c #elif defined(JACKBRIDGE_DIRECT) return (jack_set_xrun_callback(client, xrun_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_xrun_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_xrun_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_xrun(xrun_callback); @@ -1313,7 +1359,7 @@ bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback #elif defined(JACKBRIDGE_DIRECT) return (jack_set_latency_callback(client, latency_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_latency_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_latency_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_latency(latency_callback); @@ -1334,7 +1380,7 @@ bool jackbridge_set_freewheel(jack_client_t* client, bool onoff) #elif defined(JACKBRIDGE_DIRECT) return jack_set_freewheel(client, onoff); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().set_freewheel_ptr != nullptr) return getBridgeInstance().set_freewheel_ptr(client, onoff); #endif @@ -1347,7 +1393,7 @@ bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes) #elif defined(JACKBRIDGE_DIRECT) return jack_set_buffer_size(client, nframes); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().set_buffer_size_ptr != nullptr) return getBridgeInstance().set_buffer_size_ptr(client, nframes); #endif @@ -1362,10 +1408,15 @@ jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return jack_get_sample_rate(client); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.sampleRate; +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.sampleRate; # endif + } if (getBridgeInstance().get_sample_rate_ptr != nullptr) return getBridgeInstance().get_sample_rate_ptr(client); #endif @@ -1378,10 +1429,15 @@ jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return jack_get_buffer_size(client); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.bufferSize; +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.bufferSize; # endif + } if (getBridgeInstance().get_buffer_size_ptr != nullptr) return getBridgeInstance().get_buffer_size_ptr(client); #endif @@ -1394,7 +1450,7 @@ float jackbridge_cpu_load(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return jack_cpu_load(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().cpu_load_ptr != nullptr) return getBridgeInstance().cpu_load_ptr(client); #endif @@ -1409,10 +1465,15 @@ jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_na #elif defined(JACKBRIDGE_DIRECT) return jack_port_register(client, port_name, type, flags, buffer_size); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.registerPort(type, flags); +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.registerPort(type, flags); # endif + } if (getBridgeInstance().port_register_ptr != nullptr) return getBridgeInstance().port_register_ptr(client, port_name, type, static_cast<ulong>(flags), @@ -1427,7 +1488,7 @@ bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_unregister(client, port) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_unregister_ptr != nullptr) return (getBridgeInstance().port_unregister_ptr(client, port) == 0); #endif @@ -1440,10 +1501,15 @@ void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes) #elif defined(JACKBRIDGE_DIRECT) return jack_port_get_buffer(port, nframes); #else + if (JackBridge::usingRtAudioOrSDL) + { +# ifdef DISTRHO_OS_WASM + return JackBridge::sdl.getPortBuffer(port); +# endif # ifdef RTAUDIO_API_TYPE - if (JackBridge::usingRtAudio) return JackBridge::rtAudio.getPortBuffer(port); # endif + } if (getBridgeInstance().port_get_buffer_ptr != nullptr) return getBridgeInstance().port_get_buffer_ptr(port, nframes); #endif @@ -1458,7 +1524,7 @@ const char* jackbridge_port_name(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_name(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_name_ptr != nullptr) return getBridgeInstance().port_name_ptr(port); #endif @@ -1471,7 +1537,7 @@ jack_uuid_t jackbridge_port_uuid(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_uuid(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_uuid_ptr != nullptr) return getBridgeInstance().port_uuid_ptr(port); #endif @@ -1484,7 +1550,7 @@ const char* jackbridge_port_short_name(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_short_name(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_short_name_ptr != nullptr) return getBridgeInstance().port_short_name_ptr(port); #endif @@ -1497,7 +1563,7 @@ int jackbridge_port_flags(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_flags(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_flags_ptr != nullptr) return getBridgeInstance().port_flags_ptr(port); #endif @@ -1510,7 +1576,7 @@ const char* jackbridge_port_type(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_type(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_type_ptr != nullptr) return getBridgeInstance().port_type_ptr(port); #endif @@ -1523,7 +1589,7 @@ bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* por #elif defined(JACKBRIDGE_DIRECT) return jack_port_is_mine(client, port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_is_mine_ptr != nullptr) return getBridgeInstance().port_is_mine_ptr(client, port); #endif @@ -1536,7 +1602,7 @@ int jackbridge_port_connected(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_connected(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_connected_ptr != nullptr) return getBridgeInstance().port_connected_ptr(port); #endif @@ -1549,7 +1615,7 @@ bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name #elif defined(JACKBRIDGE_DIRECT) return jack_port_connected_to(port, port_name); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_connected_to_ptr != nullptr) return getBridgeInstance().port_connected_to_ptr(port, port_name); #endif @@ -1562,7 +1628,7 @@ const char** jackbridge_port_get_connections(const jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_get_connections(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_get_connections_ptr != nullptr) return getBridgeInstance().port_get_connections_ptr(port); #endif @@ -1575,7 +1641,7 @@ const char** jackbridge_port_get_all_connections(const jack_client_t* client, co #elif defined(JACKBRIDGE_DIRECT) return jack_port_get_all_connections(client, port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_get_all_connections_ptr != nullptr) return getBridgeInstance().port_get_all_connections_ptr(client, port); #endif @@ -1590,7 +1656,7 @@ bool jackbridge_port_rename(jack_client_t* client, jack_port_t* port, const char #elif defined(JACKBRIDGE_DIRECT) return (jack_port_rename(client, port, port_name) == 0); #else - if (JackBridge::usingRtAudio) + if (JackBridge::usingRtAudioOrSDL) return false; // Try new API first if (getBridgeInstance().port_rename_ptr != nullptr) @@ -1608,7 +1674,7 @@ bool jackbridge_port_set_alias(jack_port_t* port, const char* alias) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_set_alias(port, alias) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_set_alias_ptr != nullptr) return (getBridgeInstance().port_set_alias_ptr(port, alias) == 0); #endif @@ -1621,7 +1687,7 @@ bool jackbridge_port_unset_alias(jack_port_t* port, const char* alias) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_unset_alias(port, alias) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_unset_alias_ptr != nullptr) return (getBridgeInstance().port_unset_alias_ptr(port, alias) == 0); #endif @@ -1634,7 +1700,7 @@ int jackbridge_port_get_aliases(const jack_port_t* port, char* const aliases[2]) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_get_aliases(port, aliases) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_get_aliases_ptr != nullptr) return getBridgeInstance().port_get_aliases_ptr(port, aliases); #endif @@ -1649,7 +1715,7 @@ bool jackbridge_port_request_monitor(jack_port_t* port, bool onoff) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_request_monitor(port, onoff) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_request_monitor_ptr != nullptr) return (getBridgeInstance().port_request_monitor_ptr(port, onoff) == 0); #endif @@ -1662,7 +1728,7 @@ bool jackbridge_port_request_monitor_by_name(jack_client_t* client, const char* #elif defined(JACKBRIDGE_DIRECT) return (jack_port_request_monitor_by_name(client, port_name, onoff) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_request_monitor_by_name_ptr != nullptr) return (getBridgeInstance().port_request_monitor_by_name_ptr(client, port_name, onoff) == 0); #endif @@ -1675,7 +1741,7 @@ bool jackbridge_port_ensure_monitor(jack_port_t* port, bool onoff) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_ensure_monitor(port, onoff) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_ensure_monitor_ptr != nullptr) return (getBridgeInstance().port_ensure_monitor_ptr(port, onoff) == 0); #endif @@ -1688,7 +1754,7 @@ bool jackbridge_port_monitoring_input(jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return jack_port_monitoring_input(port); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_monitoring_input_ptr != nullptr) return getBridgeInstance().port_monitoring_input_ptr(port); #endif @@ -1703,7 +1769,7 @@ bool jackbridge_connect(jack_client_t* client, const char* source_port, const ch #elif defined(JACKBRIDGE_DIRECT) return (jack_connect(client, source_port, destination_port) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().connect_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().connect_ptr != nullptr) { const int ret = getBridgeInstance().connect_ptr(client, source_port, destination_port); return ret == 0 || ret == EEXIST; @@ -1718,7 +1784,7 @@ bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const #elif defined(JACKBRIDGE_DIRECT) return (jack_disconnect(client, source_port, destination_port) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().disconnect_ptr != nullptr) return (getBridgeInstance().disconnect_ptr(client, source_port, destination_port) == 0); #endif @@ -1731,7 +1797,7 @@ bool jackbridge_port_disconnect(jack_client_t* client, jack_port_t* port) #elif defined(JACKBRIDGE_DIRECT) return (jack_port_disconnect(client, port) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_disconnect_ptr != nullptr) return (getBridgeInstance().port_disconnect_ptr(client, port) == 0); #endif @@ -1746,7 +1812,7 @@ int jackbridge_port_name_size() #elif defined(JACKBRIDGE_DIRECT) return jack_port_name_size(); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_name_size_ptr != nullptr) return getBridgeInstance().port_name_size_ptr(); #endif @@ -1759,7 +1825,7 @@ int jackbridge_port_type_size() #elif defined(JACKBRIDGE_DIRECT) return jack_port_type_size(); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_type_size_ptr != nullptr) return getBridgeInstance().port_type_size_ptr(); #endif @@ -1772,7 +1838,7 @@ uint32_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* #elif defined(JACKBRIDGE_DIRECT) return static_cast<uint32_t>(jack_port_type_get_buffer_size(client, port_type)); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_type_get_buffer_size_ptr != nullptr) return static_cast<uint32_t>(getBridgeInstance().port_type_get_buffer_size_ptr(client, port_type)); #endif @@ -1787,7 +1853,7 @@ void jackbridge_port_get_latency_range(jack_port_t* port, uint32_t mode, jack_la #elif defined(JACKBRIDGE_DIRECT) return jack_port_get_latency_range(port, static_cast<jack_latency_callback_mode_t>(mode), range); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_get_latency_range_ptr != nullptr) return getBridgeInstance().port_get_latency_range_ptr(port, static_cast<jack_latency_callback_mode_t>(mode), @@ -1803,7 +1869,7 @@ void jackbridge_port_set_latency_range(jack_port_t* port, uint32_t mode, jack_la #elif defined(JACKBRIDGE_DIRECT) jack_port_set_latency_range(port, static_cast<jack_latency_callback_mode_t>(mode), range); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_set_latency_range_ptr != nullptr) getBridgeInstance().port_set_latency_range_ptr(port, static_cast<jack_latency_callback_mode_t>(mode), @@ -1817,7 +1883,7 @@ bool jackbridge_recompute_total_latencies(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_recompute_total_latencies(client) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().recompute_total_latencies_ptr != nullptr) return (getBridgeInstance().recompute_total_latencies_ptr(client) == 0); #endif @@ -1832,7 +1898,7 @@ const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_p #elif defined(JACKBRIDGE_DIRECT) return jack_get_ports(client, port_name_pattern, type_name_pattern, flags); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_ports_ptr != nullptr) return getBridgeInstance().get_ports_ptr(client, port_name_pattern, type_name_pattern, static_cast<ulong>(flags)); @@ -1846,7 +1912,7 @@ jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_nam #elif defined(JACKBRIDGE_DIRECT) return jack_port_by_name(client, port_name); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_by_name_ptr != nullptr) return getBridgeInstance().port_by_name_ptr(client, port_name); #endif @@ -1859,7 +1925,7 @@ jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id #elif defined(JACKBRIDGE_DIRECT) return jack_port_by_id(client, port_id); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().port_by_id_ptr != nullptr) return getBridgeInstance().port_by_id_ptr(client, port_id); #endif @@ -1874,7 +1940,7 @@ void jackbridge_free(void* ptr) #elif defined(JACKBRIDGE_DIRECT) return jack_free(ptr); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().free_ptr != nullptr) return getBridgeInstance().free_ptr(ptr); @@ -1891,7 +1957,7 @@ uint32_t jackbridge_midi_get_event_count(void* port_buffer) #elif defined(JACKBRIDGE_DIRECT) return jack_midi_get_event_count(port_buffer); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().midi_get_event_count_ptr != nullptr) return getBridgeInstance().midi_get_event_count_ptr(port_buffer); #endif @@ -1904,7 +1970,7 @@ bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint #elif defined(JACKBRIDGE_DIRECT) return (jack_midi_event_get(event, port_buffer, event_index) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().midi_event_get_ptr != nullptr) return (getBridgeInstance().midi_event_get_ptr(event, port_buffer, event_index) == 0); #endif @@ -1917,7 +1983,7 @@ void jackbridge_midi_clear_buffer(void* port_buffer) #elif defined(JACKBRIDGE_DIRECT) jack_midi_clear_buffer(port_buffer); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().midi_clear_buffer_ptr != nullptr) getBridgeInstance().midi_clear_buffer_ptr(port_buffer); #endif @@ -1929,7 +1995,7 @@ bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const j #elif defined(JACKBRIDGE_DIRECT) return (jack_midi_event_write(port_buffer, time, data, data_size) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().midi_event_write_ptr != nullptr) return (getBridgeInstance().midi_event_write_ptr(port_buffer, time, data, data_size) == 0); #endif @@ -1942,7 +2008,7 @@ jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_ #elif defined(JACKBRIDGE_DIRECT) return jack_midi_event_reserve(port_buffer, time, data_size); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().midi_event_reserve_ptr != nullptr) return getBridgeInstance().midi_event_reserve_ptr(port_buffer, time, data_size); #endif @@ -1957,7 +2023,7 @@ bool jackbridge_release_timebase(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_release_timebase(client) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().release_timebase_ptr != nullptr) return (getBridgeInstance().release_timebase_ptr(client) == 0); #endif @@ -1970,7 +2036,7 @@ bool jackbridge_set_sync_callback(jack_client_t* client, JackSyncCallback sync_c #elif defined(JACKBRIDGE_DIRECT) return (jack_set_sync_callback(client, sync_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_sync_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_sync_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_sync(sync_callback); @@ -1989,7 +2055,7 @@ bool jackbridge_set_sync_timeout(jack_client_t* client, jack_time_t timeout) #elif defined(JACKBRIDGE_DIRECT) return (jack_set_sync_timeout(client, timeout) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().set_sync_timeout_ptr != nullptr) return (getBridgeInstance().set_sync_timeout_ptr(client, timeout) == 0); #endif @@ -2002,7 +2068,7 @@ bool jackbridge_set_timebase_callback(jack_client_t* client, bool conditional, J #elif defined(JACKBRIDGE_DIRECT) return (jack_set_timebase_callback(client, conditional, timebase_callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_timebase_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_timebase_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_timebase(timebase_callback); @@ -2021,7 +2087,7 @@ bool jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame) #elif defined(JACKBRIDGE_DIRECT) return (jack_transport_locate(client, frame) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().transport_locate_ptr != nullptr) return (getBridgeInstance().transport_locate_ptr(client, frame) == 0); #endif @@ -2034,7 +2100,7 @@ uint32_t jackbridge_transport_query(const jack_client_t* client, jack_position_t #elif defined(JACKBRIDGE_DIRECT) return jack_transport_query(client, pos); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().transport_query_ptr != nullptr) return getBridgeInstance().transport_query_ptr(client, pos); #endif @@ -2054,7 +2120,7 @@ jack_nframes_t jackbridge_get_current_transport_frame(const jack_client_t* clien #elif defined(JACKBRIDGE_DIRECT) return jack_get_current_transport_frame(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_current_transport_frame_ptr != nullptr) return getBridgeInstance().get_current_transport_frame_ptr(client); #endif @@ -2067,7 +2133,7 @@ bool jackbridge_transport_reposition(jack_client_t* client, const jack_position_ #elif defined(JACKBRIDGE_DIRECT) return (jack_transport_reposition(client, pos) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().transport_reposition_ptr != nullptr) return (getBridgeInstance().transport_reposition_ptr(client, pos) == 0); #endif @@ -2080,7 +2146,7 @@ void jackbridge_transport_start(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) jack_transport_start(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().transport_start_ptr != nullptr) getBridgeInstance().transport_start_ptr(client); #endif @@ -2092,7 +2158,7 @@ void jackbridge_transport_stop(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) jack_transport_stop(client); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().transport_stop_ptr != nullptr) getBridgeInstance().transport_stop_ptr(client); #endif @@ -2106,7 +2172,7 @@ bool jackbridge_set_property(jack_client_t* client, jack_uuid_t subject, const c #elif defined(JACKBRIDGE_DIRECT) return (jack_set_property(client, subject, key, value, type) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().set_property_ptr != nullptr) return (getBridgeInstance().set_property_ptr(client, subject, key, value, type) == 0); #endif @@ -2119,7 +2185,7 @@ bool jackbridge_get_property(jack_uuid_t subject, const char* key, char** value, #elif defined(JACKBRIDGE_DIRECT) return (jack_get_property(subject, key, value, type) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_property_ptr != nullptr) return (getBridgeInstance().get_property_ptr(subject, key, value, type) == 0); #endif @@ -2132,7 +2198,7 @@ void jackbridge_free_description(jack_description_t* desc, bool free_description #elif defined(JACKBRIDGE_DIRECT) jack_free_description(desc, free_description_itself); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().free_description_ptr != nullptr) getBridgeInstance().free_description_ptr(desc, free_description_itself); #endif @@ -2144,7 +2210,7 @@ bool jackbridge_get_properties(jack_uuid_t subject, jack_description_t* desc) #elif defined(JACKBRIDGE_DIRECT) return (jack_get_properties(subject, desc) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_properties_ptr != nullptr) return (getBridgeInstance().get_properties_ptr(subject, desc) == 0); #endif @@ -2157,7 +2223,7 @@ bool jackbridge_get_all_properties(jack_description_t** descs) #elif defined(JACKBRIDGE_DIRECT) return (jack_get_all_properties(descs) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().get_all_properties_ptr != nullptr) return (getBridgeInstance().get_all_properties_ptr(descs) == 0); #endif @@ -2170,7 +2236,7 @@ bool jackbridge_remove_property(jack_client_t* client, jack_uuid_t subject, cons #elif defined(JACKBRIDGE_DIRECT) return (jack_remove_property(client, subject, key) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().remove_property_ptr != nullptr) return (getBridgeInstance().remove_property_ptr(client, subject, key) == 0); #endif @@ -2183,7 +2249,7 @@ int jackbridge_remove_properties(jack_client_t* client, jack_uuid_t subject) #elif defined(JACKBRIDGE_DIRECT) return jack_remove_properties(client, subject); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().remove_properties_ptr != nullptr) return getBridgeInstance().remove_properties_ptr(client, subject); #endif @@ -2196,7 +2262,7 @@ bool jackbridge_remove_all_properties(jack_client_t* client) #elif defined(JACKBRIDGE_DIRECT) return (jack_remove_all_properties(client) == 0); #else - if (! JackBridge::usingRtAudio) + if (! JackBridge::usingRtAudioOrSDL) if (getBridgeInstance().remove_all_properties_ptr != nullptr) return (getBridgeInstance().remove_all_properties_ptr(client) == 0); #endif @@ -2209,7 +2275,7 @@ bool jackbridge_set_property_change_callback(jack_client_t* client, JackProperty #elif defined(JACKBRIDGE_DIRECT) return (jack_set_property_change_callback(client, callback, arg) == 0); #else - if (! JackBridge::usingRtAudio && getBridgeInstance().set_property_change_callback_ptr != nullptr) + if (! JackBridge::usingRtAudioOrSDL && getBridgeInstance().set_property_change_callback_ptr != nullptr) { # ifdef __WINE__ WineBridge::getInstance().set_prop_change(callback); diff --git a/distrho/src/jackbridge/JackBridge.hpp b/distrho/src/jackbridge/JackBridge.hpp @@ -300,8 +300,8 @@ JACKBRIDGE_API const char* jackbridge_get_version_string(); JACKBRIDGE_API jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, jack_status_t* status); JACKBRIDGE_API bool jackbridge_client_close(jack_client_t* client); -JACKBRIDGE_API int jackbridge_client_name_size(); -JACKBRIDGE_API char* jackbridge_get_client_name(jack_client_t* client); +JACKBRIDGE_API int jackbridge_client_name_size(); +JACKBRIDGE_API const char* jackbridge_get_client_name(jack_client_t* client); JACKBRIDGE_API char* jackbridge_client_get_uuid(jack_client_t* client); JACKBRIDGE_API char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* name); @@ -408,19 +408,4 @@ JACKBRIDGE_API int jackbridge_remove_properties(jack_client_t* client, jack_uui JACKBRIDGE_API bool jackbridge_remove_all_properties(jack_client_t* client); JACKBRIDGE_API bool jackbridge_set_property_change_callback(jack_client_t* client, JackPropertyChangeCallback callback, void* arg); -JACKBRIDGE_API bool jackbridge_sem_init(void* sem) noexcept; -JACKBRIDGE_API void jackbridge_sem_destroy(void* sem) noexcept; -JACKBRIDGE_API bool jackbridge_sem_connect(void* sem) noexcept; -JACKBRIDGE_API void jackbridge_sem_post(void* sem, bool server) noexcept; -JACKBRIDGE_API bool jackbridge_sem_timedwait(void* sem, uint msecs, bool server) noexcept; - -JACKBRIDGE_API bool jackbridge_shm_is_valid(const void* shm) noexcept; -JACKBRIDGE_API void jackbridge_shm_init(void* shm) noexcept; -JACKBRIDGE_API void jackbridge_shm_attach(void* shm, const char* name) noexcept; -JACKBRIDGE_API void jackbridge_shm_close(void* shm) noexcept; -JACKBRIDGE_API void* jackbridge_shm_map(void* shm, uint64_t size) noexcept; -JACKBRIDGE_API void jackbridge_shm_unmap(void* shm, void* ptr) noexcept; - -JACKBRIDGE_API void jackbridge_parent_deathsig(bool kill) noexcept; - #endif // JACKBRIDGE_HPP_INCLUDED diff --git a/distrho/src/jackbridge/RtAudioBridge.hpp b/distrho/src/jackbridge/RtAudioBridge.hpp @@ -1,6 +1,6 @@ /* * RtAudioBridge for DPF - * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> + * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -167,14 +167,14 @@ struct RtAudioBridge { { bool isAudio, isInput; - if (std::strcmp(type, JACK_DEFAULT_AUDIO_TYPE) == 0) + /**/ if (std::strcmp(type, JACK_DEFAULT_AUDIO_TYPE) == 0) isAudio = true; else if (std::strcmp(type, JACK_DEFAULT_MIDI_TYPE) == 0) isAudio = false; else return nullptr; - if (flags & JackPortIsInput) + /**/ if (flags & JackPortIsInput) isInput = true; else if (flags & JackPortIsOutput) isInput = false; @@ -230,7 +230,7 @@ struct RtAudioBridge { uint i = 0; # if DISTRHO_PLUGIN_NUM_INPUTS > 0 - if (float* const insPtr = (float*)inputBuffer) + if (float* const insPtr = (float*)inputBuffer) { for (uint j=0; j<DISTRHO_PLUGIN_NUM_INPUTS; ++j, ++i) selfAudioBuffers[i] = insPtr + (j * numFrames); diff --git a/distrho/src/jackbridge/SDLBridge.hpp b/distrho/src/jackbridge/SDLBridge.hpp @@ -0,0 +1,216 @@ +/* + * SDLBridge for DPF + * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SDLBRIDGE_HPP_INCLUDED +#define SDLBRIDGE_HPP_INCLUDED + +#include "JackBridge.hpp" +#include "../../extra/RingBuffer.hpp" + +#include <SDL.h> + +struct SDLBridge { + SDL_AudioDeviceID deviceId = 0; + + // SDL information + uint bufferSize = 0; + uint sampleRate = 0; + + // Port caching information + uint numAudioIns = 0; + uint numAudioOuts = 0; + uint numMidiIns = 0; + uint numMidiOuts = 0; + + // JACK callbacks + JackProcessCallback jackProcessCallback = nullptr; + void* jackProcessArg = nullptr; + + // Runtime buffers + enum PortMask { + kPortMaskAudio = 0x1000, + kPortMaskMIDI = 0x2000, + kPortMaskInput = 0x4000, + kPortMaskOutput = 0x8000, + kPortMaskInputMIDI = kPortMaskInput|kPortMaskMIDI, + kPortMaskOutputMIDI = kPortMaskOutput|kPortMaskMIDI, + }; +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + float* audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS]; + float* audioBufferStorage; +#endif +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + HeapRingBuffer midiInBuffer; +#endif +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + HeapRingBuffer midiOutBuffer; +#endif + + bool open(const char* const clientName) + { + SDL_AudioSpec requested, received; + std::memset(&requested, 0, sizeof(requested)); + requested.format = AUDIO_F32SYS; + requested.channels = DISTRHO_PLUGIN_NUM_OUTPUTS; + requested.freq = 48000; + requested.samples = 512; + requested.callback = SDLCallback; + requested.userdata = this; + + SDL_SetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME, clientName); + // SDL_SetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME, ); + SDL_SetHint(SDL_HINT_AUDIO_RESAMPLING_MODE, "2"); + + /* + deviceId = SDL_OpenAudioDevice("PulseAudio", 0, + &requested, &received, + SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); + */ + deviceId = SDL_OpenAudio(&requested, &received) == 0 ? 1 : 0; + DISTRHO_SAFE_ASSERT_RETURN(deviceId != 0, false); + + if (received.channels != DISTRHO_PLUGIN_NUM_OUTPUTS) + { + SDL_CloseAudioDevice(deviceId); + deviceId = 0; + d_stderr2("Invalid or missing audio output channels"); + return false; + } + + bufferSize = received.samples; + sampleRate = received.freq; + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + audioBufferStorage = new float[bufferSize*(DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS)]; +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + std::memset(audioBufferStorage, 0, sizeof(float)*bufferSize*DISTRHO_PLUGIN_NUM_INPUTS); +#endif + + for (uint i=0; i<DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + audioBuffers[i] = audioBufferStorage + (bufferSize * i); +#endif + + return true; + } + + bool close() + { + DISTRHO_SAFE_ASSERT_RETURN(deviceId != 0, false); + + // SDL_CloseAudioDevice(deviceId); + SDL_CloseAudio(); + deviceId = 0; + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + delete[] audioBufferStorage; + audioBufferStorage = nullptr; +#endif + + return true; + } + + bool activate() + { + DISTRHO_SAFE_ASSERT_RETURN(deviceId != 0, false); + + SDL_PauseAudioDevice(deviceId, 0); + return true; + } + + bool deactivate() + { + DISTRHO_SAFE_ASSERT_RETURN(deviceId != 0, false); + + SDL_PauseAudioDevice(deviceId, 1); + return true; + } + + jack_port_t* registerPort(const char* const type, const ulong flags) + { + bool isAudio, isInput; + + /**/ if (std::strcmp(type, JACK_DEFAULT_AUDIO_TYPE) == 0) + isAudio = true; + else if (std::strcmp(type, JACK_DEFAULT_MIDI_TYPE) == 0) + isAudio = false; + else + return nullptr; + + /**/ if (flags & JackPortIsInput) + isInput = true; + else if (flags & JackPortIsOutput) + isInput = false; + else + return nullptr; + + const uintptr_t ret = (isAudio ? kPortMaskAudio : kPortMaskMIDI) + | (isInput ? kPortMaskInput : kPortMaskOutput); + + return (jack_port_t*)(ret + (isAudio ? (isInput ? numAudioIns++ : numAudioOuts++) + : (isInput ? numMidiIns++ : numMidiOuts++))); + } + + void* getPortBuffer(jack_port_t* const port) + { + const uintptr_t portMask = (uintptr_t)port; + DISTRHO_SAFE_ASSERT_RETURN(portMask != 0x0, nullptr); + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + if (portMask & kPortMaskAudio) + return audioBuffers[(portMask & kPortMaskInput ? 0 : DISTRHO_PLUGIN_NUM_INPUTS) + (portMask & 0x0fff)]; +#endif +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if ((portMask & kPortMaskInputMIDI) == kPortMaskInputMIDI) + return &midiInBuffer; +#endif +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + if ((portMask & kPortMaskOutputMIDI) == kPortMaskOutputMIDI) + return &midiOutBuffer; +#endif + + return nullptr; + } + + static void SDLCallback(void* const userData, uchar* const stream, const int len) + { + SDLBridge* const self = (SDLBridge*)userData; + + // safety checks + DISTRHO_SAFE_ASSERT_RETURN(stream != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(len > 0,); + + float* const fstream = (float*)stream; + + if (self->jackProcessCallback == nullptr) + { + std::memset(fstream, 0, len); + return; + } + + const uint numFrames = static_cast<uint>(static_cast<uint>(len) / sizeof(float) / DISTRHO_PLUGIN_NUM_OUTPUTS); + + self->jackProcessCallback(numFrames, self->jackProcessArg); + + for (uint i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + { + for (uint j=0; j < numFrames; ++j) + fstream[j * DISTRHO_PLUGIN_NUM_OUTPUTS + i] = self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS+i][j]; + } + } + +}; + +#endif