88#include " JackMidiPort.h"
99#include " JackTools.h"
1010
11- #ifdef _WIN32
12- #else
11+ #ifndef _WIN32
1312# include < fcntl.h>
1413# include < sys/mman.h>
1514# ifdef __APPLE__
@@ -34,7 +33,7 @@ namespace Jack
3433#ifdef __APPLE__
3534static void terminateHandler (void *)
3635{
37- printf (" Desktop driver parent has died, terminating ourselves now\n " );
36+ printf (" MOD Desktop driver parent has died, terminating ourselves now\n " );
3837 fflush (stdout);
3938 kill (getpid (), SIGTERM);
4039}
@@ -95,6 +94,40 @@ class ModDesktopAudioDriver : public JackAudioDriver
9594 mach_port_t task = MACH_PORT_NULL;
9695 semaphore_t sem1 = MACH_PORT_NULL;
9796 semaphore_t sem2 = MACH_PORT_NULL;
97+ mach_port_t port1 = MACH_PORT_NULL;
98+ mach_port_t port2 = MACH_PORT_NULL;
99+
100+ bool connectport (const mach_port_t port, semaphore_t * const sem)
101+ {
102+ mach_port_t reqport;
103+
104+ if (mach_port_allocate (task, MACH_PORT_RIGHT_RECEIVE, &reqport) != KERN_SUCCESS)
105+ return false ;
106+
107+ struct {
108+ mach_msg_header_t hdr;
109+ mach_msg_trailer_t trailer;
110+ } msg;
111+
112+ msg.hdr .msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MOVE_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE);
113+ msg.hdr .msgh_local_port = reqport;
114+ msg.hdr .msgh_remote_port = port;
115+
116+ if (mach_msg (&msg.hdr , MACH_SEND_MSG, sizeof (msg.hdr ), 0 , MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL) != MACH_MSG_SUCCESS)
117+ {
118+ mach_port_destroy (task, reqport);
119+ return false ;
120+ }
121+
122+ if (mach_msg (&msg.hdr , MACH_RCV_MSG, 0 , sizeof (msg), reqport, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL) != MACH_MSG_SUCCESS)
123+ {
124+ mach_port_destroy (task, reqport);
125+ return false ;
126+ }
127+
128+ *sem = msg.hdr .msgh_remote_port ;
129+ return true ;
130+ }
98131
99132 void post ()
100133 {
@@ -289,23 +322,27 @@ class ModDesktopAudioDriver : public JackAudioDriver
289322 #ifdef __APPLE__
290323 task = mach_task_self ();
291324
292- mach_port_t bootport1;
293- if (task_get_bootstrap_port (task, &bootport1) != KERN_SUCCESS ||
294- bootstrap_look_up (bootport1, fShmData ->bootname1 , &sem1) != KERN_SUCCESS)
325+ mach_port_t bootport;
326+ if (task_get_bootstrap_port (task, &bootport) != KERN_SUCCESS)
295327 {
296328 Close ();
297329 jack_error (" Can't open default MOD Desktop driver 4" );
298330 return -1 ;
299331 }
300332
301- mach_port_t bootport2;
302- if (task_get_bootstrap_port (task, &bootport2) != KERN_SUCCESS ||
303- bootstrap_look_up (bootport2, fShmData ->bootname2 , &sem2) != KERN_SUCCESS)
333+ if (bootstrap_look_up (bootport, fShmData ->bootname1 , &port1) != KERN_SUCCESS || !connectport (port1, &sem1))
304334 {
305335 Close ();
306336 jack_error (" Can't open default MOD Desktop driver 5" );
307337 return -1 ;
308338 }
339+
340+ if (bootstrap_look_up (bootport, fShmData ->bootname2 , &port2) != KERN_SUCCESS || !connectport (port2, &sem2))
341+ {
342+ Close ();
343+ jack_error (" Can't open default MOD Desktop driver 6" );
344+ return -1 ;
345+ }
309346 #endif
310347
311348 return 0 ;
@@ -319,6 +356,18 @@ class ModDesktopAudioDriver : public JackAudioDriver
319356 JackAudioDriver::Close ();
320357
321358 #ifdef __APPLE__
359+ if (port1 != MACH_PORT_NULL)
360+ {
361+ mach_port_deallocate (task, port1);
362+ port1 = MACH_PORT_NULL;
363+ }
364+
365+ if (port2 != MACH_PORT_NULL)
366+ {
367+ mach_port_deallocate (task, port2);
368+ port2 = MACH_PORT_NULL;
369+ }
370+
322371 if (sem1 != MACH_PORT_NULL)
323372 {
324373 semaphore_destroy (task, sem1);
0 commit comments