|
|
@@ -95,7 +95,11 @@ char *program_name; |
|
|
|
jack_port_t *remote_in_port; |
|
|
|
jack_port_t *remote_out_port; |
|
|
|
size_t samples; |
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_t* semaphore; |
|
|
|
#else |
|
|
|
sem_t semaphore; |
|
|
|
#endif |
|
|
|
pthread_mutex_t start_mutex; |
|
|
|
int timeout; |
|
|
|
jack_nframes_t total_latency; |
|
|
@@ -212,7 +216,11 @@ handle_process(jack_nframes_t frames, void *arg) |
|
|
|
messages_received++; |
|
|
|
if (messages_received == samples) { |
|
|
|
process_state = 2; |
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_post(semaphore); |
|
|
|
#else |
|
|
|
sem_post(&semaphore); |
|
|
|
#endif |
|
|
|
break; |
|
|
|
} |
|
|
|
send_message: |
|
|
@@ -302,7 +310,11 @@ set_process_error(const char *source, const char *message) |
|
|
|
error_source = source; |
|
|
|
error_message = message; |
|
|
|
process_state = -1; |
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_post(semaphore); |
|
|
|
#else |
|
|
|
sem_post(&semaphore); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
int |
|
|
@@ -460,11 +472,22 @@ main(int argc, char **argv) |
|
|
|
jack_on_shutdown(client, handle_shutdown, NULL); |
|
|
|
jack_set_info_function(handle_info); |
|
|
|
process_state = 0; |
|
|
|
#ifdef __APPLE__ |
|
|
|
// sem_init is not implemented on OSX |
|
|
|
char name[128]; |
|
|
|
sprintf(name, "midi_sem_%p", client); |
|
|
|
if ((semaphore = sem_open(name, O_CREAT, 0777, 0)) == (sem_t*)SEM_FAILED) { |
|
|
|
error_message = strerror(errno); |
|
|
|
error_source = "sem_open"; |
|
|
|
goto unregister_out_port; |
|
|
|
} |
|
|
|
#else |
|
|
|
if (sem_init(&semaphore, 0, 0)) { |
|
|
|
error_message = strerror(errno); |
|
|
|
error_source = "sem_init"; |
|
|
|
goto unregister_out_port; |
|
|
|
} |
|
|
|
#endif |
|
|
|
code = pthread_mutex_init(&start_mutex, NULL); |
|
|
|
if (code) { |
|
|
|
error_message = strerror(errno); |
|
|
@@ -500,11 +523,15 @@ main(int argc, char **argv) |
|
|
|
error_source = "pthread_mutex_unlock"; |
|
|
|
goto deactivate_client; |
|
|
|
} |
|
|
|
#ifdef __APPLE__ |
|
|
|
while (sem_wait(semaphore) != 0) {} |
|
|
|
#else |
|
|
|
if (sem_wait(&semaphore)) { |
|
|
|
error_message = strerror(errno); |
|
|
|
error_source = "sem_wait"; |
|
|
|
goto deactivate_client; |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (process_state == 2) { |
|
|
|
double average_latency = ((double) total_latency) / samples; |
|
|
|
double average_latency_time = total_latency_time / samples; |
|
|
@@ -572,7 +599,11 @@ main(int argc, char **argv) |
|
|
|
destroy_mutex: |
|
|
|
pthread_mutex_destroy(&start_mutex); |
|
|
|
destroy_semaphore: |
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_destroy(semaphore); |
|
|
|
#else |
|
|
|
sem_destroy(&semaphore); |
|
|
|
#endif |
|
|
|
unregister_out_port: |
|
|
|
jack_port_unregister(client, out_port); |
|
|
|
unregister_in_port: |
|
|
@@ -592,5 +623,8 @@ main(int argc, char **argv) |
|
|
|
output_error(error_source, error_message); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_unlink(name); |
|
|
|
#endif |
|
|
|
return EXIT_SUCCESS; |
|
|
|
} |