Cross-Platform build scripts for audio plugins
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2727 lines
109KB

  1. diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c
  2. index a800f8e..c06eb89 100644
  3. --- a/src/hostapi/jack/pa_jack.c
  4. +++ b/src/hostapi/jack/pa_jack.c
  5. @@ -59,8 +59,8 @@
  6. #include <math.h>
  7. #include <semaphore.h>
  8. -#include <jack/types.h>
  9. -#include <jack/jack.h>
  10. +#include "JackBridge.c"
  11. +#include <pthread.h>
  12. #include "pa_util.h"
  13. #include "pa_hostapi.h"
  14. @@ -73,7 +73,7 @@
  15. static pthread_t mainThread_;
  16. static char *jackErr_ = NULL;
  17. -static const char* clientName_ = "PortAudio";
  18. +static const char* clientName_ = "MOD Desktop";
  19. #define STRINGIZE_HELPER(expr) #expr
  20. #define STRINGIZE(expr) STRINGIZE_HELPER(expr)
  21. @@ -488,15 +488,15 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  22. * associated with the previous list */
  23. PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory );
  24. - regex_pattern = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() + 3 );
  25. - tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() );
  26. + regex_pattern = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jackbridge_client_name_size() + 3 );
  27. + tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jackbridge_client_name_size() );
  28. /* We can only retrieve the list of clients indirectly, by first
  29. * asking for a list of all ports, then parsing the port names
  30. * according to the client_name:port_name convention (which is
  31. * enforced by jackd)
  32. * A: If jack_get_ports returns NULL, there's nothing for us to do */
  33. - UNLESS( (jack_ports = jack_get_ports( jackApi->jack_client, "", JACK_PORT_TYPE_FILTER, 0 )) && jack_ports[0], paNoError );
  34. + UNLESS( (jack_ports = jackbridge_get_ports( jackApi->jack_client, "", JACK_PORT_TYPE_FILTER, 0 )) && jack_ports[0], paNoError );
  35. /* Find number of ports */
  36. while( jack_ports[numPorts] )
  37. ++numPorts;
  38. @@ -514,7 +514,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  39. /* extract the client name from the port name, using a regex
  40. * that parses the clientname:portname syntax */
  41. UNLESS( !regexec( &port_regex, port, 1, &match_info, 0 ), paInternalError );
  42. - assert(match_info.rm_eo - match_info.rm_so < jack_client_name_size());
  43. + assert(match_info.rm_eo - match_info.rm_so < jackbridge_client_name_size());
  44. memcpy( tmp_client_name, port + match_info.rm_so,
  45. match_info.rm_eo - match_info.rm_so );
  46. tmp_client_name[match_info.rm_eo - match_info.rm_so] = '\0';
  47. @@ -555,7 +555,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  48. /* there is one global sample rate all clients must conform to */
  49. - globalSampleRate = jack_get_sample_rate( jackApi->jack_client );
  50. + globalSampleRate = jackbridge_get_sample_rate( jackApi->jack_client );
  51. UNLESS( commonApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory,
  52. sizeof(PaDeviceInfo*) * numClients ), paInsufficientMemory );
  53. @@ -586,16 +586,16 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  54. sprintf( regex_pattern, "%s:.*", client_names[client_index] );
  55. /* ... what are your output ports (that we could input from)? */
  56. - clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern,
  57. - JACK_PORT_TYPE_FILTER, JackPortIsOutput);
  58. + clientPorts = jackbridge_get_ports( jackApi->jack_client, regex_pattern,
  59. + JACK_PORT_TYPE_FILTER, JackPortIsOutput);
  60. curDevInfo->maxInputChannels = 0;
  61. curDevInfo->defaultLowInputLatency = 0.;
  62. curDevInfo->defaultHighInputLatency = 0.;
  63. if( clientPorts )
  64. {
  65. - jack_port_t *p = jack_port_by_name( jackApi->jack_client, clientPorts[0] );
  66. + jack_port_t *p = jackbridge_port_by_name( jackApi->jack_client, clientPorts[0] );
  67. curDevInfo->defaultLowInputLatency = curDevInfo->defaultHighInputLatency =
  68. - jack_port_get_latency( p ) / globalSampleRate;
  69. + jackbridge_port_get_latency( p ) / globalSampleRate;
  70. for( i = 0; clientPorts[i] != NULL; i++)
  71. {
  72. @@ -603,20 +603,20 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  73. * We don't care what they are, we just care how many */
  74. curDevInfo->maxInputChannels++;
  75. }
  76. - free(clientPorts);
  77. + jackbridge_free(clientPorts);
  78. }
  79. /* ... what are your input ports (that we could output to)? */
  80. - clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern,
  81. - JACK_PORT_TYPE_FILTER, JackPortIsInput);
  82. + clientPorts = jackbridge_get_ports( jackApi->jack_client, regex_pattern,
  83. + JACK_PORT_TYPE_FILTER, JackPortIsInput);
  84. curDevInfo->maxOutputChannels = 0;
  85. curDevInfo->defaultLowOutputLatency = 0.;
  86. curDevInfo->defaultHighOutputLatency = 0.;
  87. if( clientPorts )
  88. {
  89. - jack_port_t *p = jack_port_by_name( jackApi->jack_client, clientPorts[0] );
  90. + jack_port_t *p = jackbridge_port_by_name( jackApi->jack_client, clientPorts[0] );
  91. curDevInfo->defaultLowOutputLatency = curDevInfo->defaultHighOutputLatency =
  92. - jack_port_get_latency( p ) / globalSampleRate;
  93. + jackbridge_port_get_latency( p ) / globalSampleRate;
  94. for( i = 0; clientPorts[i] != NULL; i++)
  95. {
  96. @@ -624,7 +624,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  97. * We don't care what they are, we just care how many */
  98. curDevInfo->maxOutputChannels++;
  99. }
  100. - free(clientPorts);
  101. + jackbridge_free(clientPorts);
  102. }
  103. /* Add this client to the list of devices */
  104. @@ -638,7 +638,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi )
  105. error:
  106. regfree( &port_regex );
  107. - free( jack_ports );
  108. + jackbridge_free( jack_ports );
  109. return result;
  110. }
  111. @@ -730,7 +730,11 @@ PaError PaJack_Initialize( PaUtilHostApiRepresentation **hostApi,
  112. * automatically which we do not want.
  113. */
  114. - jackHostApi->jack_client = jack_client_open( clientName_, JackNoStartServer, &jackStatus );
  115. + if (jackbridge_is_ok())
  116. + jackHostApi->jack_client = jackbridge_client_open( clientName_, JackNoStartServer, &jackStatus );
  117. + else
  118. + jackHostApi->jack_client = NULL;
  119. +
  120. if( !jackHostApi->jack_client )
  121. {
  122. /* the V19 development docs say that if an implementation
  123. @@ -746,7 +750,7 @@ PaError PaJack_Initialize( PaUtilHostApiRepresentation **hostApi,
  124. *hostApi = &jackHostApi->commonHostApiRep;
  125. (*hostApi)->info.structVersion = 1;
  126. (*hostApi)->info.type = paJACK;
  127. - (*hostApi)->info.name = "JACK Audio Connection Kit";
  128. + (*hostApi)->info.name = "JACK";
  129. /* Build a device list by querying the JACK server */
  130. ENSURE_PA( BuildDeviceList( jackHostApi ) );
  131. @@ -778,26 +782,26 @@ PaError PaJack_Initialize( PaUtilHostApiRepresentation **hostApi,
  132. jackHostApi->processQueue = NULL;
  133. jackHostApi->jackIsDown = 0;
  134. - jack_on_shutdown( jackHostApi->jack_client, JackOnShutdown, jackHostApi );
  135. - jack_set_error_function( JackErrorCallback );
  136. - jackHostApi->jack_buffer_size = jack_get_buffer_size ( jackHostApi->jack_client );
  137. + jackbridge_on_shutdown( jackHostApi->jack_client, JackOnShutdown, jackHostApi );
  138. + jackbridge_set_error_function( JackErrorCallback );
  139. + jackHostApi->jack_buffer_size = jackbridge_get_buffer_size ( jackHostApi->jack_client );
  140. /* Don't check for error, may not be supported (deprecated in at least jackdmp) */
  141. - jack_set_sample_rate_callback( jackHostApi->jack_client, JackSrCb, jackHostApi );
  142. - UNLESS( !jack_set_xrun_callback( jackHostApi->jack_client, JackXRunCb, jackHostApi ), paUnanticipatedHostError );
  143. - UNLESS( !jack_set_process_callback( jackHostApi->jack_client, JackCallback, jackHostApi ), paUnanticipatedHostError );
  144. - UNLESS( !jack_activate( jackHostApi->jack_client ), paUnanticipatedHostError );
  145. + jackbridge_set_sample_rate_callback( jackHostApi->jack_client, JackSrCb, jackHostApi );
  146. + UNLESS( jackbridge_set_xrun_callback( jackHostApi->jack_client, JackXRunCb, jackHostApi ), paUnanticipatedHostError );
  147. + UNLESS( jackbridge_set_process_callback( jackHostApi->jack_client, JackCallback, jackHostApi ), paUnanticipatedHostError );
  148. + UNLESS( jackbridge_activate( jackHostApi->jack_client ), paUnanticipatedHostError );
  149. activated = 1;
  150. return result;
  151. error:
  152. if( activated )
  153. - ASSERT_CALL( jack_deactivate( jackHostApi->jack_client ), 0 );
  154. + ASSERT_CALL( jackbridge_deactivate( jackHostApi->jack_client ), true );
  155. if( jackHostApi )
  156. {
  157. if( jackHostApi->jack_client )
  158. - ASSERT_CALL( jack_client_close( jackHostApi->jack_client ), 0 );
  159. + ASSERT_CALL( jackbridge_client_close( jackHostApi->jack_client ), true );
  160. if( jackHostApi->deviceInfoMemory )
  161. {
  162. @@ -817,12 +821,12 @@ static void Terminate( struct PaUtilHostApiRepresentation *hostApi )
  163. /* note: this automatically disconnects all ports, since a deactivated
  164. * client is not allowed to have any ports connected */
  165. - ASSERT_CALL( jack_deactivate( jackHostApi->jack_client ), 0 );
  166. + ASSERT_CALL( jackbridge_deactivate( jackHostApi->jack_client ), true );
  167. ASSERT_CALL( pthread_mutex_destroy( &jackHostApi->mtx ), 0 );
  168. ASSERT_CALL( pthread_cond_destroy( &jackHostApi->cond ), 0 );
  169. - ASSERT_CALL( jack_client_close( jackHostApi->jack_client ), 0 );
  170. + ASSERT_CALL( jackbridge_client_close( jackHostApi->jack_client ), true );
  171. if( jackHostApi->deviceInfoMemory )
  172. {
  173. @@ -915,7 +919,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
  174. /* check that the device supports sampleRate */
  175. #define ABS(x) ( (x) > 0 ? (x) : -(x) )
  176. - if( ABS(sampleRate - jack_get_sample_rate(((PaJackHostApiRepresentation *) hostApi)->jack_client )) > 1 )
  177. + if( ABS(sampleRate - jackbridge_get_sample_rate(((PaJackHostApiRepresentation *) hostApi)->jack_client )) > 1 )
  178. return paInvalidSampleRate;
  179. #undef ABS
  180. @@ -980,12 +984,12 @@ static void CleanUpStream( PaJackStream *stream, int terminateStreamRepresentati
  181. for( i = 0; i < stream->num_incoming_connections; ++i )
  182. {
  183. if( stream->local_input_ports[i] )
  184. - ASSERT_CALL( jack_port_unregister( stream->jack_client, stream->local_input_ports[i] ), 0 );
  185. + ASSERT_CALL( jackbridge_port_unregister( stream->jack_client, stream->local_input_ports[i] ), 0 );
  186. }
  187. for( i = 0; i < stream->num_outgoing_connections; ++i )
  188. {
  189. if( stream->local_output_ports[i] )
  190. - ASSERT_CALL( jack_port_unregister( stream->jack_client, stream->local_output_ports[i] ), 0 );
  191. + ASSERT_CALL( jackbridge_port_unregister( stream->jack_client, stream->local_output_ports[i] ), 0 );
  192. }
  193. if( terminateStreamRepresentation )
  194. @@ -1077,14 +1081,14 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  195. PaError result = paNoError;
  196. PaJackHostApiRepresentation *jackHostApi = (PaJackHostApiRepresentation*)hostApi;
  197. PaJackStream *stream = NULL;
  198. - char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() );
  199. - unsigned long regexSz = jack_client_name_size() + 3;
  200. + char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jackbridge_port_name_size() );
  201. + unsigned long regexSz = jackbridge_client_name_size() + 3;
  202. char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regexSz );
  203. const char **jack_ports = NULL;
  204. - /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */
  205. + /* int jack_max_buffer_size = jackbridge_get_buffer_size( jackHostApi->jack_client ); */
  206. int i;
  207. int inputChannelCount, outputChannelCount;
  208. - const double jackSr = jack_get_sample_rate( jackHostApi->jack_client );
  209. + const double jackSr = jackbridge_get_sample_rate( jackHostApi->jack_client );
  210. PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0;
  211. int bpInitialized = 0, srInitialized = 0; /* Initialized buffer processor and stream representation? */
  212. unsigned long ofs;
  213. @@ -1178,7 +1182,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  214. latency = outputParameters->suggestedLatency;
  215. /* the latency the user asked for indicates the minimum buffer size in frames */
  216. - minimum_buffer_frames = (int) (latency * jack_get_sample_rate( jackHostApi->jack_client ));
  217. + minimum_buffer_frames = (int) (latency * jackbridge_get_sample_rate( jackHostApi->jack_client ));
  218. /* we also need to be able to store at least three full jack buffers to avoid dropouts */
  219. if( jackHostApi->jack_buffer_size * 3 > minimum_buffer_frames )
  220. @@ -1211,8 +1215,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  221. ofs = jackHostApi->inputBase;
  222. for( i = 0; i < inputChannelCount; i++ )
  223. {
  224. - snprintf( port_string, jack_port_name_size(), "in_%lu", ofs + i );
  225. - UNLESS( stream->local_input_ports[i] = jack_port_register(
  226. + snprintf( port_string, jackbridge_port_name_size(), "in_%lu", ofs + i );
  227. + UNLESS( stream->local_input_ports[i] = jackbridge_port_register(
  228. jackHostApi->jack_client, port_string,
  229. JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ), paInsufficientMemory );
  230. }
  231. @@ -1221,8 +1225,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  232. ofs = jackHostApi->outputBase;
  233. for( i = 0; i < outputChannelCount; i++ )
  234. {
  235. - snprintf( port_string, jack_port_name_size(), "out_%lu", ofs + i );
  236. - UNLESS( stream->local_output_ports[i] = jack_port_register(
  237. + snprintf( port_string, jackbridge_port_name_size(), "out_%lu", ofs + i );
  238. + UNLESS( stream->local_output_ports[i] = jackbridge_port_register(
  239. jackHostApi->jack_client, port_string,
  240. JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ), paInsufficientMemory );
  241. }
  242. @@ -1238,18 +1242,18 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  243. /* Get output ports of our capture device */
  244. snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ inputParameters->device ]->name );
  245. - UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern,
  246. + UNLESS( jack_ports = jackbridge_get_ports( jackHostApi->jack_client, regex_pattern,
  247. JACK_PORT_TYPE_FILTER, JackPortIsOutput ), paUnanticipatedHostError );
  248. for( i = 0; i < inputChannelCount && jack_ports[i]; i++ )
  249. {
  250. - if( (stream->remote_output_ports[i] = jack_port_by_name(
  251. + if( (stream->remote_output_ports[i] = jackbridge_port_by_name(
  252. jackHostApi->jack_client, jack_ports[i] )) == NULL )
  253. {
  254. err = 1;
  255. break;
  256. }
  257. }
  258. - free( jack_ports );
  259. + jackbridge_free( jack_ports );
  260. UNLESS( !err, paInsufficientMemory );
  261. /* Fewer ports than expected? */
  262. @@ -1262,18 +1266,18 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  263. /* Get input ports of our playback device */
  264. snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ outputParameters->device ]->name );
  265. - UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern,
  266. + UNLESS( jack_ports = jackbridge_get_ports( jackHostApi->jack_client, regex_pattern,
  267. JACK_PORT_TYPE_FILTER, JackPortIsInput ), paUnanticipatedHostError );
  268. for( i = 0; i < outputChannelCount && jack_ports[i]; i++ )
  269. {
  270. - if( (stream->remote_input_ports[i] = jack_port_by_name(
  271. + if( (stream->remote_input_ports[i] = jackbridge_port_by_name(
  272. jackHostApi->jack_client, jack_ports[i] )) == 0 )
  273. {
  274. err = 1;
  275. break;
  276. }
  277. }
  278. - free( jack_ports );
  279. + jackbridge_free( jack_ports );
  280. UNLESS( !err , paInsufficientMemory );
  281. /* Fewer ports than expected? */
  282. @@ -1298,16 +1302,16 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
  283. bpInitialized = 1;
  284. if( stream->num_incoming_connections > 0 )
  285. - stream->streamRepresentation.streamInfo.inputLatency = (jack_port_get_latency( stream->remote_output_ports[0] )
  286. - - jack_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */
  287. + stream->streamRepresentation.streamInfo.inputLatency = (jackbridge_port_get_latency( stream->remote_output_ports[0] )
  288. + - jackbridge_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */
  289. + PaUtil_GetBufferProcessorInputLatencyFrames( &stream->bufferProcessor )) / sampleRate;
  290. if( stream->num_outgoing_connections > 0 )
  291. - stream->streamRepresentation.streamInfo.outputLatency = (jack_port_get_latency( stream->remote_input_ports[0] )
  292. - - jack_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */
  293. + stream->streamRepresentation.streamInfo.outputLatency = (jackbridge_port_get_latency( stream->remote_input_ports[0] )
  294. + - jackbridge_get_buffer_size( jackHostApi->jack_client ) /* One buffer is not counted as latency */
  295. + PaUtil_GetBufferProcessorOutputLatencyFrames( &stream->bufferProcessor )) / sampleRate;
  296. stream->streamRepresentation.streamInfo.sampleRate = jackSr;
  297. - stream->t0 = jack_frame_time( jackHostApi->jack_client ); /* A: Time should run from Pa_OpenStream */
  298. + stream->t0 = jackbridge_frame_time( jackHostApi->jack_client ); /* A: Time should run from Pa_OpenStream */
  299. /* Add to queue of opened streams */
  300. ENSURE_PA( AddStream( stream ) );
  301. @@ -1346,7 +1350,7 @@ static PaError RealProcess( PaJackStream *stream, jack_nframes_t frames )
  302. PaStreamCallbackTimeInfo timeInfo = {0,0,0};
  303. int chn;
  304. int framesProcessed;
  305. - const double sr = jack_get_sample_rate( stream->jack_client ); /* Shouldn't change during the process callback */
  306. + const double sr = jackbridge_get_sample_rate( stream->jack_client ); /* Shouldn't change during the process callback */
  307. PaStreamCallbackFlags cbFlags = 0;
  308. /* If the user has returned !paContinue from the callback we'll want to flush the internal buffers,
  309. @@ -1362,12 +1366,12 @@ static PaError RealProcess( PaJackStream *stream, jack_nframes_t frames )
  310. goto end;
  311. }
  312. - timeInfo.currentTime = (jack_frame_time( stream->jack_client ) - stream->t0) / sr;
  313. + timeInfo.currentTime = (jackbridge_frame_time( stream->jack_client ) - stream->t0) / sr;
  314. if( stream->num_incoming_connections > 0 )
  315. - timeInfo.inputBufferAdcTime = timeInfo.currentTime - jack_port_get_latency( stream->remote_output_ports[0] )
  316. + timeInfo.inputBufferAdcTime = timeInfo.currentTime - jackbridge_port_get_latency( stream->remote_output_ports[0] )
  317. / sr;
  318. if( stream->num_outgoing_connections > 0 )
  319. - timeInfo.outputBufferDacTime = timeInfo.currentTime + jack_port_get_latency( stream->remote_input_ports[0] )
  320. + timeInfo.outputBufferDacTime = timeInfo.currentTime + jackbridge_port_get_latency( stream->remote_input_ports[0] )
  321. / sr;
  322. PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer );
  323. @@ -1389,7 +1393,7 @@ static PaError RealProcess( PaJackStream *stream, jack_nframes_t frames )
  324. for( chn = 0; chn < stream->num_incoming_connections; chn++ )
  325. {
  326. jack_default_audio_sample_t *channel_buf = (jack_default_audio_sample_t*)
  327. - jack_port_get_buffer( stream->local_input_ports[chn],
  328. + jackbridge_port_get_buffer( stream->local_input_ports[chn],
  329. frames );
  330. PaUtil_SetNonInterleavedInputChannel( &stream->bufferProcessor,
  331. @@ -1400,7 +1404,7 @@ static PaError RealProcess( PaJackStream *stream, jack_nframes_t frames )
  332. for( chn = 0; chn < stream->num_outgoing_connections; chn++ )
  333. {
  334. jack_default_audio_sample_t *channel_buf = (jack_default_audio_sample_t*)
  335. - jack_port_get_buffer( stream->local_output_ports[chn],
  336. + jackbridge_port_get_buffer( stream->local_output_ports[chn],
  337. frames );
  338. PaUtil_SetNonInterleavedOutputChannel( &stream->bufferProcessor,
  339. @@ -1424,7 +1428,7 @@ static PaError UpdateQueue( PaJackHostApiRepresentation *hostApi )
  340. {
  341. PaError result = paNoError;
  342. int queueModified = 0;
  343. - const double jackSr = jack_get_sample_rate( hostApi->jack_client );
  344. + const double jackSr = jackbridge_get_sample_rate( hostApi->jack_client );
  345. int err;
  346. if( (err = pthread_mutex_trylock( &hostApi->mtx )) != 0 )
  347. @@ -1559,7 +1563,7 @@ static int JackCallback( jack_nframes_t frames, void *userData )
  348. PA_DEBUG(( "Silencing the output\n" ));
  349. for( i = 0; i < stream->num_outgoing_connections; ++i )
  350. {
  351. - jack_default_audio_sample_t *buffer = jack_port_get_buffer( stream->local_output_ports[i], frames );
  352. + jack_default_audio_sample_t *buffer = jackbridge_port_get_buffer( stream->local_output_ports[i], frames );
  353. memset( buffer, 0, sizeof (jack_default_audio_sample_t) * frames );
  354. }
  355. @@ -1606,9 +1610,9 @@ static PaError StartStream( PaStream *s )
  356. {
  357. for( i = 0; i < stream->num_incoming_connections; i++ )
  358. {
  359. - int r = jack_connect( stream->jack_client, jack_port_name( stream->remote_output_ports[i] ),
  360. - jack_port_name( stream->local_input_ports[i] ) );
  361. - UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError );
  362. + bool r = jackbridge_connect( stream->jack_client, jackbridge_port_name( stream->remote_output_ports[i] ),
  363. + jackbridge_port_name( stream->local_input_ports[i] ) );
  364. + UNLESS( r, paUnanticipatedHostError );
  365. }
  366. }
  367. @@ -1616,9 +1620,9 @@ static PaError StartStream( PaStream *s )
  368. {
  369. for( i = 0; i < stream->num_outgoing_connections; i++ )
  370. {
  371. - int r = jack_connect( stream->jack_client, jack_port_name( stream->local_output_ports[i] ),
  372. - jack_port_name( stream->remote_input_ports[i] ) );
  373. - UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError );
  374. + bool r = jackbridge_connect( stream->jack_client, jackbridge_port_name( stream->local_output_ports[i] ),
  375. + jackbridge_port_name( stream->remote_input_ports[i] ) );
  376. + UNLESS( r, paUnanticipatedHostError );
  377. }
  378. }
  379. @@ -1685,17 +1689,17 @@ error:
  380. {
  381. for( i = 0; i < stream->num_incoming_connections; i++ )
  382. {
  383. - if( jack_port_connected( stream->local_input_ports[i] ) )
  384. + if( jackbridge_port_connected( stream->local_input_ports[i] ) )
  385. {
  386. - UNLESS( !jack_port_disconnect( stream->jack_client, stream->local_input_ports[i] ),
  387. + UNLESS( jackbridge_port_disconnect( stream->jack_client, stream->local_input_ports[i] ),
  388. paUnanticipatedHostError );
  389. }
  390. }
  391. for( i = 0; i < stream->num_outgoing_connections; i++ )
  392. {
  393. - if( jack_port_connected( stream->local_output_ports[i] ) )
  394. + if( jackbridge_port_connected( stream->local_output_ports[i] ) )
  395. {
  396. - UNLESS( !jack_port_disconnect( stream->jack_client, stream->local_output_ports[i] ),
  397. + UNLESS( jackbridge_port_disconnect( stream->jack_client, stream->local_output_ports[i] ),
  398. paUnanticipatedHostError );
  399. }
  400. }
  401. @@ -1735,7 +1739,7 @@ static PaTime GetStreamTime( PaStream *s )
  402. PaJackStream *stream = (PaJackStream*)s;
  403. /* A: Is this relevant?? --> TODO: what if we're recording-only? */
  404. - return (jack_frame_time( stream->jack_client ) - stream->t0) / (PaTime)jack_get_sample_rate( stream->jack_client );
  405. + return (jackbridge_frame_time( stream->jack_client ) - stream->t0) / (PaTime)jackbridge_get_sample_rate( stream->jack_client );
  406. }
  407. @@ -1747,7 +1751,7 @@ static double GetStreamCpuLoad( PaStream* s )
  408. PaError PaJack_SetClientName( const char* name )
  409. {
  410. - if( strlen( name ) > jack_client_name_size() )
  411. + if( strlen( name ) > jackbridge_client_name_size() )
  412. {
  413. /* OK, I don't know any better error code */
  414. return paInvalidFlag;
  415. @@ -1762,7 +1766,7 @@ PaError PaJack_GetClientName(const char** clientName)
  416. PaJackHostApiRepresentation* jackHostApi = NULL;
  417. PaJackHostApiRepresentation** ref = &jackHostApi;
  418. ENSURE_PA( PaUtil_GetHostApiRepresentation( (PaUtilHostApiRepresentation**)ref, paJACK ) );
  419. - *clientName = jack_get_client_name( jackHostApi->jack_client );
  420. + *clientName = jackbridge_get_client_name( jackHostApi->jack_client );
  421. error:
  422. return result;
  423. diff --git a/src/hostapi/jack/JackBridge.c b/src/hostapi/jack/JackBridge.c
  424. new file mode 100644
  425. index 0000000..5d83b1d
  426. --- /dev/null
  427. +++ b/src/hostapi/jack/JackBridge.c
  428. @@ -0,0 +1,1820 @@
  429. +/*
  430. + * JackBridge for DPF
  431. + * Copyright (C) 2013-2022 Filipe Coelho <falktx@falktx.com>
  432. + *
  433. + * Permission to use, copy, modify, and/or distribute this software for any purpose with
  434. + * or without fee is hereby granted, provided that the above copyright notice and this
  435. + * permission notice appear in all copies.
  436. + *
  437. + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  438. + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  439. + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  440. + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  441. + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  442. + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  443. + */
  444. +
  445. +#include "JackBridge.h"
  446. +
  447. +#ifdef _WIN32
  448. +# define JACKSYM_API __cdecl
  449. +#else
  450. +# define JACKSYM_API
  451. +#endif
  452. +
  453. +#include <dlfcn.h>
  454. +#include <errno.h>
  455. +typedef void* lib_t;
  456. +
  457. +// -----------------------------------------------------------------------------
  458. +
  459. +typedef void (JACKSYM_API *JackSymLatencyCallback)(jack_latency_callback_mode_t, void*);
  460. +typedef int (JACKSYM_API *JackSymProcessCallback)(jack_nframes_t, void*);
  461. +typedef void (JACKSYM_API *JackSymThreadInitCallback)(void*);
  462. +typedef int (JACKSYM_API *JackSymGraphOrderCallback)(void*);
  463. +typedef int (JACKSYM_API *JackSymXRunCallback)(void*);
  464. +typedef int (JACKSYM_API *JackSymBufferSizeCallback)(jack_nframes_t, void*);
  465. +typedef int (JACKSYM_API *JackSymSampleRateCallback)(jack_nframes_t, void*);
  466. +typedef void (JACKSYM_API *JackSymPortRegistrationCallback)(jack_port_id_t, int, void*);
  467. +typedef void (JACKSYM_API *JackSymClientRegistrationCallback)(const char*, int, void*);
  468. +typedef void (JACKSYM_API *JackSymPortConnectCallback)(jack_port_id_t, jack_port_id_t, int, void*);
  469. +typedef void (JACKSYM_API *JackSymPortRenameCallback)(jack_port_id_t, const char*, const char*, void*);
  470. +typedef void (JACKSYM_API *JackSymFreewheelCallback)(int, void*);
  471. +typedef void (JACKSYM_API *JackSymShutdownCallback)(void*);
  472. +typedef void (JACKSYM_API *JackSymInfoShutdownCallback)(jack_status_t, const char*, void*);
  473. +typedef int (JACKSYM_API *JackSymSyncCallback)(jack_transport_state_t, jack_position_t*, void*);
  474. +typedef void (JACKSYM_API *JackSymTimebaseCallback)(jack_transport_state_t, jack_nframes_t, jack_position_t*, int, void*);
  475. +typedef void (JACKSYM_API *JackSymSessionCallback)(jack_session_event_t*, void*);
  476. +typedef void (JACKSYM_API *JackSymPropertyChangeCallback)(jack_uuid_t, const char*, jack_property_change_t, void*);
  477. +typedef void* (JACKSYM_API *JackSymThreadCallback)(void*);
  478. +
  479. +typedef void (JACKSYM_API *jacksym_get_version)(int*, int*, int*, int*);
  480. +typedef const char* (JACKSYM_API *jacksym_get_version_string)(void);
  481. +
  482. +typedef jack_client_t* (JACKSYM_API *jacksym_client_open)(const char*, jack_options_t, jack_status_t*, ...);
  483. +typedef int (JACKSYM_API *jacksym_client_close)(jack_client_t*);
  484. +
  485. +typedef int (JACKSYM_API *jacksym_client_name_size)(void);
  486. +typedef char* (JACKSYM_API *jacksym_get_client_name)(jack_client_t*);
  487. +
  488. +typedef char* (JACKSYM_API *jacksym_client_get_uuid)(jack_client_t*);
  489. +typedef char* (JACKSYM_API *jacksym_get_uuid_for_client_name)(jack_client_t*, const char*);
  490. +typedef char* (JACKSYM_API *jacksym_get_client_name_by_uuid)(jack_client_t*, const char*);
  491. +
  492. +typedef int (JACKBRIDGE_API *jacksym_uuid_parse)(const char*, jack_uuid_t*);
  493. +typedef void (JACKBRIDGE_API *jacksym_uuid_unparse)(jack_uuid_t, char buf[JACK_UUID_STRING_SIZE]);
  494. +
  495. +typedef int (JACKSYM_API *jacksym_activate)(jack_client_t*);
  496. +typedef int (JACKSYM_API *jacksym_deactivate)(jack_client_t*);
  497. +typedef int (JACKSYM_API *jacksym_is_realtime)(jack_client_t*);
  498. +
  499. +typedef int (JACKSYM_API *jacksym_set_thread_init_callback)(jack_client_t*, JackSymThreadInitCallback, void*);
  500. +typedef void (JACKSYM_API *jacksym_on_shutdown)(jack_client_t*, JackSymShutdownCallback, void*);
  501. +typedef void (JACKSYM_API *jacksym_on_info_shutdown)(jack_client_t*, JackSymInfoShutdownCallback, void*);
  502. +typedef int (JACKSYM_API *jacksym_set_process_callback)(jack_client_t*, JackSymProcessCallback, void*);
  503. +typedef int (JACKSYM_API *jacksym_set_freewheel_callback)(jack_client_t*, JackSymFreewheelCallback, void*);
  504. +typedef int (JACKSYM_API *jacksym_set_buffer_size_callback)(jack_client_t*, JackSymBufferSizeCallback, void*);
  505. +typedef int (JACKSYM_API *jacksym_set_sample_rate_callback)(jack_client_t*, JackSymSampleRateCallback, void*);
  506. +typedef int (JACKSYM_API *jacksym_set_client_registration_callback)(jack_client_t*, JackSymClientRegistrationCallback, void*);
  507. +typedef int (JACKSYM_API *jacksym_set_port_registration_callback)(jack_client_t*, JackSymPortRegistrationCallback, void*);
  508. +typedef int (JACKSYM_API *jacksym_set_port_rename_callback)(jack_client_t*, JackSymPortRenameCallback, void*);
  509. +typedef int (JACKSYM_API *jacksym_set_port_connect_callback)(jack_client_t*, JackSymPortConnectCallback, void*);
  510. +typedef int (JACKSYM_API *jacksym_set_graph_order_callback)(jack_client_t*, JackSymGraphOrderCallback, void*);
  511. +typedef int (JACKSYM_API *jacksym_set_xrun_callback)(jack_client_t*, JackSymXRunCallback, void*);
  512. +typedef int (JACKSYM_API *jacksym_set_latency_callback)(jack_client_t*, JackSymLatencyCallback, void*);
  513. +
  514. +typedef int (JACKSYM_API *jacksym_set_freewheel)(jack_client_t*, int);
  515. +typedef int (JACKSYM_API *jacksym_set_buffer_size)(jack_client_t*, jack_nframes_t);
  516. +
  517. +typedef jack_nframes_t (JACKSYM_API *jacksym_get_sample_rate)(jack_client_t*);
  518. +typedef jack_nframes_t (JACKSYM_API *jacksym_get_buffer_size)(jack_client_t*);
  519. +typedef float (JACKSYM_API *jacksym_cpu_load)(jack_client_t*);
  520. +
  521. +typedef jack_port_t* (JACKSYM_API *jacksym_port_register)(jack_client_t*, const char*, const char*, ulong, ulong);
  522. +typedef int (JACKSYM_API *jacksym_port_unregister)(jack_client_t*, jack_port_t*);
  523. +typedef void* (JACKSYM_API *jacksym_port_get_buffer)(jack_port_t*, jack_nframes_t);
  524. +
  525. +typedef const char* (JACKSYM_API *jacksym_port_name)(const jack_port_t*);
  526. +typedef jack_uuid_t (JACKSYM_API *jacksym_port_uuid)(const jack_port_t*);
  527. +typedef const char* (JACKSYM_API *jacksym_port_short_name)(const jack_port_t*);
  528. +typedef int (JACKSYM_API *jacksym_port_flags)(const jack_port_t*);
  529. +typedef const char* (JACKSYM_API *jacksym_port_type)(const jack_port_t*);
  530. +typedef int (JACKSYM_API *jacksym_port_is_mine)(const jack_client_t*, const jack_port_t*);
  531. +typedef int (JACKSYM_API *jacksym_port_connected)(const jack_port_t*);
  532. +typedef int (JACKSYM_API *jacksym_port_connected_to)(const jack_port_t*, const char*);
  533. +typedef const char** (JACKSYM_API *jacksym_port_get_connections)(const jack_port_t*);
  534. +typedef const char** (JACKSYM_API *jacksym_port_get_all_connections)(const jack_client_t*, const jack_port_t*);
  535. +
  536. +typedef int (JACKSYM_API *jacksym_port_rename)(jack_client_t*, jack_port_t*, const char*);
  537. +typedef int (JACKSYM_API *jacksym_port_set_name)(jack_port_t*, const char*);
  538. +typedef int (JACKSYM_API *jacksym_port_set_alias)(jack_port_t*, const char*);
  539. +typedef int (JACKSYM_API *jacksym_port_unset_alias)(jack_port_t*, const char*);
  540. +typedef int (JACKSYM_API *jacksym_port_get_aliases)(const jack_port_t*, char* const aliases[2]);
  541. +
  542. +typedef int (JACKSYM_API *jacksym_port_request_monitor)(jack_port_t*, int);
  543. +typedef int (JACKSYM_API *jacksym_port_request_monitor_by_name)(jack_client_t*, const char*, int);
  544. +typedef int (JACKSYM_API *jacksym_port_ensure_monitor)(jack_port_t*, int);
  545. +typedef int (JACKSYM_API *jacksym_port_monitoring_input)(jack_port_t*);
  546. +
  547. +typedef int (JACKSYM_API *jacksym_connect)(jack_client_t*, const char*, const char*);
  548. +typedef int (JACKSYM_API *jacksym_disconnect)(jack_client_t*, const char*, const char*);
  549. +typedef int (JACKSYM_API *jacksym_port_disconnect)(jack_client_t*, jack_port_t*);
  550. +
  551. +typedef int (JACKSYM_API *jacksym_port_name_size)(void);
  552. +typedef int (JACKSYM_API *jacksym_port_type_size)(void);
  553. +typedef size_t (JACKSYM_API *jacksym_port_type_get_buffer_size)(jack_client_t*, const char*);
  554. +
  555. +typedef void (JACKSYM_API *jacksym_port_get_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  556. +typedef void (JACKSYM_API *jacksym_port_set_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  557. +typedef int (JACKSYM_API *jacksym_recompute_total_latencies)(jack_client_t*);
  558. +
  559. +typedef const char** (JACKSYM_API *jacksym_get_ports)(jack_client_t*, const char*, const char*, ulong);
  560. +typedef jack_port_t* (JACKSYM_API *jacksym_port_by_name)(jack_client_t*, const char*);
  561. +typedef jack_port_t* (JACKSYM_API *jacksym_port_by_id)(jack_client_t*, jack_port_id_t);
  562. +
  563. +typedef void (JACKSYM_API *jacksym_free)(void*);
  564. +
  565. +typedef uint32_t (JACKSYM_API *jacksym_midi_get_event_count)(void*);
  566. +typedef int (JACKSYM_API *jacksym_midi_event_get)(jack_midi_event_t*, void*, uint32_t);
  567. +typedef void (JACKSYM_API *jacksym_midi_clear_buffer)(void*);
  568. +typedef int (JACKSYM_API *jacksym_midi_event_write)(void*, jack_nframes_t, const jack_midi_data_t*, size_t);
  569. +typedef jack_midi_data_t* (JACKSYM_API *jacksym_midi_event_reserve)(void*, jack_nframes_t, size_t);
  570. +
  571. +typedef int (JACKSYM_API *jacksym_release_timebase)(jack_client_t*);
  572. +typedef int (JACKSYM_API *jacksym_set_sync_callback)(jack_client_t*, JackSymSyncCallback, void*);
  573. +typedef int (JACKSYM_API *jacksym_set_sync_timeout)(jack_client_t*, jack_time_t);
  574. +typedef int (JACKSYM_API *jacksym_set_timebase_callback)(jack_client_t*, int, JackSymTimebaseCallback, void*);
  575. +typedef int (JACKSYM_API *jacksym_transport_locate)(jack_client_t*, jack_nframes_t);
  576. +
  577. +typedef jack_transport_state_t (JACKSYM_API *jacksym_transport_query)(const jack_client_t*, jack_position_t*);
  578. +typedef jack_nframes_t (JACKSYM_API *jacksym_get_current_transport_frame)(const jack_client_t*);
  579. +
  580. +typedef int (JACKSYM_API *jacksym_transport_reposition)(jack_client_t*, const jack_position_t*);
  581. +typedef void (JACKSYM_API *jacksym_transport_start)(jack_client_t*);
  582. +typedef void (JACKSYM_API *jacksym_transport_stop)(jack_client_t*);
  583. +
  584. +typedef int (JACKSYM_API *jacksym_set_property)(jack_client_t*, jack_uuid_t, const char*, const char*, const char*);
  585. +typedef int (JACKSYM_API *jacksym_get_property)(jack_uuid_t, const char*, char**, char**);
  586. +typedef void (JACKSYM_API *jacksym_free_description)(jack_description_t*, int);
  587. +typedef int (JACKSYM_API *jacksym_get_properties)(jack_uuid_t, jack_description_t*);
  588. +typedef int (JACKSYM_API *jacksym_get_all_properties)(jack_description_t**);
  589. +typedef int (JACKSYM_API *jacksym_remove_property)(jack_client_t*, jack_uuid_t, const char*);
  590. +typedef int (JACKSYM_API *jacksym_remove_properties)(jack_client_t*, jack_uuid_t);
  591. +typedef int (JACKSYM_API *jacksym_remove_all_properties)(jack_client_t*);
  592. +typedef int (JACKSYM_API *jacksym_set_property_change_callback)(jack_client_t*, JackSymPropertyChangeCallback, void*);
  593. +
  594. +typedef bool (JACKSYM_API *jacksym_set_process_thread)(jack_client_t*, JackSymThreadCallback callback, void*);
  595. +typedef jack_nframes_t (JACKSYM_API *jacksym_cycle_wait)(jack_client_t*);
  596. +typedef void (JACKSYM_API *jacksym_cycle_signal)(jack_client_t*, int);
  597. +
  598. +typedef jack_nframes_t (JACKSYM_API *jacksym_port_get_latency)(jack_port_t*);
  599. +typedef jack_nframes_t (JACKSYM_API *jacksym_frame_time)(const jack_client_t*);
  600. +
  601. +// -----------------------------------------------------------------------------
  602. +
  603. +typedef struct JackBridge {
  604. + lib_t lib;
  605. +
  606. + jacksym_get_version get_version_ptr;
  607. + jacksym_get_version_string get_version_string_ptr;
  608. +
  609. + jacksym_client_open client_open_ptr;
  610. + jacksym_client_close client_close_ptr;
  611. +
  612. + jacksym_client_name_size client_name_size_ptr;
  613. + jacksym_get_client_name get_client_name_ptr;
  614. +
  615. + jacksym_client_get_uuid client_get_uuid_ptr;
  616. + jacksym_get_uuid_for_client_name get_uuid_for_client_name_ptr;
  617. + jacksym_get_client_name_by_uuid get_client_name_by_uuid_ptr;
  618. +
  619. + jacksym_uuid_parse uuid_parse_ptr;
  620. + jacksym_uuid_unparse uuid_unparse_ptr;
  621. +
  622. + jacksym_activate activate_ptr;
  623. + jacksym_deactivate deactivate_ptr;
  624. + jacksym_is_realtime is_realtime_ptr;
  625. +
  626. + jacksym_set_thread_init_callback set_thread_init_callback_ptr;
  627. + jacksym_on_shutdown on_shutdown_ptr;
  628. + jacksym_on_info_shutdown on_info_shutdown_ptr;
  629. + jacksym_set_process_callback set_process_callback_ptr;
  630. + jacksym_set_freewheel_callback set_freewheel_callback_ptr;
  631. + jacksym_set_buffer_size_callback set_buffer_size_callback_ptr;
  632. + jacksym_set_sample_rate_callback set_sample_rate_callback_ptr;
  633. + jacksym_set_client_registration_callback set_client_registration_callback_ptr;
  634. + jacksym_set_port_registration_callback set_port_registration_callback_ptr;
  635. + jacksym_set_port_rename_callback set_port_rename_callback_ptr;
  636. + jacksym_set_port_connect_callback set_port_connect_callback_ptr;
  637. + jacksym_set_graph_order_callback set_graph_order_callback_ptr;
  638. + jacksym_set_xrun_callback set_xrun_callback_ptr;
  639. + jacksym_set_latency_callback set_latency_callback_ptr;
  640. +
  641. + jacksym_set_freewheel set_freewheel_ptr;
  642. + jacksym_set_buffer_size set_buffer_size_ptr;
  643. +
  644. + jacksym_get_sample_rate get_sample_rate_ptr;
  645. + jacksym_get_buffer_size get_buffer_size_ptr;
  646. + jacksym_cpu_load cpu_load_ptr;
  647. +
  648. + jacksym_port_register port_register_ptr;
  649. + jacksym_port_unregister port_unregister_ptr;
  650. + jacksym_port_get_buffer port_get_buffer_ptr;
  651. +
  652. + jacksym_port_name port_name_ptr;
  653. + jacksym_port_uuid port_uuid_ptr;
  654. + jacksym_port_short_name port_short_name_ptr;
  655. + jacksym_port_flags port_flags_ptr;
  656. + jacksym_port_type port_type_ptr;
  657. + jacksym_port_is_mine port_is_mine_ptr;
  658. + jacksym_port_connected port_connected_ptr;
  659. + jacksym_port_connected_to port_connected_to_ptr;
  660. + jacksym_port_get_connections port_get_connections_ptr;
  661. + jacksym_port_get_all_connections port_get_all_connections_ptr;
  662. +
  663. + jacksym_port_rename port_rename_ptr;
  664. + jacksym_port_set_name port_set_name_ptr;
  665. + jacksym_port_set_alias port_set_alias_ptr;
  666. + jacksym_port_unset_alias port_unset_alias_ptr;
  667. + jacksym_port_get_aliases port_get_aliases_ptr;
  668. +
  669. + jacksym_port_request_monitor port_request_monitor_ptr;
  670. + jacksym_port_request_monitor_by_name port_request_monitor_by_name_ptr;
  671. + jacksym_port_ensure_monitor port_ensure_monitor_ptr;
  672. + jacksym_port_monitoring_input port_monitoring_input_ptr;
  673. +
  674. + jacksym_connect connect_ptr;
  675. + jacksym_disconnect disconnect_ptr;
  676. + jacksym_port_disconnect port_disconnect_ptr;
  677. +
  678. + jacksym_port_name_size port_name_size_ptr;
  679. + jacksym_port_type_size port_type_size_ptr;
  680. + jacksym_port_type_get_buffer_size port_type_get_buffer_size_ptr;
  681. +
  682. + jacksym_port_get_latency_range port_get_latency_range_ptr;
  683. + jacksym_port_set_latency_range port_set_latency_range_ptr;
  684. + jacksym_recompute_total_latencies recompute_total_latencies_ptr;
  685. +
  686. + jacksym_get_ports get_ports_ptr;
  687. + jacksym_port_by_name port_by_name_ptr;
  688. + jacksym_port_by_id port_by_id_ptr;
  689. +
  690. + jacksym_free free_ptr;
  691. +
  692. + jacksym_midi_get_event_count midi_get_event_count_ptr;
  693. + jacksym_midi_event_get midi_event_get_ptr;
  694. + jacksym_midi_clear_buffer midi_clear_buffer_ptr;
  695. + jacksym_midi_event_write midi_event_write_ptr;
  696. + jacksym_midi_event_reserve midi_event_reserve_ptr;
  697. +
  698. + jacksym_release_timebase release_timebase_ptr;
  699. + jacksym_set_sync_callback set_sync_callback_ptr;
  700. + jacksym_set_sync_timeout set_sync_timeout_ptr;
  701. + jacksym_set_timebase_callback set_timebase_callback_ptr;
  702. + jacksym_transport_locate transport_locate_ptr;
  703. +
  704. + jacksym_transport_query transport_query_ptr;
  705. + jacksym_get_current_transport_frame get_current_transport_frame_ptr;
  706. +
  707. + jacksym_transport_reposition transport_reposition_ptr;
  708. + jacksym_transport_start transport_start_ptr;
  709. + jacksym_transport_stop transport_stop_ptr;
  710. +
  711. + jacksym_set_property set_property_ptr;
  712. + jacksym_get_property get_property_ptr;
  713. + jacksym_free_description free_description_ptr;
  714. + jacksym_get_properties get_properties_ptr;
  715. + jacksym_get_all_properties get_all_properties_ptr;
  716. + jacksym_remove_property remove_property_ptr;
  717. + jacksym_remove_properties remove_properties_ptr;
  718. + jacksym_remove_all_properties remove_all_properties_ptr;
  719. + jacksym_set_property_change_callback set_property_change_callback_ptr;
  720. +
  721. + jacksym_set_process_thread set_process_thread_ptr;
  722. + jacksym_cycle_wait cycle_wait_ptr;
  723. + jacksym_cycle_signal cycle_signal_ptr;
  724. +
  725. + jacksym_port_get_latency port_get_latency_ptr;
  726. + jacksym_frame_time frame_time_ptr;
  727. +} JackBridge;
  728. +
  729. +static void jackbridge_init(JackBridge* const bridge)
  730. +{
  731. + memset(bridge, 0, sizeof(*bridge));
  732. +
  733. +#if !(defined(JACKBRIDGE_DUMMY) || defined(JACKBRIDGE_DIRECT))
  734. + #if defined(__APPLE__)
  735. + const char* const filename = "libjack.dylib";
  736. + #elif defined(_WIN64)
  737. + const char* const filename = "libjack64.dll";
  738. + #elif defined(_WIN32)
  739. + const char* const filename = "libjack.dll";
  740. + #else
  741. + const char* const filename = "libjack.so.0";
  742. + #endif
  743. +
  744. + void* const lib = dlopen(filename, RTLD_NOW|RTLD_LOCAL);
  745. +
  746. + if (lib == NULL)
  747. + {
  748. + fprintf(stderr, "Failed to load JACK DLL, reason:\n%s\n", dlerror());
  749. + return;
  750. + }
  751. + else
  752. + {
  753. + fprintf(stdout, "%s loaded successfully!\n", filename);
  754. + }
  755. +
  756. + #define JOIN(a, b) a ## b
  757. + #define LIB_SYMBOL(NAME) bridge->JOIN(NAME, _ptr) = (jacksym_##NAME)dlsym(lib, "jack_" #NAME);
  758. +
  759. + LIB_SYMBOL(get_version)
  760. + LIB_SYMBOL(get_version_string)
  761. +
  762. + LIB_SYMBOL(client_open)
  763. + LIB_SYMBOL(client_close)
  764. +
  765. + LIB_SYMBOL(client_name_size)
  766. + LIB_SYMBOL(get_client_name)
  767. +
  768. + LIB_SYMBOL(client_get_uuid)
  769. + LIB_SYMBOL(get_uuid_for_client_name)
  770. + LIB_SYMBOL(get_client_name_by_uuid)
  771. +
  772. + LIB_SYMBOL(uuid_parse)
  773. + LIB_SYMBOL(uuid_unparse)
  774. +
  775. + LIB_SYMBOL(activate)
  776. + LIB_SYMBOL(deactivate)
  777. + LIB_SYMBOL(is_realtime)
  778. +
  779. + LIB_SYMBOL(set_thread_init_callback)
  780. + LIB_SYMBOL(on_shutdown)
  781. + LIB_SYMBOL(on_info_shutdown)
  782. + LIB_SYMBOL(set_process_callback)
  783. + LIB_SYMBOL(set_freewheel_callback)
  784. + LIB_SYMBOL(set_buffer_size_callback)
  785. + LIB_SYMBOL(set_sample_rate_callback)
  786. + LIB_SYMBOL(set_client_registration_callback)
  787. + LIB_SYMBOL(set_port_registration_callback)
  788. + LIB_SYMBOL(set_port_rename_callback)
  789. + LIB_SYMBOL(set_port_connect_callback)
  790. + LIB_SYMBOL(set_graph_order_callback)
  791. + LIB_SYMBOL(set_xrun_callback)
  792. + LIB_SYMBOL(set_latency_callback)
  793. +
  794. + LIB_SYMBOL(set_freewheel)
  795. + LIB_SYMBOL(set_buffer_size)
  796. +
  797. + LIB_SYMBOL(get_sample_rate)
  798. + LIB_SYMBOL(get_buffer_size)
  799. + LIB_SYMBOL(cpu_load)
  800. +
  801. + LIB_SYMBOL(port_register)
  802. + LIB_SYMBOL(port_unregister)
  803. + LIB_SYMBOL(port_get_buffer)
  804. +
  805. + LIB_SYMBOL(port_name)
  806. + LIB_SYMBOL(port_uuid)
  807. + LIB_SYMBOL(port_short_name)
  808. + LIB_SYMBOL(port_flags)
  809. + LIB_SYMBOL(port_type)
  810. + LIB_SYMBOL(port_is_mine)
  811. + LIB_SYMBOL(port_connected)
  812. + LIB_SYMBOL(port_connected_to)
  813. + LIB_SYMBOL(port_get_connections)
  814. + LIB_SYMBOL(port_get_all_connections)
  815. +
  816. + LIB_SYMBOL(port_rename)
  817. + LIB_SYMBOL(port_set_name)
  818. + LIB_SYMBOL(port_set_alias)
  819. + LIB_SYMBOL(port_unset_alias)
  820. + LIB_SYMBOL(port_get_aliases)
  821. +
  822. + LIB_SYMBOL(port_request_monitor)
  823. + LIB_SYMBOL(port_request_monitor_by_name)
  824. + LIB_SYMBOL(port_ensure_monitor)
  825. + LIB_SYMBOL(port_monitoring_input)
  826. +
  827. + LIB_SYMBOL(connect)
  828. + LIB_SYMBOL(disconnect)
  829. + LIB_SYMBOL(port_disconnect)
  830. +
  831. + LIB_SYMBOL(port_name_size)
  832. + LIB_SYMBOL(port_type_size)
  833. + LIB_SYMBOL(port_type_get_buffer_size)
  834. +
  835. + LIB_SYMBOL(port_get_latency_range)
  836. + LIB_SYMBOL(port_set_latency_range)
  837. + LIB_SYMBOL(recompute_total_latencies)
  838. +
  839. + LIB_SYMBOL(get_ports)
  840. + LIB_SYMBOL(port_by_name)
  841. + LIB_SYMBOL(port_by_id)
  842. +
  843. + LIB_SYMBOL(free)
  844. +
  845. + LIB_SYMBOL(midi_get_event_count)
  846. + LIB_SYMBOL(midi_event_get)
  847. + LIB_SYMBOL(midi_clear_buffer)
  848. + LIB_SYMBOL(midi_event_write)
  849. + LIB_SYMBOL(midi_event_reserve)
  850. +
  851. + LIB_SYMBOL(release_timebase)
  852. + LIB_SYMBOL(set_sync_callback)
  853. + LIB_SYMBOL(set_sync_timeout)
  854. + LIB_SYMBOL(set_timebase_callback)
  855. + LIB_SYMBOL(transport_locate)
  856. + LIB_SYMBOL(transport_query)
  857. + LIB_SYMBOL(get_current_transport_frame)
  858. + LIB_SYMBOL(transport_reposition)
  859. + LIB_SYMBOL(transport_start)
  860. + LIB_SYMBOL(transport_stop)
  861. +
  862. + LIB_SYMBOL(set_property)
  863. + LIB_SYMBOL(get_property)
  864. + LIB_SYMBOL(free_description)
  865. + LIB_SYMBOL(get_properties)
  866. + LIB_SYMBOL(get_all_properties)
  867. + LIB_SYMBOL(remove_property)
  868. + LIB_SYMBOL(remove_properties)
  869. + LIB_SYMBOL(remove_all_properties)
  870. + LIB_SYMBOL(set_property_change_callback)
  871. +
  872. + LIB_SYMBOL(set_process_thread)
  873. + LIB_SYMBOL(cycle_wait)
  874. + LIB_SYMBOL(cycle_signal)
  875. +
  876. + LIB_SYMBOL(port_get_latency)
  877. + LIB_SYMBOL(frame_time)
  878. +
  879. + #undef JOIN
  880. + #undef LIB_SYMBOL
  881. +
  882. + bridge->lib = lib;
  883. +#endif
  884. +}
  885. +
  886. +static void jackbridge_destroy(JackBridge* const bridge)
  887. +{
  888. + if (bridge->lib != NULL)
  889. + {
  890. + dlclose(bridge->lib);
  891. + bridge->lib = NULL;
  892. + }
  893. +}
  894. +
  895. +static JackBridge* jackbridge_instance()
  896. +{
  897. + static JackBridge bridge;
  898. + static bool init = false;
  899. + if (! init)
  900. + {
  901. + init = true;
  902. + jackbridge_init(&bridge);
  903. + }
  904. + return &bridge;
  905. +}
  906. +
  907. +// -----------------------------------------------------------------------------
  908. +
  909. +bool jackbridge_is_ok()
  910. +{
  911. +#if defined(JACKBRIDGE_DUMMY)
  912. + return false;
  913. +#elif defined(JACKBRIDGE_DIRECT)
  914. + return true;
  915. +#else
  916. + return jackbridge_instance()->lib != NULL;
  917. +#endif
  918. +}
  919. +
  920. +// -----------------------------------------------------------------------------
  921. +
  922. +void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr)
  923. +{
  924. +#if defined(JACKBRIDGE_DUMMY)
  925. +#elif defined(JACKBRIDGE_DIRECT)
  926. + return jack_get_version(major_ptr, minor_ptr, micro_ptr, proto_ptr);
  927. +#else
  928. + if (jackbridge_instance()->get_version_ptr != NULL)
  929. + return jackbridge_instance()->get_version_ptr(major_ptr, minor_ptr, micro_ptr, proto_ptr);
  930. +#endif
  931. + if (major_ptr != NULL)
  932. + *major_ptr = 0;
  933. + if (minor_ptr != NULL)
  934. + *minor_ptr = 0;
  935. + if (micro_ptr != NULL)
  936. + *micro_ptr = 0;
  937. + if (proto_ptr != NULL)
  938. + *proto_ptr = 0;
  939. +}
  940. +
  941. +const char* jackbridge_get_version_string()
  942. +{
  943. +#if defined(JACKBRIDGE_DUMMY)
  944. +#elif defined(JACKBRIDGE_DIRECT)
  945. + return jack_get_version_string();
  946. +#else
  947. + if (jackbridge_instance()->get_version_string_ptr != NULL)
  948. + return jackbridge_instance()->get_version_string_ptr();
  949. +#endif
  950. + return NULL;
  951. +}
  952. +
  953. +// -----------------------------------------------------------------------------
  954. +
  955. +jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, jack_status_t* status)
  956. +{
  957. +#if defined(JACKBRIDGE_DUMMY)
  958. +#elif defined(JACKBRIDGE_DIRECT)
  959. + return jack_client_open(client_name, (jack_options_t)options, status);
  960. +#endif
  961. + if (jackbridge_instance()->client_open_ptr != NULL)
  962. + return jackbridge_instance()->client_open_ptr(client_name, (jack_options_t)options, status);
  963. + if (status != NULL)
  964. + *status = JackServerError;
  965. + return NULL;
  966. +}
  967. +
  968. +bool jackbridge_client_close(jack_client_t* client)
  969. +{
  970. +#if defined(JACKBRIDGE_DUMMY)
  971. +#elif defined(JACKBRIDGE_DIRECT)
  972. + return (jack_client_close(client) == 0);
  973. +#else
  974. + if (jackbridge_instance()->client_close_ptr != NULL)
  975. + return (jackbridge_instance()->client_close_ptr(client) == 0);
  976. +#endif
  977. + return false;
  978. +}
  979. +
  980. +// -----------------------------------------------------------------------------
  981. +
  982. +int jackbridge_client_name_size()
  983. +{
  984. +#if defined(JACKBRIDGE_DUMMY)
  985. +#elif defined(JACKBRIDGE_DIRECT)
  986. + return jack_client_name_size();
  987. +#else
  988. + if (jackbridge_instance()->client_name_size_ptr != NULL)
  989. + return jackbridge_instance()->client_name_size_ptr();
  990. +#endif
  991. + return 33;
  992. +}
  993. +
  994. +const char* jackbridge_get_client_name(jack_client_t* client)
  995. +{
  996. +#if defined(JACKBRIDGE_DUMMY)
  997. +#elif defined(JACKBRIDGE_DIRECT)
  998. + return jack_get_client_name(client);
  999. +#else
  1000. + if (jackbridge_instance()->get_client_name_ptr != NULL)
  1001. + return jackbridge_instance()->get_client_name_ptr(client);
  1002. +#endif
  1003. + return NULL;
  1004. +}
  1005. +
  1006. +// -----------------------------------------------------------------------------
  1007. +
  1008. +char* jackbridge_client_get_uuid(jack_client_t* client)
  1009. +{
  1010. +#if defined(JACKBRIDGE_DUMMY)
  1011. +#elif defined(JACKBRIDGE_DIRECT)
  1012. + return jack_client_get_uuid(client);
  1013. +#else
  1014. + if (jackbridge_instance()->client_get_uuid_ptr != NULL)
  1015. + return jackbridge_instance()->client_get_uuid_ptr(client);
  1016. +#endif
  1017. + return NULL;
  1018. +}
  1019. +
  1020. +char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* name)
  1021. +{
  1022. +#if defined(JACKBRIDGE_DUMMY)
  1023. +#elif defined(JACKBRIDGE_DIRECT)
  1024. + return jack_get_uuid_for_client_name(client, name);
  1025. +#else
  1026. + if (jackbridge_instance()->get_uuid_for_client_name_ptr != NULL)
  1027. + return jackbridge_instance()->get_uuid_for_client_name_ptr(client, name);
  1028. +#endif
  1029. + return NULL;
  1030. +}
  1031. +
  1032. +char* jackbridge_get_client_name_by_uuid(jack_client_t* client, const char* uuid)
  1033. +{
  1034. +#if defined(JACKBRIDGE_DUMMY)
  1035. +#elif defined(JACKBRIDGE_DIRECT)
  1036. + return jack_get_client_name_by_uuid(client, uuid);
  1037. +#else
  1038. + if (jackbridge_instance()->get_client_name_by_uuid_ptr != NULL)
  1039. + return jackbridge_instance()->get_client_name_by_uuid_ptr(client, uuid);
  1040. +#endif
  1041. + return NULL;
  1042. +}
  1043. +
  1044. +// -----------------------------------------------------------------------------
  1045. +
  1046. +bool jackbridge_uuid_parse(const char* buf, jack_uuid_t* uuid)
  1047. +{
  1048. +#if defined(JACKBRIDGE_DUMMY)
  1049. +#elif defined(JACKBRIDGE_DIRECT)
  1050. + return (jack_uuid_parse(buf, uuid) == 0);
  1051. +#else
  1052. + if (jackbridge_instance()->uuid_parse_ptr != NULL)
  1053. + return jackbridge_instance()->uuid_parse_ptr(buf, uuid) == 0;
  1054. +#endif
  1055. + return false;
  1056. +}
  1057. +
  1058. +void jackbridge_uuid_unparse(jack_uuid_t uuid, char buf[JACK_UUID_STRING_SIZE])
  1059. +{
  1060. +#if defined(JACKBRIDGE_DUMMY)
  1061. +#elif defined(JACKBRIDGE_DIRECT)
  1062. + jack_uuid_unparse(uuid, buf);
  1063. +#else
  1064. + if (jackbridge_instance()->uuid_unparse_ptr != NULL)
  1065. + return jackbridge_instance()->uuid_unparse_ptr(uuid, buf);
  1066. +#endif
  1067. +}
  1068. +
  1069. +// -----------------------------------------------------------------------------
  1070. +
  1071. +bool jackbridge_activate(jack_client_t* client)
  1072. +{
  1073. +#if defined(JACKBRIDGE_DUMMY)
  1074. +#elif defined(JACKBRIDGE_DIRECT)
  1075. + return (jack_activate(client) == 0);
  1076. +#else
  1077. + if (jackbridge_instance()->activate_ptr != NULL)
  1078. + return (jackbridge_instance()->activate_ptr(client) == 0);
  1079. +#endif
  1080. + return false;
  1081. +}
  1082. +
  1083. +bool jackbridge_deactivate(jack_client_t* client)
  1084. +{
  1085. +#if defined(JACKBRIDGE_DUMMY)
  1086. +#elif defined(JACKBRIDGE_DIRECT)
  1087. + return (jack_deactivate(client) == 0);
  1088. +#else
  1089. + if (jackbridge_instance()->deactivate_ptr != NULL)
  1090. + return (jackbridge_instance()->deactivate_ptr(client) == 0);
  1091. +#endif
  1092. + return false;
  1093. +}
  1094. +
  1095. +bool jackbridge_is_realtime(jack_client_t* client)
  1096. +{
  1097. +#if defined(JACKBRIDGE_DUMMY)
  1098. +#elif defined(JACKBRIDGE_DIRECT)
  1099. + return jack_is_realtime(client);
  1100. +#else
  1101. + if (jackbridge_instance()->is_realtime_ptr != NULL)
  1102. + return jackbridge_instance()->is_realtime_ptr(client);
  1103. +#endif
  1104. + return false;
  1105. +}
  1106. +
  1107. +// -----------------------------------------------------------------------------
  1108. +
  1109. +bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCallback thread_init_callback, void* arg)
  1110. +{
  1111. +#if defined(JACKBRIDGE_DUMMY)
  1112. +#elif defined(JACKBRIDGE_DIRECT)
  1113. + return (jack_set_thread_init_callback(client, thread_init_callback, arg) == 0);
  1114. +#else
  1115. + if (jackbridge_instance()->set_thread_init_callback_ptr != NULL)
  1116. + {
  1117. +# ifdef __WINE__
  1118. + WineBridge::getInstance().set_thread_init(thread_init_callback);
  1119. + return (jackbridge_instance()->set_thread_init_callback_ptr(client, WineBridge::thread_init, arg) == 0);
  1120. +# else
  1121. + return (jackbridge_instance()->set_thread_init_callback_ptr(client, thread_init_callback, arg) == 0);
  1122. +# endif
  1123. + }
  1124. +#endif
  1125. + return false;
  1126. +}
  1127. +
  1128. +void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg)
  1129. +{
  1130. +#if defined(JACKBRIDGE_DUMMY)
  1131. +#elif defined(JACKBRIDGE_DIRECT)
  1132. + jack_on_shutdown(client, shutdown_callback, arg);
  1133. +#else
  1134. + if (jackbridge_instance()->on_shutdown_ptr != NULL)
  1135. + {
  1136. +# ifdef __WINE__
  1137. + WineBridge::getInstance().set_shutdown(shutdown_callback);
  1138. + jackbridge_instance()->on_shutdown_ptr(client, WineBridge::shutdown, arg);
  1139. +# else
  1140. + jackbridge_instance()->on_shutdown_ptr(client, shutdown_callback, arg);
  1141. +# endif
  1142. + }
  1143. +#endif
  1144. +}
  1145. +
  1146. +void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback shutdown_callback, void* arg)
  1147. +{
  1148. +#if defined(JACKBRIDGE_DUMMY)
  1149. +#elif defined(JACKBRIDGE_DIRECT)
  1150. + jack_on_info_shutdown(client, shutdown_callback, arg);
  1151. +#else
  1152. + if (jackbridge_instance()->on_info_shutdown_ptr != NULL)
  1153. + {
  1154. +# ifdef __WINE__
  1155. + WineBridge::getInstance().set_info_shutdown(shutdown_callback);
  1156. + jackbridge_instance()->on_info_shutdown_ptr(client, WineBridge::info_shutdown, arg);
  1157. +# else
  1158. + jackbridge_instance()->on_info_shutdown_ptr(client, shutdown_callback, arg);
  1159. +# endif
  1160. + }
  1161. +#endif
  1162. +}
  1163. +
  1164. +bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg)
  1165. +{
  1166. +#if defined(JACKBRIDGE_DUMMY)
  1167. +#elif defined(JACKBRIDGE_DIRECT)
  1168. + return (jack_set_process_callback(client, process_callback, arg) == 0);
  1169. +#else
  1170. + if (jackbridge_instance()->set_process_callback_ptr != NULL)
  1171. + {
  1172. +# ifdef __WINE__
  1173. + WineBridge::getInstance().set_process(process_callback);
  1174. + return (jackbridge_instance()->set_process_callback_ptr(client, WineBridge::process, arg) == 0);
  1175. +# else
  1176. + return (jackbridge_instance()->set_process_callback_ptr(client, process_callback, arg) == 0);
  1177. +# endif
  1178. + }
  1179. +#endif
  1180. + return false;
  1181. +}
  1182. +
  1183. +bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg)
  1184. +{
  1185. +#if defined(JACKBRIDGE_DUMMY)
  1186. +#elif defined(JACKBRIDGE_DIRECT)
  1187. + return (jack_set_freewheel_callback(client, freewheel_callback, arg) == 0);
  1188. +#else
  1189. + if (jackbridge_instance()->set_freewheel_callback_ptr != NULL)
  1190. + {
  1191. +# ifdef __WINE__
  1192. + WineBridge::getInstance().set_freewheel(freewheel_callback);
  1193. + return (jackbridge_instance()->set_freewheel_callback_ptr(client, WineBridge::freewheel, arg) == 0);
  1194. +# else
  1195. + return (jackbridge_instance()->set_freewheel_callback_ptr(client, freewheel_callback, arg) == 0);
  1196. +# endif
  1197. + }
  1198. +#endif
  1199. + return false;
  1200. +}
  1201. +
  1202. +bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg)
  1203. +{
  1204. +#if defined(JACKBRIDGE_DUMMY)
  1205. +#elif defined(JACKBRIDGE_DIRECT)
  1206. + return (jack_set_buffer_size_callback(client, bufsize_callback, arg) == 0);
  1207. +#else
  1208. + if (jackbridge_instance()->set_buffer_size_callback_ptr != NULL)
  1209. + {
  1210. +# ifdef __WINE__
  1211. + WineBridge::getInstance().set_bufsize(bufsize_callback);
  1212. + return (jackbridge_instance()->set_buffer_size_callback_ptr(client, WineBridge::bufsize, arg) == 0);
  1213. +# else
  1214. + return (jackbridge_instance()->set_buffer_size_callback_ptr(client, bufsize_callback, arg) == 0);
  1215. +# endif
  1216. + }
  1217. +#endif
  1218. + return false;
  1219. +}
  1220. +
  1221. +bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg)
  1222. +{
  1223. +#if defined(JACKBRIDGE_DUMMY)
  1224. +#elif defined(JACKBRIDGE_DIRECT)
  1225. + return (jack_set_sample_rate_callback(client, srate_callback, arg) == 0);
  1226. +#else
  1227. + if (jackbridge_instance()->set_sample_rate_callback_ptr != NULL)
  1228. + {
  1229. +# ifdef __WINE__
  1230. + WineBridge::getInstance().set_srate(srate_callback);
  1231. + return (jackbridge_instance()->set_sample_rate_callback_ptr(client, WineBridge::srate, arg) == 0);
  1232. +# else
  1233. + return (jackbridge_instance()->set_sample_rate_callback_ptr(client, srate_callback, arg) == 0);
  1234. +# endif
  1235. + }
  1236. +#endif
  1237. + return false;
  1238. +}
  1239. +
  1240. +bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg)
  1241. +{
  1242. +#if defined(JACKBRIDGE_DUMMY)
  1243. +#elif defined(JACKBRIDGE_DIRECT)
  1244. + return (jack_set_client_registration_callback(client, registration_callback, arg) == 0);
  1245. +#else
  1246. + if (jackbridge_instance()->set_client_registration_callback_ptr != NULL)
  1247. + {
  1248. +# ifdef __WINE__
  1249. + WineBridge::getInstance().set_client_reg(registration_callback);
  1250. + return (jackbridge_instance()->set_client_registration_callback_ptr(client, WineBridge::client_reg, arg) == 0);
  1251. +# else
  1252. + return (jackbridge_instance()->set_client_registration_callback_ptr(client, registration_callback, arg) == 0);
  1253. +# endif
  1254. + }
  1255. +#endif
  1256. + return false;
  1257. +}
  1258. +
  1259. +bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg)
  1260. +{
  1261. +#if defined(JACKBRIDGE_DUMMY)
  1262. +#elif defined(JACKBRIDGE_DIRECT)
  1263. + return (jack_set_port_registration_callback(client, registration_callback, arg) == 0);
  1264. +#else
  1265. + if (jackbridge_instance()->set_port_registration_callback_ptr != NULL)
  1266. + {
  1267. +# ifdef __WINE__
  1268. + WineBridge::getInstance().set_port_reg(registration_callback);
  1269. + return (jackbridge_instance()->set_port_registration_callback_ptr(client, WineBridge::port_reg, arg) == 0);
  1270. +# else
  1271. + return (jackbridge_instance()->set_port_registration_callback_ptr(client, registration_callback, arg) == 0);
  1272. +# endif
  1273. + }
  1274. +#endif
  1275. + return false;
  1276. +}
  1277. +
  1278. +bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCallback rename_callback, void* arg)
  1279. +{
  1280. +#if defined(JACKBRIDGE_DUMMY)
  1281. +#elif defined(JACKBRIDGE_DIRECT)
  1282. + return (jack_set_port_rename_callback(client, rename_callback, arg) == 0);
  1283. +#else
  1284. + if (jackbridge_instance()->set_port_rename_callback_ptr != NULL)
  1285. + {
  1286. +# ifdef __WINE__
  1287. + WineBridge::getInstance().set_port_rename(rename_callback);
  1288. + return (jackbridge_instance()->set_port_rename_callback_ptr(client, WineBridge::port_rename, arg) == 0);
  1289. +# else
  1290. + return (jackbridge_instance()->set_port_rename_callback_ptr(client, rename_callback, arg) == 0);
  1291. +# endif
  1292. + }
  1293. +#endif
  1294. + return false;
  1295. +}
  1296. +
  1297. +bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback connect_callback, void* arg)
  1298. +{
  1299. +#if defined(JACKBRIDGE_DUMMY)
  1300. +#elif defined(JACKBRIDGE_DIRECT)
  1301. + return (jack_set_port_connect_callback(client, connect_callback, arg) == 0);
  1302. +#else
  1303. + if (jackbridge_instance()->set_port_connect_callback_ptr != NULL)
  1304. + {
  1305. +# ifdef __WINE__
  1306. + WineBridge::getInstance().set_port_conn(connect_callback);
  1307. + return (jackbridge_instance()->set_port_connect_callback_ptr(client, WineBridge::port_conn, arg) == 0);
  1308. +# else
  1309. + return (jackbridge_instance()->set_port_connect_callback_ptr(client, connect_callback, arg) == 0);
  1310. +# endif
  1311. + }
  1312. +#endif
  1313. + return false;
  1314. +}
  1315. +
  1316. +bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback graph_callback, void* arg)
  1317. +{
  1318. +#if defined(JACKBRIDGE_DUMMY)
  1319. +#elif defined(JACKBRIDGE_DIRECT)
  1320. + return (jack_set_graph_order_callback(client, graph_callback, arg) == 0);
  1321. +#else
  1322. + if (jackbridge_instance()->set_graph_order_callback_ptr != NULL)
  1323. + {
  1324. +# ifdef __WINE__
  1325. + WineBridge::getInstance().set_graph_order(graph_callback);
  1326. + return (jackbridge_instance()->set_graph_order_callback_ptr(client, WineBridge::graph_order, arg) == 0);
  1327. +# else
  1328. + return (jackbridge_instance()->set_graph_order_callback_ptr(client, graph_callback, arg) == 0);
  1329. +# endif
  1330. + }
  1331. +#endif
  1332. + return false;
  1333. +}
  1334. +
  1335. +bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_callback, void* arg)
  1336. +{
  1337. +#if defined(JACKBRIDGE_DUMMY)
  1338. +#elif defined(JACKBRIDGE_DIRECT)
  1339. + return (jack_set_xrun_callback(client, xrun_callback, arg) == 0);
  1340. +#else
  1341. + if (jackbridge_instance()->set_xrun_callback_ptr != NULL)
  1342. + {
  1343. +# ifdef __WINE__
  1344. + WineBridge::getInstance().set_xrun(xrun_callback);
  1345. + return (jackbridge_instance()->set_xrun_callback_ptr(client, WineBridge::xrun, arg) == 0);
  1346. +# else
  1347. + return (jackbridge_instance()->set_xrun_callback_ptr(client, xrun_callback, arg) == 0);
  1348. +# endif
  1349. + }
  1350. +#endif
  1351. + return false;
  1352. +}
  1353. +
  1354. +bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg)
  1355. +{
  1356. +#if defined(JACKBRIDGE_DUMMY)
  1357. +#elif defined(JACKBRIDGE_DIRECT)
  1358. + return (jack_set_latency_callback(client, latency_callback, arg) == 0);
  1359. +#else
  1360. + if (jackbridge_instance()->set_latency_callback_ptr != NULL)
  1361. + {
  1362. +# ifdef __WINE__
  1363. + WineBridge::getInstance().set_latency(latency_callback);
  1364. + return (jackbridge_instance()->set_latency_callback_ptr(client, WineBridge::latency, arg) == 0);
  1365. +# else
  1366. + return (jackbridge_instance()->set_latency_callback_ptr(client, latency_callback, arg) == 0);
  1367. +# endif
  1368. + }
  1369. +#endif
  1370. + return false;
  1371. +}
  1372. +
  1373. +// -----------------------------------------------------------------------------
  1374. +
  1375. +bool jackbridge_set_freewheel(jack_client_t* client, bool onoff)
  1376. +{
  1377. +#if defined(JACKBRIDGE_DUMMY)
  1378. +#elif defined(JACKBRIDGE_DIRECT)
  1379. + return jack_set_freewheel(client, onoff);
  1380. +#else
  1381. + if (jackbridge_instance()->set_freewheel_ptr != NULL)
  1382. + return jackbridge_instance()->set_freewheel_ptr(client, onoff);
  1383. +#endif
  1384. + return false;
  1385. +}
  1386. +
  1387. +bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes)
  1388. +{
  1389. +#if defined(JACKBRIDGE_DUMMY)
  1390. +#elif defined(JACKBRIDGE_DIRECT)
  1391. + return jack_set_buffer_size(client, nframes);
  1392. +#else
  1393. + if (jackbridge_instance()->set_buffer_size_ptr != NULL)
  1394. + return jackbridge_instance()->set_buffer_size_ptr(client, nframes);
  1395. +#endif
  1396. + return false;
  1397. +}
  1398. +
  1399. +// -----------------------------------------------------------------------------
  1400. +
  1401. +jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client)
  1402. +{
  1403. +#if defined(JACKBRIDGE_DUMMY)
  1404. +#elif defined(JACKBRIDGE_DIRECT)
  1405. + return jack_get_sample_rate(client);
  1406. +#else
  1407. + if (jackbridge_instance()->get_sample_rate_ptr != NULL)
  1408. + return jackbridge_instance()->get_sample_rate_ptr(client);
  1409. +#endif
  1410. + return 0;
  1411. +}
  1412. +
  1413. +jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client)
  1414. +{
  1415. +#if defined(JACKBRIDGE_DUMMY)
  1416. +#elif defined(JACKBRIDGE_DIRECT)
  1417. + return jack_get_buffer_size(client);
  1418. +#else
  1419. + if (jackbridge_instance()->get_buffer_size_ptr != NULL)
  1420. + return jackbridge_instance()->get_buffer_size_ptr(client);
  1421. +#endif
  1422. + return 0;
  1423. +}
  1424. +
  1425. +float jackbridge_cpu_load(jack_client_t* client)
  1426. +{
  1427. +#if defined(JACKBRIDGE_DUMMY)
  1428. +#elif defined(JACKBRIDGE_DIRECT)
  1429. + return jack_cpu_load(client);
  1430. +#else
  1431. + if (jackbridge_instance()->cpu_load_ptr != NULL)
  1432. + return jackbridge_instance()->cpu_load_ptr(client);
  1433. +#endif
  1434. + return 0.0f;
  1435. +}
  1436. +
  1437. +// -----------------------------------------------------------------------------
  1438. +
  1439. +jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* type, uint64_t flags, uint64_t buffer_size)
  1440. +{
  1441. +#if defined(JACKBRIDGE_DUMMY)
  1442. +#elif defined(JACKBRIDGE_DIRECT)
  1443. + return jack_port_register(client, port_name, type, flags, buffer_size);
  1444. +#else
  1445. + if (jackbridge_instance()->port_register_ptr != NULL)
  1446. + return jackbridge_instance()->port_register_ptr(client, port_name, type, (ulong)flags, (ulong)buffer_size);
  1447. +#endif
  1448. + return NULL;
  1449. +}
  1450. +
  1451. +bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port)
  1452. +{
  1453. +#if defined(JACKBRIDGE_DUMMY)
  1454. +#elif defined(JACKBRIDGE_DIRECT)
  1455. + return (jack_port_unregister(client, port) == 0);
  1456. +#else
  1457. + if (jackbridge_instance()->port_unregister_ptr != NULL)
  1458. + return (jackbridge_instance()->port_unregister_ptr(client, port) == 0);
  1459. +#endif
  1460. + return false;
  1461. +}
  1462. +
  1463. +void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes)
  1464. +{
  1465. +#if defined(JACKBRIDGE_DUMMY)
  1466. +#elif defined(JACKBRIDGE_DIRECT)
  1467. + return jack_port_get_buffer(port, nframes);
  1468. +#else
  1469. + if (jackbridge_instance()->port_get_buffer_ptr != NULL)
  1470. + return jackbridge_instance()->port_get_buffer_ptr(port, nframes);
  1471. +#endif
  1472. + return NULL;
  1473. +}
  1474. +
  1475. +// -----------------------------------------------------------------------------
  1476. +
  1477. +const char* jackbridge_port_name(const jack_port_t* port)
  1478. +{
  1479. +#if defined(JACKBRIDGE_DUMMY)
  1480. +#elif defined(JACKBRIDGE_DIRECT)
  1481. + return jack_port_name(port);
  1482. +#else
  1483. + if (jackbridge_instance()->port_name_ptr != NULL)
  1484. + return jackbridge_instance()->port_name_ptr(port);
  1485. +#endif
  1486. + return NULL;
  1487. +}
  1488. +
  1489. +jack_uuid_t jackbridge_port_uuid(const jack_port_t* port)
  1490. +{
  1491. +#if defined(JACKBRIDGE_DUMMY)
  1492. +#elif defined(JACKBRIDGE_DIRECT)
  1493. + return jack_port_uuid(port);
  1494. +#else
  1495. + if (jackbridge_instance()->port_uuid_ptr != NULL)
  1496. + return jackbridge_instance()->port_uuid_ptr(port);
  1497. +#endif
  1498. + return 0;
  1499. +}
  1500. +
  1501. +const char* jackbridge_port_short_name(const jack_port_t* port)
  1502. +{
  1503. +#if defined(JACKBRIDGE_DUMMY)
  1504. +#elif defined(JACKBRIDGE_DIRECT)
  1505. + return jack_port_short_name(port);
  1506. +#else
  1507. + if (jackbridge_instance()->port_short_name_ptr != NULL)
  1508. + return jackbridge_instance()->port_short_name_ptr(port);
  1509. +#endif
  1510. + return NULL;
  1511. +}
  1512. +
  1513. +int jackbridge_port_flags(const jack_port_t* port)
  1514. +{
  1515. +#if defined(JACKBRIDGE_DUMMY)
  1516. +#elif defined(JACKBRIDGE_DIRECT)
  1517. + return jack_port_flags(port);
  1518. +#else
  1519. + if (jackbridge_instance()->port_flags_ptr != NULL)
  1520. + return jackbridge_instance()->port_flags_ptr(port);
  1521. +#endif
  1522. + return 0x0;
  1523. +}
  1524. +
  1525. +const char* jackbridge_port_type(const jack_port_t* port)
  1526. +{
  1527. +#if defined(JACKBRIDGE_DUMMY)
  1528. +#elif defined(JACKBRIDGE_DIRECT)
  1529. + return jack_port_type(port);
  1530. +#else
  1531. + if (jackbridge_instance()->port_type_ptr != NULL)
  1532. + return jackbridge_instance()->port_type_ptr(port);
  1533. +#endif
  1534. + return NULL;
  1535. +}
  1536. +
  1537. +bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* port)
  1538. +{
  1539. +#if defined(JACKBRIDGE_DUMMY)
  1540. +#elif defined(JACKBRIDGE_DIRECT)
  1541. + return jack_port_is_mine(client, port);
  1542. +#else
  1543. + if (jackbridge_instance()->port_is_mine_ptr != NULL)
  1544. + return jackbridge_instance()->port_is_mine_ptr(client, port);
  1545. +#endif
  1546. + return false;
  1547. +}
  1548. +
  1549. +int jackbridge_port_connected(const jack_port_t* port)
  1550. +{
  1551. +#if defined(JACKBRIDGE_DUMMY)
  1552. +#elif defined(JACKBRIDGE_DIRECT)
  1553. + return jack_port_connected(port);
  1554. +#else
  1555. + if (jackbridge_instance()->port_connected_ptr != NULL)
  1556. + return jackbridge_instance()->port_connected_ptr(port);
  1557. +#endif
  1558. + return 0;
  1559. +}
  1560. +
  1561. +bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name)
  1562. +{
  1563. +#if defined(JACKBRIDGE_DUMMY)
  1564. +#elif defined(JACKBRIDGE_DIRECT)
  1565. + return jack_port_connected_to(port, port_name);
  1566. +#else
  1567. + if (jackbridge_instance()->port_connected_to_ptr != NULL)
  1568. + return jackbridge_instance()->port_connected_to_ptr(port, port_name);
  1569. +#endif
  1570. + return false;
  1571. +}
  1572. +
  1573. +const char** jackbridge_port_get_connections(const jack_port_t* port)
  1574. +{
  1575. +#if defined(JACKBRIDGE_DUMMY)
  1576. +#elif defined(JACKBRIDGE_DIRECT)
  1577. + return jack_port_get_connections(port);
  1578. +#else
  1579. + if (jackbridge_instance()->port_get_connections_ptr != NULL)
  1580. + return jackbridge_instance()->port_get_connections_ptr(port);
  1581. +#endif
  1582. + return NULL;
  1583. +}
  1584. +
  1585. +const char** jackbridge_port_get_all_connections(const jack_client_t* client, const jack_port_t* port)
  1586. +{
  1587. +#if defined(JACKBRIDGE_DUMMY)
  1588. +#elif defined(JACKBRIDGE_DIRECT)
  1589. + return jack_port_get_all_connections(client, port);
  1590. +#else
  1591. + if (jackbridge_instance()->port_get_all_connections_ptr != NULL)
  1592. + return jackbridge_instance()->port_get_all_connections_ptr(client, port);
  1593. +#endif
  1594. + return NULL;
  1595. +}
  1596. +
  1597. +// -----------------------------------------------------------------------------
  1598. +
  1599. +bool jackbridge_port_rename(jack_client_t* client, jack_port_t* port, const char* port_name)
  1600. +{
  1601. +#if defined(JACKBRIDGE_DUMMY)
  1602. +#elif defined(JACKBRIDGE_DIRECT)
  1603. + return (jack_port_rename(client, port, port_name) == 0);
  1604. +#else
  1605. + // Try new API first
  1606. + if (jackbridge_instance()->port_rename_ptr != NULL)
  1607. + return (jackbridge_instance()->port_rename_ptr(client, port, port_name) == 0);
  1608. + // Try old API if using JACK2
  1609. + if (jackbridge_instance()->get_version_string_ptr != NULL && jackbridge_instance()->port_set_name_ptr != NULL)
  1610. + return (jackbridge_instance()->port_set_name_ptr(port, port_name) == 0);
  1611. +#endif
  1612. + return false;
  1613. +}
  1614. +
  1615. +bool jackbridge_port_set_alias(jack_port_t* port, const char* alias)
  1616. +{
  1617. +#if defined(JACKBRIDGE_DUMMY)
  1618. +#elif defined(JACKBRIDGE_DIRECT)
  1619. + return (jack_port_set_alias(port, alias) == 0);
  1620. +#else
  1621. + if (jackbridge_instance()->port_set_alias_ptr != NULL)
  1622. + return (jackbridge_instance()->port_set_alias_ptr(port, alias) == 0);
  1623. +#endif
  1624. + return false;
  1625. +}
  1626. +
  1627. +bool jackbridge_port_unset_alias(jack_port_t* port, const char* alias)
  1628. +{
  1629. +#if defined(JACKBRIDGE_DUMMY)
  1630. +#elif defined(JACKBRIDGE_DIRECT)
  1631. + return (jack_port_unset_alias(port, alias) == 0);
  1632. +#else
  1633. + if (jackbridge_instance()->port_unset_alias_ptr != NULL)
  1634. + return (jackbridge_instance()->port_unset_alias_ptr(port, alias) == 0);
  1635. +#endif
  1636. + return false;
  1637. +}
  1638. +
  1639. +int jackbridge_port_get_aliases(const jack_port_t* port, char* const aliases[2])
  1640. +{
  1641. +#if defined(JACKBRIDGE_DUMMY)
  1642. +#elif defined(JACKBRIDGE_DIRECT)
  1643. + return (jack_port_get_aliases(port, aliases) == 0);
  1644. +#else
  1645. + if (jackbridge_instance()->port_get_aliases_ptr != NULL)
  1646. + return jackbridge_instance()->port_get_aliases_ptr(port, aliases);
  1647. +#endif
  1648. + return 0;
  1649. +}
  1650. +
  1651. +// -----------------------------------------------------------------------------
  1652. +
  1653. +bool jackbridge_port_request_monitor(jack_port_t* port, bool onoff)
  1654. +{
  1655. +#if defined(JACKBRIDGE_DUMMY)
  1656. +#elif defined(JACKBRIDGE_DIRECT)
  1657. + return (jack_port_request_monitor(port, onoff) == 0);
  1658. +#else
  1659. + if (jackbridge_instance()->port_request_monitor_ptr != NULL)
  1660. + return (jackbridge_instance()->port_request_monitor_ptr(port, onoff) == 0);
  1661. +#endif
  1662. + return false;
  1663. +}
  1664. +
  1665. +bool jackbridge_port_request_monitor_by_name(jack_client_t* client, const char* port_name, bool onoff)
  1666. +{
  1667. +#if defined(JACKBRIDGE_DUMMY)
  1668. +#elif defined(JACKBRIDGE_DIRECT)
  1669. + return (jack_port_request_monitor_by_name(client, port_name, onoff) == 0);
  1670. +#else
  1671. + if (jackbridge_instance()->port_request_monitor_by_name_ptr != NULL)
  1672. + return (jackbridge_instance()->port_request_monitor_by_name_ptr(client, port_name, onoff) == 0);
  1673. +#endif
  1674. + return false;
  1675. +}
  1676. +
  1677. +bool jackbridge_port_ensure_monitor(jack_port_t* port, bool onoff)
  1678. +{
  1679. +#if defined(JACKBRIDGE_DUMMY)
  1680. +#elif defined(JACKBRIDGE_DIRECT)
  1681. + return (jack_port_ensure_monitor(port, onoff) == 0);
  1682. +#else
  1683. + if (jackbridge_instance()->port_ensure_monitor_ptr != NULL)
  1684. + return (jackbridge_instance()->port_ensure_monitor_ptr(port, onoff) == 0);
  1685. +#endif
  1686. + return false;
  1687. +}
  1688. +
  1689. +bool jackbridge_port_monitoring_input(jack_port_t* port)
  1690. +{
  1691. +#if defined(JACKBRIDGE_DUMMY)
  1692. +#elif defined(JACKBRIDGE_DIRECT)
  1693. + return jack_port_monitoring_input(port);
  1694. +#else
  1695. + if (jackbridge_instance()->port_monitoring_input_ptr != NULL)
  1696. + return jackbridge_instance()->port_monitoring_input_ptr(port);
  1697. +#endif
  1698. + return false;
  1699. +}
  1700. +
  1701. +// -----------------------------------------------------------------------------
  1702. +
  1703. +bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port)
  1704. +{
  1705. +#if defined(JACKBRIDGE_DUMMY)
  1706. +#elif defined(JACKBRIDGE_DIRECT)
  1707. + return (jack_connect(client, source_port, destination_port) == 0);
  1708. +#else
  1709. + if (jackbridge_instance()->connect_ptr != NULL)
  1710. + {
  1711. + const int ret = jackbridge_instance()->connect_ptr(client, source_port, destination_port);
  1712. + return ret == 0 || ret == EEXIST;
  1713. + }
  1714. +#endif
  1715. + return false;
  1716. +}
  1717. +
  1718. +bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port)
  1719. +{
  1720. +#if defined(JACKBRIDGE_DUMMY)
  1721. +#elif defined(JACKBRIDGE_DIRECT)
  1722. + return (jack_disconnect(client, source_port, destination_port) == 0);
  1723. +#else
  1724. + if (jackbridge_instance()->disconnect_ptr != NULL)
  1725. + return (jackbridge_instance()->disconnect_ptr(client, source_port, destination_port) == 0);
  1726. +#endif
  1727. + return false;
  1728. +}
  1729. +
  1730. +bool jackbridge_port_disconnect(jack_client_t* client, jack_port_t* port)
  1731. +{
  1732. +#if defined(JACKBRIDGE_DUMMY)
  1733. +#elif defined(JACKBRIDGE_DIRECT)
  1734. + return (jack_port_disconnect(client, port) == 0);
  1735. +#else
  1736. + if (jackbridge_instance()->port_disconnect_ptr != NULL)
  1737. + return (jackbridge_instance()->port_disconnect_ptr(client, port) == 0);
  1738. +#endif
  1739. + return false;
  1740. +}
  1741. +
  1742. +// -----------------------------------------------------------------------------
  1743. +
  1744. +int jackbridge_port_name_size()
  1745. +{
  1746. +#if defined(JACKBRIDGE_DUMMY)
  1747. +#elif defined(JACKBRIDGE_DIRECT)
  1748. + return jack_port_name_size();
  1749. +#else
  1750. + if (jackbridge_instance()->port_name_size_ptr != NULL)
  1751. + return jackbridge_instance()->port_name_size_ptr();
  1752. +#endif
  1753. + return 256;
  1754. +}
  1755. +
  1756. +int jackbridge_port_type_size()
  1757. +{
  1758. +#if defined(JACKBRIDGE_DUMMY)
  1759. +#elif defined(JACKBRIDGE_DIRECT)
  1760. + return jack_port_type_size();
  1761. +#else
  1762. + if (jackbridge_instance()->port_type_size_ptr != NULL)
  1763. + return jackbridge_instance()->port_type_size_ptr();
  1764. +#endif
  1765. + return 32;
  1766. +}
  1767. +
  1768. +uint32_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* port_type)
  1769. +{
  1770. +#if defined(JACKBRIDGE_DUMMY)
  1771. +#elif defined(JACKBRIDGE_DIRECT)
  1772. + return (uint32_t)jack_port_type_get_buffer_size(client, port_type);
  1773. +#else
  1774. + if (jackbridge_instance()->port_type_get_buffer_size_ptr != NULL)
  1775. + return (uint32_t)jackbridge_instance()->port_type_get_buffer_size_ptr(client, port_type);
  1776. +#endif
  1777. + return 0;
  1778. +}
  1779. +
  1780. +// -----------------------------------------------------------------------------
  1781. +
  1782. +void jackbridge_port_get_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  1783. +{
  1784. +#if defined(JACKBRIDGE_DUMMY)
  1785. +#elif defined(JACKBRIDGE_DIRECT)
  1786. + return jack_port_get_latency_range(port, (jack_latency_callback_mode_t)mode, range);
  1787. +#else
  1788. + if (jackbridge_instance()->port_get_latency_range_ptr != NULL)
  1789. + return jackbridge_instance()->port_get_latency_range_ptr(port, (jack_latency_callback_mode_t)mode, range);
  1790. +#endif
  1791. + range->min = 0;
  1792. + range->max = 0;
  1793. +}
  1794. +
  1795. +void jackbridge_port_set_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  1796. +{
  1797. +#if defined(JACKBRIDGE_DUMMY)
  1798. +#elif defined(JACKBRIDGE_DIRECT)
  1799. + jack_port_set_latency_range(port, (jack_latency_callback_mode_t)mode, range);
  1800. +#else
  1801. + if (jackbridge_instance()->port_set_latency_range_ptr != NULL)
  1802. + jackbridge_instance()->port_set_latency_range_ptr(port, (jack_latency_callback_mode_t)mode, range);
  1803. +#endif
  1804. +}
  1805. +
  1806. +bool jackbridge_recompute_total_latencies(jack_client_t* client)
  1807. +{
  1808. +#if defined(JACKBRIDGE_DUMMY)
  1809. +#elif defined(JACKBRIDGE_DIRECT)
  1810. + return (jack_recompute_total_latencies(client) == 0);
  1811. +#else
  1812. + if (jackbridge_instance()->recompute_total_latencies_ptr != NULL)
  1813. + return (jackbridge_instance()->recompute_total_latencies_ptr(client) == 0);
  1814. +#endif
  1815. + return false;
  1816. +}
  1817. +
  1818. +// -----------------------------------------------------------------------------
  1819. +
  1820. +const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, uint64_t flags)
  1821. +{
  1822. +#if defined(JACKBRIDGE_DUMMY)
  1823. +#elif defined(JACKBRIDGE_DIRECT)
  1824. + return jack_get_ports(client, port_name_pattern, type_name_pattern, flags);
  1825. +#else
  1826. + if (jackbridge_instance()->get_ports_ptr != NULL)
  1827. + return jackbridge_instance()->get_ports_ptr(client, port_name_pattern, type_name_pattern, (ulong)flags);
  1828. +#endif
  1829. + return NULL;
  1830. +}
  1831. +
  1832. +jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name)
  1833. +{
  1834. +#if defined(JACKBRIDGE_DUMMY)
  1835. +#elif defined(JACKBRIDGE_DIRECT)
  1836. + return jack_port_by_name(client, port_name);
  1837. +#else
  1838. + if (jackbridge_instance()->port_by_name_ptr != NULL)
  1839. + return jackbridge_instance()->port_by_name_ptr(client, port_name);
  1840. +#endif
  1841. + return NULL;
  1842. +}
  1843. +
  1844. +jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id)
  1845. +{
  1846. +#if defined(JACKBRIDGE_DUMMY)
  1847. +#elif defined(JACKBRIDGE_DIRECT)
  1848. + return jack_port_by_id(client, port_id);
  1849. +#else
  1850. + if (jackbridge_instance()->port_by_id_ptr != NULL)
  1851. + return jackbridge_instance()->port_by_id_ptr(client, port_id);
  1852. +#endif
  1853. + return NULL;
  1854. +}
  1855. +
  1856. +// -----------------------------------------------------------------------------
  1857. +
  1858. +void jackbridge_free(void* ptr)
  1859. +{
  1860. +#if defined(JACKBRIDGE_DUMMY)
  1861. +#elif defined(JACKBRIDGE_DIRECT)
  1862. + return jack_free(ptr);
  1863. +#else
  1864. + if (jackbridge_instance()->free_ptr != NULL)
  1865. + return jackbridge_instance()->free_ptr(ptr);
  1866. +
  1867. + #ifndef _WIN32
  1868. + free(ptr);
  1869. + #endif
  1870. +#endif
  1871. +}
  1872. +
  1873. +// -----------------------------------------------------------------------------
  1874. +
  1875. +uint32_t jackbridge_midi_get_event_count(void* port_buffer)
  1876. +{
  1877. +#if defined(JACKBRIDGE_DUMMY)
  1878. +#elif defined(JACKBRIDGE_DIRECT)
  1879. + return jack_midi_get_event_count(port_buffer);
  1880. +#else
  1881. + if (jackbridge_instance()->midi_get_event_count_ptr != NULL)
  1882. + return jackbridge_instance()->midi_get_event_count_ptr(port_buffer);
  1883. +#endif
  1884. + return 0;
  1885. +}
  1886. +
  1887. +bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index)
  1888. +{
  1889. +#if defined(JACKBRIDGE_DUMMY)
  1890. +#elif defined(JACKBRIDGE_DIRECT)
  1891. + return (jack_midi_event_get(event, port_buffer, event_index) == 0);
  1892. +#else
  1893. + if (jackbridge_instance()->midi_event_get_ptr != NULL)
  1894. + return (jackbridge_instance()->midi_event_get_ptr(event, port_buffer, event_index) == 0);
  1895. +#endif
  1896. + return false;
  1897. +}
  1898. +
  1899. +void jackbridge_midi_clear_buffer(void* port_buffer)
  1900. +{
  1901. +#if defined(JACKBRIDGE_DUMMY)
  1902. +#elif defined(JACKBRIDGE_DIRECT)
  1903. + jack_midi_clear_buffer(port_buffer);
  1904. +#else
  1905. + if (jackbridge_instance()->midi_clear_buffer_ptr != NULL)
  1906. + jackbridge_instance()->midi_clear_buffer_ptr(port_buffer);
  1907. +#endif
  1908. +}
  1909. +
  1910. +bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, uint32_t data_size)
  1911. +{
  1912. +#if defined(JACKBRIDGE_DUMMY)
  1913. +#elif defined(JACKBRIDGE_DIRECT)
  1914. + return (jack_midi_event_write(port_buffer, time, data, data_size) == 0);
  1915. +#else
  1916. + if (jackbridge_instance()->midi_event_write_ptr != NULL)
  1917. + return (jackbridge_instance()->midi_event_write_ptr(port_buffer, time, data, data_size) == 0);
  1918. +#endif
  1919. + return false;
  1920. +}
  1921. +
  1922. +jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, uint32_t data_size)
  1923. +{
  1924. +#if defined(JACKBRIDGE_DUMMY)
  1925. +#elif defined(JACKBRIDGE_DIRECT)
  1926. + return jack_midi_event_reserve(port_buffer, time, data_size);
  1927. +#else
  1928. + if (jackbridge_instance()->midi_event_reserve_ptr != NULL)
  1929. + return jackbridge_instance()->midi_event_reserve_ptr(port_buffer, time, data_size);
  1930. +#endif
  1931. + return NULL;
  1932. +}
  1933. +
  1934. +// -----------------------------------------------------------------------------
  1935. +
  1936. +bool jackbridge_release_timebase(jack_client_t* client)
  1937. +{
  1938. +#if defined(JACKBRIDGE_DUMMY)
  1939. +#elif defined(JACKBRIDGE_DIRECT)
  1940. + return (jack_release_timebase(client) == 0);
  1941. +#else
  1942. + if (jackbridge_instance()->release_timebase_ptr != NULL)
  1943. + return (jackbridge_instance()->release_timebase_ptr(client) == 0);
  1944. +#endif
  1945. + return false;
  1946. +}
  1947. +
  1948. +bool jackbridge_set_sync_callback(jack_client_t* client, JackSyncCallback sync_callback, void* arg)
  1949. +{
  1950. +#if defined(JACKBRIDGE_DUMMY)
  1951. +#elif defined(JACKBRIDGE_DIRECT)
  1952. + return (jack_set_sync_callback(client, sync_callback, arg) == 0);
  1953. +#else
  1954. + if (jackbridge_instance()->set_sync_callback_ptr != NULL)
  1955. + {
  1956. +# ifdef __WINE__
  1957. + WineBridge::getInstance().set_sync(sync_callback);
  1958. + return (jackbridge_instance()->set_sync_callback_ptr(client, WineBridge::sync, arg) == 0);
  1959. +# else
  1960. + return (jackbridge_instance()->set_sync_callback_ptr(client, sync_callback, arg) == 0);
  1961. +# endif
  1962. + }
  1963. +#endif
  1964. + return false;
  1965. +}
  1966. +
  1967. +bool jackbridge_set_sync_timeout(jack_client_t* client, jack_time_t timeout)
  1968. +{
  1969. +#if defined(JACKBRIDGE_DUMMY)
  1970. +#elif defined(JACKBRIDGE_DIRECT)
  1971. + return (jack_set_sync_timeout(client, timeout) == 0);
  1972. +#else
  1973. + if (jackbridge_instance()->set_sync_timeout_ptr != NULL)
  1974. + return (jackbridge_instance()->set_sync_timeout_ptr(client, timeout) == 0);
  1975. +#endif
  1976. + return false;
  1977. +}
  1978. +
  1979. +bool jackbridge_set_timebase_callback(jack_client_t* client, bool conditional, JackTimebaseCallback timebase_callback, void* arg)
  1980. +{
  1981. +#if defined(JACKBRIDGE_DUMMY)
  1982. +#elif defined(JACKBRIDGE_DIRECT)
  1983. + return (jack_set_timebase_callback(client, conditional, timebase_callback, arg) == 0);
  1984. +#else
  1985. + if (jackbridge_instance()->set_timebase_callback_ptr != NULL)
  1986. + return (jackbridge_instance()->set_timebase_callback_ptr(client, conditional, timebase_callback, arg) == 0);
  1987. +#endif
  1988. + return false;
  1989. +}
  1990. +
  1991. +bool jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame)
  1992. +{
  1993. +#if defined(JACKBRIDGE_DUMMY)
  1994. +#elif defined(JACKBRIDGE_DIRECT)
  1995. + return (jack_transport_locate(client, frame) == 0);
  1996. +#else
  1997. + if (jackbridge_instance()->transport_locate_ptr != NULL)
  1998. + return (jackbridge_instance()->transport_locate_ptr(client, frame) == 0);
  1999. +#endif
  2000. + return false;
  2001. +}
  2002. +
  2003. +uint32_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos)
  2004. +{
  2005. +#if defined(JACKBRIDGE_DUMMY)
  2006. +#elif defined(JACKBRIDGE_DIRECT)
  2007. + return jack_transport_query(client, pos);
  2008. +#else
  2009. + if (jackbridge_instance()->transport_query_ptr != NULL)
  2010. + return jackbridge_instance()->transport_query_ptr(client, pos);
  2011. +#endif
  2012. + if (pos != NULL)
  2013. + {
  2014. + // invalidate
  2015. + memset(pos, 0, sizeof(*pos));
  2016. + pos->unique_1 = 0;
  2017. + pos->unique_2 = 1;
  2018. + }
  2019. + return JackTransportStopped;
  2020. +}
  2021. +
  2022. +jack_nframes_t jackbridge_get_current_transport_frame(const jack_client_t* client)
  2023. +{
  2024. +#if defined(JACKBRIDGE_DUMMY)
  2025. +#elif defined(JACKBRIDGE_DIRECT)
  2026. + return jack_get_current_transport_frame(client);
  2027. +#else
  2028. + if (jackbridge_instance()->get_current_transport_frame_ptr != NULL)
  2029. + return jackbridge_instance()->get_current_transport_frame_ptr(client);
  2030. +#endif
  2031. + return 0;
  2032. +}
  2033. +
  2034. +bool jackbridge_transport_reposition(jack_client_t* client, const jack_position_t* pos)
  2035. +{
  2036. +#if defined(JACKBRIDGE_DUMMY)
  2037. +#elif defined(JACKBRIDGE_DIRECT)
  2038. + return (jack_transport_reposition(client, pos) == 0);
  2039. +#else
  2040. + if (jackbridge_instance()->transport_reposition_ptr != NULL)
  2041. + return (jackbridge_instance()->transport_reposition_ptr(client, pos) == 0);
  2042. +#endif
  2043. + return false;
  2044. +}
  2045. +
  2046. +void jackbridge_transport_start(jack_client_t* client)
  2047. +{
  2048. +#if defined(JACKBRIDGE_DUMMY)
  2049. +#elif defined(JACKBRIDGE_DIRECT)
  2050. + jack_transport_start(client);
  2051. +#else
  2052. + if (jackbridge_instance()->transport_start_ptr != NULL)
  2053. + jackbridge_instance()->transport_start_ptr(client);
  2054. +#endif
  2055. +}
  2056. +
  2057. +void jackbridge_transport_stop(jack_client_t* client)
  2058. +{
  2059. +#if defined(JACKBRIDGE_DUMMY)
  2060. +#elif defined(JACKBRIDGE_DIRECT)
  2061. + jack_transport_stop(client);
  2062. +#else
  2063. + if (jackbridge_instance()->transport_stop_ptr != NULL)
  2064. + jackbridge_instance()->transport_stop_ptr(client);
  2065. +#endif
  2066. +}
  2067. +
  2068. +// -----------------------------------------------------------------------------
  2069. +
  2070. +bool jackbridge_set_property(jack_client_t* client, jack_uuid_t subject, const char* key, const char* value, const char* type)
  2071. +{
  2072. +#if defined(JACKBRIDGE_DUMMY)
  2073. +#elif defined(JACKBRIDGE_DIRECT)
  2074. + return (jack_set_property(client, subject, key, value, type) == 0);
  2075. +#else
  2076. + if (jackbridge_instance()->set_property_ptr != NULL)
  2077. + return (jackbridge_instance()->set_property_ptr(client, subject, key, value, type) == 0);
  2078. +#endif
  2079. + return false;
  2080. +}
  2081. +
  2082. +bool jackbridge_get_property(jack_uuid_t subject, const char* key, char** value, char** type)
  2083. +{
  2084. +#if defined(JACKBRIDGE_DUMMY)
  2085. +#elif defined(JACKBRIDGE_DIRECT)
  2086. + return (jack_get_property(subject, key, value, type) == 0);
  2087. +#else
  2088. + if (jackbridge_instance()->get_property_ptr != NULL)
  2089. + return (jackbridge_instance()->get_property_ptr(subject, key, value, type) == 0);
  2090. +#endif
  2091. + return false;
  2092. +}
  2093. +
  2094. +void jackbridge_free_description(jack_description_t* desc, bool free_description_itself)
  2095. +{
  2096. +#if defined(JACKBRIDGE_DUMMY)
  2097. +#elif defined(JACKBRIDGE_DIRECT)
  2098. + jack_free_description(desc, free_description_itself);
  2099. +#else
  2100. + if (jackbridge_instance()->free_description_ptr != NULL)
  2101. + jackbridge_instance()->free_description_ptr(desc, free_description_itself);
  2102. +#endif
  2103. +}
  2104. +
  2105. +bool jackbridge_get_properties(jack_uuid_t subject, jack_description_t* desc)
  2106. +{
  2107. +#if defined(JACKBRIDGE_DUMMY)
  2108. +#elif defined(JACKBRIDGE_DIRECT)
  2109. + return (jack_get_properties(subject, desc) == 0);
  2110. +#else
  2111. + if (jackbridge_instance()->get_properties_ptr != NULL)
  2112. + return (jackbridge_instance()->get_properties_ptr(subject, desc) == 0);
  2113. +#endif
  2114. + return false;
  2115. +}
  2116. +
  2117. +bool jackbridge_get_all_properties(jack_description_t** descs)
  2118. +{
  2119. +#if defined(JACKBRIDGE_DUMMY)
  2120. +#elif defined(JACKBRIDGE_DIRECT)
  2121. + return (jack_get_all_properties(descs) == 0);
  2122. +#else
  2123. + if (jackbridge_instance()->get_all_properties_ptr != NULL)
  2124. + return (jackbridge_instance()->get_all_properties_ptr(descs) == 0);
  2125. +#endif
  2126. + return false;
  2127. +}
  2128. +
  2129. +bool jackbridge_remove_property(jack_client_t* client, jack_uuid_t subject, const char* key)
  2130. +{
  2131. +#if defined(JACKBRIDGE_DUMMY)
  2132. +#elif defined(JACKBRIDGE_DIRECT)
  2133. + return (jack_remove_property(client, subject, key) == 0);
  2134. +#else
  2135. + if (jackbridge_instance()->remove_property_ptr != NULL)
  2136. + return (jackbridge_instance()->remove_property_ptr(client, subject, key) == 0);
  2137. +#endif
  2138. + return false;
  2139. +}
  2140. +
  2141. +int jackbridge_remove_properties(jack_client_t* client, jack_uuid_t subject)
  2142. +{
  2143. +#if defined(JACKBRIDGE_DUMMY)
  2144. +#elif defined(JACKBRIDGE_DIRECT)
  2145. + return jack_remove_properties(client, subject);
  2146. +#else
  2147. + if (jackbridge_instance()->remove_properties_ptr != NULL)
  2148. + return jackbridge_instance()->remove_properties_ptr(client, subject);
  2149. +#endif
  2150. + return 0;
  2151. +}
  2152. +
  2153. +bool jackbridge_remove_all_properties(jack_client_t* client)
  2154. +{
  2155. +#if defined(JACKBRIDGE_DUMMY)
  2156. +#elif defined(JACKBRIDGE_DIRECT)
  2157. + return (jack_remove_all_properties(client) == 0);
  2158. +#else
  2159. + if (jackbridge_instance()->remove_all_properties_ptr != NULL)
  2160. + return (jackbridge_instance()->remove_all_properties_ptr(client) == 0);
  2161. +#endif
  2162. + return false;
  2163. +}
  2164. +
  2165. +bool jackbridge_set_property_change_callback(jack_client_t* client, JackPropertyChangeCallback callback, void* arg)
  2166. +{
  2167. +#if defined(JACKBRIDGE_DUMMY)
  2168. +#elif defined(JACKBRIDGE_DIRECT)
  2169. + return (jack_set_property_change_callback(client, callback, arg) == 0);
  2170. +#else
  2171. + if (jackbridge_instance()->set_property_change_callback_ptr != NULL)
  2172. + {
  2173. +# ifdef __WINE__
  2174. + WineBridge::getInstance().set_prop_change(callback);
  2175. + return (jackbridge_instance()->set_property_change_callback_ptr(client, WineBridge::prop_change, arg) == 0);
  2176. +# else
  2177. + return (jackbridge_instance()->set_property_change_callback_ptr(client, callback, arg) == 0);
  2178. +# endif
  2179. + }
  2180. +#endif
  2181. + return false;
  2182. +}
  2183. +
  2184. +bool jackbridge_set_process_thread(jack_client_t* client, JackThreadCallback callback, void* arg)
  2185. +{
  2186. +#if defined(JACKBRIDGE_DUMMY)
  2187. +#elif defined(JACKBRIDGE_DIRECT)
  2188. + return (jack_set_process_thread(client, callback, arg) == 0);
  2189. +#else
  2190. + if (jackbridge_instance()->set_process_thread_ptr != NULL)
  2191. + {
  2192. +# ifdef __WINE__
  2193. + WineBridge::getInstance().set_process_thread(callback);
  2194. + return (jackbridge_instance()->set_process_thread_ptr(client, WineBridge::process_thread, arg) == 0);
  2195. +# else
  2196. + return (jackbridge_instance()->set_process_thread_ptr(client, callback, arg) == 0);
  2197. +# endif
  2198. + }
  2199. +#endif
  2200. + return false;
  2201. +}
  2202. +
  2203. +jack_nframes_t jackbridge_cycle_wait(jack_client_t* client)
  2204. +{
  2205. +#if defined(JACKBRIDGE_DUMMY)
  2206. +#elif defined(JACKBRIDGE_DIRECT)
  2207. + return jack_cycle_wait(client);
  2208. +#else
  2209. + if (jackbridge_instance()->cycle_wait_ptr != NULL)
  2210. + return jackbridge_instance()->cycle_wait_ptr(client);
  2211. +#endif
  2212. + return 0;
  2213. +}
  2214. +
  2215. +void jackbridge_cycle_signal(jack_client_t* client, int status)
  2216. +{
  2217. +#if defined(JACKBRIDGE_DUMMY)
  2218. +#elif defined(JACKBRIDGE_DIRECT)
  2219. + jack_cycle_signal(client, status);
  2220. +#else
  2221. + if (jackbridge_instance()->cycle_signal_ptr != NULL)
  2222. + jackbridge_instance()->cycle_signal_ptr(client, status);
  2223. +#endif
  2224. +}
  2225. +
  2226. +jack_nframes_t jackbridge_port_get_latency(jack_port_t* port)
  2227. +{
  2228. +#if defined(JACKBRIDGE_DUMMY)
  2229. +#elif defined(JACKBRIDGE_DIRECT)
  2230. + return jack_port_get_latency(port);
  2231. +#else
  2232. + if (jackbridge_instance()->port_get_latency_ptr != NULL)
  2233. + jackbridge_instance()->port_get_latency_ptr(port);
  2234. + return 0;
  2235. +#endif
  2236. +}
  2237. +
  2238. +jack_nframes_t jackbridge_frame_time(const jack_client_t* client)
  2239. +{
  2240. +#if defined(JACKBRIDGE_DUMMY)
  2241. +#elif defined(JACKBRIDGE_DIRECT)
  2242. + return jackbridge_frame_time(client);
  2243. +#else
  2244. + if (jackbridge_instance()->frame_time_ptr != NULL)
  2245. + jackbridge_instance()->frame_time_ptr(client);
  2246. + return 0;
  2247. +#endif
  2248. +}
  2249. diff --git a/src/hostapi/jack/JackBridge.h b/src/hostapi/jack/JackBridge.h
  2250. new file mode 100644
  2251. index 0000000..eff8cb0
  2252. --- /dev/null
  2253. +++ b/src/hostapi/jack/JackBridge.h
  2254. @@ -0,0 +1,406 @@
  2255. +/*
  2256. + * JackBridge for DPF
  2257. + * Copyright (C) 2013-2021 Filipe Coelho <falktx@falktx.com>
  2258. + *
  2259. + * Permission to use, copy, modify, and/or distribute this software for any purpose with
  2260. + * or without fee is hereby granted, provided that the above copyright notice and this
  2261. + * permission notice appear in all copies.
  2262. + *
  2263. + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  2264. + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  2265. + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  2266. + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  2267. + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  2268. + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  2269. + */
  2270. +
  2271. +#ifndef JACKBRIDGE_HPP_INCLUDED
  2272. +#define JACKBRIDGE_HPP_INCLUDED
  2273. +
  2274. +#if defined(_WIN32) && defined(__cdecl)
  2275. +# define JACKBRIDGE_API __cdecl
  2276. +#else
  2277. +# define JACKBRIDGE_API
  2278. +#endif
  2279. +
  2280. +#ifdef JACKBRIDGE_DIRECT
  2281. +# include <jack/jack.h>
  2282. +# include <jack/midiport.h>
  2283. +# include <jack/transport.h>
  2284. +# include <jack/session.h>
  2285. +# include <jack/metadata.h>
  2286. +# include <jack/uuid.h>
  2287. +#else
  2288. +
  2289. +#include <stdbool.h>
  2290. +#include <stddef.h>
  2291. +#include <stdint.h>
  2292. +
  2293. +#ifndef POST_PACKED_STRUCTURE
  2294. +# if defined(__GNUC__)
  2295. + /* POST_PACKED_STRUCTURE needs to be a macro which
  2296. + expands into a compiler directive. The directive must
  2297. + tell the compiler to arrange the preceding structure
  2298. + declaration so that it is packed on byte-boundaries rather
  2299. + than use the natural alignment of the processor and/or
  2300. + compiler.
  2301. + */
  2302. + #define PRE_PACKED_STRUCTURE
  2303. + #define POST_PACKED_STRUCTURE __attribute__((__packed__))
  2304. +# elif defined(_MSC_VER)
  2305. + #define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1))
  2306. + #define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1
  2307. + /* PRE_PACKED_STRUCTURE needs to be a macro which
  2308. + expands into a compiler directive. The directive must
  2309. + tell the compiler to arrange the following structure
  2310. + declaration so that it is packed on byte-boundaries rather
  2311. + than use the natural alignment of the processor and/or
  2312. + compiler.
  2313. + */
  2314. + #define POST_PACKED_STRUCTURE ;__pragma(pack(pop))
  2315. + /* and POST_PACKED_STRUCTURE needs to be a macro which
  2316. + restores the packing to its previous setting */
  2317. +# else
  2318. + #define PRE_PACKED_STRUCTURE
  2319. + #define POST_PACKED_STRUCTURE
  2320. +# endif
  2321. +#endif
  2322. +
  2323. +#if (defined(__arm__) || defined(__aarch64__) || defined(__mips__) || defined(__ppc__) || defined(__powerpc__)) && !defined(__APPLE__)
  2324. +# undef POST_PACKED_STRUCTURE
  2325. +# define POST_PACKED_STRUCTURE
  2326. +#endif
  2327. +
  2328. +#define JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio"
  2329. +#define JACK_DEFAULT_MIDI_TYPE "8 bit raw midi"
  2330. +
  2331. +#define JACK_MAX_FRAMES (4294967295U)
  2332. +
  2333. +#define JackOpenOptions (JackSessionID|JackServerName|JackNoStartServer|JackUseExactName)
  2334. +#define JackLoadOptions (JackLoadInit|JackLoadName|JackUseExactName)
  2335. +
  2336. +#define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode|JackBBTFrameOffset|JackAudioVideoRatio|JackVideoFrameOffset)
  2337. +#define EXTENDED_TIME_INFO
  2338. +
  2339. +#define JACK_UUID_SIZE 36
  2340. +#define JACK_UUID_STRING_SIZE (JACK_UUID_SIZE+1) /* includes trailing null */
  2341. +#define JACK_UUID_EMPTY_INITIALIZER 0
  2342. +
  2343. +#define JACK_TICK_DOUBLE
  2344. +
  2345. +enum JackOptions {
  2346. + JackNullOption = 0x00,
  2347. + JackNoStartServer = 0x01,
  2348. + JackUseExactName = 0x02,
  2349. + JackServerName = 0x04,
  2350. + JackLoadName = 0x08,
  2351. + JackLoadInit = 0x10,
  2352. + JackSessionID = 0x20
  2353. +};
  2354. +
  2355. +enum JackStatus {
  2356. + JackFailure = 0x0001,
  2357. + JackInvalidOption = 0x0002,
  2358. + JackNameNotUnique = 0x0004,
  2359. + JackServerStarted = 0x0008,
  2360. + JackServerFailed = 0x0010,
  2361. + JackServerError = 0x0020,
  2362. + JackNoSuchClient = 0x0040,
  2363. + JackLoadFailure = 0x0080,
  2364. + JackInitFailure = 0x0100,
  2365. + JackShmFailure = 0x0200,
  2366. + JackVersionError = 0x0400,
  2367. + JackBackendError = 0x0800,
  2368. + JackClientZombie = 0x1000,
  2369. + JackBridgeNativeFailed = 0x10000
  2370. +};
  2371. +
  2372. +enum JackLatencyCallbackMode {
  2373. + JackCaptureLatency,
  2374. + JackPlaybackLatency
  2375. +};
  2376. +
  2377. +enum JackPortFlags {
  2378. + JackPortIsInput = 0x01,
  2379. + JackPortIsOutput = 0x02,
  2380. + JackPortIsPhysical = 0x04,
  2381. + JackPortCanMonitor = 0x08,
  2382. + JackPortIsTerminal = 0x10,
  2383. + JackPortIsControlVoltage = 0x100
  2384. +};
  2385. +
  2386. +enum JackTransportState {
  2387. + JackTransportStopped = 0,
  2388. + JackTransportRolling = 1,
  2389. + JackTransportLooping = 2,
  2390. + JackTransportStarting = 3
  2391. +};
  2392. +
  2393. +enum JackPositionBits {
  2394. + JackPositionBBT = 0x010,
  2395. + JackPositionTimecode = 0x020,
  2396. + JackBBTFrameOffset = 0x040,
  2397. + JackAudioVideoRatio = 0x080,
  2398. + JackVideoFrameOffset = 0x100,
  2399. + JackTickDouble = 0x200
  2400. +};
  2401. +
  2402. +enum JackSessionEventType {
  2403. + JackSessionSave = 1,
  2404. + JackSessionSaveAndQuit = 2,
  2405. + JackSessionSaveTemplate = 3
  2406. +};
  2407. +
  2408. +enum JackSessionFlags {
  2409. + JackSessionSaveError = 0x1,
  2410. + JackSessionNeedTerminal = 0x2
  2411. +};
  2412. +
  2413. +enum JackPropertyChange {
  2414. + PropertyCreated,
  2415. + PropertyChanged,
  2416. + PropertyDeleted
  2417. +};
  2418. +
  2419. +typedef uint32_t jack_nframes_t;
  2420. +typedef uint32_t jack_port_id_t;
  2421. +typedef uint64_t jack_time_t;
  2422. +typedef uint64_t jack_uuid_t;
  2423. +typedef uint64_t jack_unique_t;
  2424. +typedef unsigned char jack_midi_data_t;
  2425. +typedef float jack_default_audio_sample_t;
  2426. +
  2427. +typedef enum JackOptions jack_options_t;
  2428. +typedef enum JackStatus jack_status_t;
  2429. +typedef enum JackLatencyCallbackMode jack_latency_callback_mode_t;
  2430. +typedef enum JackTransportState jack_transport_state_t;
  2431. +typedef enum JackPositionBits jack_position_bits_t;
  2432. +typedef enum JackSessionEventType jack_session_event_type_t;
  2433. +typedef enum JackSessionFlags jack_session_flags_t;
  2434. +typedef enum JackPropertyChange jack_property_change_t;
  2435. +
  2436. +struct _jack_midi_event {
  2437. + jack_nframes_t time;
  2438. + size_t size;
  2439. + jack_midi_data_t* buffer;
  2440. +};
  2441. +
  2442. +// NOTE: packed in JACK2 but not in JACK1
  2443. +PRE_PACKED_STRUCTURE
  2444. +struct _jack_latency_range {
  2445. + jack_nframes_t min;
  2446. + jack_nframes_t max;
  2447. +} POST_PACKED_STRUCTURE;
  2448. +
  2449. +PRE_PACKED_STRUCTURE
  2450. +struct _jack_position {
  2451. + jack_unique_t unique_1;
  2452. + jack_time_t usecs;
  2453. + jack_nframes_t frame_rate;
  2454. + jack_nframes_t frame;
  2455. + jack_position_bits_t valid;
  2456. + int32_t bar;
  2457. + int32_t beat;
  2458. + int32_t tick;
  2459. + double bar_start_tick;
  2460. + float beats_per_bar;
  2461. + float beat_type;
  2462. + double ticks_per_beat;
  2463. + double beats_per_minute;
  2464. + double frame_time;
  2465. + double next_time;
  2466. + jack_nframes_t bbt_offset;
  2467. + float audio_frames_per_video_frame;
  2468. + jack_nframes_t video_offset;
  2469. + double tick_double;
  2470. + int32_t padding[5];
  2471. + jack_unique_t unique_2;
  2472. +} POST_PACKED_STRUCTURE;
  2473. +
  2474. +struct _jack_session_event {
  2475. + jack_session_event_type_t type;
  2476. + const char* session_dir;
  2477. + const char* client_uuid;
  2478. + char* command_line;
  2479. + jack_session_flags_t flags;
  2480. + uint32_t future;
  2481. +};
  2482. +
  2483. +struct _jack_session_command_t {
  2484. + const char* uuid;
  2485. + const char* client_name;
  2486. + const char* command;
  2487. + jack_session_flags_t flags;
  2488. +};
  2489. +
  2490. +typedef struct {
  2491. + const char* key;
  2492. + const char* data;
  2493. + const char* type;
  2494. +} jack_property_t;
  2495. +
  2496. +typedef struct {
  2497. + jack_uuid_t subject;
  2498. + uint32_t property_cnt;
  2499. + jack_property_t* properties;
  2500. + uint32_t property_size;
  2501. +} jack_description_t;
  2502. +
  2503. +typedef struct _jack_port jack_port_t;
  2504. +typedef struct _jack_client jack_client_t;
  2505. +typedef struct _jack_midi_event jack_midi_event_t;
  2506. +typedef struct _jack_latency_range jack_latency_range_t;
  2507. +typedef struct _jack_position jack_position_t;
  2508. +typedef struct _jack_session_event jack_session_event_t;
  2509. +typedef struct _jack_session_command_t jack_session_command_t;
  2510. +
  2511. +typedef void (JACKBRIDGE_API *JackLatencyCallback)(jack_latency_callback_mode_t mode, void* arg);
  2512. +typedef int (JACKBRIDGE_API *JackProcessCallback)(jack_nframes_t nframes, void* arg);
  2513. +typedef void (JACKBRIDGE_API *JackThreadInitCallback)(void* arg);
  2514. +typedef int (JACKBRIDGE_API *JackGraphOrderCallback)(void* arg);
  2515. +typedef int (JACKBRIDGE_API *JackXRunCallback)(void* arg);
  2516. +typedef int (JACKBRIDGE_API *JackBufferSizeCallback)(jack_nframes_t nframes, void* arg);
  2517. +typedef int (JACKBRIDGE_API *JackSampleRateCallback)(jack_nframes_t nframes, void* arg);
  2518. +typedef void (JACKBRIDGE_API *JackPortRegistrationCallback)(jack_port_id_t port, int register_, void* arg);
  2519. +typedef void (JACKBRIDGE_API *JackClientRegistrationCallback)(const char* name, int register_, void* arg);
  2520. +typedef void (JACKBRIDGE_API *JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg);
  2521. +typedef void (JACKBRIDGE_API *JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void* arg);
  2522. +typedef void (JACKBRIDGE_API *JackFreewheelCallback)(int starting, void* arg);
  2523. +typedef void (JACKBRIDGE_API *JackShutdownCallback)(void* arg);
  2524. +typedef void (JACKBRIDGE_API *JackInfoShutdownCallback)(jack_status_t code, const char* reason, void* arg);
  2525. +typedef int (JACKBRIDGE_API *JackSyncCallback)(jack_transport_state_t state, jack_position_t* pos, void* arg);
  2526. +typedef void (JACKBRIDGE_API *JackTimebaseCallback)(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg);
  2527. +typedef void (JACKBRIDGE_API *JackSessionCallback)(jack_session_event_t* event, void* arg);
  2528. +typedef void (JACKBRIDGE_API *JackPropertyChangeCallback)(jack_uuid_t subject, const char* key, jack_property_change_t change, void* arg);
  2529. +typedef void *(JACKBRIDGE_API *JackThreadCallback)(void* arg);
  2530. +
  2531. +#endif // ! JACKBRIDGE_DIRECT
  2532. +
  2533. +JACKBRIDGE_API bool jackbridge_is_ok();
  2534. +
  2535. +JACKBRIDGE_API void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr);
  2536. +JACKBRIDGE_API const char* jackbridge_get_version_string();
  2537. +
  2538. +JACKBRIDGE_API jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, jack_status_t* status);
  2539. +JACKBRIDGE_API bool jackbridge_client_close(jack_client_t* client);
  2540. +
  2541. +JACKBRIDGE_API int jackbridge_client_name_size();
  2542. +JACKBRIDGE_API const char* jackbridge_get_client_name(jack_client_t* client);
  2543. +
  2544. +JACKBRIDGE_API char* jackbridge_client_get_uuid(jack_client_t* client);
  2545. +JACKBRIDGE_API char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* name);
  2546. +JACKBRIDGE_API char* jackbridge_get_client_name_by_uuid(jack_client_t* client, const char* uuid);
  2547. +
  2548. +JACKBRIDGE_API bool jackbridge_uuid_parse(const char* buf, jack_uuid_t* uuid);
  2549. +JACKBRIDGE_API void jackbridge_uuid_unparse(jack_uuid_t uuid, char buf[JACK_UUID_STRING_SIZE]);
  2550. +
  2551. +JACKBRIDGE_API bool jackbridge_activate(jack_client_t* client);
  2552. +JACKBRIDGE_API bool jackbridge_deactivate(jack_client_t* client);
  2553. +JACKBRIDGE_API bool jackbridge_is_realtime(jack_client_t* client);
  2554. +
  2555. +JACKBRIDGE_API bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCallback thread_init_callback, void* arg);
  2556. +JACKBRIDGE_API void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg);
  2557. +JACKBRIDGE_API void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback shutdown_callback, void* arg);
  2558. +JACKBRIDGE_API bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg);
  2559. +JACKBRIDGE_API bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg);
  2560. +JACKBRIDGE_API bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg);
  2561. +JACKBRIDGE_API bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg);
  2562. +JACKBRIDGE_API bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg);
  2563. +JACKBRIDGE_API bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback registration_callback, void* arg);
  2564. +JACKBRIDGE_API bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCallback rename_callback, void* arg);
  2565. +JACKBRIDGE_API bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback connect_callback, void* arg);
  2566. +JACKBRIDGE_API bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback graph_callback, void* arg);
  2567. +JACKBRIDGE_API bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_callback, void* arg);
  2568. +JACKBRIDGE_API bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg);
  2569. +
  2570. +JACKBRIDGE_API bool jackbridge_set_freewheel(jack_client_t* client, bool onoff);
  2571. +JACKBRIDGE_API bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes);
  2572. +
  2573. +JACKBRIDGE_API jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client);
  2574. +JACKBRIDGE_API jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client);
  2575. +JACKBRIDGE_API float jackbridge_cpu_load(jack_client_t* client);
  2576. +
  2577. +JACKBRIDGE_API jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, uint64_t flags, uint64_t buffer_size);
  2578. +JACKBRIDGE_API bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port);
  2579. +JACKBRIDGE_API void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes);
  2580. +
  2581. +JACKBRIDGE_API const char* jackbridge_port_name(const jack_port_t* port);
  2582. +JACKBRIDGE_API jack_uuid_t jackbridge_port_uuid(const jack_port_t* port);
  2583. +JACKBRIDGE_API const char* jackbridge_port_short_name(const jack_port_t* port);
  2584. +JACKBRIDGE_API int jackbridge_port_flags(const jack_port_t* port);
  2585. +JACKBRIDGE_API const char* jackbridge_port_type(const jack_port_t* port);
  2586. +JACKBRIDGE_API bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* port);
  2587. +JACKBRIDGE_API int jackbridge_port_connected(const jack_port_t* port);
  2588. +JACKBRIDGE_API bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name);
  2589. +JACKBRIDGE_API const char** jackbridge_port_get_connections(const jack_port_t* port);
  2590. +JACKBRIDGE_API const char** jackbridge_port_get_all_connections(const jack_client_t* client, const jack_port_t* port);
  2591. +
  2592. +JACKBRIDGE_API bool jackbridge_port_rename(jack_client_t* client, jack_port_t* port, const char* port_name);
  2593. +JACKBRIDGE_API bool jackbridge_port_set_alias(jack_port_t* port, const char* alias);
  2594. +JACKBRIDGE_API bool jackbridge_port_unset_alias(jack_port_t* port, const char* alias);
  2595. +JACKBRIDGE_API int jackbridge_port_get_aliases(const jack_port_t* port, char* const al[2]);
  2596. +
  2597. +JACKBRIDGE_API bool jackbridge_port_request_monitor(jack_port_t* port, bool onoff);
  2598. +JACKBRIDGE_API bool jackbridge_port_request_monitor_by_name(jack_client_t* client, const char* port_name, bool onoff);
  2599. +JACKBRIDGE_API bool jackbridge_port_ensure_monitor(jack_port_t* port, bool onoff);
  2600. +JACKBRIDGE_API bool jackbridge_port_monitoring_input(jack_port_t* port);
  2601. +
  2602. +JACKBRIDGE_API bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port);
  2603. +JACKBRIDGE_API bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port);
  2604. +JACKBRIDGE_API bool jackbridge_port_disconnect(jack_client_t* client, jack_port_t* port);
  2605. +
  2606. +JACKBRIDGE_API int jackbridge_port_name_size();
  2607. +JACKBRIDGE_API int jackbridge_port_type_size();
  2608. +JACKBRIDGE_API uint32_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* port_type);
  2609. +
  2610. +JACKBRIDGE_API void jackbridge_port_get_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range);
  2611. +JACKBRIDGE_API void jackbridge_port_set_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range);
  2612. +JACKBRIDGE_API bool jackbridge_recompute_total_latencies(jack_client_t* client);
  2613. +
  2614. +JACKBRIDGE_API const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, uint64_t flags);
  2615. +JACKBRIDGE_API jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name);
  2616. +JACKBRIDGE_API jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id);
  2617. +
  2618. +JACKBRIDGE_API void jackbridge_free(void* ptr);
  2619. +
  2620. +JACKBRIDGE_API uint32_t jackbridge_midi_get_event_count(void* port_buffer);
  2621. +JACKBRIDGE_API bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index);
  2622. +JACKBRIDGE_API void jackbridge_midi_clear_buffer(void* port_buffer);
  2623. +JACKBRIDGE_API bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, uint32_t data_size);
  2624. +JACKBRIDGE_API jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, uint32_t data_size);
  2625. +
  2626. +JACKBRIDGE_API bool jackbridge_release_timebase(jack_client_t* client);
  2627. +JACKBRIDGE_API bool jackbridge_set_sync_callback(jack_client_t* client, JackSyncCallback sync_callback, void* arg);
  2628. +JACKBRIDGE_API bool jackbridge_set_sync_timeout(jack_client_t* client, jack_time_t timeout);
  2629. +JACKBRIDGE_API bool jackbridge_set_timebase_callback(jack_client_t* client, bool conditional, JackTimebaseCallback timebase_callback, void* arg);
  2630. +JACKBRIDGE_API bool jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame);
  2631. +
  2632. +JACKBRIDGE_API uint32_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos);
  2633. +JACKBRIDGE_API jack_nframes_t jackbridge_get_current_transport_frame(const jack_client_t* client);
  2634. +
  2635. +JACKBRIDGE_API bool jackbridge_transport_reposition(jack_client_t* client, const jack_position_t* pos);
  2636. +JACKBRIDGE_API void jackbridge_transport_start(jack_client_t* client);
  2637. +JACKBRIDGE_API void jackbridge_transport_stop(jack_client_t* client);
  2638. +
  2639. +JACKBRIDGE_API bool jackbridge_set_property(jack_client_t* client, jack_uuid_t subject, const char* key, const char* value, const char* type);
  2640. +JACKBRIDGE_API bool jackbridge_get_property(jack_uuid_t subject, const char* key, char** value, char** type);
  2641. +JACKBRIDGE_API void jackbridge_free_description(jack_description_t* desc, bool free_description_itself);
  2642. +JACKBRIDGE_API bool jackbridge_get_properties(jack_uuid_t subject, jack_description_t* desc);
  2643. +JACKBRIDGE_API bool jackbridge_get_all_properties(jack_description_t** descs);
  2644. +JACKBRIDGE_API bool jackbridge_remove_property(jack_client_t* client, jack_uuid_t subject, const char* key);
  2645. +JACKBRIDGE_API int jackbridge_remove_properties(jack_client_t* client, jack_uuid_t subject);
  2646. +JACKBRIDGE_API bool jackbridge_remove_all_properties(jack_client_t* client);
  2647. +JACKBRIDGE_API bool jackbridge_set_property_change_callback(jack_client_t* client, JackPropertyChangeCallback callback, void* arg);
  2648. +
  2649. +JACKBRIDGE_API bool jackbridge_set_process_thread(jack_client_t* client, JackThreadCallback callback, void* arg);
  2650. +JACKBRIDGE_API jack_nframes_t jackbridge_cycle_wait(jack_client_t* client);
  2651. +JACKBRIDGE_API void jackbridge_cycle_signal(jack_client_t* client, int status);
  2652. +
  2653. +JACKBRIDGE_API jack_nframes_t jackbridge_port_get_latency(jack_port_t* port);
  2654. +JACKBRIDGE_API jack_nframes_t jackbridge_frame_time(const jack_client_t* client);
  2655. +
  2656. +// todo
  2657. +static inline
  2658. +void jackbridge_set_error_function(void* cb) {}
  2659. +
  2660. +#endif // JACKBRIDGE_HPP_INCLUDED
  2661. diff --git a/configure.in b/configure.in
  2662. index f325bb1..178588f 100644
  2663. --- a/configure.in
  2664. +++ b/configure.in
  2665. @@ -134,7 +134,7 @@ if test "x$with_oss" != "xno"; then
  2666. fi
  2667. have_jack=no
  2668. if test "x$with_jack" != "xno"; then
  2669. - PKG_CHECK_MODULES(JACK, jack, have_jack=yes, have_jack=no)
  2670. + have_jack=yes
  2671. fi