@@ -101,6 +101,7 @@ typedef int (JACKSYM_API *JackSymSyncCallback)(jack_transport_state_t, jack_pos
101101typedef void (JACKSYM_API *JackSymTimebaseCallback)(jack_transport_state_t , jack_nframes_t , jack_position_t *, int , void *);
102102typedef void (JACKSYM_API *JackSymSessionCallback)(jack_session_event_t *, void *);
103103typedef void (JACKSYM_API *JackSymPropertyChangeCallback)(jack_uuid_t , const char *, jack_property_change_t , void *);
104+ typedef void * (JACKSYM_API *JackSymThreadCallback)(void *);
104105
105106typedef void (JACKSYM_API *jacksym_get_version)(int *, int *, int *, int *);
106107typedef const char * (JACKSYM_API *jacksym_get_version_string)(void );
@@ -217,6 +218,10 @@ typedef int (JACKSYM_API *jacksym_remove_properties)(jack_client_t*, jack_uuid_
217218typedef int (JACKSYM_API *jacksym_remove_all_properties)(jack_client_t *);
218219typedef int (JACKSYM_API *jacksym_set_property_change_callback)(jack_client_t *, JackSymPropertyChangeCallback, void *);
219220
221+ typedef bool (JACKSYM_API *jacksym_set_process_thread)(jack_client_t *, JackSymThreadCallback callback, void *);
222+ typedef jack_nframes_t (JACKSYM_API *jacksym_cycle_wait)(jack_client_t *);
223+ typedef void (JACKSYM_API *jacksym_cycle_signal)(jack_client_t *, int );
224+
220225#ifdef __WINE__
221226typedef int (JACKSYM_API *jacksym_thread_creator_t )(pthread_t *, const pthread_attr_t *, void *(*)(void *), void*);
222227typedef void (JACKSYM_API *jacksym_set_thread_creator)(jacksym_thread_creator_t );
@@ -344,6 +349,10 @@ struct JackBridge {
344349 jacksym_remove_all_properties remove_all_properties_ptr;
345350 jacksym_set_property_change_callback set_property_change_callback_ptr;
346351
352+ jacksym_set_process_thread set_process_thread_ptr;
353+ jacksym_cycle_wait cycle_wait_ptr;
354+ jacksym_cycle_signal cycle_signal_ptr;
355+
347356 #ifdef __WINE__
348357 jacksym_set_thread_creator set_thread_creator_ptr;
349358 #endif
@@ -441,7 +450,10 @@ struct JackBridge {
441450 remove_property_ptr(nullptr ),
442451 remove_properties_ptr(nullptr ),
443452 remove_all_properties_ptr(nullptr ),
444- set_property_change_callback_ptr(nullptr )
453+ set_property_change_callback_ptr(nullptr ),
454+ set_process_thread_ptr(nullptr ),
455+ cycle_wait_ptr(nullptr ),
456+ cycle_signal_ptr(nullptr )
445457 #ifdef __WINE__
446458 , set_thread_creator_ptr(nullptr )
447459 #endif
@@ -587,6 +599,10 @@ struct JackBridge {
587599 LIB_SYMBOL (remove_all_properties)
588600 LIB_SYMBOL (set_property_change_callback)
589601
602+ LIB_SYMBOL (set_process_thread)
603+ LIB_SYMBOL (cycle_wait)
604+ LIB_SYMBOL (cycle_signal)
605+
590606 #ifdef __WINE__
591607 LIB_SYMBOL (set_thread_creator)
592608 #endif
@@ -650,6 +666,7 @@ struct WineBridge {
650666 JackTimebaseCallback timebase_cb;
651667 JackSessionCallback session_cb;
652668 JackPropertyChangeCallback prop_change_cb;
669+ JackThreadCallback proc_thread_cb;
653670
654671 void * (*creator_func)(void *);
655672 void * creator_arg;
@@ -676,6 +693,7 @@ struct WineBridge {
676693 timebase_cb(nullptr ),
677694 session_cb(nullptr ),
678695 prop_change_cb(nullptr ),
696+ proc_thread_cb(nullptr ),
679697 creator_func(nullptr ),
680698 creator_arg(nullptr ),
681699 creator_handle(nullptr ),
@@ -687,24 +705,25 @@ struct WineBridge {
687705 return bridge;
688706 }
689707
690- void set_latency (JackLatencyCallback cb) noexcept { latency_cb = cb; }
691- void set_process (JackProcessCallback cb) noexcept { process_cb = cb; }
692- void set_thread_init (JackThreadInitCallback cb) noexcept { thread_init_cb = cb; }
693- void set_graph_order (JackGraphOrderCallback cb) noexcept { graph_order_cb = cb; }
694- void set_xrun (JackXRunCallback cb) noexcept { xrun_cb = cb; }
695- void set_bufsize (JackBufferSizeCallback cb) noexcept { bufsize_cb = cb; }
696- void set_srate (JackSampleRateCallback cb) noexcept { srate_cb = cb; }
697- void set_port_reg (JackPortRegistrationCallback cb) noexcept { port_reg_cb = cb; }
698- void set_client_reg (JackClientRegistrationCallback cb) noexcept { client_reg_cb = cb; }
699- void set_port_conn (JackPortConnectCallback cb) noexcept { port_conn_cb = cb; }
700- void set_port_rename (JackPortRenameCallback cb) noexcept { port_rename_cb = cb; }
701- void set_freewheel (JackFreewheelCallback cb) noexcept { freewheel_cb = cb; }
702- void set_shutdown (JackShutdownCallback cb) noexcept { shutdown_cb = cb; }
703- void set_info_shutdown (JackInfoShutdownCallback cb) noexcept { info_shutdown_cb = cb; }
704- void set_sync (JackSyncCallback cb) noexcept { sync_cb = cb; }
705- void set_timebase (JackTimebaseCallback cb) noexcept { timebase_cb = cb; }
706- void set_session (JackSessionCallback cb) noexcept { session_cb = cb; }
707- void set_prop_change (JackPropertyChangeCallback cb) noexcept { prop_change_cb = cb; }
708+ void set_latency (JackLatencyCallback cb) noexcept { latency_cb = cb; }
709+ void set_process (JackProcessCallback cb) noexcept { process_cb = cb; }
710+ void set_thread_init (JackThreadInitCallback cb) noexcept { thread_init_cb = cb; }
711+ void set_graph_order (JackGraphOrderCallback cb) noexcept { graph_order_cb = cb; }
712+ void set_xrun (JackXRunCallback cb) noexcept { xrun_cb = cb; }
713+ void set_bufsize (JackBufferSizeCallback cb) noexcept { bufsize_cb = cb; }
714+ void set_srate (JackSampleRateCallback cb) noexcept { srate_cb = cb; }
715+ void set_port_reg (JackPortRegistrationCallback cb) noexcept { port_reg_cb = cb; }
716+ void set_client_reg (JackClientRegistrationCallback cb) noexcept { client_reg_cb = cb; }
717+ void set_port_conn (JackPortConnectCallback cb) noexcept { port_conn_cb = cb; }
718+ void set_port_rename (JackPortRenameCallback cb) noexcept { port_rename_cb = cb; }
719+ void set_freewheel (JackFreewheelCallback cb) noexcept { freewheel_cb = cb; }
720+ void set_shutdown (JackShutdownCallback cb) noexcept { shutdown_cb = cb; }
721+ void set_info_shutdown (JackInfoShutdownCallback cb) noexcept { info_shutdown_cb = cb; }
722+ void set_sync (JackSyncCallback cb) noexcept { sync_cb = cb; }
723+ void set_timebase (JackTimebaseCallback cb) noexcept { timebase_cb = cb; }
724+ void set_session (JackSessionCallback cb) noexcept { session_cb = cb; }
725+ void set_prop_change (JackPropertyChangeCallback cb) noexcept { prop_change_cb = cb; }
726+ void set_process_thread (JackThreadCallback cb) noexcept { proc_thread_cb = cb; }
708727
709728 static DWORD WINAPI thread_creator_helper (LPVOID )
710729 {
@@ -832,6 +851,11 @@ struct WineBridge {
832851 return getInstance ().prop_change_cb (subject, key, change, arg);
833852 }
834853
854+ static void * process_thread (void * arg)
855+ {
856+ return getInstance ().proc_thread_cb (arg);
857+ }
858+
835859 DISTRHO_DECLARE_NON_COPYABLE (WineBridge);
836860};
837861
@@ -2292,8 +2316,54 @@ bool jackbridge_set_property_change_callback(jack_client_t* client, JackProperty
22922316 return false ;
22932317}
22942318
2319+ bool jackbridge_set_process_thread (jack_client_t * client, JackThreadCallback callback, void * arg)
2320+ {
2321+ #if defined(JACKBRIDGE_DUMMY)
2322+ #elif defined(JACKBRIDGE_DIRECT)
2323+ return (jack_set_process_thread (client, callback, arg) == 0 );
2324+ #else
2325+ if (usingRealJACK && getBridgeInstance ().set_process_thread_ptr != nullptr )
2326+ {
2327+ # ifdef __WINE__
2328+ WineBridge::getInstance ().set_process_thread (callback);
2329+ return (getBridgeInstance ().set_process_thread_ptr (client, WineBridge::process_thread, arg) == 0 );
2330+ # else
2331+ return (getBridgeInstance ().set_process_thread_ptr (client, callback, arg) == 0 );
2332+ # endif
2333+ }
2334+ #endif
2335+ return false ;
2336+ }
2337+
2338+ jack_nframes_t jackbridge_cycle_wait (jack_client_t * client)
2339+ {
2340+ #if defined(JACKBRIDGE_DUMMY)
2341+ #elif defined(JACKBRIDGE_DIRECT)
2342+ return jack_cycle_wait (client);
2343+ #else
2344+ if (usingRealJACK)
2345+ if (getBridgeInstance ().cycle_wait_ptr != nullptr )
2346+ return getBridgeInstance ().cycle_wait_ptr (client);
2347+ #endif
2348+ return 0 ;
2349+ }
2350+
2351+ void jackbridge_cycle_signal (jack_client_t * client, int status)
2352+ {
2353+ #if defined(JACKBRIDGE_DUMMY)
2354+ #elif defined(JACKBRIDGE_DIRECT)
2355+ jack_cycle_signal (client, status);
2356+ #else
2357+ if (usingRealJACK)
2358+ if (getBridgeInstance ().cycle_signal_ptr != nullptr )
2359+ getBridgeInstance ().cycle_signal_ptr (client, status);
2360+ #endif
2361+ }
2362+
22952363// -----------------------------------------------------------------------------
22962364
2365+ #ifndef JACKBRIDGE_SKIP_NATIVE_UTILS
2366+
22972367START_NAMESPACE_DISTRHO
22982368
22992369bool isUsingNativeAudio () noexcept
@@ -2388,4 +2458,6 @@ bool requestMIDI()
23882458
23892459END_NAMESPACE_DISTRHO
23902460
2461+ #endif // JACKBRIDGE_SKIP_NATIVE_UTILS
2462+
23912463// -----------------------------------------------------------------------------
0 commit comments