git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1909 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.71
@@ -31,11 +31,11 @@ extern "C" | |||
{ | |||
#endif | |||
EXPORT jack_client_t * jack_client_open (const char *client_name, | |||
EXPORT jack_client_t * jack_client_open (const char *client_name, | |||
jack_options_t options, | |||
jack_status_t *status, ...); | |||
EXPORT jack_client_t * jack_client_new (const char *client_name); | |||
EXPORT int jack_client_name_size (void); | |||
EXPORT int jack_client_name_size (void); | |||
EXPORT char* jack_get_client_name (jack_client_t *client); | |||
EXPORT int jack_internal_client_new (const char *client_name, | |||
const char *load_name, | |||
@@ -47,13 +47,13 @@ extern "C" | |||
EXPORT int jack_set_process_callback (jack_client_t *client, | |||
JackProcessCallback process_callback, | |||
void *arg); | |||
// | |||
EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status); | |||
// new | |||
EXPORT jack_nframes_t jack_cycle_wait (jack_client_t*); | |||
EXPORT void jack_cycle_signal (jack_client_t*, int status); | |||
EXPORT int jack_set_process_thread(jack_client_t* client, JackThreadCallback fun, void *arg); | |||
// | |||
EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status); | |||
// new | |||
EXPORT jack_nframes_t jack_cycle_wait (jack_client_t*); | |||
EXPORT void jack_cycle_signal (jack_client_t*, int status); | |||
EXPORT int jack_set_process_thread(jack_client_t* client, JackThreadCallback fun, void *arg); | |||
EXPORT int jack_set_thread_init_callback (jack_client_t *client, | |||
JackThreadInitCallback thread_init_callback, | |||
void *arg); | |||
@@ -68,18 +68,18 @@ extern "C" | |||
EXPORT int jack_set_sample_rate_callback (jack_client_t *client, | |||
JackSampleRateCallback srate_callback, | |||
void *arg); | |||
// | |||
EXPORT int jack_set_client_registration_callback (jack_client_t *, | |||
JackClientRegistrationCallback | |||
registration_callback, void *arg); | |||
EXPORT int jack_set_port_registration_callback (jack_client_t *, | |||
// | |||
EXPORT int jack_set_client_registration_callback (jack_client_t *, | |||
JackClientRegistrationCallback | |||
registration_callback, void *arg); | |||
EXPORT int jack_set_port_registration_callback (jack_client_t *, | |||
JackPortRegistrationCallback | |||
registration_callback, void *arg); | |||
// | |||
EXPORT int jack_set_port_connect_callback (jack_client_t *, | |||
JackPortConnectCallback | |||
connect_callback, void *arg); | |||
// | |||
EXPORT int jack_set_port_connect_callback (jack_client_t *, | |||
JackPortConnectCallback | |||
connect_callback, void *arg); | |||
EXPORT int jack_set_graph_order_callback (jack_client_t *, | |||
JackGraphOrderCallback graph_callback, | |||
void *); | |||
@@ -111,14 +111,14 @@ extern "C" | |||
EXPORT jack_nframes_t jack_port_get_total_latency (jack_client_t *, | |||
jack_port_t *port); | |||
EXPORT void jack_port_set_latency (jack_port_t *, jack_nframes_t); | |||
// | |||
// | |||
EXPORT int jack_recompute_total_latency (jack_client_t*, jack_port_t* port); | |||
EXPORT int jack_recompute_total_latencies (jack_client_t*); | |||
EXPORT int jack_port_set_name (jack_port_t *port, const char *port_name); | |||
// | |||
EXPORT int jack_port_set_alias (jack_port_t *port, const char *alias); | |||
EXPORT int jack_port_unset_alias (jack_port_t *port, const char *alias); | |||
EXPORT int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]); | |||
// | |||
EXPORT int jack_port_set_alias (jack_port_t *port, const char *alias); | |||
EXPORT int jack_port_unset_alias (jack_port_t *port, const char *alias); | |||
EXPORT int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]); | |||
EXPORT int jack_port_request_monitor (jack_port_t *port, int onoff); | |||
EXPORT int jack_port_request_monitor_by_name (jack_client_t *client, | |||
const char *port_name, int onoff); | |||
@@ -144,11 +144,11 @@ extern "C" | |||
jack_port_id_t port_id); | |||
EXPORT int jack_engine_takeover_timebase (jack_client_t *); | |||
EXPORT jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *); | |||
// | |||
EXPORT jack_time_t jack_get_time(); | |||
// | |||
EXPORT jack_time_t jack_get_time(); | |||
EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t time); | |||
EXPORT jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t frames); | |||
EXPORT jack_nframes_t jack_frame_time (const jack_client_t *); | |||
EXPORT jack_nframes_t jack_last_frame_time (const jack_client_t *client); | |||
EXPORT float jack_cpu_load (jack_client_t *client); | |||
@@ -203,8 +203,8 @@ extern "C" | |||
jack_status_t *status, ...); | |||
EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client, | |||
jack_intclient_t intclient); | |||
EXPORT jack_client_t * jack_client_open (const char *client_name, | |||
EXPORT jack_client_t * jack_client_open (const char *client_name, | |||
jack_options_t options, | |||
jack_status_t *status, ...); | |||
EXPORT jack_client_t * jack_client_new (const char *client_name); | |||
@@ -220,7 +220,7 @@ typedef void* (*jack_port_get_buffer_fun_def)(jack_port_t* port, jack_nframes_t | |||
static jack_port_get_buffer_fun_def jack_port_get_buffer_fun = 0; | |||
EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames) | |||
{ | |||
return (*jack_port_get_buffer_fun)(port, frames); | |||
return (*jack_port_get_buffer_fun)(port, frames); | |||
} | |||
typedef const char* (*jack_port_name_fun_def)(const jack_port_t* port); | |||
@@ -283,7 +283,7 @@ typedef jack_nframes_t (*jack_port_get_latency_fun_def)(jack_port_t* port); | |||
static jack_port_get_latency_fun_def jack_port_get_latency_fun = 0; | |||
EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port) | |||
{ | |||
return (*jack_port_get_latency)(port); | |||
return (*jack_port_get_latency)(port); | |||
} | |||
typedef void (*jack_port_set_latency_fun_def)(jack_port_t* port, jack_nframes_t frames); | |||
@@ -297,14 +297,14 @@ typedef int (*jack_recompute_total_latency_fun_def)(jack_client_t* ext_client, j | |||
static jack_recompute_total_latency_fun_def jack_recompute_total_latency_fun = 0; | |||
EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port_t* port) | |||
{ | |||
return (*jack_recompute_total_latency_fun)(ext_client, port); | |||
return (*jack_recompute_total_latency_fun)(ext_client, port); | |||
} | |||
typedef int (*jack_recompute_total_latencies_fun_def)(jack_client_t* ext_client); | |||
static jack_recompute_total_latencies_fun_def jack_recompute_total_latencies_fun = 0; | |||
EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client) | |||
{ | |||
return (*jack_recompute_total_latencies_fun)(ext_client); | |||
return (*jack_recompute_total_latencies_fun)(ext_client); | |||
} | |||
typedef int (*jack_port_set_name_fun_def)(jack_port_t* port, const char* name); | |||
@@ -537,7 +537,7 @@ typedef jack_nframes_t (*jack_get_buffer_size_fun_def)(jack_client_t* ext_client | |||
static jack_get_buffer_size_fun_def jack_get_buffer_size_fun = 0; | |||
EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client) | |||
{ | |||
return (*jack_get_buffer_size_fun)(ext_client); | |||
return (*jack_get_buffer_size_fun)(ext_client); | |||
} | |||
typedef const char** (*jack_get_ports_fun_def)(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | |||
@@ -707,7 +707,7 @@ typedef void (*jack_transport_stop_fun_def)(jack_client_t* ext_client); | |||
static jack_transport_stop_fun_def jack_transport_stop_fun = 0; | |||
EXPORT void jack_transport_stop(jack_client_t* ext_client) | |||
{ | |||
return (*jack_transport_stop_fun)(ext_client); | |||
return (*jack_transport_stop_fun)(ext_client); | |||
} | |||
// deprecated | |||
@@ -760,16 +760,16 @@ EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority) | |||
typedef void *(*start_routine)(void*); | |||
typedef int (*jack_client_create_thread_fun_def)(jack_client_t* client, | |||
pthread_t *thread, | |||
int priority, | |||
int realtime, // boolean | |||
start_routine callback, | |||
void *arg); | |||
pthread_t *thread, | |||
int priority, | |||
int realtime, // boolean | |||
start_routine callback, | |||
void *arg); | |||
static jack_client_create_thread_fun_def jack_client_create_thread_fun = 0; | |||
EXPORT int jack_client_create_thread(jack_client_t* client, | |||
pthread_t *thread, | |||
int priority, | |||
int realtime, // boolean | |||
int realtime, // boolean | |||
start_routine callback, | |||
void *arg) | |||
{ | |||
@@ -803,11 +803,11 @@ typedef jack_intclient_t (*jack_internal_client_load_fun_def)(jack_client_t* ext | |||
static jack_internal_client_load_fun_def jack_internal_client_load_fun = 0; | |||
EXPORT jack_intclient_t jack_internal_client_load(jack_client_t* ext_client, const char* client_name, jack_options_t options, jack_status_t* status, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, status); | |||
jack_intclient_t res = (*jack_internal_client_load_fun)(ext_client, client_name, options, status, ap); | |||
va_end(ap); | |||
return res; | |||
va_list ap; | |||
va_start(ap, status); | |||
jack_intclient_t res = (*jack_internal_client_load_fun)(ext_client, client_name, options, status, ap); | |||
va_end(ap); | |||
return res; | |||
} | |||
typedef jack_status_t (*jack_internal_client_unload_fun_def)(jack_client_t* ext_client, jack_intclient_t intclient); | |||
@@ -828,223 +828,223 @@ typedef jack_client_t * (*jack_client_open_fun_def)(const char *client_name, jac | |||
static jack_client_open_fun_def jack_client_open_fun = 0; | |||
EXPORT jack_client_t * jack_client_open(const char *client_name, jack_options_t options, jack_status_t *status, ...) | |||
{ | |||
// Library check... | |||
if (!open_library()) | |||
return 0; | |||
va_list ap; | |||
va_start(ap, status); | |||
jack_client_t* res = (*jack_client_open_fun)(client_name, options, status, ap); | |||
va_end(ap); | |||
return res; | |||
// Library check... | |||
if (!open_library()) | |||
return 0; | |||
va_list ap; | |||
va_start(ap, status); | |||
jack_client_t* res = (*jack_client_open_fun)(client_name, options, status, ap); | |||
va_end(ap); | |||
return res; | |||
} | |||
typedef jack_client_t * (*jack_client_new_fun_def)(const char *client_name); | |||
static jack_client_new_fun_def jack_client_new_fun = 0; | |||
EXPORT jack_client_t * jack_client_new(const char *client_name) | |||
{ | |||
// Library check... | |||
if (!open_library()) | |||
return 0; | |||
return (*jack_client_new_fun)(client_name); | |||
// Library check... | |||
if (!open_library()) | |||
return 0; | |||
return (*jack_client_new_fun)(client_name); | |||
} | |||
typedef int (*jack_client_close_fun_def)(jack_client_t *client); | |||
static jack_client_close_fun_def jack_client_close_fun = 0; | |||
EXPORT int jack_client_close(jack_client_t *client) | |||
{ | |||
int res = (*jack_client_close_fun)(client); | |||
close_library(); | |||
return res; | |||
{ | |||
int res = (*jack_client_close_fun)(client); | |||
close_library(); | |||
return res; | |||
} | |||
// Library loader | |||
static bool get_jack_library_in_directory(const char* dir_name, char* library_name) | |||
{ | |||
struct dirent * dir_entry; | |||
DIR * dir_stream = opendir(dir_name); | |||
if (!dir_stream) | |||
return false; | |||
while ((dir_entry = readdir(dir_stream))) { | |||
if (strncmp("libjack.so", dir_entry->d_name, 10) == 0) { | |||
struct dirent * dir_entry; | |||
DIR * dir_stream = opendir(dir_name); | |||
if (!dir_stream) | |||
return false; | |||
while ((dir_entry = readdir(dir_stream))) { | |||
if (strncmp("libjack.so", dir_entry->d_name, 10) == 0) { | |||
strcpy(library_name, dir_entry->d_name); | |||
closedir(dir_stream); | |||
return true; | |||
closedir(dir_stream); | |||
return true; | |||
} | |||
} | |||
closedir(dir_stream); | |||
return false; | |||
} | |||
closedir(dir_stream); | |||
return false; | |||
} | |||
static bool get_jack_library(char* library_name) | |||
{ | |||
if (get_jack_library_in_directory("/usr/lib", library_name)) | |||
return true; | |||
if (get_jack_library_in_directory("/usr/local/lib", library_name)) | |||
return true; | |||
return false; | |||
if (get_jack_library_in_directory("/usr/lib", library_name)) | |||
return true; | |||
if (get_jack_library_in_directory("/usr/local/lib", library_name)) | |||
return true; | |||
return false; | |||
} | |||
static bool open_library() | |||
{ | |||
if (gClientCount++ == 0) { | |||
return init_library(); | |||
} else { | |||
return true; | |||
} | |||
if (gClientCount++ == 0) { | |||
return init_library(); | |||
} else { | |||
return true; | |||
} | |||
} | |||
static void close_library() | |||
{ | |||
if (--gClientCount == 0) { | |||
dlclose(gLibrary); | |||
} | |||
if (--gClientCount == 0) { | |||
dlclose(gLibrary); | |||
} | |||
} | |||
static bool check_client(void* library) | |||
{ | |||
jack_client_t* client = 0; | |||
jack_client_t* client = 0; | |||
// Get "new", "open" and "close" entry points... | |||
jack_client_new_fun = (jack_client_new_fun_def)dlsym(library, "jack_client_new"); | |||
jack_client_close_fun = (jack_client_close_fun_def)dlsym(library, "jack_client_close"); | |||
jack_client_open_fun = (jack_client_open_fun_def)dlsym(gLibrary, "jack_client_open"); | |||
// Get "new", "open" and "close" entry points... | |||
jack_client_new_fun = (jack_client_new_fun_def)dlsym(library, "jack_client_new"); | |||
jack_client_close_fun = (jack_client_close_fun_def)dlsym(library, "jack_client_close"); | |||
jack_client_open_fun = (jack_client_open_fun_def)dlsym(gLibrary, "jack_client_open"); | |||
// Try opening a client... | |||
if ((client = (*jack_client_new_fun)("dummy"))) { // jackd server is running.... | |||
(*jack_client_close_fun)(client); | |||
return true; | |||
} else { | |||
return false; | |||
} | |||
// Try opening a client... | |||
if ((client = (*jack_client_new_fun)("dummy"))) { // jackd server is running.... | |||
(*jack_client_close_fun)(client); | |||
return true; | |||
} else { | |||
return false; | |||
} | |||
} | |||
static bool init_library() | |||
{ | |||
char library_name[64]; | |||
void* jackLibrary = (get_jack_library(library_name)) ? dlopen(library_name, RTLD_LAZY) : 0; | |||
void* jackmpLibrary = dlopen("libjackmp.so", RTLD_LAZY); | |||
if (jackLibrary) { | |||
if (check_client(jackLibrary)) { // jackd is running... | |||
gLibrary = jackLibrary; | |||
if (jackmpLibrary) dlclose(jackmpLibrary); | |||
} else if (check_client(jackmpLibrary)) { // jackdmp is running... | |||
gLibrary = jackmpLibrary; | |||
if (jackLibrary) dlclose(jackLibrary); | |||
} else { | |||
goto error; | |||
} | |||
} else if (jackmpLibrary) { | |||
if (check_client(jackmpLibrary)) { // jackd is running... | |||
gLibrary = jackmpLibrary; | |||
} else { | |||
goto error; | |||
} | |||
} else { | |||
printf("Jack libraries not found, failure...\n"); | |||
goto error; | |||
} | |||
// Load entry points... | |||
jack_port_get_buffer_fun = (jack_port_get_buffer_fun_def)dlsym(gLibrary, "jack_port_get_buffer"); | |||
jack_port_name_fun = (jack_port_name_fun_def)dlsym(gLibrary, "jack_port_name"); | |||
jack_port_short_name_fun = (jack_port_short_name_fun_def)dlsym(gLibrary, "jack_port_short_name"); | |||
jack_port_flags_fun = (jack_port_flags_fun_def)dlsym(gLibrary, "jack_port_flags"); | |||
jack_port_type_fun = (jack_port_type_fun_def)dlsym(gLibrary, "jack_port_type"); | |||
jack_port_connected_fun = (jack_port_connected_fun_def)dlsym(gLibrary, "jack_port_connected"); | |||
jack_port_connected_to_fun = (jack_port_connected_to_fun_def)dlsym(gLibrary, "jack_port_connected_to"); | |||
jack_port_tie_fun = (jack_port_tie_fun_def)dlsym(gLibrary, "jack_port_tie"); | |||
jack_port_untie_fun = (jack_port_untie_fun_def)dlsym(gLibrary, "jack_port_untie"); | |||
jack_port_get_latency_fun = (jack_port_get_latency_fun_def)dlsym(gLibrary, "jack_port_get_latency"); | |||
jack_port_set_latency_fun = (jack_port_set_latency_fun_def)dlsym(gLibrary, "jack_port_set_latency"); | |||
jack_recompute_total_latency_fun = (jack_recompute_total_latency_fun_def)dlsym(gLibrary, "jack_recompute_total_latency"); | |||
jack_recompute_total_latencies_fun = (jack_recompute_total_latencies_fun_def)dlsym(gLibrary, "jack_recompute_total_latencies"); | |||
jack_port_set_name_fun = (jack_port_set_name_fun_def)dlsym(gLibrary, "jack_port_set_name"); | |||
jack_port_request_monitor_fun = (jack_port_request_monitor_fun_def)dlsym(gLibrary, "jack_port_request_monitor"); | |||
jack_port_request_monitor_by_name_fun = (jack_port_request_monitor_by_name_fun_def)dlsym(gLibrary, "jack_port_request_monitor_by_name"); | |||
jack_port_ensure_monitor_fun = (jack_port_ensure_monitor_fun_def)dlsym(gLibrary, "jack_port_ensure_monitor"); | |||
jack_port_monitoring_input_fun = (jack_port_monitoring_input_fun_def)dlsym(gLibrary, "jack_port_monitoring_input_fun"); | |||
jack_is_realtime_fun = (jack_is_realtime_fun_def)dlsym(gLibrary, "jack_is_realtime"); | |||
jack_on_shutdown_fun = (jack_on_shutdown_fun_def)dlsym(gLibrary, "jack_on_shutdown"); | |||
jack_set_process_callback_fun = (jack_set_process_callback_fun_def)dlsym(gLibrary, "jack_set_process_callback"); | |||
jack_set_freewheel_callback_fun = (jack_set_freewheel_callback_fun_def)dlsym(gLibrary, "jack_set_freewheel_callback"); | |||
jack_set_freewheel_fun = (jack_set_freewheel_fun_def)dlsym(gLibrary, "jack_set_freewheel"); | |||
jack_set_buffer_size_fun = (jack_set_buffer_size_fun_def)dlsym(gLibrary, "jack_set_buffer_size"); | |||
jack_set_buffer_size_callback_fun = (jack_set_buffer_size_callback_fun_def)dlsym(gLibrary, "jack_set_buffer_size_callback"); | |||
jack_set_sample_rate_callback_fun = (jack_set_sample_rate_callback_fun_def)dlsym(gLibrary, "jack_set_sample_rate_callback"); | |||
jack_set_client_registration_callback_fun = (jack_set_client_registration_callback_fun_def)dlsym(gLibrary, "jack_set_client_registration_callback"); | |||
jack_set_port_registration_callback_fun = (jack_set_port_registration_callback_fun_def)dlsym(gLibrary, "jack_set_port_registration_callback"); | |||
jack_set_port_connect_callback_fun = (jack_set_port_connect_callback_fun_def)dlsym(gLibrary, "jack_set_port_connect_callback"); | |||
jack_set_graph_order_callback_fun = (jack_set_graph_order_callback_fun_def)dlsym(gLibrary, "jack_set_graph_order_callback"); | |||
jack_set_xrun_callback_fun = (jack_set_xrun_callback_fun_def)dlsym(gLibrary, "jack_set_xrun_callback"); | |||
jack_set_thread_init_callback_fun = (jack_set_thread_init_callback_fun_def)dlsym(gLibrary, "jack_set_thread_init_callback"); | |||
jack_activate_fun = (jack_activate_fun_def)dlsym(gLibrary, "jack_activate"); | |||
jack_deactivate_fun = (jack_deactivate_fun_def)dlsym(gLibrary, "jack_deactivate"); | |||
jack_port_register_fun = (jack_port_register_fun_def)dlsym(gLibrary, "jack_port_register"); | |||
jack_port_unregister_fun = (jack_port_unregister_fun_def)dlsym(gLibrary, "jack_port_unregister"); | |||
jack_port_is_mine_fun = (jack_port_is_mine_fun_def)dlsym(gLibrary, "jack_port_is_mine"); | |||
jack_port_get_connections_fun = (jack_port_get_connections_fun_def)dlsym(gLibrary, "jack_port_get_connections"); | |||
jack_port_get_all_connections_fun = (jack_port_get_all_connections_fun_def)dlsym(gLibrary, "jack_port_get_all_connections_fun"); | |||
jack_port_get_total_latency_fun = (jack_port_get_total_latency_fun_def)dlsym(gLibrary, "jack_port_get_total_latency"); | |||
jack_connect_fun = (jack_connect_fun_def)dlsym(gLibrary, "jack_connect"); | |||
jack_disconnect_fun = (jack_disconnect_fun_def)dlsym(gLibrary, "jack_disconnect"); | |||
jack_port_connect_fun = (jack_port_connect_fun_def)dlsym(gLibrary, "jack_port_connect"); | |||
jack_port_disconnect_fun = (jack_port_disconnect_fun_def)dlsym(gLibrary, "jack_port_disconnect"); | |||
jack_get_sample_rate_fun = (jack_get_sample_rate_fun_def)dlsym(gLibrary, "jack_get_sample_rate"); | |||
jack_get_buffer_size_fun = (jack_get_buffer_size_fun_def)dlsym(gLibrary, "jack_get_buffer_size"); | |||
jack_get_ports_fun = (jack_get_ports_fun_def)dlsym(gLibrary, "jack_get_ports"); | |||
jack_port_by_name_fun = (jack_port_by_name_fun_def)dlsym(gLibrary, "jack_port_by_name"); | |||
jack_port_by_id_fun = (jack_port_by_id_fun_def)dlsym(gLibrary, "jack_port_by_id"); | |||
jack_engine_takeover_timebase_fun = (jack_engine_takeover_timebase_fun_def)dlsym(gLibrary, "jack_engine_takeover_timebase"); | |||
jack_frames_since_cycle_start_fun = (jack_frames_since_cycle_start_fun_def)dlsym(gLibrary, "jack_frames_since_cycle_start"); | |||
jack_get_time_fun = (jack_get_time_fun_def)dlsym(gLibrary, "jack_get_time"); | |||
jack_time_to_frames_fun = (jack_time_to_frames_fun_def)dlsym(gLibrary, "jack_time_to_frames"); | |||
jack_frame_time_fun = (jack_frame_time_fun_def)dlsym(gLibrary, "jack_frame_time"); | |||
jack_last_frame_time_fun = (jack_last_frame_time_fun_def)dlsym(gLibrary, "jack_last_frame_time"); | |||
jack_cpu_load_fun = (jack_cpu_load_fun_def)dlsym(gLibrary, "jack_cpu_load"); | |||
jack_client_thread_id_fun = (jack_client_thread_id_fun_def)dlsym(gLibrary, "jack_client_thread_id"); | |||
jack_get_client_name_fun = (jack_get_client_name_fun_def)dlsym(gLibrary, "jack_get_client_name"); | |||
jack_port_name_size_fun = (jack_port_name_size_fun_def)dlsym(gLibrary, "jack_port_name_size"); | |||
jack_client_name_size_fun = (jack_client_name_size_fun_def)dlsym(gLibrary, "jack_client_name_size"); | |||
jack_release_timebase_fun = (jack_release_timebase_fun_def)dlsym(gLibrary, "jack_release_timebase"); | |||
jack_set_sync_callback_fun = (jack_set_sync_callback_fun_def)dlsym(gLibrary, "jack_set_sync_callback"); | |||
jack_set_sync_timeout_fun = (jack_set_sync_timeout_fun_def)dlsym(gLibrary, "jack_set_sync_timeout"); | |||
jack_set_timebase_callback_fun = (jack_set_timebase_callback_fun_def)dlsym(gLibrary, "jack_set_timebase_callback"); | |||
jack_transport_locate_fun = (jack_transport_locate_fun_def)dlsym(gLibrary, "jack_transport_locate_fun"); | |||
jack_transport_query_fun = (jack_transport_query_fun_def)dlsym(gLibrary, "jack_transport_query"); | |||
jack_get_current_transport_frame_fun = (jack_get_current_transport_frame_fun_def)dlsym(gLibrary, "jack_get_current_transport_frame"); | |||
jack_transport_reposition_fun = (jack_transport_reposition_fun_def)dlsym(gLibrary, "jack_transport_reposition"); | |||
jack_transport_start_fun = (jack_transport_start_fun_def)dlsym(gLibrary, "jack_transport_start"); | |||
jack_transport_stop_fun = (jack_transport_stop_fun_def)dlsym(gLibrary, "jack_transport_stop"); | |||
jack_get_transport_info_fun = (jack_get_transport_info_fun_def)dlsym(gLibrary, "jack_get_transport_info"); | |||
jack_set_transport_info_fun = (jack_set_transport_info_fun_def)dlsym(gLibrary, "jack_set_transport_info"); | |||
jack_get_max_delayed_usecs_fun = (jack_get_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_max_delayed_usecs"); | |||
jack_get_xrun_delayed_usecs_fun = (jack_get_xrun_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_xrun_delayed_usecs"); | |||
jack_reset_max_delayed_usecs_fun = (jack_reset_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_reset_max_delayed_usecs"); | |||
jack_acquire_real_time_scheduling_fun = (jack_acquire_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_acquire_real_time_scheduling"); | |||
jack_client_create_thread_fun = (jack_client_create_thread_fun_def)dlsym(gLibrary, "jack_client_create_thread"); | |||
jack_drop_real_time_scheduling_fun = (jack_drop_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_drop_real_time_scheduling"); | |||
jack_get_internal_client_name_fun = (jack_get_internal_client_name_fun_def)dlsym(gLibrary, "jack_get_internal_client_name"); | |||
jack_internal_client_handle_fun = (jack_internal_client_handle_fun_def)dlsym(gLibrary, "jack_internal_client_handle"); | |||
jack_internal_client_load_fun = (jack_internal_client_load_fun_def)dlsym(gLibrary, "jack_internal_client_load"); | |||
jack_internal_client_unload_fun = (jack_internal_client_unload_fun_def)dlsym(gLibrary, "jack_internal_client_unload"); | |||
jack_client_open_fun = (jack_client_open_fun_def)dlsym(gLibrary, "jack_client_open"); | |||
jack_client_new_fun = (jack_client_new_fun_def)dlsym(gLibrary, "jack_client_new"); | |||
jack_client_close_fun = (jack_client_close_fun_def)dlsym(gLibrary, "jack_client_close"); | |||
return true; | |||
char library_name[64]; | |||
void* jackLibrary = (get_jack_library(library_name)) ? dlopen(library_name, RTLD_LAZY) : 0; | |||
void* jackmpLibrary = dlopen("libjackmp.so", RTLD_LAZY); | |||
if (jackLibrary) { | |||
if (check_client(jackLibrary)) { // jackd is running... | |||
gLibrary = jackLibrary; | |||
if (jackmpLibrary) dlclose(jackmpLibrary); | |||
} else if (check_client(jackmpLibrary)) { // jackdmp is running... | |||
gLibrary = jackmpLibrary; | |||
if (jackLibrary) dlclose(jackLibrary); | |||
} else { | |||
goto error; | |||
} | |||
} else if (jackmpLibrary) { | |||
if (check_client(jackmpLibrary)) { // jackd is running... | |||
gLibrary = jackmpLibrary; | |||
} else { | |||
goto error; | |||
} | |||
} else { | |||
printf("Jack libraries not found, failure...\n"); | |||
goto error; | |||
} | |||
// Load entry points... | |||
jack_port_get_buffer_fun = (jack_port_get_buffer_fun_def)dlsym(gLibrary, "jack_port_get_buffer"); | |||
jack_port_name_fun = (jack_port_name_fun_def)dlsym(gLibrary, "jack_port_name"); | |||
jack_port_short_name_fun = (jack_port_short_name_fun_def)dlsym(gLibrary, "jack_port_short_name"); | |||
jack_port_flags_fun = (jack_port_flags_fun_def)dlsym(gLibrary, "jack_port_flags"); | |||
jack_port_type_fun = (jack_port_type_fun_def)dlsym(gLibrary, "jack_port_type"); | |||
jack_port_connected_fun = (jack_port_connected_fun_def)dlsym(gLibrary, "jack_port_connected"); | |||
jack_port_connected_to_fun = (jack_port_connected_to_fun_def)dlsym(gLibrary, "jack_port_connected_to"); | |||
jack_port_tie_fun = (jack_port_tie_fun_def)dlsym(gLibrary, "jack_port_tie"); | |||
jack_port_untie_fun = (jack_port_untie_fun_def)dlsym(gLibrary, "jack_port_untie"); | |||
jack_port_get_latency_fun = (jack_port_get_latency_fun_def)dlsym(gLibrary, "jack_port_get_latency"); | |||
jack_port_set_latency_fun = (jack_port_set_latency_fun_def)dlsym(gLibrary, "jack_port_set_latency"); | |||
jack_recompute_total_latency_fun = (jack_recompute_total_latency_fun_def)dlsym(gLibrary, "jack_recompute_total_latency"); | |||
jack_recompute_total_latencies_fun = (jack_recompute_total_latencies_fun_def)dlsym(gLibrary, "jack_recompute_total_latencies"); | |||
jack_port_set_name_fun = (jack_port_set_name_fun_def)dlsym(gLibrary, "jack_port_set_name"); | |||
jack_port_request_monitor_fun = (jack_port_request_monitor_fun_def)dlsym(gLibrary, "jack_port_request_monitor"); | |||
jack_port_request_monitor_by_name_fun = (jack_port_request_monitor_by_name_fun_def)dlsym(gLibrary, "jack_port_request_monitor_by_name"); | |||
jack_port_ensure_monitor_fun = (jack_port_ensure_monitor_fun_def)dlsym(gLibrary, "jack_port_ensure_monitor"); | |||
jack_port_monitoring_input_fun = (jack_port_monitoring_input_fun_def)dlsym(gLibrary, "jack_port_monitoring_input_fun"); | |||
jack_is_realtime_fun = (jack_is_realtime_fun_def)dlsym(gLibrary, "jack_is_realtime"); | |||
jack_on_shutdown_fun = (jack_on_shutdown_fun_def)dlsym(gLibrary, "jack_on_shutdown"); | |||
jack_set_process_callback_fun = (jack_set_process_callback_fun_def)dlsym(gLibrary, "jack_set_process_callback"); | |||
jack_set_freewheel_callback_fun = (jack_set_freewheel_callback_fun_def)dlsym(gLibrary, "jack_set_freewheel_callback"); | |||
jack_set_freewheel_fun = (jack_set_freewheel_fun_def)dlsym(gLibrary, "jack_set_freewheel"); | |||
jack_set_buffer_size_fun = (jack_set_buffer_size_fun_def)dlsym(gLibrary, "jack_set_buffer_size"); | |||
jack_set_buffer_size_callback_fun = (jack_set_buffer_size_callback_fun_def)dlsym(gLibrary, "jack_set_buffer_size_callback"); | |||
jack_set_sample_rate_callback_fun = (jack_set_sample_rate_callback_fun_def)dlsym(gLibrary, "jack_set_sample_rate_callback"); | |||
jack_set_client_registration_callback_fun = (jack_set_client_registration_callback_fun_def)dlsym(gLibrary, "jack_set_client_registration_callback"); | |||
jack_set_port_registration_callback_fun = (jack_set_port_registration_callback_fun_def)dlsym(gLibrary, "jack_set_port_registration_callback"); | |||
jack_set_port_connect_callback_fun = (jack_set_port_connect_callback_fun_def)dlsym(gLibrary, "jack_set_port_connect_callback"); | |||
jack_set_graph_order_callback_fun = (jack_set_graph_order_callback_fun_def)dlsym(gLibrary, "jack_set_graph_order_callback"); | |||
jack_set_xrun_callback_fun = (jack_set_xrun_callback_fun_def)dlsym(gLibrary, "jack_set_xrun_callback"); | |||
jack_set_thread_init_callback_fun = (jack_set_thread_init_callback_fun_def)dlsym(gLibrary, "jack_set_thread_init_callback"); | |||
jack_activate_fun = (jack_activate_fun_def)dlsym(gLibrary, "jack_activate"); | |||
jack_deactivate_fun = (jack_deactivate_fun_def)dlsym(gLibrary, "jack_deactivate"); | |||
jack_port_register_fun = (jack_port_register_fun_def)dlsym(gLibrary, "jack_port_register"); | |||
jack_port_unregister_fun = (jack_port_unregister_fun_def)dlsym(gLibrary, "jack_port_unregister"); | |||
jack_port_is_mine_fun = (jack_port_is_mine_fun_def)dlsym(gLibrary, "jack_port_is_mine"); | |||
jack_port_get_connections_fun = (jack_port_get_connections_fun_def)dlsym(gLibrary, "jack_port_get_connections"); | |||
jack_port_get_all_connections_fun = (jack_port_get_all_connections_fun_def)dlsym(gLibrary, "jack_port_get_all_connections_fun"); | |||
jack_port_get_total_latency_fun = (jack_port_get_total_latency_fun_def)dlsym(gLibrary, "jack_port_get_total_latency"); | |||
jack_connect_fun = (jack_connect_fun_def)dlsym(gLibrary, "jack_connect"); | |||
jack_disconnect_fun = (jack_disconnect_fun_def)dlsym(gLibrary, "jack_disconnect"); | |||
jack_port_connect_fun = (jack_port_connect_fun_def)dlsym(gLibrary, "jack_port_connect"); | |||
jack_port_disconnect_fun = (jack_port_disconnect_fun_def)dlsym(gLibrary, "jack_port_disconnect"); | |||
jack_get_sample_rate_fun = (jack_get_sample_rate_fun_def)dlsym(gLibrary, "jack_get_sample_rate"); | |||
jack_get_buffer_size_fun = (jack_get_buffer_size_fun_def)dlsym(gLibrary, "jack_get_buffer_size"); | |||
jack_get_ports_fun = (jack_get_ports_fun_def)dlsym(gLibrary, "jack_get_ports"); | |||
jack_port_by_name_fun = (jack_port_by_name_fun_def)dlsym(gLibrary, "jack_port_by_name"); | |||
jack_port_by_id_fun = (jack_port_by_id_fun_def)dlsym(gLibrary, "jack_port_by_id"); | |||
jack_engine_takeover_timebase_fun = (jack_engine_takeover_timebase_fun_def)dlsym(gLibrary, "jack_engine_takeover_timebase"); | |||
jack_frames_since_cycle_start_fun = (jack_frames_since_cycle_start_fun_def)dlsym(gLibrary, "jack_frames_since_cycle_start"); | |||
jack_get_time_fun = (jack_get_time_fun_def)dlsym(gLibrary, "jack_get_time"); | |||
jack_time_to_frames_fun = (jack_time_to_frames_fun_def)dlsym(gLibrary, "jack_time_to_frames"); | |||
jack_frame_time_fun = (jack_frame_time_fun_def)dlsym(gLibrary, "jack_frame_time"); | |||
jack_last_frame_time_fun = (jack_last_frame_time_fun_def)dlsym(gLibrary, "jack_last_frame_time"); | |||
jack_cpu_load_fun = (jack_cpu_load_fun_def)dlsym(gLibrary, "jack_cpu_load"); | |||
jack_client_thread_id_fun = (jack_client_thread_id_fun_def)dlsym(gLibrary, "jack_client_thread_id"); | |||
jack_get_client_name_fun = (jack_get_client_name_fun_def)dlsym(gLibrary, "jack_get_client_name"); | |||
jack_port_name_size_fun = (jack_port_name_size_fun_def)dlsym(gLibrary, "jack_port_name_size"); | |||
jack_client_name_size_fun = (jack_client_name_size_fun_def)dlsym(gLibrary, "jack_client_name_size"); | |||
jack_release_timebase_fun = (jack_release_timebase_fun_def)dlsym(gLibrary, "jack_release_timebase"); | |||
jack_set_sync_callback_fun = (jack_set_sync_callback_fun_def)dlsym(gLibrary, "jack_set_sync_callback"); | |||
jack_set_sync_timeout_fun = (jack_set_sync_timeout_fun_def)dlsym(gLibrary, "jack_set_sync_timeout"); | |||
jack_set_timebase_callback_fun = (jack_set_timebase_callback_fun_def)dlsym(gLibrary, "jack_set_timebase_callback"); | |||
jack_transport_locate_fun = (jack_transport_locate_fun_def)dlsym(gLibrary, "jack_transport_locate_fun"); | |||
jack_transport_query_fun = (jack_transport_query_fun_def)dlsym(gLibrary, "jack_transport_query"); | |||
jack_get_current_transport_frame_fun = (jack_get_current_transport_frame_fun_def)dlsym(gLibrary, "jack_get_current_transport_frame"); | |||
jack_transport_reposition_fun = (jack_transport_reposition_fun_def)dlsym(gLibrary, "jack_transport_reposition"); | |||
jack_transport_start_fun = (jack_transport_start_fun_def)dlsym(gLibrary, "jack_transport_start"); | |||
jack_transport_stop_fun = (jack_transport_stop_fun_def)dlsym(gLibrary, "jack_transport_stop"); | |||
jack_get_transport_info_fun = (jack_get_transport_info_fun_def)dlsym(gLibrary, "jack_get_transport_info"); | |||
jack_set_transport_info_fun = (jack_set_transport_info_fun_def)dlsym(gLibrary, "jack_set_transport_info"); | |||
jack_get_max_delayed_usecs_fun = (jack_get_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_max_delayed_usecs"); | |||
jack_get_xrun_delayed_usecs_fun = (jack_get_xrun_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_xrun_delayed_usecs"); | |||
jack_reset_max_delayed_usecs_fun = (jack_reset_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_reset_max_delayed_usecs"); | |||
jack_acquire_real_time_scheduling_fun = (jack_acquire_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_acquire_real_time_scheduling"); | |||
jack_client_create_thread_fun = (jack_client_create_thread_fun_def)dlsym(gLibrary, "jack_client_create_thread"); | |||
jack_drop_real_time_scheduling_fun = (jack_drop_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_drop_real_time_scheduling"); | |||
jack_get_internal_client_name_fun = (jack_get_internal_client_name_fun_def)dlsym(gLibrary, "jack_get_internal_client_name"); | |||
jack_internal_client_handle_fun = (jack_internal_client_handle_fun_def)dlsym(gLibrary, "jack_internal_client_handle"); | |||
jack_internal_client_load_fun = (jack_internal_client_load_fun_def)dlsym(gLibrary, "jack_internal_client_load"); | |||
jack_internal_client_unload_fun = (jack_internal_client_unload_fun_def)dlsym(gLibrary, "jack_internal_client_unload"); | |||
jack_client_open_fun = (jack_client_open_fun_def)dlsym(gLibrary, "jack_client_open"); | |||
jack_client_new_fun = (jack_client_new_fun_def)dlsym(gLibrary, "jack_client_new"); | |||
jack_client_close_fun = (jack_client_close_fun_def)dlsym(gLibrary, "jack_client_close"); | |||
return true; | |||
error: | |||
if (jackLibrary) | |||
dlclose(jackLibrary); | |||
if (jackmpLibrary) | |||
dlclose(jackmpLibrary); | |||
return false; | |||
if (jackLibrary) | |||
dlclose(jackLibrary); | |||
if (jackmpLibrary) | |||
dlclose(jackmpLibrary); | |||
return false; | |||
} |
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -29,11 +29,11 @@ namespace Jack | |||
bool JackActivationCount::Signal(JackSynchro* synchro, JackClientControl* control) | |||
{ | |||
if (fValue == 0) { | |||
// Transfer activation to next clients | |||
// Transfer activation to next clients | |||
jack_error("JackActivationCount::Signal value = 0 ref = %ld", control->fRefNum); | |||
return synchro->Signal(); | |||
} else if (DEC_ATOMIC(&fValue) == 1) { | |||
return synchro->Signal(); | |||
return synchro->Signal(); | |||
} else { | |||
return true; | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -38,12 +38,12 @@ class JackActivationCount | |||
private: | |||
SInt32 fValue; | |||
SInt32 fValue; | |||
SInt32 fCount; | |||
public: | |||
JackActivationCount(): fValue(0), fCount(0) | |||
JackActivationCount(): fValue(0), fCount(0) | |||
{} | |||
virtual ~JackActivationCount() | |||
{} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -28,7 +28,7 @@ namespace Jack | |||
{ | |||
/*! | |||
\brief Counter for CAS | |||
\brief Counter for CAS | |||
*/ | |||
struct AtomicArrayCounter | |||
@@ -56,33 +56,33 @@ struct AtomicArrayCounter | |||
/*! | |||
\brief A class to handle several states in a lock-free manner | |||
Requirement: | |||
- a "current" state | |||
- several possible "pending" state | |||
- an TrySwitchState(int state) operation to atomically switch a "pending" to the "current" state (the pending becomes the current). | |||
- an TrySwitchState(int state) operation to atomically switch a "pending" to the "current" state (the pending becomes the current). | |||
The TrySwitchState operation returns a "current" state (either the same if switch fails or the new one, one can know if the switch has succeeded) | |||
- a WriteNextStartState(int state) returns a "pending" state to be written into | |||
- a WriteNextStartStop(int state) make the written "pending" state become "switchable" | |||
Different pending states can be written independantly and concurrently. | |||
GetCurrentIndex() *must* return an increasing value to be able to check reading current state coherency | |||
The fCounter is an array of indexes to access the current and 3 different "pending" states. | |||
ÂĄ WriteNextStateStart(int index) must return a valid state to be written into, and must invalidate state "index" ==> cur state switch. | |||
ÂĄ WriteNextStateStop(int index) makes the "index" state become "switchable" with the current state. | |||
ÂĄ TrySwitchState(int index) must detect that pending state is a new state, and does the switch | |||
ÂĄ ReadCurrentState() must return the state | |||
ÂĄ ReadCurrentState() must return the state | |||
ÂĄ GetCurrentIndex() must return an index increased each new switch. | |||
ÂĄ WriteNextStateStart(int index1) and WriteNextStateStart(int index2) can be interleaved | |||
[switch counter][index state][index state][cur index] | |||
*/ | |||
// CHECK livelock | |||
@@ -162,8 +162,8 @@ class JackAtomicArrayState | |||
} | |||
/*! | |||
\brief Tries to switch to the next state and returns the new current state (either the same as before if case of switch failure or the new one) | |||
*/ | |||
\brief Tries to switch to the next state and returns the new current state (either the same as before if case of switch failure or the new one) | |||
*/ | |||
T* TrySwitchState(int state) | |||
{ | |||
@@ -202,8 +202,8 @@ class JackAtomicArrayState | |||
} | |||
/*! | |||
\brief Start write operation : setup and returns the next state to update, check for recursive write calls. | |||
*/ | |||
\brief Start write operation : setup and returns the next state to update, check for recursive write calls. | |||
*/ | |||
T* WriteNextStateStart(int state) | |||
{ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -27,7 +27,7 @@ namespace Jack | |||
{ | |||
/*! | |||
\brief Counter for CAS | |||
\brief Counter for CAS | |||
*/ | |||
struct AtomicCounter | |||
@@ -132,8 +132,8 @@ class JackAtomicState | |||
} | |||
/*! | |||
\brief Tries to switch to the next state and returns the new current state (either the same as before if case of switch failure or the new one) | |||
*/ | |||
\brief Tries to switch to the next state and returns the new current state (either the same as before if case of switch failure or the new one) | |||
*/ | |||
T* TrySwitchState() | |||
{ | |||
AtomicCounter old_val; | |||
@@ -218,15 +218,15 @@ class JackAtomicState | |||
{ | |||
T* state; | |||
UInt16 cur_index; | |||
UInt16 next_index = GetCurrentIndex(); | |||
UInt16 next_index = GetCurrentIndex(); | |||
do { | |||
cur_index = next_index; | |||
cur_index = next_index; | |||
state = ReadCurrentState(); | |||
...... | |||
...... | |||
next_index = GetCurrentIndex(); | |||
next_index = GetCurrentIndex(); | |||
} while (cur_index != next_index); | |||
} | |||
*/ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -48,19 +48,19 @@ JackAudioDriver::~JackAudioDriver() | |||
int JackAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||
{ | |||
fEngineControl->fBufferSize = buffer_size; | |||
fGraphManager->SetBufferSize(buffer_size); | |||
fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | |||
if (!fEngineControl->fTimeOut) | |||
fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); | |||
fGraphManager->SetBufferSize(buffer_size); | |||
fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | |||
if (!fEngineControl->fTimeOut) | |||
fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); | |||
return 0; | |||
} | |||
int JackAudioDriver::SetSampleRate(jack_nframes_t sample_rate) | |||
{ | |||
fEngineControl->fSampleRate = sample_rate; | |||
fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | |||
if (!fEngineControl->fTimeOut) | |||
fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); | |||
fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | |||
if (!fEngineControl->fTimeOut) | |||
fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); | |||
return 0; | |||
} | |||
@@ -87,7 +87,7 @@ int JackAudioDriver::Attach() | |||
JackPort* port; | |||
jack_port_id_t port_index; | |||
char name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
unsigned long port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; | |||
int i; | |||
@@ -95,13 +95,13 @@ int JackAudioDriver::Attach() | |||
for (i = 0; i < fCaptureChannels; i++) { | |||
snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); | |||
snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); | |||
snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { | |||
jack_error("driver: cannot register port for %s", name); | |||
return -1; | |||
} | |||
port = fGraphManager->GetPort(port_index); | |||
port->SetAlias(alias); | |||
port = fGraphManager->GetPort(port_index); | |||
port->SetAlias(alias); | |||
port->SetLatency(fEngineControl->fBufferSize + fCaptureLatency); | |||
fCapturePortList[i] = port_index; | |||
JackLog("JackAudioDriver::Attach fCapturePortList[i] port_index = %ld\n", port_index); | |||
@@ -111,17 +111,17 @@ int JackAudioDriver::Attach() | |||
for (i = 0; i < fPlaybackChannels; i++) { | |||
snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); | |||
snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); | |||
snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { | |||
jack_error("driver: cannot register port for %s", name); | |||
return -1; | |||
} | |||
port = fGraphManager->GetPort(port_index); | |||
port->SetAlias(alias); | |||
port = fGraphManager->GetPort(port_index); | |||
port->SetAlias(alias); | |||
port->SetLatency(fEngineControl->fBufferSize + fPlaybackLatency); | |||
fPlaybackPortList[i] = port_index; | |||
JackLog("JackAudioDriver::Attach fPlaybackPortList[i] port_index = %ld\n", port_index); | |||
// Monitor ports | |||
if (fWithMonitorPorts) { | |||
JackLog("Create monitor port \n"); | |||
@@ -162,7 +162,7 @@ int JackAudioDriver::Write() | |||
{ | |||
for (int i = 0; i < fPlaybackChannels; i++) { | |||
if (fGraphManager->GetConnectionsNum(fPlaybackPortList[i]) > 0) { | |||
float* buffer = GetOutputBuffer(i); | |||
float* buffer = GetOutputBuffer(i); | |||
int size = sizeof(float) * fEngineControl->fBufferSize; | |||
// Monitor ports | |||
if (fWithMonitorPorts && fGraphManager->GetConnectionsNum(fMonitorPortList[i]) > 0) | |||
@@ -196,11 +196,11 @@ int JackAudioDriver::ProcessAsync() | |||
if (fIsMaster) { | |||
if (!fEngine->Process(fLastWaitUst)) // fLastWaitUst is set in the "low level" layer | |||
jack_error("JackAudioDriver::ProcessAsync Process error"); | |||
jack_error("JackAudioDriver::ProcessAsync Process error"); | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); | |||
if (ProcessSlaves() < 0) | |||
jack_error("JackAudioDriver::ProcessAsync ProcessSlaves error"); | |||
} else { | |||
if (ProcessSlaves() < 0) | |||
jack_error("JackAudioDriver::ProcessAsync ProcessSlaves error"); | |||
} else { | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); | |||
} | |||
return 0; | |||
@@ -221,17 +221,17 @@ int JackAudioDriver::ProcessSync() | |||
if (fIsMaster) { | |||
if (fEngine->Process(fLastWaitUst)) { // fLastWaitUst is set in the "low level" layer | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); | |||
if (ProcessSlaves() < 0) | |||
jack_error("JackAudioDriver::ProcessSync ProcessSlaves error, engine may now behave abnormally!!"); | |||
if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0) | |||
jack_error("JackAudioDriver::ProcessSync SuspendRefNum error, engine may now behave abnormally!!"); | |||
} else { // Graph not finished: do not activate it | |||
jack_error("ProcessSync: error"); | |||
} | |||
if (Write() < 0) // Write output buffers for the current cycle | |||
jack_error("ProcessSync: write error"); | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); | |||
if (ProcessSlaves() < 0) | |||
jack_error("JackAudioDriver::ProcessSync ProcessSlaves error, engine may now behave abnormally!!"); | |||
if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0) | |||
jack_error("JackAudioDriver::ProcessSync SuspendRefNum error, engine may now behave abnormally!!"); | |||
} else { // Graph not finished: do not activate it | |||
jack_error("ProcessSync: error"); | |||
} | |||
if (Write() < 0) // Write output buffers for the current cycle | |||
jack_error("ProcessSync: write error"); | |||
} else { | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -78,8 +78,8 @@ class EXPORT JackAudioDriver : public JackDriver | |||
virtual int Detach(); | |||
virtual int Write(); | |||
virtual int SetBufferSize(jack_nframes_t buffer_size); | |||
virtual int SetSampleRate(jack_nframes_t sample_rate); | |||
virtual int SetBufferSize(jack_nframes_t buffer_size); | |||
virtual int SetSampleRate(jack_nframes_t sample_rate); | |||
virtual void NotifyXRun(jack_time_t callback_usecs); // XRun notification sent by the driver | |||
@@ -22,9 +22,9 @@ This program is free software; you can redistribute it and/or modify | |||
#include <string.h> | |||
#if defined (__APPLE__) | |||
#include <Accelerate/Accelerate.h> | |||
#include <Accelerate/Accelerate.h> | |||
#elif defined (__SSE__) | |||
#include <xmmintrin.h> | |||
#include <xmmintrin.h> | |||
#endif | |||
namespace Jack | |||
@@ -38,9 +38,9 @@ static void AudioBufferInit(void* buffer, size_t buffer_size, jack_nframes_t) | |||
static inline void MixAudioBuffer(float* mixbuffer, float* buffer, jack_nframes_t frames) | |||
{ | |||
#ifdef __APPLE__ | |||
// It seems that a vector mult only operation does not exist... | |||
float gain = 1.0f; | |||
vDSP_vsma(buffer, 1, &gain, mixbuffer, 1, mixbuffer, 1, frames); | |||
// It seems that a vector mult only operation does not exist... | |||
float gain = 1.0f; | |||
vDSP_vsma(buffer, 1, &gain, mixbuffer, 1, mixbuffer, 1, frames); | |||
#else | |||
jack_nframes_t frames_group = frames / 4; | |||
frames = frames % 4; | |||
@@ -54,29 +54,29 @@ static inline void MixAudioBuffer(float* mixbuffer, float* buffer, jack_nframes_ | |||
buffer += 4; | |||
frames_group--; | |||
#else | |||
register float mixFloat1 = *mixbuffer; | |||
register float sourceFloat1 = *buffer; | |||
register float mixFloat2 = *(mixbuffer + 1); | |||
register float sourceFloat2 = *(buffer + 1); | |||
register float mixFloat3 = *(mixbuffer + 2); | |||
register float sourceFloat3 = *(buffer + 2); | |||
register float mixFloat4 = *(mixbuffer + 3); | |||
register float sourceFloat4 = *(buffer + 3); | |||
buffer += 4; | |||
frames_group--; | |||
mixFloat1 += sourceFloat1; | |||
mixFloat2 += sourceFloat2; | |||
mixFloat3 += sourceFloat3; | |||
mixFloat4 += sourceFloat4; | |||
*mixbuffer = mixFloat1; | |||
*(mixbuffer + 1) = mixFloat2; | |||
*(mixbuffer + 2) = mixFloat3; | |||
*(mixbuffer + 3) = mixFloat4; | |||
mixbuffer += 4; | |||
register float mixFloat1 = *mixbuffer; | |||
register float sourceFloat1 = *buffer; | |||
register float mixFloat2 = *(mixbuffer + 1); | |||
register float sourceFloat2 = *(buffer + 1); | |||
register float mixFloat3 = *(mixbuffer + 2); | |||
register float sourceFloat3 = *(buffer + 2); | |||
register float mixFloat4 = *(mixbuffer + 3); | |||
register float sourceFloat4 = *(buffer + 3); | |||
buffer += 4; | |||
frames_group--; | |||
mixFloat1 += sourceFloat1; | |||
mixFloat2 += sourceFloat2; | |||
mixFloat3 += sourceFloat3; | |||
mixFloat4 += sourceFloat4; | |||
*mixbuffer = mixFloat1; | |||
*(mixbuffer + 1) = mixFloat2; | |||
*(mixbuffer + 2) = mixFloat3; | |||
*(mixbuffer + 3) = mixFloat4; | |||
mixbuffer += 4; | |||
#endif | |||
} | |||
@@ -99,18 +99,19 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun | |||
// Copy first buffer | |||
memcpy(mixbuffer, src_buffers[0], nframes * sizeof(float)); | |||
// Mix remaining buffers | |||
// Mix remaining buffers | |||
for (int i = 1; i < src_count; ++i) { | |||
buffer = src_buffers[i]; | |||
MixAudioBuffer(static_cast<float*>(mixbuffer), static_cast<float*>(buffer), nframes); | |||
} | |||
} | |||
const JackPortType gAudioPortType = { | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
AudioBufferInit, | |||
AudioBufferMixdown | |||
}; | |||
const JackPortType gAudioPortType = | |||
{ | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
AudioBufferInit, | |||
AudioBufferMixdown | |||
}; | |||
} // namespace Jack | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -65,13 +65,13 @@ class JackClientChannelInterface | |||
// Stop listening for messages from the server | |||
virtual void Stop() | |||
{} | |||
virtual int ServerCheck(const char* server_name) | |||
virtual int ServerCheck(const char* server_name) | |||
{ | |||
return -1; | |||
} | |||
virtual void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) | |||
return -1; | |||
} | |||
virtual void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) | |||
{} | |||
virtual void ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
{} | |||
@@ -109,17 +109,17 @@ class JackClientChannelInterface | |||
virtual void SetTimebaseCallback(int refnum, int conditional, int* result) | |||
{} | |||
virtual void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) | |||
virtual void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) | |||
{} | |||
virtual void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) | |||
virtual void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) | |||
{} | |||
virtual void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result) | |||
virtual void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result) | |||
{} | |||
virtual void InternalClientUnload(int refnum, int int_ref, int* status, int* result) | |||
virtual void InternalClientUnload(int refnum, int int_ref, int* status, int* result) | |||
{} | |||
}; | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -49,10 +49,10 @@ JackClient::JackClient(JackSynchro** table) | |||
fShutdown = NULL; | |||
fInit = NULL; | |||
fBufferSize = NULL; | |||
fClientRegistration = NULL; | |||
fClientRegistration = NULL; | |||
fFreewheel = NULL; | |||
fPortRegistration = NULL; | |||
fPortConnect = NULL; | |||
fPortConnect = NULL; | |||
fSync = NULL; | |||
fProcessArg = NULL; | |||
fGraphOrderArg = NULL; | |||
@@ -63,10 +63,10 @@ JackClient::JackClient(JackSynchro** table) | |||
fFreewheelArg = NULL; | |||
fClientRegistrationArg = NULL; | |||
fPortRegistrationArg = NULL; | |||
fPortConnectArg = NULL; | |||
fPortConnectArg = NULL; | |||
fSyncArg = NULL; | |||
fThreadFun = NULL; | |||
fThreadFunArg = NULL; | |||
fThreadFun = NULL; | |||
fThreadFunArg = NULL; | |||
fConditionnal = 0; // Temporary?? | |||
} | |||
@@ -106,12 +106,12 @@ void JackClient::SetupDriverSync(bool freewheel) | |||
{ | |||
if (!freewheel && !GetEngineControl()->fSyncMode) { | |||
JackLog("JackClient::SetupDriverSync driver sem in flush mode\n"); | |||
fSynchroTable[AUDIO_DRIVER_REFNUM]->SetFlush(true); | |||
fSynchroTable[AUDIO_DRIVER_REFNUM]->SetFlush(true); | |||
fSynchroTable[FREEWHEEL_DRIVER_REFNUM]->SetFlush(true); | |||
fSynchroTable[LOOPBACK_DRIVER_REFNUM]->SetFlush(true); | |||
} else { | |||
JackLog("JackClient::SetupDriverSync driver sem in normal mode\n"); | |||
fSynchroTable[AUDIO_DRIVER_REFNUM]->SetFlush(false); | |||
fSynchroTable[AUDIO_DRIVER_REFNUM]->SetFlush(false); | |||
fSynchroTable[FREEWHEEL_DRIVER_REFNUM]->SetFlush(false); | |||
fSynchroTable[LOOPBACK_DRIVER_REFNUM]->SetFlush(false); | |||
} | |||
@@ -123,7 +123,7 @@ void JackClient::SetupDriverSync(bool freewheel) | |||
int JackClient::ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value1, int value2) | |||
{ | |||
return 0; | |||
return 0; | |||
} | |||
int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2) | |||
@@ -135,17 +135,17 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
case kAddClient: | |||
res = ClientNotifyImp(refnum, name, notify, sync, value1, value2); | |||
break; | |||
case kRemoveClient: | |||
break; | |||
case kRemoveClient: | |||
res = ClientNotifyImp(refnum, name, notify, sync, value1, value2); | |||
break; | |||
case kActivateClient: | |||
JackLog("JackClient::kActivateClient name = %s ref = %ld \n", name, refnum); | |||
Init(); | |||
break; | |||
} | |||
break; | |||
case kActivateClient: | |||
JackLog("JackClient::kActivateClient name = %s ref = %ld \n", name, refnum); | |||
Init(); | |||
break; | |||
} | |||
/* | |||
The current semantic is that notifications can only be received when the client has been activated, | |||
@@ -154,18 +154,18 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
if (IsActive()) { | |||
switch (notify) { | |||
case kAddClient: | |||
JackLog("JackClient::kAddClient fName = %s name = %s\n", GetClientControl()->fName, name); | |||
if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself | |||
fClientRegistration(name, 1, fClientRegistrationArg); | |||
break; | |||
case kRemoveClient: | |||
JackLog("JackClient::kRemoveClient fName = %s name = %s\n", GetClientControl()->fName, name); | |||
if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself | |||
fClientRegistration(name, 0, fClientRegistrationArg); | |||
break; | |||
case kAddClient: | |||
JackLog("JackClient::kAddClient fName = %s name = %s\n", GetClientControl()->fName, name); | |||
if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself | |||
fClientRegistration(name, 1, fClientRegistrationArg); | |||
break; | |||
case kRemoveClient: | |||
JackLog("JackClient::kRemoveClient fName = %s name = %s\n", GetClientControl()->fName, name); | |||
if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself | |||
fClientRegistration(name, 0, fClientRegistrationArg); | |||
break; | |||
case kBufferSizeCallback: | |||
JackLog("JackClient::kBufferSizeCallback buffer_size = %ld\n", value1); | |||
@@ -206,14 +206,14 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
if (fPortRegistration) | |||
fPortRegistration(value1, 0, fPortRegistrationArg); | |||
break; | |||
case kPortConnectCallback: | |||
case kPortConnectCallback: | |||
JackLog("JackClient::kPortConnectCallback src = %ld dst = %ld\n", value1, value2); | |||
if (fPortConnect) | |||
fPortConnect(value1, value2, 1, fPortConnectArg); | |||
break; | |||
case kPortDisconnectCallback: | |||
case kPortDisconnectCallback: | |||
JackLog("JackClient::kPortDisconnectCallback src = %ld dst = %ld\n", value1, value2); | |||
if (fPortConnect) | |||
fPortConnect(value1, value2, 0, fPortConnectArg); | |||
@@ -224,14 +224,14 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
if (fXrun) | |||
res = fXrun(fXrunArg); | |||
break; | |||
} | |||
} | |||
} | |||
return res; | |||
} | |||
/*! | |||
\brief We need to start thread before activating in the server, otherwise the FW driver | |||
\brief We need to start thread before activating in the server, otherwise the FW driver | |||
connected to the client may not be activated. | |||
*/ | |||
int JackClient::Activate() | |||
@@ -240,18 +240,18 @@ int JackClient::Activate() | |||
if (IsActive()) | |||
return 0; | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifdef WIN32 | |||
// Done first so that the RT thread then access an allocated synchro | |||
if (!fSynchroTable[GetClientControl()->fRefNum]->Connect(GetClientControl()->fName)) { | |||
jack_error("Cannot ConnectSemaphore %s client", GetClientControl()->fName); | |||
return -1; | |||
} | |||
#endif | |||
*/ | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifdef WIN32 | |||
// Done first so that the RT thread then access an allocated synchro | |||
if (!fSynchroTable[GetClientControl()->fRefNum]->Connect(GetClientControl()->fName)) { | |||
jack_error("Cannot ConnectSemaphore %s client", GetClientControl()->fName); | |||
return -1; | |||
} | |||
#endif | |||
*/ | |||
if (StartThread() < 0) | |||
return -1; | |||
if (StartThread() < 0) | |||
return -1; | |||
int result = -1; | |||
fChannel->ClientActivate(GetClientControl()->fRefNum, &result); | |||
@@ -284,15 +284,15 @@ int JackClient::Deactivate() | |||
JackLog("JackClient::Deactivate res = %ld \n", result); | |||
// We need to wait for the new engine cycle before stopping the RT thread, but this is done by ClientDeactivate | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifdef WIN32 | |||
fSynchroTable[GetClientControl()->fRefNum]->Disconnect(); | |||
fThread->Stop(); | |||
#else | |||
fThread->Kill(); | |||
#endif | |||
*/ | |||
fThread->Kill(); | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifdef WIN32 | |||
fSynchroTable[GetClientControl()->fRefNum]->Disconnect(); | |||
fThread->Stop(); | |||
#else | |||
fThread->Kill(); | |||
#endif | |||
*/ | |||
fThread->Kill(); | |||
return result; | |||
} | |||
@@ -307,7 +307,7 @@ bool JackClient::Init() | |||
{ | |||
if (fInit) { | |||
JackLog("JackClient::Init calling client thread init callback\n"); | |||
fInit(fInitArg); | |||
fInit(fInitArg); | |||
} | |||
return true; | |||
} | |||
@@ -341,53 +341,53 @@ int JackClient::StartThread() | |||
*/ | |||
bool JackClient::Execute() | |||
{ | |||
if (fThreadFun) { | |||
fThreadFun(fThreadFunArg); | |||
} else { | |||
if (WaitFirstSync()) | |||
ExecuteThread(); | |||
} | |||
return false; // Never reached | |||
if (fThreadFun) { | |||
fThreadFun(fThreadFunArg); | |||
} else { | |||
if (WaitFirstSync()) | |||
ExecuteThread(); | |||
} | |||
return false; // Never reached | |||
} | |||
inline bool JackClient::WaitFirstSync() | |||
{ | |||
while (true) { | |||
// Start first cycle | |||
WaitSync(); | |||
if (IsActive()) { | |||
CallSyncCallback(); | |||
// Finish first cycle | |||
if (Wait(CallProcessCallback()) != GetEngineControl()->fBufferSize) | |||
return false; | |||
return true; | |||
} else { | |||
JackLog("Process called for an inactive client\n"); | |||
} | |||
SignalSync(); | |||
} | |||
return false; // Never reached | |||
while (true) { | |||
// Start first cycle | |||
WaitSync(); | |||
if (IsActive()) { | |||
CallSyncCallback(); | |||
// Finish first cycle | |||
if (Wait(CallProcessCallback()) != GetEngineControl()->fBufferSize) | |||
return false; | |||
return true; | |||
} else { | |||
JackLog("Process called for an inactive client\n"); | |||
} | |||
SignalSync(); | |||
} | |||
return false; // Never reached | |||
} | |||
inline void JackClient::ExecuteThread() | |||
{ | |||
while (true) { | |||
if (Wait(CallProcessCallback()) != GetEngineControl()->fBufferSize) | |||
return; | |||
} | |||
while (true) { | |||
if (Wait(CallProcessCallback()) != GetEngineControl()->fBufferSize) | |||
return; | |||
} | |||
} | |||
jack_nframes_t JackClient::Wait(int status) | |||
{ | |||
if (status == 0) | |||
CallTimebaseCallback(); | |||
SignalSync(); | |||
if (status != 0) | |||
return End(); | |||
if (!WaitSync()) | |||
return Error(); | |||
CallSyncCallback(); | |||
return GetEngineControl()->fBufferSize; | |||
if (status == 0) | |||
CallTimebaseCallback(); | |||
SignalSync(); | |||
if (status != 0) | |||
return End(); | |||
if (!WaitSync()) | |||
return Error(); | |||
CallSyncCallback(); | |||
return GetEngineControl()->fBufferSize; | |||
} | |||
/* | |||
@@ -400,19 +400,19 @@ jack_nframes_t JackClient::Wait(int status) | |||
jack_nframes_t JackClient::CycleWait() | |||
{ | |||
if (!WaitSync()) | |||
return Error(); | |||
CallSyncCallback(); | |||
return GetEngineControl()->fBufferSize; | |||
if (!WaitSync()) | |||
return Error(); | |||
CallSyncCallback(); | |||
return GetEngineControl()->fBufferSize; | |||
} | |||
int JackClient::SetProcessThread(JackThreadCallback fun, void *arg) | |||
{ | |||
if (IsActive()) { | |||
if (IsActive()) { | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
fThreadFun = fun; | |||
fThreadFun = fun; | |||
fThreadFunArg = arg; | |||
return 0; | |||
} | |||
@@ -420,32 +420,32 @@ int JackClient::SetProcessThread(JackThreadCallback fun, void *arg) | |||
void JackClient::CycleSignal(int status) | |||
{ | |||
if (status == 0) | |||
CallTimebaseCallback(); | |||
SignalSync(); | |||
if (status != 0) | |||
End(); | |||
if (status == 0) | |||
CallTimebaseCallback(); | |||
SignalSync(); | |||
if (status != 0) | |||
End(); | |||
} | |||
inline int JackClient::CallProcessCallback() | |||
{ | |||
return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0; | |||
return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0; | |||
} | |||
inline bool JackClient::WaitSync() | |||
{ | |||
// Suspend itself: wait on the input synchro | |||
// Suspend itself: wait on the input synchro | |||
if (GetGraphManager()->SuspendRefNum(GetClientControl(), fSynchroTable, 0x7FFFFFFF) < 0) { | |||
jack_error("SuspendRefNum error"); | |||
return false; | |||
} else { | |||
return true; | |||
} | |||
jack_error("SuspendRefNum error"); | |||
return false; | |||
} else { | |||
return true; | |||
} | |||
} | |||
inline void JackClient::SignalSync() | |||
{ | |||
// Resume: signal output clients connected to the running client | |||
// Resume: signal output clients connected to the running client | |||
if (GetGraphManager()->ResumeRefNum(GetClientControl(), fSynchroTable) < 0) { | |||
jack_error("ResumeRefNum error"); | |||
} | |||
@@ -453,27 +453,27 @@ inline void JackClient::SignalSync() | |||
inline int JackClient::End() | |||
{ | |||
JackLog("JackClient::Execute end name = %s\n", GetClientControl()->fName); | |||
// Hum... not sure about this, the following "close" code is called in the RT thread... | |||
int result; | |||
fThread->DropRealTime(); | |||
GetClientControl()->fActive = false; | |||
fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); | |||
JackLog("JackClient::Execute end name = %s\n", GetClientControl()->fName); | |||
// Hum... not sure about this, the following "close" code is called in the RT thread... | |||
int result; | |||
fThread->DropRealTime(); | |||
GetClientControl()->fActive = false; | |||
fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); | |||
fThread->Terminate(); | |||
return 0; // Never reached | |||
return 0; // Never reached | |||
} | |||
inline int JackClient::Error() | |||
{ | |||
jack_error("JackClient::Execute error name = %s", GetClientControl()->fName); | |||
// Hum... not sure about this, the following "close" code is called in the RT thread... | |||
int result; | |||
jack_error("JackClient::Execute error name = %s", GetClientControl()->fName); | |||
// Hum... not sure about this, the following "close" code is called in the RT thread... | |||
int result; | |||
fThread->DropRealTime(); | |||
GetClientControl()->fActive = false; | |||
fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); | |||
GetClientControl()->fActive = false; | |||
fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); | |||
ShutDown(); | |||
fThread->Terminate(); | |||
return 0; // Never reached | |||
fThread->Terminate(); | |||
return 0; // Never reached | |||
} | |||
//----------------- | |||
@@ -523,7 +523,7 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig | |||
int JackClient::PortUnRegister(jack_port_id_t port_index) | |||
{ | |||
JackLog("JackClient::PortUnRegister port_index = %ld\n", port_index); | |||
list<jack_port_id_t>::iterator it = find(fPortList.begin(), fPortList.end(), port_index); | |||
list<jack_port_id_t>::iterator it = find(fPortList.begin(), fPortList.end(), port_index); | |||
if (it != fPortList.end()) { | |||
fPortList.erase(it); | |||
@@ -824,7 +824,7 @@ int JackClient::SetXRunCallback(JackXRunCallback callback, void *arg) | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kXRunCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kXRunCallback] = (callback != NULL); | |||
fXrunArg = arg; | |||
fXrun = callback; | |||
return 0; | |||
@@ -851,7 +851,7 @@ int JackClient::SetGraphOrderCallback(JackGraphOrderCallback callback, void *arg | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kGraphOrderCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kGraphOrderCallback] = (callback != NULL); | |||
fGraphOrder = callback; | |||
fGraphOrderArg = arg; | |||
return 0; | |||
@@ -864,7 +864,7 @@ int JackClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kBufferSizeCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kBufferSizeCallback] = (callback != NULL); | |||
fBufferSizeArg = arg; | |||
fBufferSize = callback; | |||
return 0; | |||
@@ -877,8 +877,8 @@ int JackClient::SetClientRegistrationCallback(JackClientRegistrationCallback cal | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
// kAddClient and kRemoveClient notifications must be delivered by the server in any case | |||
fClientRegistrationArg = arg; | |||
// kAddClient and kRemoveClient notifications must be delivered by the server in any case | |||
fClientRegistrationArg = arg; | |||
fClientRegistration = callback; | |||
return 0; | |||
} | |||
@@ -890,8 +890,8 @@ int JackClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg) | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kStartFreewheelCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kStopFreewheelCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kStartFreewheelCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kStopFreewheelCallback] = (callback != NULL); | |||
fFreewheelArg = arg; | |||
fFreewheel = callback; | |||
return 0; | |||
@@ -904,8 +904,8 @@ int JackClient::SetPortRegistrationCallback(JackPortRegistrationCallback callbac | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kPortRegistrationOnCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortRegistrationOffCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortRegistrationOnCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortRegistrationOffCallback] = (callback != NULL); | |||
fPortRegistrationArg = arg; | |||
fPortRegistration = callback; | |||
return 0; | |||
@@ -918,8 +918,8 @@ int JackClient::SetPortConnectCallback(JackPortConnectCallback callback, void *a | |||
jack_error("You cannot set callbacks on an active client"); | |||
return -1; | |||
} else { | |||
GetClientControl()->fCallback[kPortConnectCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortDisconnectCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortConnectCallback] = (callback != NULL); | |||
GetClientControl()->fCallback[kPortDisconnectCallback] = (callback != NULL); | |||
fPortConnectArg = arg; | |||
fPortConnect = callback; | |||
return 0; | |||
@@ -932,62 +932,62 @@ int JackClient::SetPortConnectCallback(JackPortConnectCallback callback, void *a | |||
char* JackClient::GetInternalClientName(int ref) | |||
{ | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
int result = -1; | |||
fChannel->GetInternalClientName(GetClientControl()->fRefNum, ref, name_res, &result); | |||
if (result < 0) { | |||
return NULL; | |||
} else { | |||
char* name = (char*)malloc(strlen(name_res)); | |||
strcpy(name, name_res); | |||
return name; | |||
} | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
int result = -1; | |||
fChannel->GetInternalClientName(GetClientControl()->fRefNum, ref, name_res, &result); | |||
if (result < 0) { | |||
return NULL; | |||
} else { | |||
char* name = (char*)malloc(strlen(name_res)); | |||
strcpy(name, name_res); | |||
return name; | |||
} | |||
} | |||
int JackClient::InternalClientHandle(const char* client_name, jack_status_t* status) | |||
{ | |||
int int_ref, result = -1; | |||
fChannel->InternalClientHandle(GetClientControl()->fRefNum, client_name, (int*)status, &int_ref, &result); | |||
return int_ref; | |||
int int_ref, result = -1; | |||
fChannel->InternalClientHandle(GetClientControl()->fRefNum, client_name, (int*)status, &int_ref, &result); | |||
return int_ref; | |||
} | |||
int JackClient::InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va) | |||
{ | |||
if (strlen(client_name) >= JACK_CLIENT_NAME_SIZE) { | |||
jack_error ("\"%s\" is too long for a JACK client name.\n" | |||
"Please use %lu characters or less.", | |||
client_name, JACK_CLIENT_NAME_SIZE); | |||
return 0; | |||
} | |||
if (va->load_name && (strlen(va->load_name) >= PATH_MAX)) { | |||
jack_error("\"%s\" is too long for a shared object name.\n" | |||
"Please use %lu characters or less.", | |||
va->load_name, PATH_MAX); | |||
int my_status1 = *status | (JackFailure | JackInvalidOption); | |||
*status = (jack_status_t)my_status1; | |||
return 0; | |||
} | |||
if (va->load_init && (strlen(va->load_init) >= JACK_LOAD_INIT_LIMIT)) { | |||
jack_error ("\"%s\" is too long for internal client init " | |||
"string.\nPlease use %lu characters or less.", | |||
va->load_init, JACK_LOAD_INIT_LIMIT); | |||
int my_status1 = *status | (JackFailure | JackInvalidOption); | |||
*status = (jack_status_t)my_status1; | |||
return 0; | |||
} | |||
int int_ref, result = -1; | |||
fChannel->InternalClientLoad(GetClientControl()->fRefNum, client_name, va->load_name, va->load_init, options, (int*)status, &int_ref, &result); | |||
return int_ref; | |||
if (strlen(client_name) >= JACK_CLIENT_NAME_SIZE) { | |||
jack_error ("\"%s\" is too long for a JACK client name.\n" | |||
"Please use %lu characters or less.", | |||
client_name, JACK_CLIENT_NAME_SIZE); | |||
return 0; | |||
} | |||
if (va->load_name && (strlen(va->load_name) >= PATH_MAX)) { | |||
jack_error("\"%s\" is too long for a shared object name.\n" | |||
"Please use %lu characters or less.", | |||
va->load_name, PATH_MAX); | |||
int my_status1 = *status | (JackFailure | JackInvalidOption); | |||
*status = (jack_status_t)my_status1; | |||
return 0; | |||
} | |||
if (va->load_init && (strlen(va->load_init) >= JACK_LOAD_INIT_LIMIT)) { | |||
jack_error ("\"%s\" is too long for internal client init " | |||
"string.\nPlease use %lu characters or less.", | |||
va->load_init, JACK_LOAD_INIT_LIMIT); | |||
int my_status1 = *status | (JackFailure | JackInvalidOption); | |||
*status = (jack_status_t)my_status1; | |||
return 0; | |||
} | |||
int int_ref, result = -1; | |||
fChannel->InternalClientLoad(GetClientControl()->fRefNum, client_name, va->load_name, va->load_init, options, (int*)status, &int_ref, &result); | |||
return int_ref; | |||
} | |||
void JackClient::InternalClientUnload(int ref, jack_status_t* status) | |||
{ | |||
int result = -1; | |||
fChannel->InternalClientUnload(GetClientControl()->fRefNum, ref, (int*)status, &result); | |||
int result = -1; | |||
fChannel->InternalClientUnload(GetClientControl()->fRefNum, ref, (int*)status, &result); | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -50,8 +50,8 @@ typedef void (*JackShutdownCallback)(void *arg); | |||
class JackClient : public JackClientInterface, public JackRunnableInterface | |||
{ | |||
friend class JackDebugClient; | |||
friend class JackDebugClient; | |||
protected: | |||
JackProcessCallback fProcess; | |||
@@ -60,29 +60,29 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
JackShutdownCallback fShutdown; | |||
JackThreadInitCallback fInit; | |||
JackBufferSizeCallback fBufferSize; | |||
JackClientRegistrationCallback fClientRegistration; | |||
JackClientRegistrationCallback fClientRegistration; | |||
JackFreewheelCallback fFreewheel; | |||
JackPortRegistrationCallback fPortRegistration; | |||
JackPortConnectCallback fPortConnect; | |||
JackPortConnectCallback fPortConnect; | |||
JackTimebaseCallback fTimebase; | |||
JackSyncCallback fSync; | |||
JackThreadCallback fThreadFun; | |||
JackThreadCallback fThreadFun; | |||
void* fProcessArg; | |||
void* fGraphOrderArg; | |||
void* fXrunArg; | |||
void* fShutdownArg; | |||
void* fInitArg; | |||
void* fBufferSizeArg; | |||
void* fClientRegistrationArg; | |||
void* fClientRegistrationArg; | |||
void* fFreewheelArg; | |||
void* fPortRegistrationArg; | |||
void* fPortConnectArg; | |||
void* fPortConnectArg; | |||
void* fTimebaseArg; | |||
void* fSyncArg; | |||
void* fThreadFunArg; | |||
void* fThreadFunArg; | |||
int fConditionnal; | |||
char fServerName[64]; | |||
char fServerName[64]; | |||
JackThread* fThread; /*! Thread to execute the Process function */ | |||
JackClientChannelInterface* fChannel; | |||
@@ -98,15 +98,15 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
int RequestNewPos(jack_position_t* pos); | |||
virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value1, int value); | |||
// Fons Adriaensen thread model | |||
inline bool WaitFirstSync(); | |||
inline void ExecuteThread(); | |||
inline bool WaitSync(); | |||
inline void SignalSync(); | |||
inline int CallProcessCallback(); | |||
inline int End(); | |||
inline int Error(); | |||
// Fons Adriaensen thread model | |||
inline bool WaitFirstSync(); | |||
inline void ExecuteThread(); | |||
inline bool WaitSync(); | |||
inline void SignalSync(); | |||
inline int CallProcessCallback(); | |||
inline int End(); | |||
inline int Error(); | |||
public: | |||
@@ -162,23 +162,23 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
virtual int SetInitCallback(JackThreadInitCallback callback, void* arg); | |||
virtual int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg); | |||
virtual int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg); | |||
virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg); | |||
virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg); | |||
virtual int SetFreewheelCallback(JackFreewheelCallback callback, void* arg); | |||
virtual int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg); | |||
virtual int SetPortConnectCallback(JackPortConnectCallback callback, void *arg); | |||
// Internal clients | |||
virtual char* GetInternalClientName(int ref); | |||
virtual int InternalClientHandle(const char* client_name, jack_status_t* status); | |||
virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | |||
virtual void InternalClientUnload(int ref, jack_status_t* status); | |||
// Fons Adriaensen thread model | |||
virtual jack_nframes_t Wait(int status); | |||
virtual jack_nframes_t CycleWait(); | |||
void CycleSignal(int status); | |||
int SetProcessThread(JackThreadCallback fun, void *arg); | |||
virtual int SetPortConnectCallback(JackPortConnectCallback callback, void *arg); | |||
// Internal clients | |||
virtual char* GetInternalClientName(int ref); | |||
virtual int InternalClientHandle(const char* client_name, jack_status_t* status); | |||
virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | |||
virtual void InternalClientUnload(int ref, jack_status_t* status); | |||
// Fons Adriaensen thread model | |||
virtual jack_nframes_t Wait(int status); | |||
virtual jack_nframes_t CycleWait(); | |||
void CycleSignal(int status); | |||
int SetProcessThread(JackThreadCallback fun, void *arg); | |||
// JackRunnableInterface interface | |||
bool Init(); | |||
@@ -31,16 +31,16 @@ namespace Jack | |||
{ | |||
/*! | |||
\brief Client control in shared memory. | |||
\brief Client control in shared memory. | |||
*/ | |||
struct JackClientControl : public JackShmMem | |||
{ | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
bool fCallback[kMaxNotification]; | |||
volatile jack_transport_state_t fTransportState; | |||
int fRefNum; | |||
bool fActive; | |||
bool fCallback[kMaxNotification]; | |||
volatile jack_transport_state_t fTransportState; | |||
int fRefNum; | |||
bool fActive; | |||
JackClientControl(const char* name, int refnum) | |||
{ | |||
@@ -60,16 +60,16 @@ struct JackClientControl : public JackShmMem | |||
void Init(const char* name, int refnum) | |||
{ | |||
strcpy(fName, name); | |||
for (int i = 0; i < kMaxNotification; i++) | |||
fCallback[i] = false; | |||
// Always activated | |||
fCallback[kAddClient] = true; | |||
fCallback[kRemoveClient] = true; | |||
fCallback[kActivateClient] = true; | |||
// So that driver synchro are correctly setup in "flush" or "normal" mode | |||
fCallback[kStartFreewheelCallback] = true; | |||
fCallback[kStopFreewheelCallback] = true; | |||
fRefNum = refnum; | |||
for (int i = 0; i < kMaxNotification; i++) | |||
fCallback[i] = false; | |||
// Always activated | |||
fCallback[kAddClient] = true; | |||
fCallback[kRemoveClient] = true; | |||
fCallback[kActivateClient] = true; | |||
// So that driver synchro are correctly setup in "flush" or "normal" mode | |||
fCallback[kStartFreewheelCallback] = true; | |||
fCallback[kStopFreewheelCallback] = true; | |||
fRefNum = refnum; | |||
fTransportState = JackTransportStopped; | |||
fActive = false; | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -245,7 +245,7 @@ void JackConnectionManager::ResetGraph(JackClientTiming* timing) | |||
// Reset activation counter : must be done *before* starting to resume clients | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
fInputCounter[i].Reset(); | |||
timing[i].fStatus = NotTriggered; | |||
timing[i].fStatus = NotTriggered; | |||
} | |||
} | |||
@@ -256,8 +256,8 @@ int JackConnectionManager::SuspendRefNum(JackClientControl* control, JackSynchro | |||
{ | |||
bool res; | |||
if ((res = table[control->fRefNum]->TimedWait(time_out_usec))) { | |||
timing[control->fRefNum].fStatus = Running; | |||
timing[control->fRefNum].fAwakeAt = GetMicroSeconds(); | |||
timing[control->fRefNum].fStatus = Running; | |||
timing[control->fRefNum].fAwakeAt = GetMicroSeconds(); | |||
} | |||
return (res) ? 0 : -1; | |||
} | |||
@@ -267,22 +267,22 @@ int JackConnectionManager::SuspendRefNum(JackClientControl* control, JackSynchro | |||
*/ | |||
int JackConnectionManager::ResumeRefNum(JackClientControl* control, JackSynchro** table, JackClientTiming* timing) | |||
{ | |||
jack_time_t current_date = GetMicroSeconds(); | |||
jack_time_t current_date = GetMicroSeconds(); | |||
const jack_int_t* outputRef = fConnectionRef.GetItems(control->fRefNum); | |||
int res = 0; | |||
int res = 0; | |||
// Update state and timestamp of current client | |||
timing[control->fRefNum].fStatus = Finished; | |||
timing[control->fRefNum].fFinishedAt = current_date; | |||
timing[control->fRefNum].fStatus = Finished; | |||
timing[control->fRefNum].fFinishedAt = current_date; | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
// Signal connected clients or drivers | |||
if (outputRef[i] > 0) { | |||
// Update state and timestamp of destination clients | |||
timing[i].fStatus = Triggered; | |||
timing[i].fSignaledAt = current_date; | |||
// Update state and timestamp of destination clients | |||
timing[i].fStatus = Triggered; | |||
timing[i].fSignaledAt = current_date; | |||
if (!fInputCounter[i].Signal(table[i], control)) { | |||
JackLog("JackConnectionManager::ResumeRefNum error: ref = %ld output = %ld \n", control->fRefNum, i); | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -59,7 +59,7 @@ class JackFixedArray | |||
fCounter = 0; | |||
} | |||
bool AddItem(jack_int_t index) | |||
bool AddItem(jack_int_t index) | |||
{ | |||
for (int i = 0; i < SIZE; i++) { | |||
if (fTable[i] == EMPTY) { | |||
@@ -92,7 +92,7 @@ class JackFixedArray | |||
return false; | |||
} | |||
jack_int_t GetItem(jack_int_t index) const | |||
jack_int_t GetItem(jack_int_t index) const | |||
{ | |||
return (index < SIZE) ? fTable[index] : EMPTY; | |||
} | |||
@@ -145,7 +145,7 @@ class JackFixedArray1 : public JackFixedArray<SIZE> | |||
fUsed = false; | |||
} | |||
bool IsAvailable() | |||
bool IsAvailable() | |||
{ | |||
if (fUsed) { | |||
return false; | |||
@@ -358,25 +358,25 @@ struct JackClientTiming | |||
jack_time_t fSignaledAt; | |||
jack_time_t fAwakeAt; | |||
jack_time_t fFinishedAt; | |||
jack_client_state_t fStatus; | |||
JackClientTiming():fSignaledAt(0), fAwakeAt(0), fFinishedAt(0), fStatus(NotTriggered) | |||
jack_client_state_t fStatus; | |||
JackClientTiming(): fSignaledAt(0), fAwakeAt(0), fFinishedAt(0), fStatus(NotTriggered) | |||
{} | |||
~JackClientTiming() | |||
~JackClientTiming() | |||
{} | |||
}; | |||
/*! | |||
\brief Connection manager. | |||
<UL> | |||
<LI>The <B>fConnection</B> array contains the list (array line) of connected ports for a given port. | |||
<LI>The <B>fConnectionCount</B> array contains the number of connected ports to a given port. | |||
<LI>The <B>fInputPort</B> array contains the list (array line) of input connected ports for a given client. | |||
<LI>The <B>fOutputPort</B> array contains the list (array line) of ouput connected ports for a given client. | |||
<LI>The <B>fConnectionRef</B> array contains the number of ports connected between two clients. | |||
<LI>The <B>fInputRef</B> array contains the number of input clients connected to a given client. | |||
<LI>The <B>fInputCounter</B> array contains the number of input clients connected to a given for activation purpose. | |||
<LI>The <B>fConnectionRef</B> array contains the number of ports connected between two clients. | |||
<LI>The <B>fInputRef</B> array contains the number of input clients connected to a given client. | |||
<LI>The <B>fInputCounter</B> array contains the number of input clients connected to a given for activation purpose. | |||
</UL> | |||
*/ | |||
@@ -393,7 +393,7 @@ class JackConnectionManager | |||
JackLoopFeedback<CONNECTION_NUM> fLoopFeedback; /*! Loop feedback connections */ | |||
bool IsLoopPathAux(int ref1, int ref2) const; | |||
public: | |||
JackConnectionManager(); | |||
@@ -427,8 +427,8 @@ class JackConnectionManager | |||
const jack_int_t* GetOutputPorts(int refnum); | |||
// Client management | |||
void InitRefNum(int refnum); | |||
int GetInputRefNum(jack_port_id_t port_index) const; | |||
void InitRefNum(int refnum); | |||
int GetInputRefNum(jack_port_id_t port_index) const; | |||
int GetOutputRefNum(jack_port_id_t port_index) const; | |||
// Connect/Disconnect 2 refnum "directly" | |||
@@ -52,17 +52,17 @@ namespace Jack | |||
#define SOCKET_TIME_OUT 5 | |||
#ifdef WIN32 | |||
#define jack_server_dir "server" | |||
#define jack_client_dir "client" | |||
#define ADDON_DIR "jackmp" | |||
#define jack_server_dir "server" | |||
#define jack_client_dir "client" | |||
#define ADDON_DIR "jackmp" | |||
#elif __APPLE__ | |||
#define jack_server_dir "/tmp" | |||
#define jack_client_dir "/tmp" | |||
#define JACK_DEFAULT_DRIVER "coreaudio" | |||
#define jack_server_dir "/tmp" | |||
#define jack_client_dir "/tmp" | |||
#define JACK_DEFAULT_DRIVER "coreaudio" | |||
#else | |||
#define jack_server_dir "/dev/shm" | |||
#define jack_client_dir "/dev/shm" | |||
#define JACK_DEFAULT_DRIVER "alsa" | |||
#define jack_server_dir "/dev/shm" | |||
#define jack_client_dir "/dev/shm" | |||
#define JACK_DEFAULT_DRIVER "alsa" | |||
#endif | |||
#define jack_server_entry "jackdmp_entry" | |||
@@ -71,9 +71,9 @@ namespace Jack | |||
#define ALL_CLIENTS -1 // for notification | |||
#if defined(__ppc64__) || defined(__x86_64__) | |||
#define JACK_PROTOCOL_VERSION 4 | |||
#define JACK_PROTOCOL_VERSION 4 | |||
#else | |||
#define JACK_PROTOCOL_VERSION 3 | |||
#define JACK_PROTOCOL_VERSION 3 | |||
#endif | |||
#define DRIVER_OPEN_TIMEOUT 5 // in sec | |||
@@ -113,25 +113,25 @@ int JackDebugClient::Close() | |||
void JackDebugClient::CheckClient() const | |||
{ | |||
if (fIsClosed > 0) { | |||
*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed !" << endl; | |||
*fStream << "This is likely to cause crash !'" << endl; | |||
} | |||
*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed !" << endl; | |||
*fStream << "This is likely to cause crash !'" << endl; | |||
} | |||
} | |||
pthread_t JackDebugClient::GetThreadID() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetThreadID(); | |||
} | |||
JackGraphManager* JackDebugClient::GetGraphManager() const | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetGraphManager(); | |||
} | |||
JackEngineControl* JackDebugClient::GetEngineControl() const | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetEngineControl(); | |||
} | |||
/*! | |||
@@ -140,13 +140,13 @@ JackEngineControl* JackDebugClient::GetEngineControl() const | |||
int JackDebugClient::ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->ClientNotify( refnum, name, notify, sync, value1, value2); | |||
} | |||
int JackDebugClient::Activate() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
int res = fClient->Activate(); | |||
fIsActivated++; | |||
if (fIsDeactivated) | |||
@@ -159,7 +159,7 @@ int JackDebugClient::Activate() | |||
int JackDebugClient::Deactivate() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
int res = fClient->Deactivate(); | |||
fIsDeactivated++; | |||
if (fIsActivated == 0) | |||
@@ -176,7 +176,7 @@ int JackDebugClient::Deactivate() | |||
int JackDebugClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
int res = fClient->PortRegister(port_name, port_type, flags, buffer_size); | |||
if (res <= 0) { | |||
*fStream << "Client '" << fClientName << "' try port register ('" << port_name << "') and server return error " << res << " ." << endl; | |||
@@ -198,7 +198,7 @@ int JackDebugClient::PortRegister(const char* port_name, const char* port_type, | |||
int JackDebugClient::PortUnRegister(jack_port_id_t port_index) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
int res = fClient->PortUnRegister(port_index); | |||
fOpenPortNumber--; | |||
int i; | |||
@@ -220,7 +220,7 @@ int JackDebugClient::PortUnRegister(jack_port_id_t port_index) | |||
int JackDebugClient::PortConnect(const char* src, const char* dst) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
if (!fIsActivated) | |||
*fStream << "!!! ERROR !!! Trying to connect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl; | |||
int i; | |||
@@ -250,7 +250,7 @@ int JackDebugClient::PortConnect(const char* src, const char* dst) | |||
int JackDebugClient::PortDisconnect(const char* src, const char* dst) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
if (!fIsActivated) | |||
*fStream << "!!! ERROR !!! Trying to disconnect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl; | |||
int res = fClient->PortDisconnect( src, dst); | |||
@@ -279,8 +279,8 @@ int JackDebugClient::PortDisconnect(const char* src, const char* dst) | |||
} | |||
int JackDebugClient::PortConnect(jack_port_id_t src, jack_port_id_t dst) | |||
{ | |||
CheckClient(); | |||
{ | |||
CheckClient(); | |||
if (!fIsActivated) | |||
*fStream << "!!! ERROR !!! : Trying to connect port " << src << " to " << dst << " while the client has not been activated !" << endl; | |||
int res = fClient->PortConnect(src, dst); | |||
@@ -310,7 +310,7 @@ int JackDebugClient::PortConnect(jack_port_id_t src, jack_port_id_t dst) | |||
int JackDebugClient::PortDisconnect(jack_port_id_t src) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
if (!fIsActivated) | |||
*fStream << "!!! ERROR !!! : Trying to disconnect port " << src << " while that client has not been activated !" << endl; | |||
int res = fClient->PortDisconnect(src); | |||
@@ -334,7 +334,7 @@ int JackDebugClient::PortDisconnect(jack_port_id_t src) | |||
int JackDebugClient::PortIsMine(jack_port_id_t port_index) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->PortIsMine(port_index); | |||
} | |||
@@ -344,13 +344,13 @@ int JackDebugClient::PortIsMine(jack_port_id_t port_index) | |||
int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetBufferSize(buffer_size); | |||
} | |||
int JackDebugClient::SetFreeWheel(int onoff) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetFreeWheel(onoff); | |||
} | |||
@@ -372,61 +372,61 @@ void JackDebugClient::ShutDown() | |||
int JackDebugClient::ReleaseTimebase() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->ReleaseTimebase(); | |||
} | |||
int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback, void* arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetSyncCallback(sync_callback, arg); | |||
} | |||
int JackDebugClient::SetSyncTimeout(jack_time_t timeout) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetSyncTimeout(timeout); | |||
} | |||
int JackDebugClient::SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetTimebaseCallback( conditional, timebase_callback, arg); | |||
} | |||
int JackDebugClient::TransportLocate(jack_nframes_t frame) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->TransportLocate(frame); | |||
} | |||
jack_transport_state_t JackDebugClient::TransportQuery(jack_position_t* pos) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->TransportQuery(pos); | |||
} | |||
jack_nframes_t JackDebugClient::GetCurrentTransportFrame() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetCurrentTransportFrame(); | |||
} | |||
int JackDebugClient::TransportReposition(jack_position_t* pos) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->TransportReposition(pos); | |||
} | |||
void JackDebugClient::TransportStart() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
fClient->TransportStart(); | |||
} | |||
void JackDebugClient::TransportStop() | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
fClient->TransportStop(); | |||
} | |||
@@ -436,112 +436,112 @@ void JackDebugClient::TransportStop() | |||
void JackDebugClient::OnShutdown(JackShutdownCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
fClient->OnShutdown(callback, arg); | |||
} | |||
int JackDebugClient::TimeCallback(jack_nframes_t nframes, void *arg) | |||
{ | |||
JackDebugClient* client = (JackDebugClient*)arg; | |||
jack_time_t t1 = GetMicroSeconds(); | |||
int res = client->fProcessTimeCallback(nframes, client->fProcessTimeCallbackArg); | |||
jack_time_t t2 = GetMicroSeconds(); | |||
long delta = long((t2 - t1) - client->GetEngineControl()->fPeriodUsecs); | |||
if (delta > 0) | |||
*client->fStream << "!!! ERROR !!! : Process overload of " << delta << " us" << endl; | |||
return res; | |||
JackDebugClient* client = (JackDebugClient*)arg; | |||
jack_time_t t1 = GetMicroSeconds(); | |||
int res = client->fProcessTimeCallback(nframes, client->fProcessTimeCallbackArg); | |||
jack_time_t t2 = GetMicroSeconds(); | |||
long delta = long((t2 - t1) - client->GetEngineControl()->fPeriodUsecs); | |||
if (delta > 0) | |||
*client->fStream << "!!! ERROR !!! : Process overload of " << delta << " us" << endl; | |||
return res; | |||
} | |||
int JackDebugClient::SetProcessCallback(JackProcessCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
fProcessTimeCallback = callback; | |||
fProcessTimeCallbackArg = arg; | |||
return fClient->SetProcessCallback(TimeCallback, this); | |||
CheckClient(); | |||
fProcessTimeCallback = callback; | |||
fProcessTimeCallbackArg = arg; | |||
return fClient->SetProcessCallback(TimeCallback, this); | |||
} | |||
int JackDebugClient::SetXRunCallback(JackXRunCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetXRunCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetInitCallback(JackThreadInitCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetInitCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetGraphOrderCallback(JackGraphOrderCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetGraphOrderCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetBufferSizeCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetClientRegistrationCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetFreewheelCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetPortRegistrationCallback(callback, arg); | |||
} | |||
int JackDebugClient::SetPortConnectCallback(JackPortConnectCallback callback, void *arg) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->SetPortConnectCallback(callback, arg); | |||
} | |||
JackClientControl* JackDebugClient::GetClientControl() const | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetClientControl(); | |||
} | |||
// Internal clients | |||
char* JackDebugClient::GetInternalClientName(int ref) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->GetInternalClientName(ref); | |||
} | |||
int JackDebugClient::InternalClientHandle(const char* client_name, jack_status_t* status) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->InternalClientHandle(client_name, status); | |||
} | |||
int JackDebugClient::InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->InternalClientLoad(client_name, options, status, va); | |||
} | |||
void JackDebugClient::InternalClientUnload(int ref, jack_status_t* status) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
fClient->InternalClientUnload(ref, status); | |||
} | |||
jack_nframes_t JackDebugClient::Wait(int status) | |||
{ | |||
CheckClient(); | |||
CheckClient(); | |||
return fClient->Wait(status); | |||
} | |||
@@ -45,22 +45,22 @@ PortFollower; | |||
/*! | |||
\brief A "decorator" debug client to validate API use. | |||
*/ | |||
class JackDebugClient : public JackClient | |||
{ | |||
protected: | |||
JackClient* fClient; | |||
JackClient* fClient; | |||
std::ofstream* fStream; | |||
PortFollower fPortList[MAX_PORT_HISTORY]; // Arbitrary value... To be tuned... | |||
PortFollower fPortList[MAX_PORT_HISTORY]; // Arbitrary value... To be tuned... | |||
int fTotalPortNumber; // The total number of port opened and maybe closed. Historical view. | |||
int fOpenPortNumber; // The current number of opened port. | |||
int fIsActivated; | |||
int fIsDeactivated; | |||
int fIsClosed; | |||
char fClientName[JACK_CLIENT_NAME_SIZE]; | |||
JackProcessCallback fProcessTimeCallback; | |||
void* fProcessTimeCallbackArg; | |||
JackProcessCallback fProcessTimeCallback; | |||
void* fProcessTimeCallbackArg; | |||
public: | |||
@@ -115,24 +115,24 @@ class JackDebugClient : public JackClient | |||
int SetInitCallback(JackThreadInitCallback callback, void* arg); | |||
int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg); | |||
int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg); | |||
int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg); | |||
int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg); | |||
int SetFreewheelCallback(JackFreewheelCallback callback, void* arg); | |||
int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg); | |||
int SetPortConnectCallback(JackPortConnectCallback callback, void *arg); | |||
// Internal clients | |||
char* GetInternalClientName(int ref); | |||
int InternalClientHandle(const char* client_name, jack_status_t* status); | |||
int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | |||
void InternalClientUnload(int ref, jack_status_t* status); | |||
// Fons Adriaensen thread model | |||
jack_nframes_t Wait(int status); | |||
int SetPortConnectCallback(JackPortConnectCallback callback, void *arg); | |||
// Internal clients | |||
char* GetInternalClientName(int ref); | |||
int InternalClientHandle(const char* client_name, jack_status_t* status); | |||
int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | |||
void InternalClientUnload(int ref, jack_status_t* status); | |||
// Fons Adriaensen thread model | |||
jack_nframes_t Wait(int status); | |||
JackClientControl* GetClientControl() const; | |||
void CheckClient() const; | |||
static int TimeCallback(jack_nframes_t nframes, void *arg); | |||
void CheckClient() const; | |||
static int TimeCallback(jack_nframes_t nframes, void *arg); | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -70,15 +70,15 @@ int JackDriver::Open() | |||
{ | |||
int refnum = -1; | |||
if (fEngine->ClientInternalOpen(fClientControl->fName, &refnum, &fEngineControl, &fGraphManager, this, false) != 0) { | |||
if (fEngine->ClientInternalOpen(fClientControl->fName, &refnum, &fEngineControl, &fGraphManager, this, false) != 0) { | |||
jack_error("Cannot allocate internal client for audio driver"); | |||
return -1; | |||
} | |||
fClientControl->fRefNum = refnum; | |||
fClientControl->fActive = true; | |||
fGraphManager->DirectConnect(fClientControl->fRefNum, fClientControl->fRefNum); // Connect driver to itself for "sync" mode | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
fClientControl->fActive = true; | |||
fGraphManager->DirectConnect(fClientControl->fRefNum, fClientControl->fRefNum); // Connect driver to itself for "sync" mode | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
return 0; | |||
} | |||
@@ -104,7 +104,7 @@ int JackDriver::Open(jack_nframes_t nframes, | |||
} | |||
fClientControl->fRefNum = refnum; | |||
fClientControl->fActive = true; | |||
fClientControl->fActive = true; | |||
fEngineControl->fBufferSize = nframes; | |||
fEngineControl->fSampleRate = samplerate; | |||
fCaptureLatency = capture_latency; | |||
@@ -122,7 +122,7 @@ int JackDriver::Open(jack_nframes_t nframes, | |||
fGraphManager->SetBufferSize(nframes); | |||
fGraphManager->DirectConnect(fClientControl->fRefNum, fClientControl->fRefNum); // Connect driver to itself for "sync" mode | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
return 0; | |||
} | |||
@@ -141,31 +141,31 @@ int JackDriver::Close() | |||
*/ | |||
void JackDriver::SetupDriverSync(int ref, bool freewheel) | |||
{ | |||
if (!freewheel && !fEngineControl->fSyncMode) { | |||
if (!freewheel && !fEngineControl->fSyncMode) { | |||
JackLog("JackDriver::SetupDriverSync driver sem in flush mode\n"); | |||
fSynchroTable[ref]->SetFlush(true); | |||
} else { | |||
JackLog("JackDriver::SetupDriverSync driver sem in normal mode\n"); | |||
fSynchroTable[ref]->SetFlush(false); | |||
} | |||
} | |||
} | |||
int JackDriver::ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2) | |||
{ | |||
switch (notify) { | |||
case kStartFreewheelCallback: | |||
JackLog("JackDriver::kStartFreewheel\n"); | |||
SetupDriverSync(fClientControl->fRefNum, true); | |||
break; | |||
case kStopFreewheelCallback: | |||
JackLog("JackDriver::kStopFreewheel\n"); | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
break; | |||
} | |||
switch (notify) { | |||
case kStartFreewheelCallback: | |||
JackLog("JackDriver::kStartFreewheel\n"); | |||
SetupDriverSync(fClientControl->fRefNum, true); | |||
break; | |||
return 0; | |||
case kStopFreewheelCallback: | |||
JackLog("JackDriver::kStopFreewheel\n"); | |||
SetupDriverSync(fClientControl->fRefNum, false); | |||
break; | |||
} | |||
return 0; | |||
} | |||
bool JackDriver::IsRealTime() | |||
@@ -205,14 +205,14 @@ void JackDriverClient::RemoveSlave(JackDriverInterface* slave) | |||
int JackDriverClient::ProcessSlaves() | |||
{ | |||
int res = 0; | |||
int res = 0; | |||
list<JackDriverInterface*>::const_iterator it; | |||
for (it = fSlaveList.begin(); it != fSlaveList.end(); it++) { | |||
JackDriverInterface* slave = *it; | |||
if (slave->Process() < 0) | |||
res = -1; | |||
res = -1; | |||
} | |||
return res; | |||
return res; | |||
} | |||
} // end of namespace |
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -65,14 +65,14 @@ class EXPORT JackDriverInterface | |||
virtual int Attach() = 0; | |||
virtual int Detach() = 0; | |||
virtual int Read() = 0; | |||
virtual int Write() = 0; | |||
virtual int Start() = 0; | |||
virtual int Stop() = 0; | |||
virtual int SetBufferSize(jack_nframes_t buffer_size) = 0; | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) = 0; | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) = 0; | |||
virtual int Process() = 0; | |||
@@ -90,7 +90,7 @@ class EXPORT JackDriverInterface | |||
*/ | |||
class EXPORT JackDriverClientInterface : public JackDriverInterface, public JackClientInterface | |||
{}; | |||
{}; | |||
/*! | |||
\brief The base class for drivers clients. | |||
@@ -195,9 +195,9 @@ class EXPORT JackDriver : public JackDriverClient | |||
{ | |||
return 0; | |||
} | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) | |||
{ | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) | |||
{ | |||
return 0; | |||
} | |||
@@ -206,8 +206,8 @@ class EXPORT JackDriver : public JackDriverClient | |||
virtual bool IsRealTime(); | |||
int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2); | |||
void SetupDriverSync(int ref, bool freewheel); | |||
void SetupDriverSync(int ref, bool freewheel); | |||
}; | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001-2005 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -18,11 +18,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
#ifndef WIN32 | |||
#ifndef WIN32 | |||
#ifndef ADDON_DIR | |||
#include "config.h" | |||
#endif | |||
@@ -32,7 +32,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#include "JackError.h" | |||
#include <getopt.h> | |||
#ifndef WIN32 | |||
#ifndef WIN32 | |||
#include <dirent.h> | |||
#endif | |||
@@ -116,7 +116,7 @@ jack_parse_driver_params (jack_driver_desc_t * desc, int argc, char* argv[], JSL | |||
printf ("Parameters for driver '%s' (all parameters are optional):\n", desc->name); | |||
jack_print_driver_options (desc, stdout); | |||
return 1; | |||
} | |||
} | |||
/* set up the stuff for getopt */ | |||
options = (char*)calloc (desc->nparams * 3 + 1, sizeof (char)); | |||
@@ -186,7 +186,7 @@ jack_parse_driver_params (jack_driver_desc_t * desc, int argc, char* argv[], JSL | |||
strcasecmp ("no", optarg) == 0 || | |||
strcasecmp ("0", optarg) == 0 || | |||
strcasecmp ("(null)", optarg) == 0 ) { | |||
*/ | |||
*/ | |||
// steph | |||
if (strcmp ("false", optarg) == 0 || | |||
strcmp ("off", optarg) == 0 || | |||
@@ -256,15 +256,15 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||
#endif | |||
int err; | |||
/* | |||
char* driver_dir; | |||
if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { | |||
driver_dir = ADDON_DIR; | |||
} | |||
*/ | |||
/* | |||
char* driver_dir; | |||
if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { | |||
driver_dir = ADDON_DIR; | |||
} | |||
*/ | |||
#ifdef WIN32 | |||
char* driver_dir = ADDON_DIR; | |||
char* driver_dir = ADDON_DIR; | |||
if (strcmp(ADDON_DIR, "") == 0) { | |||
char temp_driver_dir1[512]; | |||
char temp_driver_dir2[512]; | |||
@@ -273,8 +273,8 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||
driver_dir = temp_driver_dir2; | |||
} | |||
#else | |||
char driver_dir[512]; | |||
snprintf(driver_dir, sizeof(driver_dir) - 1, "%s/%s/jackmp", ADDON_DIR, LIB_DIR); | |||
char driver_dir[512]; | |||
snprintf(driver_dir, sizeof(driver_dir) - 1, "%s/%s/jackmp", ADDON_DIR, LIB_DIR); | |||
#endif | |||
filename = (char *)malloc(strlen (driver_dir) + 1 + strlen(sofile) + 1); | |||
@@ -330,7 +330,7 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||
if (strcmp(descriptor->name, other_descriptor->name) == 0) { | |||
jack_error("the drivers in '%s' and '%s' both have the name '%s'; using the first\n", | |||
other_descriptor->file, filename, other_descriptor->name); | |||
other_descriptor->file, filename, other_descriptor->name); | |||
/* FIXME: delete the descriptor */ | |||
free(filename); | |||
return NULL; | |||
@@ -400,15 +400,15 @@ jack_drivers_load (JSList * drivers) { | |||
JSList * driver_list = NULL; | |||
jack_driver_desc_t * desc; | |||
/* | |||
char* driver_dir; | |||
/* | |||
char* driver_dir; | |||
if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { | |||
driver_dir = ADDON_DIR; | |||
} | |||
*/ | |||
char driver_dir[512]; | |||
snprintf(driver_dir, sizeof(driver_dir) - 1, "%s/%s/jackmp", ADDON_DIR, LIB_DIR); | |||
driver_dir = ADDON_DIR; | |||
} | |||
*/ | |||
char driver_dir[512]; | |||
snprintf(driver_dir, sizeof(driver_dir) - 1, "%s/%s/jackmp", ADDON_DIR, LIB_DIR); | |||
/* search through the driver_dir and add get descriptors | |||
from the .so files in it */ | |||
dir_stream = opendir (driver_dir); | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001-2005 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -38,15 +38,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
JackEngine::JackEngine(JackGraphManager* manager, | |||
JackSynchro** table, | |||
JackEngineControl* control) | |||
JackEngine::JackEngine(JackGraphManager* manager, | |||
JackSynchro** table, | |||
JackEngineControl* control) | |||
{ | |||
fGraphManager = manager; | |||
fSynchroTable = table; | |||
fEngineControl = control; | |||
fChannel = JackGlobals::MakeServerNotifyChannel(); | |||
fSignal = JackGlobals::MakeInterProcessSync(); | |||
fChannel = JackGlobals::MakeServerNotifyChannel(); | |||
fSignal = JackGlobals::MakeInterProcessSync(); | |||
for (int i = 0; i < CLIENT_NUM; i++) | |||
fClientTable[i] = NULL; | |||
} | |||
@@ -54,7 +54,7 @@ JackEngine::JackEngine(JackGraphManager* manager, | |||
JackEngine::~JackEngine() | |||
{ | |||
delete fChannel; | |||
delete fSignal; | |||
delete fSignal; | |||
} | |||
int JackEngine::Open() | |||
@@ -79,14 +79,14 @@ int JackEngine::Close() | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = fClientTable[i]; | |||
if (client) { | |||
JackLog("JackEngine::Close remaining client %ld\n", i); | |||
fClientTable[i] = NULL; | |||
JackLog("JackEngine::Close remaining client %ld\n", i); | |||
fClientTable[i] = NULL; | |||
client->Close(); | |||
delete client; | |||
} | |||
} | |||
fSignal->Destroy(); | |||
fSignal->Destroy(); | |||
return 0; | |||
} | |||
@@ -107,23 +107,23 @@ int JackEngine::AllocateRefnum() | |||
void JackEngine::ReleaseRefnum(int ref) | |||
{ | |||
fClientTable[ref] = NULL; | |||
if (fEngineControl->fTemporary) { | |||
int i; | |||
for (i = REAL_REFNUM; i < CLIENT_NUM; i++) { | |||
if (fClientTable[i]) | |||
break; | |||
} | |||
if (i == CLIENT_NUM) { | |||
// last client and temporay case: quit the server | |||
JackLog("JackEngine::ReleaseRefnum server quit\n"); | |||
fEngineControl->fTemporary = false; | |||
#ifndef WIN32 | |||
kill(getpid(), SIGINT); | |||
#endif | |||
} | |||
} | |||
fClientTable[ref] = NULL; | |||
if (fEngineControl->fTemporary) { | |||
int i; | |||
for (i = REAL_REFNUM; i < CLIENT_NUM; i++) { | |||
if (fClientTable[i]) | |||
break; | |||
} | |||
if (i == CLIENT_NUM) { | |||
// last client and temporay case: quit the server | |||
JackLog("JackEngine::ReleaseRefnum server quit\n"); | |||
fEngineControl->fTemporary = false; | |||
#ifndef WIN32 | |||
kill(getpid(), SIGINT); | |||
#endif | |||
} | |||
} | |||
} | |||
//------------------ | |||
@@ -132,46 +132,46 @@ void JackEngine::ReleaseRefnum(int ref) | |||
void JackEngine::ProcessNext(jack_time_t callback_usecs) | |||
{ | |||
fLastSwitchUsecs = callback_usecs; | |||
if (fGraphManager->RunNextGraph()) // True if the graph actually switched to a new state | |||
fChannel->ClientNotify(ALL_CLIENTS, kGraphOrderCallback, 0, 0); | |||
fSignal->SignalAll(); // Signal for threads waiting for next cycle | |||
fLastSwitchUsecs = callback_usecs; | |||
if (fGraphManager->RunNextGraph()) // True if the graph actually switched to a new state | |||
fChannel->ClientNotify(ALL_CLIENTS, kGraphOrderCallback, 0, 0); | |||
fSignal->SignalAll(); // Signal for threads waiting for next cycle | |||
} | |||
void JackEngine::ProcessCurrent(jack_time_t callback_usecs) | |||
{ | |||
if (callback_usecs < fLastSwitchUsecs + 2 * fEngineControl->fPeriodUsecs) // Signal XRun only for the first failing cycle | |||
CheckXRun(callback_usecs); | |||
fGraphManager->RunCurrentGraph(); | |||
if (callback_usecs < fLastSwitchUsecs + 2 * fEngineControl->fPeriodUsecs) // Signal XRun only for the first failing cycle | |||
CheckXRun(callback_usecs); | |||
fGraphManager->RunCurrentGraph(); | |||
} | |||
bool JackEngine::Process(jack_time_t callback_usecs) | |||
{ | |||
bool res = true; | |||
bool res = true; | |||
// Cycle begin | |||
fEngineControl->CycleBegin(fClientTable, fGraphManager, callback_usecs); | |||
fEngineControl->CycleBegin(fClientTable, fGraphManager, callback_usecs); | |||
// Graph | |||
// Graph | |||
if (fGraphManager->IsFinishedGraph()) { | |||
ProcessNext(callback_usecs); | |||
res = true; | |||
res = true; | |||
} else { | |||
JackLog("Process: graph not finished!\n"); | |||
if (callback_usecs > fLastSwitchUsecs + fEngineControl->fTimeOutUsecs) { | |||
if (callback_usecs > fLastSwitchUsecs + fEngineControl->fTimeOutUsecs) { | |||
JackLog("Process: switch to next state delta = %ld\n", long(callback_usecs - fLastSwitchUsecs)); | |||
ProcessNext(callback_usecs); | |||
res = true; | |||
ProcessNext(callback_usecs); | |||
res = true; | |||
} else { | |||
JackLog("Process: waiting to switch delta = %ld\n", long(callback_usecs - fLastSwitchUsecs)); | |||
ProcessCurrent(callback_usecs); | |||
res = false; | |||
} | |||
res = false; | |||
} | |||
} | |||
// Cycle end | |||
fEngineControl->CycleEnd(fClientTable); | |||
return res; | |||
fEngineControl->CycleEnd(fClientTable); | |||
return res; | |||
} | |||
@@ -185,15 +185,15 @@ void JackEngine::CheckXRun(jack_time_t callback_usecs) // REVOIR les conditions | |||
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = fClientTable[i]; | |||
if (client && client->GetClientControl()->fActive) { | |||
JackClientTiming* timing = fGraphManager->GetClientTiming(i); | |||
jack_client_state_t status = timing->fStatus; | |||
JackClientTiming* timing = fGraphManager->GetClientTiming(i); | |||
jack_client_state_t status = timing->fStatus; | |||
jack_time_t finished_date = timing->fFinishedAt; | |||
if (status != NotTriggered && status != Finished) { | |||
jack_error("JackEngine::XRun: client = %s was not run: state = %ld", client->GetClientControl()->fName, status); | |||
fChannel->ClientNotify(ALL_CLIENTS, kXRunCallback, 0, 0); // Notify all clients | |||
} | |||
if (status == Finished && (long)(finished_date - callback_usecs) > 0) { | |||
jack_error("JackEngine::XRun: client %s finished after current callback", client->GetClientControl()->fName); | |||
fChannel->ClientNotify(ALL_CLIENTS, kXRunCallback, 0, 0); // Notify all clients | |||
@@ -209,13 +209,13 @@ void JackEngine::CheckXRun(jack_time_t callback_usecs) // REVOIR les conditions | |||
void JackEngine::NotifyClient(int refnum, int event, int sync, int value1, int value2) | |||
{ | |||
JackClientInterface* client = fClientTable[refnum]; | |||
// The client may be notified by the RT thread while closing | |||
if (!client) { | |||
JackLog("JackEngine::NotifyClient: client not available anymore\n"); | |||
} else if (client->GetClientControl()->fCallback[event]) { | |||
if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, value1, value2) < 0) | |||
jack_error("NotifyClient fails name = %s event = %ld = val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); | |||
JackLog("JackEngine::NotifyClient: client not available anymore\n"); | |||
} else if (client->GetClientControl()->fCallback[event]) { | |||
if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, value1, value2) < 0) | |||
jack_error("NotifyClient fails name = %s event = %ld = val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); | |||
} else { | |||
JackLog("JackEngine::NotifyClient: no callback for event = %ld\n", event); | |||
} | |||
@@ -225,14 +225,14 @@ void JackEngine::NotifyClients(int event, int sync, int value1, int value2) | |||
{ | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = fClientTable[i]; | |||
if (client) { | |||
if (client->GetClientControl()->fCallback[event]) { | |||
if (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, value1, value2) < 0) | |||
jack_error("NotifyClient fails name = %s event = %ld = val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); | |||
} else { | |||
JackLog("JackEngine::NotifyClients: no callback for event = %ld\n", event); | |||
} | |||
} | |||
if (client) { | |||
if (client->GetClientControl()->fCallback[event]) { | |||
if (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, value1, value2) < 0) | |||
jack_error("NotifyClient fails name = %s event = %ld = val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); | |||
} else { | |||
JackLog("JackEngine::NotifyClients: no callback for event = %ld\n", event); | |||
} | |||
} | |||
} | |||
} | |||
@@ -244,12 +244,12 @@ int JackEngine::NotifyAddClient(JackClientInterface* new_client, const char* nam | |||
if (old_client) { | |||
if (old_client->ClientNotify(refnum, name, kAddClient, true, 0, 0) < 0) { | |||
jack_error("NotifyAddClient old_client fails name = %s", old_client->GetClientControl()->fName); | |||
return -1; | |||
} | |||
if (new_client->ClientNotify(i, old_client->GetClientControl()->fName, kAddClient, true, 0, 0) < 0) { | |||
return -1; | |||
} | |||
if (new_client->ClientNotify(i, old_client->GetClientControl()->fName, kAddClient, true, 0, 0) < 0) { | |||
jack_error("NotifyAddClient new_client fails name = %s", name); | |||
return -1; | |||
} | |||
return -1; | |||
} | |||
} | |||
} | |||
@@ -271,7 +271,7 @@ void JackEngine::NotifyRemoveClient(const char* name, int refnum) | |||
void JackEngine::NotifyXRun(jack_time_t callback_usecs) | |||
{ | |||
// Use the audio thread => request thread communication channel | |||
fEngineControl->ResetFrameTime(callback_usecs); | |||
fEngineControl->ResetFrameTime(callback_usecs); | |||
fChannel->ClientNotify(ALL_CLIENTS, kXRunCallback, 0, 0); | |||
} | |||
@@ -312,7 +312,7 @@ void JackEngine::NotifyPortConnect(jack_port_id_t src, jack_port_id_t dst, bool | |||
void JackEngine::NotifyActivate(int refnum) | |||
{ | |||
NotifyClient(refnum, kActivateClient, true, 0, 0); | |||
NotifyClient(refnum, kActivateClient, true, 0, 0); | |||
} | |||
//---------------------------- | |||
@@ -321,45 +321,45 @@ void JackEngine::NotifyActivate(int refnum) | |||
int JackEngine::GetInternalClientName(int refnum, char* name_res) | |||
{ | |||
assert(refnum >= 0 && refnum < CLIENT_NUM); | |||
JackClientInterface* client = fClientTable[refnum]; | |||
if (client) { | |||
strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); | |||
return 0; | |||
} else { | |||
return -1; | |||
} | |||
assert(refnum >= 0 && refnum < CLIENT_NUM); | |||
JackClientInterface* client = fClientTable[refnum]; | |||
if (client) { | |||
strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); | |||
return 0; | |||
} else { | |||
return -1; | |||
} | |||
} | |||
int JackEngine::InternalClientHandle(const char* client_name, int* status, int* int_ref) | |||
{ | |||
// Clear status | |||
*status = 0; | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
// Clear status | |||
*status = 0; | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = fClientTable[i]; | |||
if (client && dynamic_cast<JackLoadableInternalClient*>(client) && (strcmp(client->GetClientControl()->fName, client_name) == 0)) { | |||
JackLog("InternalClientHandle found client name = %s ref = %ld\n", client_name, i); | |||
*int_ref = i; | |||
return 0; | |||
} | |||
JackLog("InternalClientHandle found client name = %s ref = %ld\n", client_name, i); | |||
*int_ref = i; | |||
return 0; | |||
} | |||
} | |||
*status |= (JackNoSuchClient | JackFailure); | |||
return -1; | |||
*status |= (JackNoSuchClient | JackFailure); | |||
return -1; | |||
} | |||
int JackEngine::InternalClientUnload(int refnum, int* status) | |||
{ | |||
assert(refnum >= 0 && refnum < CLIENT_NUM); | |||
JackClientInterface* client = fClientTable[refnum]; | |||
if (client) { | |||
int res = client->Close(); | |||
delete client; | |||
*status = 0; | |||
return res; | |||
} else { | |||
*status = (JackNoSuchClient | JackFailure); | |||
assert(refnum >= 0 && refnum < CLIENT_NUM); | |||
JackClientInterface* client = fClientTable[refnum]; | |||
if (client) { | |||
int res = client->Close(); | |||
delete client; | |||
*status = 0; | |||
return res; | |||
} else { | |||
*status = (JackNoSuchClient | JackFailure); | |||
return -1; | |||
} | |||
} | |||
@@ -370,68 +370,68 @@ int JackEngine::InternalClientUnload(int refnum, int* status) | |||
int JackEngine::ClientCheck(const char* name, char* name_res, int protocol, int options, int* status) | |||
{ | |||
// Clear status | |||
*status = 0; | |||
strcpy(name_res, name); | |||
JackLog("Check protocol client %ld server = %ld\n", protocol, JACK_PROTOCOL_VERSION); | |||
if (protocol != JACK_PROTOCOL_VERSION) { | |||
*status |= (JackFailure | JackVersionError); | |||
jack_error("JACK protocol mismatch (%d vs %d)", protocol, JACK_PROTOCOL_VERSION); | |||
return -1; | |||
} | |||
if (ClientCheckName(name)) { | |||
*status |= JackNameNotUnique; | |||
if (options & JackUseExactName) { | |||
jack_error("cannot create new client; %s already exists", name); | |||
*status |= JackFailure; | |||
return -1; | |||
} | |||
if (GenerateUniqueName(name_res)) { | |||
*status |= JackFailure; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
// Clear status | |||
*status = 0; | |||
strcpy(name_res, name); | |||
JackLog("Check protocol client %ld server = %ld\n", protocol, JACK_PROTOCOL_VERSION); | |||
if (protocol != JACK_PROTOCOL_VERSION) { | |||
*status |= (JackFailure | JackVersionError); | |||
jack_error("JACK protocol mismatch (%d vs %d)", protocol, JACK_PROTOCOL_VERSION); | |||
return -1; | |||
} | |||
if (ClientCheckName(name)) { | |||
*status |= JackNameNotUnique; | |||
if (options & JackUseExactName) { | |||
jack_error("cannot create new client; %s already exists", name); | |||
*status |= JackFailure; | |||
return -1; | |||
} | |||
if (GenerateUniqueName(name_res)) { | |||
*status |= JackFailure; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
bool JackEngine::GenerateUniqueName(char* name) | |||
{ | |||
int tens, ones; | |||
int length = strlen(name); | |||
if (length > JACK_CLIENT_NAME_SIZE - 4) { | |||
jack_error("%s exists and is too long to make unique", name); | |||
return true; /* failure */ | |||
} | |||
/* generate a unique name by appending "-01".."-99" */ | |||
name[length++] = '-'; | |||
tens = length++; | |||
ones = length++; | |||
name[tens] = '0'; | |||
name[ones] = '1'; | |||
name[length] = '\0'; | |||
while (ClientCheckName(name)) { | |||
if (name[ones] == '9') { | |||
if (name[tens] == '9') { | |||
jack_error("client %s has 99 extra instances already", name); | |||
return true; /* give up */ | |||
} | |||
name[tens]++; | |||
name[ones] = '0'; | |||
} else { | |||
name[ones]++; | |||
} | |||
} | |||
return false; | |||
int tens, ones; | |||
int length = strlen(name); | |||
if (length > JACK_CLIENT_NAME_SIZE - 4) { | |||
jack_error("%s exists and is too long to make unique", name); | |||
return true; /* failure */ | |||
} | |||
/* generate a unique name by appending "-01".."-99" */ | |||
name[length++] = '-'; | |||
tens = length++; | |||
ones = length++; | |||
name[tens] = '0'; | |||
name[ones] = '1'; | |||
name[length] = '\0'; | |||
while (ClientCheckName(name)) { | |||
if (name[ones] == '9') { | |||
if (name[tens] == '9') { | |||
jack_error("client %s has 99 extra instances already", name); | |||
return true; /* give up */ | |||
} | |||
name[tens]++; | |||
name[ones] = '0'; | |||
} else { | |||
name[ones]++; | |||
} | |||
} | |||
return false; | |||
} | |||
bool JackEngine::ClientCheckName(const char* name) | |||
@@ -449,18 +449,18 @@ bool JackEngine::ClientCheckName(const char* name) | |||
int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) | |||
{ | |||
JackLog("JackEngine::ClientOpen: name = %s \n", name); | |||
int refnum = AllocateRefnum(); | |||
int refnum = AllocateRefnum(); | |||
if (refnum < 0) { | |||
jack_error("No more refnum available"); | |||
return -1; | |||
} | |||
JackExternalClient* client = new JackExternalClient(); | |||
JackExternalClient* client = new JackExternalClient(); | |||
if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { | |||
jack_error("Cannot allocate synchro"); | |||
goto error; | |||
goto error; | |||
} | |||
if (client->Open(name, refnum, shared_client) < 0) { | |||
@@ -480,8 +480,8 @@ int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engin | |||
} | |||
fClientTable[refnum] = client; | |||
fGraphManager->InitRefNum(refnum); | |||
fEngineControl->ResetRollingUsecs(); | |||
fGraphManager->InitRefNum(refnum); | |||
fEngineControl->ResetRollingUsecs(); | |||
*shared_engine = fEngineControl->GetShmIndex(); | |||
*shared_graph_manager = fGraphManager->GetShmIndex(); | |||
*ref = refnum; | |||
@@ -490,7 +490,7 @@ int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engin | |||
error: | |||
ClientCloseAux(refnum, client, false); | |||
client->Close(); | |||
delete client; | |||
delete client; | |||
return -1; | |||
} | |||
@@ -498,32 +498,32 @@ error: | |||
int JackEngine::ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait) | |||
{ | |||
JackLog("JackEngine::ClientInternalNew: name = %s\n", name); | |||
int refnum = AllocateRefnum(); | |||
if (refnum < 0) { | |||
int refnum = AllocateRefnum(); | |||
if (refnum < 0) { | |||
jack_error("No more refnum available"); | |||
return -1; | |||
} | |||
if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { | |||
jack_error("Cannot allocate synchro"); | |||
return -1; | |||
return -1; | |||
} | |||
if (wait && !fSignal->TimedWait(DRIVER_OPEN_TIMEOUT * 1000000)) { | |||
if (wait && !fSignal->TimedWait(DRIVER_OPEN_TIMEOUT * 1000000)) { | |||
// Failure if RT thread is not running (problem with the driver...) | |||
jack_error("Driver is not running"); | |||
return -1; | |||
return -1; | |||
} | |||
if (NotifyAddClient(client, name, refnum) < 0) { | |||
jack_error("Cannot notify add client"); | |||
return -1; | |||
return -1; | |||
} | |||
fClientTable[refnum] = client; | |||
fGraphManager->InitRefNum(refnum); | |||
fEngineControl->ResetRollingUsecs(); | |||
fGraphManager->InitRefNum(refnum); | |||
fEngineControl->ResetRollingUsecs(); | |||
*shared_engine = fEngineControl; | |||
*shared_manager = fGraphManager; | |||
*ref = refnum; | |||
@@ -554,28 +554,28 @@ int JackEngine::ClientInternalClose(int refnum, bool wait) | |||
int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wait) | |||
{ | |||
JackLog("JackEngine::ClientCloseAux ref = %ld name = %s\n", | |||
refnum, | |||
(client->GetClientControl()) ? client->GetClientControl()->fName : "No name"); | |||
JackLog("JackEngine::ClientCloseAux ref = %ld name = %s\n", | |||
refnum, | |||
(client->GetClientControl()) ? client->GetClientControl()->fName : "No name"); | |||
// Remove the client from the table | |||
ReleaseRefnum(refnum); | |||
// Notiy unregister | |||
jack_int_t ports[PORT_NUM_FOR_CLIENT]; | |||
int i; | |||
fGraphManager->GetInputPorts(refnum, ports); | |||
for (i = 0; (i < PORT_NUM_FOR_CLIENT) && (ports[i] != EMPTY) ; i++) { | |||
NotifyPortRegistation(ports[i], false); | |||
} | |||
fGraphManager->GetOutputPorts(refnum, ports); | |||
for (i = 0; (i < PORT_NUM_FOR_CLIENT) && (ports[i] != EMPTY) ; i++) { | |||
NotifyPortRegistation(ports[i], false); | |||
} | |||
// Remove all ports | |||
ReleaseRefnum(refnum); | |||
// Notiy unregister | |||
jack_int_t ports[PORT_NUM_FOR_CLIENT]; | |||
int i; | |||
fGraphManager->GetInputPorts(refnum, ports); | |||
for (i = 0; (i < PORT_NUM_FOR_CLIENT) && (ports[i] != EMPTY) ; i++) { | |||
NotifyPortRegistation(ports[i], false); | |||
} | |||
fGraphManager->GetOutputPorts(refnum, ports); | |||
for (i = 0; (i < PORT_NUM_FOR_CLIENT) && (ports[i] != EMPTY) ; i++) { | |||
NotifyPortRegistation(ports[i], false); | |||
} | |||
// Remove all ports | |||
fGraphManager->RemoveAllPorts(refnum); | |||
// Wait until next cycle to be sure client is not used anymore | |||
@@ -586,51 +586,51 @@ int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wai | |||
} | |||
// Notify running clients | |||
if (client->GetClientControl()) // When called in error cases, client may not be completely allocated | |||
NotifyRemoveClient(client->GetClientControl()->fName, client->GetClientControl()->fRefNum); | |||
if (client->GetClientControl()) // When called in error cases, client may not be completely allocated | |||
NotifyRemoveClient(client->GetClientControl()->fName, client->GetClientControl()->fRefNum); | |||
// Cleanup... | |||
fSynchroTable[refnum]->Destroy(); | |||
fEngineControl->ResetRollingUsecs(); | |||
fEngineControl->ResetRollingUsecs(); | |||
return 0; | |||
} | |||
int JackEngine::ClientActivate(int refnum) | |||
{ | |||
JackClientInterface* client = fClientTable[refnum]; | |||
assert(fClientTable[refnum]); | |||
JackLog("JackEngine::ClientActivate ref = %ld name = %s\n", refnum, client->GetClientControl()->fName); | |||
fGraphManager->Activate(refnum); | |||
// Wait for graph state change to be effective | |||
if (!fSignal->TimedWait(fEngineControl->fTimeOutUsecs * 10)) { | |||
jack_error("JackEngine::ClientActivate wait error ref = %ld name = %s", refnum, client->GetClientControl()->fName); | |||
return -1; | |||
} else { | |||
NotifyActivate(refnum); | |||
return 0; | |||
} | |||
assert(fClientTable[refnum]); | |||
JackLog("JackEngine::ClientActivate ref = %ld name = %s\n", refnum, client->GetClientControl()->fName); | |||
fGraphManager->Activate(refnum); | |||
// Wait for graph state change to be effective | |||
if (!fSignal->TimedWait(fEngineControl->fTimeOutUsecs * 10)) { | |||
jack_error("JackEngine::ClientActivate wait error ref = %ld name = %s", refnum, client->GetClientControl()->fName); | |||
return -1; | |||
} else { | |||
NotifyActivate(refnum); | |||
return 0; | |||
} | |||
} | |||
// May be called without client | |||
int JackEngine::ClientDeactivate(int refnum) | |||
{ | |||
JackClientInterface* client = fClientTable[refnum]; | |||
if (client == NULL) | |||
return -1; | |||
JackLog("JackEngine::ClientDeactivate ref = %ld name = %s\n", refnum, client->GetClientControl()->fName); | |||
fGraphManager->Deactivate(refnum); | |||
fLastSwitchUsecs = 0; // Force switch to occur next cycle, even when called with "dead" clients | |||
// Wait for graph state change to be effective | |||
if (!fSignal->TimedWait(fEngineControl->fTimeOutUsecs * 10)) { | |||
jack_error("JackEngine::ClientDeactivate wait error ref = %ld name = %s", refnum, client->GetClientControl()->fName); | |||
return -1; | |||
} else { | |||
return 0; | |||
} | |||
if (client == NULL) | |||
return -1; | |||
JackLog("JackEngine::ClientDeactivate ref = %ld name = %s\n", refnum, client->GetClientControl()->fName); | |||
fGraphManager->Deactivate(refnum); | |||
fLastSwitchUsecs = 0; // Force switch to occur next cycle, even when called with "dead" clients | |||
// Wait for graph state change to be effective | |||
if (!fSignal->TimedWait(fEngineControl->fTimeOutUsecs * 10)) { | |||
jack_error("JackEngine::ClientDeactivate wait error ref = %ld name = %s", refnum, client->GetClientControl()->fName); | |||
return -1; | |||
} else { | |||
return 0; | |||
} | |||
} | |||
//----------------- | |||
@@ -702,67 +702,67 @@ int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst) | |||
" \"%s\" is not active", client->GetClientControl()->fName); | |||
return -1; | |||
} | |||
int res = fGraphManager->Connect(src, dst); | |||
if (res == 0) { | |||
NotifyPortConnect(src, dst, true); | |||
NotifyPortConnect(dst, src, true); | |||
} | |||
return res; | |||
int res = fGraphManager->Connect(src, dst); | |||
if (res == 0) { | |||
NotifyPortConnect(src, dst, true); | |||
NotifyPortConnect(dst, src, true); | |||
} | |||
return res; | |||
} | |||
int JackEngine::PortDisconnect(int refnum, const char* src, const char* dst) | |||
{ | |||
JackLog("JackEngine::PortDisconnect src = %s dst = %s\n", src, dst); | |||
jack_port_id_t port_src, port_dst; | |||
if (fGraphManager->CheckPorts(src, dst, &port_src, &port_dst) < 0) { | |||
return -1; | |||
} else if (fGraphManager->Disconnect(port_src, port_dst) == 0){ | |||
NotifyPortConnect(port_src, port_dst, false); | |||
NotifyPortConnect(port_dst, port_src, false); | |||
return 0; | |||
} else { | |||
return -1; | |||
} | |||
if (fGraphManager->CheckPorts(src, dst, &port_src, &port_dst) < 0) { | |||
return -1; | |||
} else if (fGraphManager->Disconnect(port_src, port_dst) == 0) { | |||
NotifyPortConnect(port_src, port_dst, false); | |||
NotifyPortConnect(port_dst, port_src, false); | |||
return 0; | |||
} else { | |||
return -1; | |||
} | |||
} | |||
int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst) | |||
{ | |||
JackLog("JackEngine::PortDisconnect src = %d dst = %d\n", src, dst); | |||
if (dst == ALL_PORTS) { | |||
jack_int_t connections[CONNECTION_NUM]; | |||
fGraphManager->GetConnections(src, connections); | |||
// Notifications | |||
JackPort* port = fGraphManager->GetPort(src); | |||
if (port->GetFlags() & JackPortIsOutput) { | |||
for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
JackLog("NotifyPortConnect src = %ld dst = %ld false\n", src, connections[i]); | |||
NotifyPortConnect(src, connections[i], false); | |||
NotifyPortConnect(connections[i], src, false); | |||
} | |||
} else { | |||
for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
JackLog("NotifyPortConnect src = %ld dst = %ld false\n", connections[i], src); | |||
NotifyPortConnect(connections[i], src, false); | |||
NotifyPortConnect(connections[i], src, false); | |||
} | |||
} | |||
return fGraphManager->DisconnectAll(src); | |||
} else if (fGraphManager->CheckPorts(src, dst) < 0) { | |||
return -1; | |||
} else if (fGraphManager->Disconnect(src, dst) == 0) { | |||
// Notifications | |||
NotifyPortConnect(src, dst, false); | |||
NotifyPortConnect(dst, src, false); | |||
return 0; | |||
jack_int_t connections[CONNECTION_NUM]; | |||
fGraphManager->GetConnections(src, connections); | |||
// Notifications | |||
JackPort* port = fGraphManager->GetPort(src); | |||
if (port->GetFlags() & JackPortIsOutput) { | |||
for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
JackLog("NotifyPortConnect src = %ld dst = %ld false\n", src, connections[i]); | |||
NotifyPortConnect(src, connections[i], false); | |||
NotifyPortConnect(connections[i], src, false); | |||
} | |||
} else { | |||
for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
JackLog("NotifyPortConnect src = %ld dst = %ld false\n", connections[i], src); | |||
NotifyPortConnect(connections[i], src, false); | |||
NotifyPortConnect(connections[i], src, false); | |||
} | |||
} | |||
return fGraphManager->DisconnectAll(src); | |||
} else if (fGraphManager->CheckPorts(src, dst) < 0) { | |||
return -1; | |||
} else if (fGraphManager->Disconnect(src, dst) == 0) { | |||
// Notifications | |||
NotifyPortConnect(src, dst, false); | |||
NotifyPortConnect(dst, src, false); | |||
return 0; | |||
} else { | |||
return -1; | |||
} | |||
return -1; | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -52,22 +52,22 @@ class JackEngine | |||
int ClientCloseAux(int refnum, JackClientInterface* client, bool wait); | |||
void CheckXRun(jack_time_t callback_usecs); | |||
int NotifyAddClient(JackClientInterface* new_client, const char* name, int refnum); | |||
void NotifyRemoveClient(const char* name, int refnum); | |||
void ProcessNext(jack_time_t callback_usecs); | |||
void ProcessCurrent(jack_time_t callback_usecs); | |||
bool ClientCheckName(const char* name); | |||
bool GenerateUniqueName(char* name); | |||
int AllocateRefnum(); | |||
void ReleaseRefnum(int ref); | |||
void NotifyClient(int refnum, int event, int sync, int value1, int value2); | |||
void ProcessNext(jack_time_t callback_usecs); | |||
void ProcessCurrent(jack_time_t callback_usecs); | |||
bool ClientCheckName(const char* name); | |||
bool GenerateUniqueName(char* name); | |||
int AllocateRefnum(); | |||
void ReleaseRefnum(int ref); | |||
void NotifyClient(int refnum, int event, int sync, int value1, int value2); | |||
void NotifyClients(int event, int sync, int value1, int value2); | |||
public: | |||
JackEngine(JackGraphManager* manager, JackSynchro** table, JackEngineControl* controler); | |||
@@ -75,22 +75,22 @@ class JackEngine | |||
int Open(); | |||
int Close(); | |||
// Client management | |||
int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status); | |||
int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status); | |||
int ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager); | |||
int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait); | |||
int ClientExternalClose(int refnum); | |||
int ClientInternalClose(int refnum, bool wait); | |||
int ClientActivate(int refnum); | |||
int ClientDeactivate(int refnum); | |||
// Internal client management | |||
int GetInternalClientName(int int_ref, char* name_res); | |||
int InternalClientHandle(const char* client_name, int* status, int* int_ref); | |||
int InternalClientUnload(int refnum, int* status); | |||
// Internal client management | |||
int GetInternalClientName(int int_ref, char* name_res); | |||
int InternalClientHandle(const char* client_name, int* status, int* int_ref); | |||
int InternalClientUnload(int refnum, int* status); | |||
// Port management | |||
int PortRegister(int refnum, const char* name, const char *type, unsigned int flags, unsigned int buffer_size, unsigned int* port_index); | |||
@@ -104,16 +104,16 @@ class JackEngine | |||
// Graph | |||
bool Process(jack_time_t callback_usecs); | |||
// Notifications | |||
void NotifyXRun(jack_time_t callback_usecs); | |||
// Notifications | |||
void NotifyXRun(jack_time_t callback_usecs); | |||
void NotifyXRun(int refnum); | |||
void NotifyGraphReorder(); | |||
void NotifyBufferSize(jack_nframes_t nframes); | |||
void NotifyFreewheel(bool onoff); | |||
void NotifyPortRegistation(jack_port_id_t port_index, bool onoff); | |||
void NotifyPortConnect(jack_port_id_t src, jack_port_id_t dst, bool onoff); | |||
void NotifyActivate(int refnum); | |||
void NotifyPortConnect(jack_port_id_t src, jack_port_id_t dst, bool onoff); | |||
void NotifyActivate(int refnum); | |||
}; | |||
@@ -29,35 +29,35 @@ namespace Jack | |||
void JackEngineControl::CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs) | |||
{ | |||
// Transport | |||
fTransport.CycleBegin(fSampleRate, callback_usecs); | |||
// Timer | |||
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs); | |||
// Timing | |||
GetTimeMeasure(table, manager, callback_usecs); | |||
// Transport | |||
fTransport.CycleBegin(fSampleRate, callback_usecs); | |||
// Timer | |||
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs); | |||
// Timing | |||
GetTimeMeasure(table, manager, callback_usecs); | |||
CalcCPULoad(table, manager); | |||
} | |||
void JackEngineControl::CycleEnd(JackClientInterface** table) | |||
{ | |||
fTransport.CycleEnd(table, fSampleRate, fBufferSize); | |||
fTransport.CycleEnd(table, fSampleRate, fBufferSize); | |||
} | |||
void JackEngineControl::InitFrameTime() | |||
{ | |||
fFrameTimer.InitFrameTime(); | |||
fFrameTimer.InitFrameTime(); | |||
} | |||
void JackEngineControl::ResetFrameTime(jack_time_t callback_usecs) | |||
{ | |||
fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs); | |||
fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs); | |||
} | |||
void JackEngineControl::ReadFrameTime(JackTimer* timer) | |||
{ | |||
fFrameTimer.ReadFrameTime(timer); | |||
fFrameTimer.ReadFrameTime(timer); | |||
} | |||
// Private | |||
@@ -76,8 +76,8 @@ void JackEngineControl::CalcCPULoad(JackClientInterface** table, JackGraphManage | |||
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = table[i]; | |||
JackClientTiming* timing = manager->GetClientTiming(i); | |||
if (client && client->GetClientControl()->fActive && timing->fStatus == Finished) { | |||
JackClientTiming* timing = manager->GetClientTiming(i); | |||
if (client && client->GetClientControl()->fActive && timing->fStatus == Finished) { | |||
lastCycleEnd = MAX(lastCycleEnd, timing->fFinishedAt); | |||
} | |||
} | |||
@@ -131,9 +131,9 @@ void JackEngineControl::GetTimeMeasure(JackClientInterface** table, JackGraphMan | |||
for (int i = 0; i < CLIENT_NUM; i++) { | |||
JackClientInterface* client = table[i]; | |||
JackClientTiming* timing = manager->GetClientTiming(i); | |||
JackClientTiming* timing = manager->GetClientTiming(i); | |||
if (client && client->GetClientControl()->fActive) { | |||
fMeasure[pos].fClientTable[i].fRefNum = i; | |||
fMeasure[pos].fClientTable[i].fRefNum = i; | |||
fMeasure[pos].fClientTable[i].fSignaledAt = timing->fSignaledAt; | |||
fMeasure[pos].fClientTable[i].fAwakeAt = timing->fAwakeAt; | |||
fMeasure[pos].fClientTable[i].fFinishedAt = timing->fFinishedAt; | |||
@@ -42,7 +42,7 @@ class JackGraphManager; | |||
struct JackTimingMeasureClient | |||
{ | |||
int fRefNum; | |||
int fRefNum; | |||
jack_time_t fSignaledAt; | |||
jack_time_t fAwakeAt; | |||
jack_time_t fFinishedAt; | |||
@@ -55,7 +55,7 @@ struct JackTimingMeasureClient | |||
struct JackTimingMeasure | |||
{ | |||
unsigned int fAudioCycle; | |||
unsigned int fAudioCycle; | |||
jack_time_t fEngineTime; | |||
JackTimingMeasureClient fClientTable[CLIENT_NUM]; | |||
}; | |||
@@ -66,81 +66,81 @@ struct JackTimingMeasure | |||
struct JackEngineControl : public JackShmMem | |||
{ | |||
// Shared state | |||
// Shared state | |||
jack_nframes_t fBufferSize; | |||
jack_nframes_t fSampleRate; | |||
bool fSyncMode; | |||
bool fTemporary; | |||
bool fSyncMode; | |||
bool fTemporary; | |||
jack_time_t fPeriodUsecs; | |||
jack_time_t fTimeOutUsecs; | |||
bool fTimeOut; | |||
bool fRealTime; | |||
int fPriority; | |||
char fServerName[64]; | |||
bool fTimeOut; | |||
bool fRealTime; | |||
int fPriority; | |||
char fServerName[64]; | |||
JackTransportEngine fTransport; | |||
bool fVerbose; | |||
// Timing | |||
JackTimingMeasure fMeasure[TIME_POINTS]; | |||
jack_time_t fLastTime; | |||
jack_time_t fCurTime; | |||
jack_time_t fProcessTime; | |||
jack_time_t fLastProcessTime; | |||
jack_time_t fSpareUsecs; | |||
jack_time_t fMaxUsecs; | |||
unsigned int fAudioCycle; | |||
jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT]; | |||
int fRollingClientUsecsCnt; | |||
int fRollingClientUsecsIndex; | |||
int fRollingInterval; | |||
float fCPULoad; | |||
// Fos OSX thread | |||
// Timing | |||
JackTimingMeasure fMeasure[TIME_POINTS]; | |||
jack_time_t fLastTime; | |||
jack_time_t fCurTime; | |||
jack_time_t fProcessTime; | |||
jack_time_t fLastProcessTime; | |||
jack_time_t fSpareUsecs; | |||
jack_time_t fMaxUsecs; | |||
unsigned int fAudioCycle; | |||
jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT]; | |||
int fRollingClientUsecsCnt; | |||
int fRollingClientUsecsIndex; | |||
int fRollingInterval; | |||
float fCPULoad; | |||
// Fos OSX thread | |||
UInt64 fPeriod; | |||
UInt64 fComputation; | |||
UInt64 fConstraint; | |||
// Timer | |||
JackFrameTimer fFrameTimer; | |||
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name) | |||
{ | |||
fSyncMode = sync; | |||
fTemporary = temporary; | |||
fTimeOut = (timeout > 0); | |||
fTimeOutUsecs = timeout * 1000; | |||
fRealTime = rt; | |||
fPriority = priority; | |||
fVerbose = verbose; | |||
fLastTime = 0; | |||
fCurTime = 0; | |||
fProcessTime = 0; | |||
fLastProcessTime = 0; | |||
fSpareUsecs = 0; | |||
fMaxUsecs = 0; | |||
fAudioCycle = 0; | |||
ClearTimeMeasures(); | |||
ResetRollingUsecs(); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
} | |||
~JackEngineControl() | |||
{} | |||
// Cycle | |||
void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs); | |||
void CycleEnd(JackClientInterface** table); | |||
// Timer | |||
void InitFrameTime(); | |||
void ResetFrameTime(jack_time_t callback_usecs); | |||
void ReadFrameTime(JackTimer* timer); | |||
// Private | |||
void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager); | |||
void GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs); | |||
void ClearTimeMeasures(); | |||
void ResetRollingUsecs(); | |||
// Timer | |||
JackFrameTimer fFrameTimer; | |||
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name) | |||
{ | |||
fSyncMode = sync; | |||
fTemporary = temporary; | |||
fTimeOut = (timeout > 0); | |||
fTimeOutUsecs = timeout * 1000; | |||
fRealTime = rt; | |||
fPriority = priority; | |||
fVerbose = verbose; | |||
fLastTime = 0; | |||
fCurTime = 0; | |||
fProcessTime = 0; | |||
fLastProcessTime = 0; | |||
fSpareUsecs = 0; | |||
fMaxUsecs = 0; | |||
fAudioCycle = 0; | |||
ClearTimeMeasures(); | |||
ResetRollingUsecs(); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
} | |||
~JackEngineControl() | |||
{} | |||
// Cycle | |||
void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs); | |||
void CycleEnd(JackClientInterface** table); | |||
// Timer | |||
void InitFrameTime(); | |||
void ResetFrameTime(jack_time_t callback_usecs); | |||
void ReadFrameTime(JackTimer* timer); | |||
// Private | |||
void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager); | |||
void GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs); | |||
void ClearTimeMeasures(); | |||
void ResetRollingUsecs(); | |||
}; | |||
} // end of namespace | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -30,8 +30,8 @@ extern "C" | |||
#endif | |||
#ifdef WIN32 | |||
#define vsnprintf _vsnprintf | |||
#define snprintf _snprintf | |||
#define vsnprintf _vsnprintf | |||
#define snprintf _snprintf | |||
#endif | |||
EXPORT void jack_error(const char *fmt, ...); | |||
@@ -39,8 +39,8 @@ extern "C" | |||
EXPORT void JackLog(const char *fmt, ...); | |||
extern int jack_verbose; | |||
extern void (*jack_error_callback)(const char *desc); | |||
extern void (*jack_error_callback)(const char *desc); | |||
#ifdef __cplusplus | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2005 Grame | |||
Copyright (C) 2004-2005 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -21,9 +21,9 @@ This program is free software; you can redistribute it and/or modify | |||
#define __JackExports__ | |||
#ifdef WIN32 | |||
#define EXPORT __declspec(dllexport) | |||
#define EXPORT __declspec(dllexport) | |||
#else | |||
#define EXPORT | |||
#define EXPORT | |||
#endif | |||
#endif | |||
@@ -1,7 +1,7 @@ | |||
/* | |||
Copyright (C) 2001-2003 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -37,12 +37,12 @@ bool JackFifo::Signal() | |||
{ | |||
bool res; | |||
char c = 0; | |||
if (fFifo < 0) { | |||
jack_error("JackFifo::Signal name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFifo < 0) { | |||
jack_error("JackFifo::Signal name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFlush) | |||
return true; | |||
@@ -56,11 +56,11 @@ bool JackFifo::SignalAll() | |||
{ | |||
bool res; | |||
char c = 0; | |||
if (fFifo < 0) { | |||
jack_error("JackFifo::SignalAll name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFifo < 0) { | |||
jack_error("JackFifo::SignalAll name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFlush) | |||
return true; | |||
@@ -75,11 +75,11 @@ bool JackFifo::Wait() | |||
{ | |||
bool res; | |||
char c; | |||
if (fFifo < 0) { | |||
jack_error("JackFifo::Wait name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
jack_error("JackFifo::Wait name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if ((res = (read(fFifo, &c, sizeof(c)) != sizeof(c)))) { | |||
jack_error("JackFifo::Wait name = %s err = %s", fName, strerror(errno)); | |||
@@ -93,7 +93,7 @@ bool JackFifo::TimedWait(long usec) | |||
{ | |||
return Wait(); | |||
} | |||
#else | |||
#else | |||
// Does not work on OSX ?? | |||
bool JackFifo::TimedWait(long usec) | |||
{ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -47,11 +47,11 @@ struct JackTimer | |||
JackTimer(); | |||
~JackTimer() | |||
{} | |||
}; | |||
/*! | |||
\brief A class using the JackAtomicState to manage jack time. | |||
\brief A class using the JackAtomicState to manage jack time. | |||
*/ | |||
class JackFrameTimer : public JackAtomicState<JackTimer> | |||
@@ -60,7 +60,7 @@ class JackFrameTimer : public JackAtomicState<JackTimer> | |||
bool fFirstWakeUp; | |||
void IncFrameTimeAux(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs); | |||
void InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs); | |||
void InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs); | |||
public: | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -19,7 +19,7 @@ JackEngine.cpp | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -34,7 +34,7 @@ int JackFreewheelDriver::Process() | |||
{ | |||
if (fIsMaster) { | |||
JackLog("JackFreewheelDriver::Process master %lld\n", fEngineControl->fTimeOutUsecs); | |||
fLastWaitUst = GetMicroSeconds(); | |||
fLastWaitUst = GetMicroSeconds(); | |||
fEngine->Process(fLastWaitUst); | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); // Signal all clients | |||
if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, 10 * 1000000) < 0) // Wait for all clients to finish for 10 sec | |||
@@ -44,8 +44,8 @@ int JackFreewheelDriver::Process() | |||
if (fEngineControl->fSyncMode) { | |||
if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0) { | |||
jack_error("JackFreewheelDriver::ProcessSync SuspendRefNum error"); | |||
return -1; | |||
} | |||
return -1; | |||
} | |||
} | |||
} | |||
return 0; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -44,8 +44,8 @@ class JackFreewheelDriver : public JackDriver | |||
{ | |||
return false; | |||
} | |||
int Process(); | |||
int Process(); | |||
}; | |||
} // end of namespace | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -38,7 +38,7 @@ class JackEngine; | |||
/*! | |||
\brief Factory description | |||
\todo possibly use in a dynamic way to test different communication/synchro implementations. | |||
*/ | |||
@@ -230,18 +230,18 @@ class JackGlobals | |||
{ | |||
JackLog("JackGlobals InitServer\n"); | |||
if (!fInstance) { | |||
#ifdef __APPLE__ | |||
#ifdef __APPLE__ | |||
fInstance = new JackFactoryOSXServer(); | |||
#endif | |||
#endif | |||
#ifdef WIN32 | |||
fInstance = new JackFactoryWindowsServer(); | |||
#endif | |||
#ifdef WIN32 | |||
fInstance = new JackFactoryWindowsServer(); | |||
#endif | |||
#ifdef __linux__ | |||
fInstance = new JackFactoryLinuxServer(); | |||
#endif | |||
#ifdef __linux__ | |||
fInstance = new JackFactoryLinuxServer(); | |||
#endif | |||
} | |||
} | |||
@@ -250,18 +250,18 @@ class JackGlobals | |||
{ | |||
JackLog("JackGlobals InitClient\n"); | |||
if (!fInstance) { | |||
#ifdef __APPLE__ | |||
#ifdef __APPLE__ | |||
fInstance = new JackFactoryOSXClient(); | |||
#endif | |||
#endif | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
fInstance = new JackFactoryWindowsClient(); | |||
#endif | |||
#endif | |||
#ifdef __linux__ | |||
#ifdef __linux__ | |||
fInstance = new JackFactoryLinuxClient(); | |||
#endif | |||
#endif | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -70,7 +70,7 @@ namespace Jack | |||
JackSynchro* JackFactoryWindowsClient::MakeSynchro() | |||
{ | |||
return new JackWinSemaphore(); | |||
return new JackWinSemaphore(); | |||
} | |||
JackServerNotifyChannelInterface* JackFactoryWindowsClient::MakeServerNotifyChannel() | |||
@@ -221,7 +221,7 @@ JackThread* JackFactoryLinuxClient::MakeThread(JackRunnableInterface* runnable) | |||
#if defined(__APPLE__) | |||
#if defined(MACH_RPC_MACH_SEMA) | |||
#if defined(MACH_RPC_MACH_SEMA) | |||
// Mach RPC + Mach Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -259,7 +259,7 @@ JackThread* JackFactoryOSXClient::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(SOCKET_RPC_POSIX_SEMA) | |||
#if defined(SOCKET_RPC_POSIX_SEMA) | |||
// Socket RPC + Posix Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -297,7 +297,7 @@ JackThread* JackFactoryOSXClient::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(SOCKET_RPC_FIFO_SEMA) | |||
#if defined(SOCKET_RPC_FIFO_SEMA) | |||
// Socket RPC + Fifo Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -336,7 +336,7 @@ JackThread* JackFactoryOSXClient::MakeThread(JackRunnableInterface* runnable) | |||
#endif | |||
#if defined(MACH_RPC_FIFO_SEMA) | |||
#if defined(MACH_RPC_FIFO_SEMA) | |||
// Mach RPC + Fifo Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -374,7 +374,7 @@ JackThread* JackFactoryOSXClient::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(MACH_RPC_POSIX_SEMA) | |||
#if defined(MACH_RPC_POSIX_SEMA) | |||
// Mach RPC + Posix Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -412,7 +412,7 @@ JackThread* JackFactoryOSXClient::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined SOCKET_RPC_MACH_SEMA | |||
#if defined SOCKET_RPC_MACH_SEMA | |||
// Socket RPC + Mach Semaphore | |||
JackSynchro* JackFactoryOSXClient::MakeSynchro() | |||
{ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -17,7 +17,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -80,7 +80,7 @@ namespace Jack | |||
#ifdef WIN32 | |||
JackSynchro* JackFactoryWindowsServer::MakeSynchro() | |||
{ | |||
return new JackWinSemaphore(); | |||
return new JackWinSemaphore(); | |||
} | |||
JackServerNotifyChannelInterface* JackFactoryWindowsServer::MakeServerNotifyChannel() | |||
@@ -231,7 +231,7 @@ JackThread* JackFactoryLinuxServer::MakeThread(JackRunnableInterface* runnable) | |||
#if defined(__APPLE__) | |||
#if defined(MACH_RPC_MACH_SEMA) | |||
#if defined(MACH_RPC_MACH_SEMA) | |||
// Mach RPC + Mach Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -269,7 +269,7 @@ JackThread* JackFactoryOSXServer::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(SOCKET_RPC_POSIX_SEMA) | |||
#if defined(SOCKET_RPC_POSIX_SEMA) | |||
// Socket RPC + Posix Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -307,7 +307,7 @@ JackThread* JackFactoryOSXServer::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(SOCKET_RPC_FIFO_SEMA) | |||
#if defined(SOCKET_RPC_FIFO_SEMA) | |||
// Socket RPC + Fifo Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -345,7 +345,7 @@ JackThread* JackFactoryOSXServer::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(MACH_RPC_FIFO_SEMA) | |||
#if defined(MACH_RPC_FIFO_SEMA) | |||
// Mach RPC + Fifo Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -383,7 +383,7 @@ JackThread* JackFactoryOSXServer::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(MACH_RPC_POSIX_SEMA) | |||
#if defined(MACH_RPC_POSIX_SEMA) | |||
// Mach RPC + Posix Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -421,7 +421,7 @@ JackThread* JackFactoryOSXServer::MakeThread(JackRunnableInterface* runnable) | |||
} | |||
#endif | |||
#if defined(SOCKET_RPC_MACH_SEMA) | |||
#if defined(SOCKET_RPC_MACH_SEMA) | |||
// Socket RPC + Mac Semaphore | |||
JackSynchro* JackFactoryOSXServer::MakeSynchro() | |||
{ | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -113,7 +113,7 @@ int JackGraphManager::SuspendRefNum(JackClientControl* control, JackSynchro** ta | |||
JackClientTiming* JackGraphManager::GetClientTiming(int ref) | |||
{ | |||
return &fClientTiming[ref]; | |||
return &fClientTiming[ref]; | |||
} | |||
// Server | |||
@@ -171,19 +171,19 @@ void* JackGraphManager::GetBuffer(jack_port_id_t port_index, jack_nframes_t buff | |||
assert(manager->GetPort(port_index, 0) != port_index); // Check recursion | |||
return GetBuffer(manager->GetPort(port_index, 0), buffer_size); | |||
} else { // Multiple connections | |||
const jack_int_t* connections = manager->GetConnections(port_index); | |||
void* buffers[CONNECTION_NUM]; | |||
jack_port_id_t src_index; | |||
int i; | |||
for (i = 0; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||
void* buffers[CONNECTION_NUM]; | |||
jack_port_id_t src_index; | |||
int i; | |||
for (i = 0; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||
AssertPort(src_index); | |||
buffers[i] = GetBuffer(src_index, buffer_size); | |||
buffers[i] = GetBuffer(src_index, buffer_size); | |||
} | |||
JackPort* port = GetPort(port_index); | |||
port->MixBuffers(buffers, i, buffer_size); | |||
JackPort* port = GetPort(port_index); | |||
port->MixBuffers(buffers, i, buffer_size); | |||
return port->GetBuffer(); | |||
} | |||
} | |||
@@ -226,10 +226,10 @@ jack_nframes_t JackGraphManager::ComputeTotalLatencyAux(jack_port_id_t port_inde | |||
if (hop_count > 8) | |||
return GetPort(port_index)->GetLatency(); | |||
for (int i = 0; (i < CONNECTION_NUM) && ((dst_index = connections[i]) != EMPTY); i++) { | |||
if (src_port_index != dst_index) { | |||
AssertPort(dst_index); | |||
AssertPort(dst_index); | |||
JackPort* dst_port = GetPort(dst_index); | |||
jack_nframes_t this_latency = (dst_port->fFlags & JackPortIsTerminal) | |||
? dst_port->GetLatency() | |||
@@ -237,7 +237,7 @@ jack_nframes_t JackGraphManager::ComputeTotalLatencyAux(jack_port_id_t port_inde | |||
max_latency = MAX(max_latency, this_latency); | |||
} | |||
} | |||
return max_latency + GetPort(port_index)->GetLatency(); | |||
} | |||
@@ -246,38 +246,38 @@ int JackGraphManager::ComputeTotalLatency(jack_port_id_t port_index) | |||
{ | |||
UInt16 cur_index; | |||
UInt16 next_index; | |||
JackPort* port = GetPort(port_index); | |||
JackPort* port = GetPort(port_index); | |||
AssertPort(port_index); | |||
do { | |||
cur_index = GetCurrentIndex(); | |||
port->fTotalLatency = ComputeTotalLatencyAux(port_index, port_index, ReadCurrentState(), 0); | |||
next_index = GetCurrentIndex(); | |||
} while (cur_index != next_index); // Until a coherent state has been read | |||
JackLog("JackGraphManager::GetTotalLatency port_index = %ld total latency = %ld\n", port_index, port->fTotalLatency); | |||
return 0; | |||
JackLog("JackGraphManager::GetTotalLatency port_index = %ld total latency = %ld\n", port_index, port->fTotalLatency); | |||
return 0; | |||
} | |||
// Client | |||
int JackGraphManager::ComputeTotalLatencies() | |||
{ | |||
jack_port_id_t port_index; | |||
for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | |||
jack_port_id_t port_index; | |||
for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | |||
JackPort* port = GetPort(port_index); | |||
if (port->IsUsed()) | |||
ComputeTotalLatency(port_index); | |||
} | |||
return 0; | |||
if (port->IsUsed()) | |||
ComputeTotalLatency(port_index); | |||
} | |||
return 0; | |||
} | |||
// Server | |||
void JackGraphManager::SetBufferSize(jack_nframes_t buffer_size) | |||
{ | |||
JackLock lock(this); | |||
JackLock lock (this); | |||
JackLog("JackGraphManager::SetBufferSize size = %ld\n", (long int)buffer_size); | |||
jack_port_id_t port_index; | |||
jack_port_id_t port_index; | |||
for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | |||
JackPort* port = GetPort(port_index); | |||
if (port->IsUsed()) | |||
@@ -296,7 +296,7 @@ jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_na | |||
if (!port->IsUsed()) { | |||
JackLog("JackGraphManager::AllocatePortAux port_index = %ld name = %s type = %s\n", port_index, port_name, port_type); | |||
if (!port->Allocate(refnum, port_name, port_type, flags)) | |||
return NO_PORT; | |||
return NO_PORT; | |||
break; | |||
} | |||
} | |||
@@ -307,7 +307,7 @@ jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_na | |||
// Server | |||
jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, const char* port_type, JackPortFlags flags, jack_nframes_t buffer_size) | |||
{ | |||
JackLock lock(this); | |||
JackLock lock (this); | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
jack_port_id_t port_index = AllocatePortAux(refnum, port_name, port_type, flags); | |||
@@ -322,7 +322,7 @@ jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, | |||
} else { | |||
res = manager->AddInputPort(refnum, port_index); | |||
} | |||
// Insertion failure | |||
// Insertion failure | |||
if (res < 0) { | |||
port->Release(); | |||
port_index = NO_PORT; | |||
@@ -336,7 +336,7 @@ jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, | |||
// Server | |||
int JackGraphManager::ReleasePort(int refnum, jack_port_id_t port_index) | |||
{ | |||
JackLock lock(this); | |||
JackLock lock (this); | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
JackPort* port = GetPort(port_index); | |||
int res; | |||
@@ -349,25 +349,25 @@ int JackGraphManager::ReleasePort(int refnum, jack_port_id_t port_index) | |||
res = manager->RemoveInputPort(refnum, port_index); | |||
} | |||
port->Release(); | |||
port->Release(); | |||
WriteNextStateStop(); | |||
return res; | |||
} | |||
void JackGraphManager::GetInputPorts(int refnum, jack_int_t* res) | |||
{ | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* input = manager->GetInputPorts(refnum); | |||
memcpy(res, input, sizeof(jack_int_t) * PORT_NUM_FOR_CLIENT); | |||
WriteNextStateStop(); | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* input = manager->GetInputPorts(refnum); | |||
memcpy(res, input, sizeof(jack_int_t) * PORT_NUM_FOR_CLIENT); | |||
WriteNextStateStop(); | |||
} | |||
void JackGraphManager::GetOutputPorts(int refnum, jack_int_t* res) | |||
{ | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* output = manager->GetOutputPorts(refnum); | |||
memcpy(res, output, sizeof(jack_int_t) * PORT_NUM_FOR_CLIENT); | |||
WriteNextStateStop(); | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* output = manager->GetOutputPorts(refnum); | |||
memcpy(res, output, sizeof(jack_int_t) * PORT_NUM_FOR_CLIENT); | |||
WriteNextStateStop(); | |||
} | |||
// Server | |||
@@ -420,7 +420,7 @@ void JackGraphManager::DisconnectAllInput(jack_port_id_t port_index) | |||
for (int i = 0; i < PORT_NUM; i++) { | |||
if (manager->IsConnected(i, port_index)) { | |||
JackLog("JackGraphManager::Disconnect i = %ld port_index = %ld\n", i, port_index); | |||
JackLog("JackGraphManager::Disconnect i = %ld port_index = %ld\n", i, port_index); | |||
Disconnect(i, port_index); | |||
} | |||
} | |||
@@ -434,8 +434,8 @@ void JackGraphManager::DisconnectAllOutput(jack_port_id_t port_index) | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* connections = manager->GetConnections(port_index); | |||
while (connections[0] != EMPTY) { | |||
Disconnect(port_index, connections[0]); // Warning : Disconnect shift port to left | |||
while (connections[0] != EMPTY) { | |||
Disconnect(port_index, connections[0]); // Warning : Disconnect shift port to left | |||
} | |||
WriteNextStateStop(); | |||
} | |||
@@ -447,9 +447,9 @@ int JackGraphManager::DisconnectAll(jack_port_id_t port_index) | |||
JackPort* port = GetPort(port_index); | |||
if (port->fFlags & JackPortIsOutput) { | |||
DisconnectAllOutput(port_index); | |||
DisconnectAllOutput(port_index); | |||
} else { | |||
DisconnectAllInput(port_index); | |||
DisconnectAllInput(port_index); | |||
} | |||
return 0; | |||
} | |||
@@ -457,16 +457,16 @@ int JackGraphManager::DisconnectAll(jack_port_id_t port_index) | |||
// Server | |||
void JackGraphManager::GetConnections(jack_port_id_t port_index, jack_int_t* res) | |||
{ | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* connections = manager->GetConnections(port_index); | |||
memcpy(res, connections, sizeof(jack_int_t) * CONNECTION_NUM); | |||
WriteNextStateStop(); | |||
JackConnectionManager* manager = WriteNextStateStart(); | |||
const jack_int_t* connections = manager->GetConnections(port_index); | |||
memcpy(res, connections, sizeof(jack_int_t) * CONNECTION_NUM); | |||
WriteNextStateStop(); | |||
} | |||
// Server | |||
void JackGraphManager::Activate(int refnum) | |||
{ | |||
DirectConnect(FREEWHEEL_DRIVER_REFNUM, refnum); | |||
DirectConnect(FREEWHEEL_DRIVER_REFNUM, refnum); | |||
DirectConnect(refnum, FREEWHEEL_DRIVER_REFNUM); | |||
} | |||
@@ -478,16 +478,16 @@ void JackGraphManager::Activate(int refnum) | |||
// Server | |||
void JackGraphManager::Deactivate(int refnum) | |||
{ | |||
DisconnectAllPorts(refnum); | |||
// Disconnect only when needed | |||
DisconnectAllPorts(refnum); | |||
// Disconnect only when needed | |||
if (IsDirectConnection(refnum, FREEWHEEL_DRIVER_REFNUM)) { | |||
DirectDisconnect(refnum, FREEWHEEL_DRIVER_REFNUM); | |||
} else { | |||
JackLog("JackServer::Deactivate: client = %ld was not activated \n", refnum); | |||
} | |||
// Disconnect only when needed | |||
// Disconnect only when needed | |||
if (IsDirectConnection(FREEWHEEL_DRIVER_REFNUM, refnum)) { | |||
DirectDisconnect(FREEWHEEL_DRIVER_REFNUM, refnum); | |||
} else { | |||
@@ -532,9 +532,9 @@ int JackGraphManager::Connect(jack_port_id_t port_src, jack_port_id_t port_dst) | |||
goto end; | |||
} | |||
if (src->fTypeId != dst->fTypeId) { | |||
jack_error("JackGraphManager::Connect: different port types: port_src = %ld port_dst = %ld", port_src, port_dst); | |||
res = -1; | |||
goto end; | |||
jack_error("JackGraphManager::Connect: different port types: port_src = %ld port_dst = %ld", port_src, port_dst); | |||
res = -1; | |||
goto end; | |||
} | |||
if (manager->IsConnected(port_src, port_dst)) { | |||
jack_error("JackGraphManager::Connect already connected port_src = %ld port_dst = %ld", port_src, port_dst); | |||
@@ -615,7 +615,7 @@ end: | |||
int JackGraphManager::IsConnected(jack_port_id_t port_src, jack_port_id_t port_dst) | |||
{ | |||
JackConnectionManager* manager = ReadCurrentState(); | |||
return manager->IsConnected(port_src, port_dst); | |||
return manager->IsConnected(port_src, port_dst); | |||
} | |||
// Server | |||
@@ -722,11 +722,11 @@ const char** JackGraphManager::GetPortsAux(const char* port_name_pattern, const | |||
regcomp(&type_regex, type_name_pattern, REG_EXTENDED | REG_NOSUB); | |||
} | |||
const char** matching_ports = (const char**)malloc(sizeof(char*) * PORT_NUM); | |||
const char** matching_ports = (const char**)malloc(sizeof(char*) * PORT_NUM); | |||
for (int i = 0; i < PORT_NUM; i++) { | |||
matching = true; | |||
JackPort* port = GetPort(i); | |||
JackPort* port = GetPort(i); | |||
if (port->IsUsed()) { | |||
@@ -741,7 +741,7 @@ const char** JackGraphManager::GetPortsAux(const char* port_name_pattern, const | |||
matching = false; | |||
} | |||
} | |||
if (matching && type_name_pattern && type_name_pattern[0]) { | |||
if (matching && type_name_pattern && type_name_pattern[0]) { | |||
if (regexec(&type_regex, port->GetType(), 0, NULL, 0)) { | |||
matching = false; | |||
} | |||
@@ -786,8 +786,8 @@ const char** JackGraphManager::GetPorts(const char* port_name_pattern, const cha | |||
cur_index = GetCurrentIndex(); | |||
if (matching_ports) { | |||
free(matching_ports); | |||
JackLog("JackGraphManager::GetPorts retry... \n"); | |||
} | |||
JackLog("JackGraphManager::GetPorts retry... \n"); | |||
} | |||
matching_ports = GetPortsAux(port_name_pattern, type_name_pattern, flags); | |||
next_index = GetCurrentIndex(); | |||
} while (cur_index != next_index); // Until a coherent state has been read | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -40,9 +40,9 @@ class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectio | |||
private: | |||
JackPort fPortArray[PORT_NUM]; | |||
JackClientTiming fClientTiming[CLIENT_NUM]; | |||
JackPort fPortArray[PORT_NUM]; | |||
JackClientTiming fClientTiming[CLIENT_NUM]; | |||
jack_port_id_t AllocatePortAux(int refnum, const char* port_name, const char* port_type, JackPortFlags flags); | |||
void GetConnectionsAux(JackConnectionManager* manager, const char** res, jack_port_id_t port_index); | |||
const char** GetPortsAux(const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | |||
@@ -60,60 +60,60 @@ class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectio | |||
void SetBufferSize(jack_nframes_t buffer_size); | |||
// Ports management | |||
jack_port_id_t AllocatePort(int refnum, const char* port_name, const char* port_type, JackPortFlags flags, jack_nframes_t buffer_size); | |||
int ReleasePort(int refnum, jack_port_id_t port_index); | |||
void GetInputPorts(int refnum, jack_int_t* res); | |||
void GetOutputPorts(int refnum, jack_int_t* res); | |||
void RemoveAllPorts(int refnum); | |||
void DisconnectAllPorts(int refnum); | |||
JackPort* GetPort(jack_port_id_t index); | |||
jack_port_id_t GetPort(const char* name); | |||
int ComputeTotalLatency(jack_port_id_t port_index); | |||
int ComputeTotalLatencies(); | |||
int RequestMonitor(jack_port_id_t port_index, bool onoff); | |||
jack_port_id_t AllocatePort(int refnum, const char* port_name, const char* port_type, JackPortFlags flags, jack_nframes_t buffer_size); | |||
int ReleasePort(int refnum, jack_port_id_t port_index); | |||
void GetInputPorts(int refnum, jack_int_t* res); | |||
void GetOutputPorts(int refnum, jack_int_t* res); | |||
void RemoveAllPorts(int refnum); | |||
void DisconnectAllPorts(int refnum); | |||
JackPort* GetPort(jack_port_id_t index); | |||
jack_port_id_t GetPort(const char* name); | |||
int ComputeTotalLatency(jack_port_id_t port_index); | |||
int ComputeTotalLatencies(); | |||
int RequestMonitor(jack_port_id_t port_index, bool onoff); | |||
// Connections management | |||
int Connect(jack_port_id_t src_index, jack_port_id_t dst_index); | |||
int Disconnect(jack_port_id_t src_index, jack_port_id_t dst_index); | |||
int IsConnected(jack_port_id_t port_src, jack_port_id_t port_dst); | |||
int GetConnectionsNum(jack_port_id_t port_index); | |||
const char** GetConnections(jack_port_id_t port_index); | |||
void GetConnections(jack_port_id_t port_index, jack_int_t* connections); // TODO | |||
const char** GetPorts(const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | |||
int CheckPorts(const char* src, const char* dst, jack_port_id_t* src_index, jack_port_id_t* dst_index); | |||
int CheckPorts(jack_port_id_t port_src, jack_port_id_t port_dst); | |||
void DisconnectAllInput(jack_port_id_t port_index); | |||
void DisconnectAllOutput(jack_port_id_t port_index); | |||
int DisconnectAll(jack_port_id_t port_index); | |||
bool IsDirectConnection(int ref1, int ref2); | |||
void DirectConnect(int ref1, int ref2); | |||
void DirectDisconnect(int ref1, int ref2); | |||
void Activate(int refnum); | |||
void Deactivate(int refnum); | |||
int GetInputRefNum(jack_port_id_t port_index); | |||
int GetOutputRefNum(jack_port_id_t port_index); | |||
int Connect(jack_port_id_t src_index, jack_port_id_t dst_index); | |||
int Disconnect(jack_port_id_t src_index, jack_port_id_t dst_index); | |||
int IsConnected(jack_port_id_t port_src, jack_port_id_t port_dst); | |||
int GetConnectionsNum(jack_port_id_t port_index); | |||
const char** GetConnections(jack_port_id_t port_index); | |||
void GetConnections(jack_port_id_t port_index, jack_int_t* connections); // TODO | |||
const char** GetPorts(const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | |||
int CheckPorts(const char* src, const char* dst, jack_port_id_t* src_index, jack_port_id_t* dst_index); | |||
int CheckPorts(jack_port_id_t port_src, jack_port_id_t port_dst); | |||
void DisconnectAllInput(jack_port_id_t port_index); | |||
void DisconnectAllOutput(jack_port_id_t port_index); | |||
int DisconnectAll(jack_port_id_t port_index); | |||
bool IsDirectConnection(int ref1, int ref2); | |||
void DirectConnect(int ref1, int ref2); | |||
void DirectDisconnect(int ref1, int ref2); | |||
void Activate(int refnum); | |||
void Deactivate(int refnum); | |||
int GetInputRefNum(jack_port_id_t port_index); | |||
int GetOutputRefNum(jack_port_id_t port_index); | |||
// Buffer management | |||
void* GetBuffer(jack_port_id_t port_index, jack_nframes_t frames); | |||
void* GetBuffer(jack_port_id_t port_index, jack_nframes_t frames); | |||
// Activation management | |||
void RunCurrentGraph(); | |||
bool RunNextGraph(); | |||
bool IsFinishedGraph(); | |||
void InitRefNum(int refnum); | |||
int ResumeRefNum(JackClientControl* control, JackSynchro** table); | |||
int SuspendRefNum(JackClientControl* control, JackSynchro** table, long usecs); | |||
JackClientTiming* GetClientTiming(int refnum); | |||
void RunCurrentGraph(); | |||
bool RunNextGraph(); | |||
bool IsFinishedGraph(); | |||
void InitRefNum(int refnum); | |||
int ResumeRefNum(JackClientControl* control, JackSynchro** table); | |||
int SuspendRefNum(JackClientControl* control, JackSynchro** table, long usecs); | |||
JackClientTiming* GetClientTiming(int refnum); | |||
void Save(JackConnectionManager* dst); | |||
void Restore(JackConnectionManager* src); | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -68,22 +68,22 @@ JackInternalClient::~JackInternalClient() | |||
int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
{ | |||
int result; | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
JackLog("JackInternalClient::Open name = %s\n", name); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); | |||
if (result < 0) { | |||
int status1 = *status; | |||
int status1 = *status; | |||
if (status1 & JackVersionError) | |||
jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION); | |||
jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION); | |||
else | |||
jack_error("Client name = %s conflits with another running client", name); | |||
jack_error("Client name = %s conflits with another running client", name); | |||
goto error; | |||
} | |||
strcpy(fClientControl->fName, name_res); | |||
strcpy(fClientControl->fName, name_res); | |||
// Require new client | |||
fChannel->ClientOpen(name_res, &fClientControl->fRefNum, &fEngineControl, &fGraphManager, this, &result); | |||
@@ -119,49 +119,49 @@ JackClientControl* JackInternalClient::GetClientControl() const | |||
} | |||
JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackSynchro** table, const char* so_name, const char* object_data) | |||
:JackInternalClient(server, table) | |||
: JackInternalClient(server, table) | |||
{ | |||
char path_to_so[PATH_MAX + 1]; | |||
//snprintf(path_to_so, sizeof(path_to_so), ADDON_DIR "/%s.so", so_name); | |||
snprintf(path_to_so, sizeof(path_to_so), so_name); | |||
snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data); | |||
fHandle = LoadJackModule(path_to_so); | |||
JackLog("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s\n", path_to_so); | |||
if (fHandle == 0) { | |||
jack_error("error loading %s", so_name); | |||
throw -1; | |||
} | |||
fInitialize = (InitializeCallback)GetJackProc(fHandle, "jack_initialize"); | |||
if (!fInitialize) { | |||
UnloadJackModule(fHandle); | |||
jack_error("symbol jack_initialize cannot be found in %s", so_name); | |||
throw -1; | |||
} | |||
fFinish = (FinishCallback)GetJackProc(fHandle, "jack_finish"); | |||
if (!fFinish) { | |||
UnloadJackModule(fHandle); | |||
jack_error("symbol jack_finish cannot be found in %s", so_name); | |||
throw -1; | |||
} | |||
char path_to_so[PATH_MAX + 1]; | |||
//snprintf(path_to_so, sizeof(path_to_so), ADDON_DIR "/%s.so", so_name); | |||
snprintf(path_to_so, sizeof(path_to_so), so_name); | |||
snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data); | |||
fHandle = LoadJackModule(path_to_so); | |||
JackLog("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s\n", path_to_so); | |||
if (fHandle == 0) { | |||
jack_error("error loading %s", so_name); | |||
throw - 1; | |||
} | |||
fInitialize = (InitializeCallback)GetJackProc(fHandle, "jack_initialize"); | |||
if (!fInitialize) { | |||
UnloadJackModule(fHandle); | |||
jack_error("symbol jack_initialize cannot be found in %s", so_name); | |||
throw - 1; | |||
} | |||
fFinish = (FinishCallback)GetJackProc(fHandle, "jack_finish"); | |||
if (!fFinish) { | |||
UnloadJackModule(fHandle); | |||
jack_error("symbol jack_finish cannot be found in %s", so_name); | |||
throw - 1; | |||
} | |||
} | |||
JackLoadableInternalClient::~JackLoadableInternalClient() | |||
{ | |||
if (fFinish) | |||
fFinish(fProcessArg); | |||
UnloadJackModule(fHandle); | |||
if (fFinish) | |||
fFinish(fProcessArg); | |||
UnloadJackModule(fHandle); | |||
} | |||
int JackLoadableInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
{ | |||
int res = JackInternalClient::Open(server_name, name, options, status); | |||
if (res == 0) | |||
fInitialize((jack_client_t*)this, fObjectData); | |||
return res; | |||
int res = JackInternalClient::Open(server_name, name, options, status); | |||
if (res == 0) | |||
fInitialize((jack_client_t*)this, fObjectData); | |||
return res; | |||
} | |||
} // end of namespace | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -62,15 +62,15 @@ class JackInternalClient : public JackClient | |||
#ifdef WIN32 | |||
#include <windows.h> | |||
#define HANDLE HINSTANCE | |||
#define HANDLE HINSTANCE | |||
#define LoadJackModule(name) LoadLibrary((name)); | |||
#define UnloadJackModule(handle) FreeLibrary((handle)); | |||
#define UnloadJackModule(handle) FreeLibrary((handle)); | |||
#define GetJackProc(handle, name) GetProcAddress((handle), (name)); | |||
#else | |||
#include <dlfcn.h> | |||
#define HANDLE void* | |||
#define HANDLE void* | |||
#define LoadJackModule(name) dlopen((name), RTLD_NOW | RTLD_LOCAL); | |||
#define UnloadJackModule(handle) dlclose((handle)); | |||
#define GetJackProc(handle, name) dlsym((handle), (name)); | |||
@@ -84,18 +84,18 @@ class JackLoadableInternalClient : public JackInternalClient | |||
{ | |||
private: | |||
HANDLE fHandle; | |||
InitializeCallback fInitialize; | |||
FinishCallback fFinish; | |||
char fObjectData[JACK_LOAD_INIT_LIMIT]; | |||
HANDLE fHandle; | |||
InitializeCallback fInitialize; | |||
FinishCallback fFinish; | |||
char fObjectData[JACK_LOAD_INIT_LIMIT]; | |||
public: | |||
JackLoadableInternalClient(JackServer* server, JackSynchro** table, const char* so_name, const char* object_data); | |||
virtual ~JackLoadableInternalClient(); | |||
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
virtual ~JackLoadableInternalClient(); | |||
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -43,15 +43,15 @@ class JackInternalClientChannel : public JackClientChannelInterface | |||
{} | |||
virtual ~JackInternalClientChannel() | |||
{} | |||
// Open the Server/Client connection | |||
// Open the Server/Client connection | |||
virtual int Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
{ | |||
return 0; | |||
} | |||
void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) | |||
{ | |||
void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) | |||
{ | |||
*result = fEngine->ClientCheck(name, name_res, protocol, options, status); | |||
} | |||
void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) | |||
@@ -62,14 +62,14 @@ class JackInternalClientChannel : public JackClientChannelInterface | |||
{ | |||
*result = fEngine->ClientInternalClose(refnum, true); | |||
} | |||
void ClientActivate(int refnum, int* result) | |||
{ | |||
*result = fEngine->ClientActivate(refnum); | |||
*result = fEngine->ClientActivate(refnum); | |||
} | |||
void ClientDeactivate(int refnum, int* result) | |||
{ | |||
*result = fEngine->ClientDeactivate(refnum); | |||
*result = fEngine->ClientDeactivate(refnum); | |||
} | |||
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, unsigned int* port_index, int* result) | |||
@@ -108,7 +108,7 @@ class JackInternalClientChannel : public JackClientChannelInterface | |||
*result = fServer->SetFreewheel(onoff); | |||
} | |||
void ReleaseTimebase(int refnum, int* result) | |||
void ReleaseTimebase(int refnum, int* result) | |||
{ | |||
*result = fServer->ReleaseTimebase(refnum); | |||
} | |||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -29,9 +29,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
using namespace Jack; | |||
#ifdef WIN32 | |||
#define EXPORT __declspec(dllexport) | |||
#define EXPORT __declspec(dllexport) | |||
#else | |||
#define EXPORT | |||
#define EXPORT | |||
#endif | |||
#ifdef __cplusplus | |||
@@ -56,10 +56,10 @@ EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options | |||
va_list ap; /* variable argument pointer */ | |||
jack_varargs_t va; /* variable arguments */ | |||
jack_status_t my_status; | |||
JackClient* client; | |||
char client_name[JACK_CLIENT_NAME_SIZE]; | |||
JackTools::RewriteName(ext_client_name, client_name); | |||
JackClient* client; | |||
char client_name[JACK_CLIENT_NAME_SIZE]; | |||
JackTools::RewriteName(ext_client_name, client_name); | |||
if (status == NULL) /* no status from caller? */ | |||
status = &my_status; /* use local status word */ | |||
@@ -76,8 +76,8 @@ EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options | |||
va_start(ap, status); | |||
jack_varargs_parse(options, ap, &va); | |||
va_end(ap); | |||
JackLog("jack_client_open %s\n", client_name); | |||
if (client_name == NULL) { | |||
jack_error("jack_client_new called with a NULL client_name"); | |||
@@ -85,30 +85,30 @@ EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options | |||
} | |||
JackLibGlobals::Init(); // jack library initialisation | |||
#ifndef WIN32 | |||
if (try_start_server(&va, options, status)) { | |||
jack_error("jack server is not running or cannot be started"); | |||
JackLibGlobals::Destroy(); // jack library destruction | |||
return 0; | |||
} | |||
#endif | |||
if (try_start_server(&va, options, status)) { | |||
jack_error("jack server is not running or cannot be started"); | |||
JackLibGlobals::Destroy(); // jack library destruction | |||
return 0; | |||
} | |||
#endif | |||
#ifndef WIN32 | |||
char* jack_debug = getenv("JACK_CLIENT_DEBUG"); | |||
if (jack_debug && strcmp(jack_debug, "on") == 0) | |||
client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode | |||
else | |||
client = new JackLibClient(GetSynchroTable()); | |||
char* jack_debug = getenv("JACK_CLIENT_DEBUG"); | |||
if (jack_debug && strcmp(jack_debug, "on") == 0) | |||
client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode | |||
else | |||
client = new JackLibClient(GetSynchroTable()); | |||
#else | |||
client = new JackLibClient(GetSynchroTable()); | |||
#endif | |||
client = new JackLibClient(GetSynchroTable()); | |||
#endif | |||
int res = client->Open(va.server_name, client_name, options, status); | |||
if (res < 0) { | |||
delete client; | |||
JackLibGlobals::Destroy(); // jack library destruction | |||
int my_status1 = (JackFailure|JackServerError); | |||
int my_status1 = (JackFailure | JackServerError); | |||
*status = (jack_status_t)my_status1; | |||
return NULL; | |||
} else { | |||
@@ -124,12 +124,12 @@ EXPORT int jack_client_close(jack_client_t* ext_client) | |||
jack_error("jack_client_close called with a NULL client"); | |||
return -1; | |||
} else { | |||
int res = client->Close(); | |||
delete client; | |||
JackLog("jack_client_close OK\n"); | |||
JackLibGlobals::Destroy(); // jack library destruction | |||
return res; | |||
} | |||
int res = client->Close(); | |||
delete client; | |||
JackLog("jack_client_close OK\n"); | |||
JackLibGlobals::Destroy(); // jack library destruction | |||
return res; | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -29,18 +29,18 @@ namespace Jack | |||
// Used for external C API (JackAPI.cpp) | |||
JackGraphManager* GetGraphManager() | |||
{ | |||
if (JackLibGlobals::fGlobals) | |||
return JackLibGlobals::fGlobals->fGraphManager; | |||
else | |||
return NULL; | |||
if (JackLibGlobals::fGlobals) | |||
return JackLibGlobals::fGlobals->fGraphManager; | |||
else | |||
return NULL; | |||
} | |||
JackEngineControl* GetEngineControl() | |||
{ | |||
if (JackLibGlobals::fGlobals) | |||
return JackLibGlobals::fGlobals->fEngineControl; | |||
else | |||
return NULL; | |||
if (JackLibGlobals::fGlobals) | |||
return JackLibGlobals::fGlobals->fEngineControl; | |||
else | |||
return NULL; | |||
} | |||
JackSynchro** GetSynchroTable() | |||
@@ -68,11 +68,11 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_ | |||
{ | |||
int shared_engine, shared_client, shared_graph, result; | |||
JackLog("JackLibClient::Open %s\n", name); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
snprintf(fServerName, sizeof(fServerName), server_name); | |||
// Open server/client channel | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
char name_res[JACK_CLIENT_NAME_SIZE]; | |||
if (fChannel->Open(server_name, name, name_res, this, options, status) < 0) { | |||
jack_error("Cannot connect to the server"); | |||
goto error; | |||
@@ -93,28 +93,28 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_ | |||
try { | |||
// Map shared memory segments | |||
JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName); | |||
JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName); | |||
JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName); | |||
fClientControl.SetShmIndex(shared_client, fServerName); | |||
jack_verbose = GetEngineControl()->fVerbose; | |||
} catch (int n) { | |||
} catch (int n) { | |||
jack_error("Map shared memory segments exception %d", n); | |||
goto error; | |||
} | |||
SetupDriverSync(false); | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifndef WIN32 | |||
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process | |||
if (!fSynchroTable[fClientControl->fRefNum]->Connect(name)) { | |||
jack_error("Cannot ConnectSemaphore %s client", name); | |||
goto error; | |||
} | |||
#endif | |||
*/ | |||
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process | |||
if (!fSynchroTable[fClientControl->fRefNum]->Connect(name_res, fServerName)) { | |||
/* TODO : solve WIN32 thread Kill issue | |||
#ifndef WIN32 | |||
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process | |||
if (!fSynchroTable[fClientControl->fRefNum]->Connect(name)) { | |||
jack_error("Cannot ConnectSemaphore %s client", name); | |||
goto error; | |||
} | |||
#endif | |||
*/ | |||
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process | |||
if (!fSynchroTable[fClientControl->fRefNum]->Connect(name_res, fServerName)) { | |||
jack_error("Cannot ConnectSemaphore %s client", name_res); | |||
goto error; | |||
} | |||
@@ -140,7 +140,7 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int | |||
case kAddClient: | |||
JackLog("JackClient::AddClient name = %s, ref = %ld \n", name, refnum); | |||
// the synchro must be usable in I/O mode when several clients live in the same process | |||
// the synchro must be usable in I/O mode when several clients live in the same process | |||
res = fSynchroTable[refnum]->Connect(name, fServerName) ? 0 : -1; | |||
break; | |||
@@ -149,7 +149,7 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int | |||
if (strcmp(GetClientControl()->fName, name) != 0) | |||
res = fSynchroTable[refnum]->Disconnect() ? 0 : -1; | |||
break; | |||
} | |||
} | |||
return res; | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2005 Grame | |||
Copyright (C) 2005 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -49,7 +49,7 @@ struct JackLibGlobals | |||
std::map<mach_port_t, JackClient*> fClientTable; /*! Client table */ | |||
#endif | |||
static int fClientCount; | |||
static int fClientCount; | |||
static JackLibGlobals* fGlobals; | |||
JackLibGlobals() | |||
@@ -77,7 +77,7 @@ struct JackLibGlobals | |||
JackGlobals::InitClient(); | |||
InitTime(); | |||
fGlobals = new JackLibGlobals(); | |||
} | |||
} | |||
} | |||
static void Destroy() | |||
@@ -89,13 +89,13 @@ struct JackLibGlobals | |||
JackGlobals::Destroy(); | |||
} | |||
} | |||
static void CheckContext() | |||
{ | |||
if (!(fClientCount > 0 && fGlobals)) { | |||
jack_error("Error !!! : client accessing an already desallocated library context"); | |||
} | |||
} | |||
static void CheckContext() | |||
{ | |||
if (!(fClientCount > 0 && fGlobals)) { | |||
jack_error("Error !!! : client accessing an already desallocated library context"); | |||
} | |||
} | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -38,14 +38,14 @@ int JackLoopbackDriver::Process() | |||
// Loopback copy | |||
for (int i = 0; i < fCaptureChannels; i++) { | |||
memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(float) * fEngineControl->fBufferSize); | |||
} | |||
} | |||
fGraphManager->ResumeRefNum(fClientControl, fSynchroTable); // Signal all clients | |||
if (fEngineControl->fSyncMode) { | |||
if (fGraphManager->SuspendRefNum(fClientControl, fSynchroTable, fEngineControl->fTimeOutUsecs) < 0) { | |||
jack_error("JackLoopbackDriver::ProcessSync SuspendRefNum error"); | |||
return -1; | |||
} | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -41,7 +41,7 @@ class JackLoopbackDriver : public JackAudioDriver | |||
virtual ~JackLoopbackDriver() | |||
{} | |||
int Process(); | |||
int Process(); | |||
}; | |||
} // end of namespace | |||
@@ -28,23 +28,24 @@ This program is free software; you can redistribute it and/or modify | |||
#endif | |||
#ifdef __cplusplus | |||
extern "C" { | |||
extern "C" | |||
{ | |||
#endif | |||
EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer); | |||
EXPORT int jack_midi_event_get(jack_midi_event_t* event, | |||
void* port_buffer, jack_nframes_t event_index); | |||
void* port_buffer, jack_nframes_t event_index); | |||
EXPORT void jack_midi_clear_buffer(void* port_buffer); | |||
EXPORT size_t jack_midi_max_event_size(void* port_buffer); | |||
EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, | |||
jack_nframes_t time, size_t data_size); | |||
jack_nframes_t time, size_t data_size); | |||
EXPORT int jack_midi_event_write(void* port_buffer, | |||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size); | |||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size); | |||
EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer); | |||
@@ -108,7 +109,7 @@ jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time | |||
EXPORT | |||
int jack_midi_event_write(void* port_buffer, | |||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size) | |||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size) | |||
{ | |||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||
if (!buf && !buf->IsValid()) | |||
@@ -127,6 +128,6 @@ jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer) | |||
{ | |||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||
if (buf && buf->IsValid()) | |||
return buf->lost_events; | |||
return buf->lost_events; | |||
return 0; | |||
} |
@@ -131,10 +131,11 @@ static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count | |||
mix->lost_events += event_count - events_done; | |||
} | |||
const JackPortType gMidiPortType = { | |||
JACK_DEFAULT_MIDI_TYPE, | |||
MidiBufferInit, | |||
MidiBufferMixdown | |||
}; | |||
const JackPortType gMidiPortType = | |||
{ | |||
JACK_DEFAULT_MIDI_TYPE, | |||
MidiBufferInit, | |||
MidiBufferMixdown | |||
}; | |||
} // namespace Jack |
@@ -31,9 +31,9 @@ typedef unsigned char jack_midi_data_t; | |||
/** A Jack MIDI event. */ | |||
struct jack_midi_event_t | |||
{ | |||
jack_nframes_t time; /**< Sample index at which event is valid */ | |||
size_t size; /**< Number of bytes of data in \a buffer */ | |||
jack_midi_data_t *buffer; /**< Raw MIDI data */ | |||
jack_nframes_t time; /**< Sample index at which event is valid */ | |||
size_t size; /**< Number of bytes of data in \a buffer */ | |||
jack_midi_data_t *buffer; /**< Raw MIDI data */ | |||
}; | |||
/** A Jack MIDI port type. */ | |||
@@ -84,7 +84,10 @@ struct JackMidiBuffer | |||
JackMidiEvent events[0]; | |||
int IsValid() const { return magic == MAGIC; } | |||
int IsValid() const | |||
{ | |||
return magic == MAGIC; | |||
} | |||
void Reset(jack_nframes_t nframes); | |||
jack_shmsize_t MaxEventSize() const; | |||
@@ -1,23 +1,23 @@ | |||
/* | |||
/* | |||
Copyright (C) 2006 Grame | |||
Copyright (C) 2006 Grame | |||
This library is free software; you can redistribute it and/or | |||
modify it under the terms of the GNU Lesser General Public | |||
License as published by the Free Software Foundation; either | |||
version 2.1 of the License, or (at your option) any later version. | |||
This library is free software; you can redistribute it and/or | |||
modify it under the terms of the GNU Lesser General Public | |||
License as published by the Free Software Foundation; either | |||
version 2.1 of the License, or (at your option) any later version. | |||
This library is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
Lesser General Public License for more details. | |||
This library is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public | |||
License along with this library; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
You should have received a copy of the GNU Lesser General Public | |||
License along with this library; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France | |||
grame@grame.fr | |||
Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France | |||
grame@grame.fr | |||
*/ | |||
@@ -32,117 +32,119 @@ | |||
#include<assert.h> | |||
namespace Jack | |||
namespace Jack | |||
{ | |||
class JackMutex | |||
class JackMutex | |||
{ | |||
private: | |||
#ifdef WIN32 | |||
HANDLE fMutex; | |||
#else | |||
pthread_mutex_t fMutex; | |||
#endif | |||
public: | |||
#ifdef WIN32 | |||
JackMutex() | |||
{ | |||
fMutex = CreateMutex(0, FALSE, 0); | |||
} | |||
virtual ~JackMutex() | |||
{ | |||
CloseHandle(fMutex); | |||
} | |||
void Lock() | |||
{ | |||
DWORD dwWaitResult = WaitForSingleObject(fMutex, INFINITE); | |||
} | |||
void Unlock() | |||
{ | |||
ReleaseMutex(fMutex); | |||
} | |||
#else | |||
JackMutex() | |||
{ | |||
// Use recursive mutex | |||
pthread_mutexattr_t mutex_attr; | |||
assert(pthread_mutexattr_init(&mutex_attr) == 0); | |||
assert(pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE) == 0); | |||
assert(pthread_mutex_init(&fMutex, &mutex_attr) == 0); | |||
} | |||
virtual ~JackMutex() | |||
{ | |||
pthread_mutex_destroy(&fMutex); | |||
} | |||
void Lock() | |||
{ | |||
pthread_mutex_lock(&fMutex); | |||
} | |||
void Unlock() | |||
{ | |||
pthread_mutex_unlock(&fMutex); | |||
} | |||
#endif | |||
private: | |||
#ifdef WIN32 | |||
HANDLE fMutex; | |||
#else | |||
pthread_mutex_t fMutex; | |||
#endif | |||
public: | |||
#ifdef WIN32 | |||
JackMutex() | |||
{ | |||
fMutex = CreateMutex(0, FALSE, 0); | |||
} | |||
virtual ~JackMutex() | |||
{ | |||
CloseHandle(fMutex); | |||
} | |||
void Lock() | |||
{ | |||
DWORD dwWaitResult = WaitForSingleObject(fMutex, INFINITE); | |||
} | |||
void Unlock() | |||
{ | |||
ReleaseMutex(fMutex); | |||
} | |||
#else | |||
JackMutex() | |||
{ | |||
// Use recursive mutex | |||
pthread_mutexattr_t mutex_attr; | |||
assert(pthread_mutexattr_init(&mutex_attr) == 0); | |||
assert(pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE) == 0); | |||
assert(pthread_mutex_init(&fMutex, &mutex_attr) == 0); | |||
} | |||
virtual ~JackMutex() | |||
{ | |||
pthread_mutex_destroy(&fMutex); | |||
} | |||
void Lock() | |||
{ | |||
pthread_mutex_lock(&fMutex); | |||
} | |||
void Unlock() | |||
{ | |||
pthread_mutex_unlock(&fMutex); | |||
} | |||
#endif | |||
}; | |||
class JackLockAble | |||
{ | |||
private: | |||
private: | |||
JackMutex fMutex; | |||
JackMutex fMutex; | |||
public: | |||
public: | |||
JackLockAble() | |||
{} | |||
virtual ~JackLockAble() | |||
{} | |||
JackLockAble() {} | |||
virtual ~JackLockAble() {} | |||
void Lock() | |||
{ | |||
fMutex.Lock(); | |||
} | |||
void Lock() | |||
{ | |||
fMutex.Lock(); | |||
} | |||
void Unlock() | |||
{ | |||
fMutex.Unlock(); | |||
} | |||
void Unlock() | |||
{ | |||
fMutex.Unlock(); | |||
} | |||
}; | |||
class JackLock | |||
{ | |||
private: | |||
JackLockAble* fObj; | |||
public: | |||
JackLock(JackLockAble* obj):fObj(obj) | |||
{ | |||
fObj->Lock(); | |||
} | |||
JackLock(const JackLockAble* obj):fObj((JackLockAble*)obj) | |||
{ | |||
fObj->Lock(); | |||
} | |||
virtual ~JackLock() | |||
{ | |||
fObj->Unlock(); | |||
} | |||
private: | |||
JackLockAble* fObj; | |||
public: | |||
JackLock(JackLockAble* obj): fObj(obj) | |||
{ | |||
fObj->Lock(); | |||
} | |||
JackLock(const JackLockAble* obj): fObj((JackLockAble*)obj) | |||
{ | |||
fObj->Lock(); | |||
} | |||
virtual ~JackLock() | |||
{ | |||
fObj->Unlock(); | |||
} | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2007 Grame | |||
Copyright (C) 2007 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -22,22 +22,22 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
enum NotificationType { | |||
kAddClient = 0, | |||
kRemoveClient = 1, | |||
kActivateClient = 2, | |||
kXRunCallback = 3, | |||
kGraphOrderCallback = 4, | |||
kBufferSizeCallback = 5, | |||
kStartFreewheelCallback = 6, | |||
kStopFreewheelCallback = 7, | |||
kPortRegistrationOnCallback = 8, | |||
kPortRegistrationOffCallback = 9, | |||
kPortConnectCallback = 10, | |||
kPortDisconnectCallback = 11, | |||
kDeadClient = 12, | |||
kMaxNotification | |||
}; | |||
enum NotificationType { | |||
kAddClient = 0, | |||
kRemoveClient = 1, | |||
kActivateClient = 2, | |||
kXRunCallback = 3, | |||
kGraphOrderCallback = 4, | |||
kBufferSizeCallback = 5, | |||
kStartFreewheelCallback = 6, | |||
kStopFreewheelCallback = 7, | |||
kPortRegistrationOnCallback = 8, | |||
kPortRegistrationOffCallback = 9, | |||
kPortConnectCallback = 10, | |||
kPortDisconnectCallback = 11, | |||
kDeadClient = 12, | |||
kMaxNotification | |||
}; | |||
} // end of namespace | |||
@@ -39,14 +39,14 @@ bool JackPort::Allocate(int refnum, const char* port_name, const char* port_type | |||
{ | |||
int id = GetPortTypeId(port_type); | |||
if (id < 0) | |||
return false; | |||
return false; | |||
fTypeId = id; | |||
fFlags = flags; | |||
fRefNum = refnum; | |||
strcpy(fName, port_name); | |||
fInUse = true; | |||
fLatency = 0; | |||
fTotalLatency = 0; | |||
fTotalLatency = 0; | |||
fTied = NO_PORT; | |||
// DB: At this point we do not know current buffer size in frames, | |||
// but every time buffer will be returned to any user, | |||
@@ -64,10 +64,10 @@ void JackPort::Release() | |||
fRefNum = -1; | |||
fInUse = false; | |||
fLatency = 0; | |||
fTotalLatency = 0; | |||
fTotalLatency = 0; | |||
fTied = NO_PORT; | |||
fAlias1[0] = '\0'; | |||
fAlias2[0] = '\0'; | |||
fAlias1[0] = '\0'; | |||
fAlias2[0] = '\0'; | |||
} | |||
bool JackPort::IsUsed() const | |||
@@ -170,7 +170,7 @@ const char* JackPort::GetShortName() const | |||
{ | |||
/* we know there is always a colon, because we put | |||
it there ... | |||
*/ | |||
*/ | |||
return strchr(fName, ':') + 1; | |||
} | |||
@@ -195,66 +195,66 @@ int JackPort::SetName(const char* new_name) | |||
bool JackPort::NameEquals(const char* target) | |||
{ | |||
char buf[JACK_PORT_NAME_SIZE + 1]; | |||
/* this nasty, nasty kludge is here because between 0.109.0 and 0.109.1, | |||
the ALSA audio backend had the name "ALSA", whereas as before and | |||
after it, it was called "alsa_pcm". this stops breakage for | |||
any setups that have saved "alsa_pcm" or "ALSA" in their connection | |||
state. | |||
*/ | |||
if (strncmp(target, "ALSA:capture", 12) == 0 || strncmp(target, "ALSA:playback", 13) == 0) { | |||
snprintf(buf, sizeof(buf), "alsa_pcm%s", target + 4); | |||
target = buf; | |||
} | |||
return (strcmp(fName, target) == 0 | |||
|| strcmp(fAlias1, target) == 0 | |||
|| strcmp(fAlias2, target) == 0); | |||
char buf[JACK_PORT_NAME_SIZE + 1]; | |||
/* this nasty, nasty kludge is here because between 0.109.0 and 0.109.1, | |||
the ALSA audio backend had the name "ALSA", whereas as before and | |||
after it, it was called "alsa_pcm". this stops breakage for | |||
any setups that have saved "alsa_pcm" or "ALSA" in their connection | |||
state. | |||
*/ | |||
if (strncmp(target, "ALSA:capture", 12) == 0 || strncmp(target, "ALSA:playback", 13) == 0) { | |||
snprintf(buf, sizeof(buf), "alsa_pcm%s", target + 4); | |||
target = buf; | |||
} | |||
return (strcmp(fName, target) == 0 | |||
|| strcmp(fAlias1, target) == 0 | |||
|| strcmp(fAlias2, target) == 0); | |||
} | |||
int JackPort::GetAliases(char* const aliases[2]) | |||
{ | |||
int cnt = 0; | |||
if (fAlias1[0] != '\0') { | |||
snprintf(aliases[0], JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE, "%s", fAlias1); | |||
cnt++; | |||
} | |||
if (fAlias2[0] != '\0') { | |||
snprintf(aliases[1], JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE, "%s", fAlias2); | |||
cnt++; | |||
} | |||
return cnt; | |||
int cnt = 0; | |||
if (fAlias1[0] != '\0') { | |||
snprintf(aliases[0], JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE, "%s", fAlias1); | |||
cnt++; | |||
} | |||
if (fAlias2[0] != '\0') { | |||
snprintf(aliases[1], JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE, "%s", fAlias2); | |||
cnt++; | |||
} | |||
return cnt; | |||
} | |||
int JackPort::SetAlias(const char* alias) | |||
{ | |||
if (fAlias1[0] == '\0') { | |||
snprintf(fAlias1, sizeof(fAlias1), "%s", alias); | |||
} else if (fAlias2[0] == '\0') { | |||
snprintf(fAlias2, sizeof(fAlias2), "%s", alias); | |||
} else { | |||
return -1; | |||
} | |||
return 0; | |||
if (fAlias1[0] == '\0') { | |||
snprintf(fAlias1, sizeof(fAlias1), "%s", alias); | |||
} else if (fAlias2[0] == '\0') { | |||
snprintf(fAlias2, sizeof(fAlias2), "%s", alias); | |||
} else { | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
int JackPort::UnsetAlias(const char* alias) | |||
{ | |||
if (strcmp(fAlias1, alias) == 0) { | |||
fAlias1[0] = '\0'; | |||
} else if (strcmp(fAlias2, alias) == 0) { | |||
fAlias2[0] = '\0'; | |||
} else { | |||
return -1; | |||
} | |||
return 0; | |||
if (strcmp(fAlias1, alias) == 0) { | |||
fAlias1[0] = '\0'; | |||
} else if (strcmp(fAlias2, alias) == 0) { | |||
fAlias2[0] = '\0'; | |||
} else { | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
void JackPort::ClearBuffer(jack_nframes_t frames) | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -31,7 +31,7 @@ namespace Jack | |||
#define NO_PORT 0xFFFE | |||
/*! | |||
\brief Base class for port. | |||
\brief Base class for port. | |||
*/ | |||
class JackPort | |||
@@ -44,30 +44,30 @@ class JackPort | |||
int fTypeId; | |||
enum JackPortFlags fFlags; | |||
char fName[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char fAlias1[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char fAlias2[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char fAlias1[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
char fAlias2[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||
int fRefNum; | |||
jack_nframes_t fLatency; | |||
jack_nframes_t fTotalLatency; | |||
jack_nframes_t fTotalLatency; | |||
uint8_t fMonitorRequests; | |||
bool fInUse; | |||
jack_port_id_t fTied; // Locally tied source port | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
//__declspec(align(16)) float fBuffer[BUFFER_SIZE_MAX]; | |||
float fBuffer[BUFFER_SIZE_MAX]; | |||
#elif __GNUC__ | |||
float fBuffer[BUFFER_SIZE_MAX] __attribute__((aligned(64))); // 16 bytes alignment for vector code, 64 bytes better for cache loads/stores | |||
#else | |||
#warning Buffer will not be aligned on 16 bytes boundaries : vector based code (Altivec of SSE) will fail | |||
float fBuffer[BUFFER_SIZE_MAX]; | |||
#endif | |||
float fBuffer[BUFFER_SIZE_MAX]; | |||
#elif __GNUC__ | |||
float fBuffer[BUFFER_SIZE_MAX] __attribute__((aligned(64))); // 16 bytes alignment for vector code, 64 bytes better for cache loads/stores | |||
#else | |||
#warning Buffer will not be aligned on 16 bytes boundaries : vector based code (Altivec of SSE) will fail | |||
float fBuffer[BUFFER_SIZE_MAX]; | |||
#endif | |||
bool IsUsed() const; | |||
// RT | |||
// RT | |||
void ClearBuffer(jack_nframes_t frames); | |||
void MixBuffers(void** src_buffers, int src_count, jack_nframes_t frames); | |||
@@ -81,20 +81,20 @@ class JackPort | |||
const char* GetName() const; | |||
const char* GetShortName() const; | |||
int SetName(const char* name); | |||
int GetAliases(char* const aliases[2]); | |||
int SetAlias(const char* alias); | |||
int UnsetAlias(const char* alias); | |||
bool NameEquals(const char* target); | |||
int GetAliases(char* const aliases[2]); | |||
int SetAlias(const char* alias); | |||
int UnsetAlias(const char* alias); | |||
bool NameEquals(const char* target); | |||
int GetFlags() const; | |||
const char* GetType() const; | |||
int Tie(jack_port_id_t port_index); | |||
int Tie(jack_port_id_t port_index); | |||
int UnTie(); | |||
jack_nframes_t GetLatency() const; | |||
jack_nframes_t GetTotalLatency() const; | |||
jack_nframes_t GetTotalLatency() const; | |||
void SetLatency(jack_nframes_t latency); | |||
int RequestMonitor(bool onoff); | |||
@@ -103,7 +103,7 @@ class JackPort | |||
float* GetBuffer(); | |||
int GetRefNum() const; | |||
}; | |||
@@ -24,27 +24,31 @@ This program is free software; you can redistribute it and/or modify | |||
namespace Jack | |||
{ | |||
static const JackPortType* port_types[] = { | |||
&gAudioPortType, | |||
&gMidiPortType, | |||
}; | |||
static const JackPortType* port_types[] = | |||
{ | |||
&gAudioPortType, | |||
&gMidiPortType, | |||
}; | |||
enum { PORT_TYPES_MAX = sizeof(port_types)/sizeof(port_types[0]) }; | |||
enum | |||
{ | |||
PORT_TYPES_MAX = sizeof(port_types) / sizeof(port_types[0]) | |||
}; | |||
int GetPortTypeId(const char* port_type) | |||
{ | |||
for (int i = 0; i < PORT_TYPES_MAX; ++i) { | |||
const JackPortType* type = port_types[i]; | |||
assert(type != 0); | |||
assert(type != 0); | |||
if (strcmp(port_type, type->name) == 0) | |||
return i; | |||
return i; | |||
} | |||
return -1; | |||
} | |||
const JackPortType* GetPortType(int type_id) | |||
{ | |||
assert(type_id >= 0 && type_id <= PORT_TYPES_MAX); | |||
assert(type_id >= 0 && type_id <= PORT_TYPES_MAX); | |||
const JackPortType* type = port_types[type_id]; | |||
assert(type != 0); | |||
return type; | |||
@@ -27,7 +27,8 @@ This program is free software; you can redistribute it and/or modify | |||
namespace Jack | |||
{ | |||
struct JackPortType { | |||
struct JackPortType | |||
{ | |||
const char* name; | |||
void (*init)(void* buffer, size_t buffer_size, jack_nframes_t nframes); | |||
void (*mixdown)(void *mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes); | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -34,11 +34,11 @@ void JackPosixSemaphore::BuildName(const char* name, const char* server_name, ch | |||
bool JackPosixSemaphore::Signal() | |||
{ | |||
int res; | |||
if (!fSemaphore) { | |||
jack_error("JackPosixSemaphore::Signal name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (!fSemaphore) { | |||
jack_error("JackPosixSemaphore::Signal name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFlush) | |||
return true; | |||
@@ -52,11 +52,11 @@ bool JackPosixSemaphore::Signal() | |||
bool JackPosixSemaphore::SignalAll() | |||
{ | |||
int res; | |||
if (!fSemaphore) { | |||
jack_error("JackPosixSemaphore::SignalAll name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
jack_error("JackPosixSemaphore::SignalAll name = %s already desallocated!!", fName); | |||
return false; | |||
} | |||
if (fFlush) | |||
return true; | |||
@@ -71,7 +71,7 @@ bool JackPosixSemaphore::SignalAll() | |||
bool JackPosixSemaphore::Wait() | |||
{ | |||
int res; | |||
if (!fSemaphore) { | |||
jack_error("JackPosixSemaphore::Wait name = %s already desallocated!!", fName); | |||
return false; | |||
@@ -99,13 +99,13 @@ bool JackPosixSemaphore::Wait() | |||
/* | |||
#ifdef __linux__ | |||
bool JackPosixSemaphore::TimedWait(long usec) // unusable semantic !! | |||
{ | |||
int res; | |||
struct timeval now; | |||
timespec time; | |||
if (!fSemaphore) { | |||
jack_error("JackPosixSemaphore::TimedWait name = %s already desallocated!!", fName); | |||
return false; | |||
@@ -113,7 +113,7 @@ bool JackPosixSemaphore::TimedWait(long usec) // unusable semantic !! | |||
gettimeofday(&now, 0); | |||
time.tv_sec = now.tv_sec + usec / 1000000; | |||
time.tv_nsec = (now.tv_usec + (usec % 1000000)) * 1000; | |||
if ((res = sem_timedwait(fSemaphore, &time)) != 0) { | |||
jack_error("JackPosixSemaphore::TimedWait err = %s", strerror(errno)); | |||
JackLog("now %ld %ld \n", now.tv_sec, now.tv_usec); | |||
@@ -121,15 +121,15 @@ bool JackPosixSemaphore::TimedWait(long usec) // unusable semantic !! | |||
} | |||
return (res == 0); | |||
} | |||
#else | |||
#else | |||
#warning "JackPosixSemaphore::TimedWait is not supported: Jack in SYNC mode with JackPosixSemaphore will not run properly !!" | |||
bool JackPosixSemaphore::TimedWait(long usec) | |||
{ | |||
return Wait(); | |||
} | |||
#endif | |||
#endif | |||
*/ | |||
#warning JackPosixSemaphore::TimedWait not available : synchronous mode may not work correctly if POSIX semaphore are used | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -43,8 +43,8 @@ void* JackPosixThread::ThreadHandler(void* arg) | |||
JackLog("ThreadHandler: start\n"); | |||
// If Init succeed, start the thread loop | |||
bool res = true; | |||
// If Init succeed, start the thread loop | |||
bool res = true; | |||
while (obj->fRunning && res) { | |||
res = runnable->Execute(); | |||
} | |||
@@ -55,21 +55,21 @@ void* JackPosixThread::ThreadHandler(void* arg) | |||
int JackPosixThread::Start() | |||
{ | |||
fRunning = true; | |||
// Check if the thread was correctly started | |||
if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | |||
fRunning = false; | |||
return -1; | |||
} else { | |||
return 0; | |||
} | |||
fRunning = true; | |||
// Check if the thread was correctly started | |||
if (StartImp(&fThread, fPriority, fRealTime, ThreadHandler, this) < 0) { | |||
fRunning = false; | |||
return -1; | |||
} else { | |||
return 0; | |||
} | |||
} | |||
int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) | |||
{ | |||
int res; | |||
if (realtime) { | |||
JackLog("Create RT thread\n"); | |||
@@ -80,17 +80,17 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi | |||
pthread_attr_t attributes; | |||
struct sched_param rt_param; | |||
pthread_attr_init(&attributes); | |||
if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { | |||
if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { | |||
jack_error("Cannot request explicit scheduling for RT thread %d %s", res, strerror(errno)); | |||
return -1; | |||
} | |||
if ((res = pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_JOINABLE))) { | |||
jack_error("Cannot request joinable thread creation for RT thread %d %s", res, strerror(errno)); | |||
return -1; | |||
} | |||
if ((res = pthread_attr_setscope(&attributes, PTHREAD_SCOPE_SYSTEM))) { | |||
jack_error("Cannot set scheduling scope for RT thread %d %s", res, strerror(errno)); | |||
return -1; | |||
@@ -102,18 +102,18 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi | |||
jack_error("Cannot set RR scheduling class for RT thread %d %s", res, strerror(errno)); | |||
return -1; | |||
} | |||
memset(&rt_param, 0, sizeof(rt_param)); | |||
memset(&rt_param, 0, sizeof(rt_param)); | |||
rt_param.sched_priority = priority; | |||
if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) { | |||
jack_error("Cannot set scheduling priority for RT thread %d %s", res, strerror(errno)); | |||
return -1; | |||
} | |||
if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { | |||
jack_error("setting thread stack size%d %s", res, strerror(errno)); | |||
return -1; | |||
if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { | |||
jack_error("setting thread stack size%d %s", res, strerror(errno)); | |||
return -1; | |||
} | |||
if ((res = pthread_create(thread, &attributes, start_routine, arg))) { | |||
@@ -146,8 +146,8 @@ int JackPosixThread::Kill() | |||
void* status; | |||
pthread_cancel(fThread); | |||
pthread_join(fThread, &status); | |||
fRunning = false; | |||
fThread = (pthread_t)NULL; | |||
fRunning = false; | |||
fThread = (pthread_t)NULL; | |||
return 0; | |||
} else { | |||
return -1; | |||
@@ -161,7 +161,7 @@ int JackPosixThread::Stop() | |||
void* status; | |||
fRunning = false; // Request for the thread to stop | |||
pthread_join(fThread, &status); | |||
fThread = (pthread_t)NULL; | |||
fThread = (pthread_t)NULL; | |||
return 0; | |||
} else { | |||
return -1; | |||
@@ -170,18 +170,18 @@ int JackPosixThread::Stop() | |||
int JackPosixThread::AcquireRealTime() | |||
{ | |||
return (fThread) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||
return (fThread) ? AcquireRealTimeImp(fThread, fPriority) : -1; | |||
} | |||
int JackPosixThread::AcquireRealTime(int priority) | |||
{ | |||
fPriority = priority; | |||
fPriority = priority; | |||
return AcquireRealTime(); | |||
} | |||
int JackPosixThread::AcquireRealTimeImp(pthread_t thread, int priority) | |||
{ | |||
struct sched_param rtparam; | |||
struct sched_param rtparam; | |||
int res; | |||
memset(&rtparam, 0, sizeof(rtparam)); | |||
rtparam.sched_priority = priority; | |||
@@ -204,7 +204,7 @@ int JackPosixThread::DropRealTime() | |||
int JackPosixThread::DropRealTimeImp(pthread_t thread) | |||
{ | |||
struct sched_param rtparam; | |||
struct sched_param rtparam; | |||
int res; | |||
memset(&rtparam, 0, sizeof(rtparam)); | |||
rtparam.sched_priority = 0; | |||
@@ -223,8 +223,8 @@ pthread_t JackPosixThread::GetThreadID() | |||
void JackPosixThread::Terminate() | |||
{ | |||
JackLog("JackPosixThread::Terminate\n"); | |||
pthread_exit(0); | |||
JackLog("JackPosixThread::Terminate\n"); | |||
pthread_exit(0); | |||
} | |||
} // end of namespace | |||
@@ -27,7 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
/* use 512KB stack per thread - the default is way too high to be feasible | |||
/* use 512KB stack per thread - the default is way too high to be feasible | |||
* with mlockall() on many systems */ | |||
#define THREAD_STACK 524288 | |||
@@ -62,17 +62,17 @@ class JackPosixThread : public JackThread | |||
virtual int StartSync(); | |||
virtual int Kill(); | |||
virtual int Stop(); | |||
virtual void Terminate(); | |||
virtual void Terminate(); | |||
virtual int AcquireRealTime(); | |||
virtual int AcquireRealTime(int priority); | |||
virtual int DropRealTime(); | |||
pthread_t GetThreadID(); | |||
static int AcquireRealTimeImp(pthread_t thread, int priority); | |||
static int DropRealTimeImp(pthread_t thread); | |||
static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||
static int AcquireRealTimeImp(pthread_t thread, int priority); | |||
static int DropRealTimeImp(pthread_t thread); | |||
static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,22 +1,22 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __JackRequest__ | |||
@@ -55,15 +55,15 @@ struct JackRequest | |||
kSetTimebaseCallback = 13, | |||
kSetBufferSize = 20, | |||
kSetFreeWheel = 21, | |||
kClientCheck = 22, | |||
kClientCheck = 22, | |||
kClientOpen = 23, | |||
kClientClose = 24, | |||
kConnectNamePorts = 25, | |||
kDisconnectNamePorts = 26, | |||
kGetInternalClientName = 27, | |||
kInternalClientHandle = 28, | |||
kInternalClientLoad = 29, | |||
kInternalClientUnload = 30, | |||
kGetInternalClientName = 27, | |||
kInternalClientHandle = 28, | |||
kInternalClientLoad = 29, | |||
kInternalClientUnload = 30, | |||
kNotification = 31 | |||
}; | |||
@@ -75,17 +75,17 @@ struct JackRequest | |||
JackRequest(RequestType type): fType(type) | |||
{} | |||
virtual ~JackRequest() | |||
virtual ~JackRequest() | |||
{} | |||
virtual int Read(JackChannelTransaction* trans) | |||
virtual int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fType, sizeof(RequestType)); | |||
return trans->Read(&fType, sizeof(RequestType)); | |||
} | |||
virtual int Write(JackChannelTransaction* trans) | |||
virtual int Write(JackChannelTransaction* trans) | |||
{ | |||
return trans->Write(&fType, sizeof(RequestType)); | |||
return trans->Write(&fType, sizeof(RequestType)); | |||
} | |||
}; | |||
@@ -108,12 +108,12 @@ struct JackResult | |||
virtual int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fResult, sizeof(int)); | |||
return trans->Read(&fResult, sizeof(int)); | |||
} | |||
virtual int Write(JackChannelTransaction* trans) | |||
{ | |||
return trans->Write(&fResult, sizeof(int)); | |||
return trans->Write(&fResult, sizeof(int)); | |||
} | |||
}; | |||
@@ -125,29 +125,29 @@ struct JackClientCheckRequest : public JackRequest | |||
{ | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
int fProtocol; | |||
int fProtocol; | |||
int fOptions; | |||
JackClientCheckRequest() | |||
{} | |||
JackClientCheckRequest(const char* name, int protocol, int options): JackRequest(JackRequest::kClientCheck),fProtocol(protocol),fOptions(options) | |||
JackClientCheckRequest(const char* name, int protocol, int options): JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options) | |||
{ | |||
snprintf(fName, sizeof(fName), "%s", name); | |||
} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fProtocol, sizeof(int))); | |||
return trans->Read(&fOptions, sizeof(int)); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fProtocol, sizeof(int))); | |||
return trans->Read(&fOptions, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fProtocol, sizeof(int))); | |||
return trans->Write(&fOptions, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fProtocol, sizeof(int))); | |||
return trans->Write(&fOptions, sizeof(int)); | |||
} | |||
}; | |||
@@ -158,31 +158,31 @@ struct JackClientCheckRequest : public JackRequest | |||
struct JackClientCheckResult : public JackResult | |||
{ | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
int fStatus; | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
int fStatus; | |||
JackClientCheckResult():JackResult(),fStatus(0) | |||
JackClientCheckResult(): JackResult(), fStatus(0) | |||
{} | |||
JackClientCheckResult(int32_t result, const char* name, int status) | |||
: JackResult(result), fStatus(status) | |||
: JackResult(result), fStatus(status) | |||
{ | |||
snprintf(fName, sizeof(fName), "%s", name); | |||
} | |||
snprintf(fName, sizeof(fName), "%s", name); | |||
} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -204,13 +204,13 @@ struct JackClientOpenRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
} | |||
}; | |||
@@ -227,30 +227,30 @@ struct JackClientOpenResult : public JackResult | |||
uint32_t fProtocolVersion; | |||
JackClientOpenResult() | |||
:JackResult(),fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1), fProtocolVersion(0) | |||
: JackResult(), fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1), fProtocolVersion(0) | |||
{} | |||
JackClientOpenResult(int32_t result, int index1, int index2, int index3) | |||
: JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3), fProtocolVersion(0) | |||
: JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3), fProtocolVersion(0) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fSharedEngine, sizeof(int))); | |||
CheckRes(trans->Read(&fSharedClient, sizeof(int))); | |||
CheckRes(trans->Read(&fSharedGraph, sizeof(int))); | |||
CheckRes(trans->Read(&fProtocolVersion, sizeof(uint32_t))); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fSharedEngine, sizeof(int))); | |||
CheckRes(trans->Read(&fSharedClient, sizeof(int))); | |||
CheckRes(trans->Read(&fSharedGraph, sizeof(int))); | |||
CheckRes(trans->Read(&fProtocolVersion, sizeof(uint32_t))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fSharedEngine, sizeof(int))); | |||
CheckRes(trans->Write(&fSharedClient, sizeof(int))); | |||
CheckRes(trans->Write(&fSharedGraph, sizeof(int))); | |||
CheckRes(trans->Write(&fProtocolVersion, sizeof(uint32_t))); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fSharedEngine, sizeof(int))); | |||
CheckRes(trans->Write(&fSharedClient, sizeof(int))); | |||
CheckRes(trans->Write(&fSharedGraph, sizeof(int))); | |||
CheckRes(trans->Write(&fProtocolVersion, sizeof(uint32_t))); | |||
return 0; | |||
} | |||
}; | |||
@@ -270,13 +270,13 @@ struct JackClientCloseRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -296,13 +296,13 @@ struct JackActivateRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -323,13 +323,13 @@ struct JackDeactivateRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -358,23 +358,23 @@ struct JackPortRegisterRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fPortType, JACK_PORT_TYPE_SIZE + 1)); | |||
CheckRes(trans->Read(&fFlags, sizeof(unsigned int))); | |||
CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int))); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fPortType, JACK_PORT_TYPE_SIZE + 1)); | |||
CheckRes(trans->Read(&fFlags, sizeof(unsigned int))); | |||
CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fPortType, JACK_PORT_TYPE_SIZE + 1)); | |||
CheckRes(trans->Write(&fFlags, sizeof(unsigned int))); | |||
CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int))); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fPortType, JACK_PORT_TYPE_SIZE + 1)); | |||
CheckRes(trans->Write(&fFlags, sizeof(unsigned int))); | |||
CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -387,19 +387,19 @@ struct JackPortRegisterResult : public JackResult | |||
unsigned int fPortIndex; | |||
JackPortRegisterResult():JackResult(),fPortIndex(NO_PORT) | |||
JackPortRegisterResult(): JackResult(), fPortIndex(NO_PORT) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
return trans->Read(&fPortIndex, sizeof(jack_port_id_t)); | |||
CheckRes(JackResult::Read(trans)); | |||
return trans->Read(&fPortIndex, sizeof(jack_port_id_t)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
return trans->Write(&fPortIndex, sizeof(jack_port_id_t)); | |||
CheckRes(JackResult::Write(trans)); | |||
return trans->Write(&fPortIndex, sizeof(jack_port_id_t)); | |||
} | |||
}; | |||
@@ -420,17 +420,17 @@ struct JackPortUnRegisterRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fPortIndex, sizeof(int))); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fPortIndex, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fPortIndex, sizeof(int))); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fPortIndex, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -440,7 +440,7 @@ struct JackPortUnRegisterRequest : public JackRequest | |||
struct JackPortConnectNameRequest : public JackRequest | |||
{ | |||
int fRefNum; | |||
char fSrc[JACK_PORT_NAME_SIZE + 1]; | |||
char fDst[JACK_PORT_NAME_SIZE + 1]; | |||
@@ -455,20 +455,20 @@ struct JackPortConnectNameRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
}; | |||
@@ -493,19 +493,19 @@ struct JackPortDisconnectNameRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
}; | |||
@@ -527,19 +527,19 @@ struct JackPortConnectRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
} | |||
}; | |||
@@ -562,19 +562,19 @@ struct JackPortDisconnectRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); | |||
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); | |||
return 0; | |||
} | |||
}; | |||
@@ -595,13 +595,13 @@ struct JackSetBufferSizeRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fBufferSize, sizeof(jack_nframes_t)); | |||
return trans->Read(&fBufferSize, sizeof(jack_nframes_t)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fBufferSize, sizeof(jack_nframes_t)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fBufferSize, sizeof(jack_nframes_t)); | |||
} | |||
}; | |||
@@ -621,13 +621,13 @@ struct JackSetFreeWheelRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fOnOff, sizeof(int)); | |||
return trans->Read(&fOnOff, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fOnOff, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fOnOff, sizeof(int)); | |||
} | |||
}; | |||
@@ -647,13 +647,13 @@ struct JackReleaseTimebaseRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
return trans->Read(&fRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
return trans->Write(&fRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -674,15 +674,15 @@ struct JackSetTimebaseCallbackRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fConditionnal, sizeof(int)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fConditionnal, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fConditionnal, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fConditionnal, sizeof(int)); | |||
} | |||
}; | |||
@@ -693,26 +693,26 @@ struct JackSetTimebaseCallbackRequest : public JackRequest | |||
struct JackGetInternalClientNameRequest : public JackRequest | |||
{ | |||
int fRefNum; | |||
int fRefNum; | |||
int fIntRefNum; | |||
JackGetInternalClientNameRequest() | |||
{} | |||
JackGetInternalClientNameRequest(int refnum, int int_ref) | |||
: JackRequest(JackRequest::kGetInternalClientName),fRefNum(refnum),fIntRefNum(int_ref) | |||
: JackRequest(JackRequest::kGetInternalClientName), fRefNum(refnum), fIntRefNum(int_ref) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fIntRefNum, sizeof(int)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fIntRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fIntRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fIntRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -723,28 +723,28 @@ struct JackGetInternalClientNameRequest : public JackRequest | |||
struct JackGetInternalClientNameResult : public JackResult | |||
{ | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
JackGetInternalClientNameResult():JackResult() | |||
JackGetInternalClientNameResult(): JackResult() | |||
{} | |||
JackGetInternalClientNameResult(int32_t result, const char* name) | |||
: JackResult(result) | |||
: JackResult(result) | |||
{ | |||
snprintf(fName, sizeof(fName), "%s", name); | |||
} | |||
snprintf(fName, sizeof(fName), "%s", name); | |||
} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
return 0; | |||
} | |||
}; | |||
@@ -755,28 +755,28 @@ struct JackGetInternalClientNameResult : public JackResult | |||
struct JackInternalClientHandleRequest : public JackRequest | |||
{ | |||
int fRefNum; | |||
int fRefNum; | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
JackInternalClientHandleRequest() | |||
{} | |||
JackInternalClientHandleRequest(int refnum, const char* client_name) | |||
: JackRequest(JackRequest::kInternalClientHandle),fRefNum(refnum) | |||
: JackRequest(JackRequest::kInternalClientHandle), fRefNum(refnum) | |||
{ | |||
snprintf(fName, sizeof(fName), "%s", client_name); | |||
} | |||
snprintf(fName, sizeof(fName), "%s", client_name); | |||
} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); | |||
} | |||
}; | |||
@@ -787,29 +787,29 @@ struct JackInternalClientHandleRequest : public JackRequest | |||
struct JackInternalClientHandleResult : public JackResult | |||
{ | |||
int fStatus; | |||
int fIntRefNum; | |||
int fStatus; | |||
int fIntRefNum; | |||
JackInternalClientHandleResult():JackResult() | |||
JackInternalClientHandleResult(): JackResult() | |||
{} | |||
JackInternalClientHandleResult(int32_t result, int status, int int_ref) | |||
: JackResult(result),fStatus(status),fIntRefNum(int_ref) | |||
: JackResult(result), fStatus(status), fIntRefNum(int_ref) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
CheckRes(trans->Read(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
CheckRes(trans->Read(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
CheckRes(trans->Write(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
CheckRes(trans->Write(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -820,41 +820,41 @@ struct JackInternalClientHandleResult : public JackResult | |||
struct JackInternalClientLoadRequest : public JackRequest | |||
{ | |||
#define MAX_PATH 256 | |||
int fRefNum; | |||
#define MAX_PATH 256 | |||
int fRefNum; | |||
char fName[JACK_CLIENT_NAME_SIZE + 1]; | |||
char fDllName[MAX_PATH + 1]; | |||
char fLoadInitName[JACK_LOAD_INIT_LIMIT + 1]; | |||
int fOptions; | |||
char fDllName[MAX_PATH + 1]; | |||
char fLoadInitName[JACK_LOAD_INIT_LIMIT + 1]; | |||
int fOptions; | |||
JackInternalClientLoadRequest() | |||
{} | |||
JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options) | |||
: JackRequest(JackRequest::kInternalClientLoad),fRefNum(refnum),fOptions(options) | |||
: JackRequest(JackRequest::kInternalClientLoad), fRefNum(refnum), fOptions(options) | |||
{ | |||
snprintf(fName, sizeof(fName), "%s", client_name); | |||
snprintf(fDllName, sizeof(fDllName), "%s", so_name); | |||
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data); | |||
} | |||
snprintf(fName, sizeof(fName), "%s", client_name); | |||
snprintf(fDllName, sizeof(fDllName), "%s", so_name); | |||
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data); | |||
} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDllName, MAX_PATH + 1)); | |||
CheckRes(trans->Read(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); | |||
return trans->Read(&fOptions, sizeof(int)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fDllName, MAX_PATH + 1)); | |||
CheckRes(trans->Read(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); | |||
return trans->Read(&fOptions, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDllName, MAX_PATH + 1)); | |||
CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); | |||
return trans->Write(&fOptions, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fDllName, MAX_PATH + 1)); | |||
CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); | |||
return trans->Write(&fOptions, sizeof(int)); | |||
} | |||
}; | |||
@@ -865,29 +865,29 @@ struct JackInternalClientLoadRequest : public JackRequest | |||
struct JackInternalClientLoadResult : public JackResult | |||
{ | |||
int fStatus; | |||
int fIntRefNum; | |||
int fStatus; | |||
int fIntRefNum; | |||
JackInternalClientLoadResult():JackResult() | |||
JackInternalClientLoadResult(): JackResult() | |||
{} | |||
JackInternalClientLoadResult(int32_t result, int status, int int_ref) | |||
: JackResult(result),fStatus(status),fIntRefNum(int_ref) | |||
: JackResult(result), fStatus(status), fIntRefNum(int_ref) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
CheckRes(trans->Read(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
CheckRes(trans->Read(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
CheckRes(trans->Write(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
CheckRes(trans->Write(&fIntRefNum, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -898,26 +898,26 @@ struct JackInternalClientLoadResult : public JackResult | |||
struct JackInternalClientUnloadRequest : public JackRequest | |||
{ | |||
int fRefNum; | |||
int fRefNum; | |||
int fIntRefNum; | |||
JackInternalClientUnloadRequest() | |||
{} | |||
JackInternalClientUnloadRequest(int refnum, int int_ref) | |||
: JackRequest(JackRequest::kInternalClientUnload),fRefNum(refnum),fIntRefNum(int_ref) | |||
: JackRequest(JackRequest::kInternalClientUnload), fRefNum(refnum), fIntRefNum(int_ref) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fIntRefNum, sizeof(int)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
return trans->Read(&fIntRefNum, sizeof(int)); | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fIntRefNum, sizeof(int)); | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
return trans->Write(&fIntRefNum, sizeof(int)); | |||
} | |||
}; | |||
@@ -929,26 +929,26 @@ struct JackInternalClientUnloadRequest : public JackRequest | |||
struct JackInternalClientUnloadResult : public JackResult | |||
{ | |||
int fStatus; | |||
int fStatus; | |||
JackInternalClientUnloadResult():JackResult() | |||
JackInternalClientUnloadResult(): JackResult() | |||
{} | |||
JackInternalClientUnloadResult(int32_t result, int status) | |||
: JackResult(result),fStatus(status) | |||
: JackResult(result), fStatus(status) | |||
{} | |||
int Read(JackChannelTransaction* trans) | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Read(trans)); | |||
CheckRes(trans->Read(&fStatus, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
return 0; | |||
CheckRes(JackResult::Write(trans)); | |||
CheckRes(trans->Write(&fStatus, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -958,7 +958,7 @@ struct JackInternalClientUnloadResult : public JackResult | |||
struct JackClientNotificationRequest : public JackRequest | |||
{ | |||
int fRefNum; | |||
int fNotify; | |||
int fValue; | |||
@@ -971,19 +971,19 @@ struct JackClientNotificationRequest : public JackRequest | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fNotify, sizeof(int))); | |||
CheckRes(trans->Read(&fValue, sizeof(int))); | |||
return 0; | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fNotify, sizeof(int))); | |||
CheckRes(trans->Read(&fValue, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fNotify, sizeof(int))); | |||
CheckRes(trans->Write(&fValue, sizeof(int))); | |||
return 0; | |||
CheckRes(JackRequest::Write(trans)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fNotify, sizeof(int))); | |||
CheckRes(trans->Write(&fValue, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -998,7 +998,7 @@ struct JackClientNotification | |||
int fRefNum; | |||
int fNotify; | |||
int fValue1; | |||
int fValue2; | |||
int fValue2; | |||
int fSync; | |||
JackClientNotification(): fNotify(-1), fValue1(-1), fValue2(-1) | |||
@@ -1011,24 +1011,24 @@ struct JackClientNotification | |||
int Read(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fNotify, sizeof(int))); | |||
CheckRes(trans->Read(&fValue1, sizeof(int))); | |||
CheckRes(trans->Read(&fValue2, sizeof(int))); | |||
CheckRes(trans->Read(&fSync, sizeof(int))); | |||
return 0; | |||
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Read(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Read(&fNotify, sizeof(int))); | |||
CheckRes(trans->Read(&fValue1, sizeof(int))); | |||
CheckRes(trans->Read(&fValue2, sizeof(int))); | |||
CheckRes(trans->Read(&fSync, sizeof(int))); | |||
return 0; | |||
} | |||
int Write(JackChannelTransaction* trans) | |||
{ | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fNotify, sizeof(int))); | |||
CheckRes(trans->Write(&fValue1, sizeof(int))); | |||
CheckRes(trans->Write(&fValue2, sizeof(int))); | |||
CheckRes(trans->Write(&fSync, sizeof(int))); | |||
return 0; | |||
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); | |||
CheckRes(trans->Write(&fRefNum, sizeof(int))); | |||
CheckRes(trans->Write(&fNotify, sizeof(int))); | |||
CheckRes(trans->Write(&fValue1, sizeof(int))); | |||
CheckRes(trans->Write(&fValue2, sizeof(int))); | |||
CheckRes(trans->Write(&fSync, sizeof(int))); | |||
return 0; | |||
} | |||
}; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -53,12 +53,12 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long p | |||
fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver("freewheel", fEngine, fSynchroTable)); | |||
fLoopbackDriver = new JackLoopbackDriver("loopback", fEngine, fSynchroTable); | |||
fChannel = JackGlobals::MakeServerChannel(); | |||
fFreewheel = false; | |||
fFreewheel = false; | |||
fLoopback = loopback; | |||
fDriverInfo = NULL; | |||
fAudioDriver = NULL; | |||
fInstance = this; // Unique instance | |||
jack_verbose = verbose; | |||
jack_verbose = verbose; | |||
} | |||
JackServer::~JackServer() | |||
@@ -117,7 +117,7 @@ int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) | |||
jack_error("Cannot attach audio driver"); | |||
return -1; | |||
} | |||
if (fLoopback > 0 && fLoopbackDriver->Attach() != 0) { | |||
jack_error("Cannot attach loopback driver"); | |||
return -1; | |||
@@ -148,25 +148,25 @@ int JackServer::Close() | |||
int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status) | |||
{ | |||
try { | |||
// Clear status | |||
*status = 0; | |||
JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); | |||
assert(client); | |||
int res = client->Open("unused", client_name, (jack_options_t)options, (jack_status_t*)status); | |||
if (res < 0) { | |||
delete client; | |||
*int_ref = 0; | |||
} else { | |||
*int_ref = client->GetClientControl()->fRefNum; | |||
} | |||
} catch (...) { | |||
int my_status1 = *status | JackFailure; | |||
*status = (jack_status_t)my_status1; | |||
*int_ref = 0; | |||
} | |||
return 0; | |||
try { | |||
// Clear status | |||
*status = 0; | |||
JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); | |||
assert(client); | |||
int res = client->Open("unused", client_name, (jack_options_t)options, (jack_status_t*)status); | |||
if (res < 0) { | |||
delete client; | |||
*int_ref = 0; | |||
} else { | |||
*int_ref = client->GetClientControl()->fRefNum; | |||
} | |||
} catch (...) { | |||
int my_status1 = *status | JackFailure; | |||
*status = (jack_status_t)my_status1; | |||
*int_ref = 0; | |||
} | |||
return 0; | |||
} | |||
int JackServer::Start() | |||
@@ -185,7 +185,7 @@ int JackServer::Stop() | |||
int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||
{ | |||
JackLog("JackServer::SetBufferSize nframes = %ld\n", buffer_size); | |||
jack_nframes_t current_buffer_size = fEngineControl->fBufferSize; | |||
jack_nframes_t current_buffer_size = fEngineControl->fBufferSize; | |||
if (fAudioDriver->Stop() != 0) { | |||
jack_error("Cannot stop audio driver"); | |||
@@ -193,27 +193,27 @@ int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||
} | |||
if (fAudioDriver->SetBufferSize(buffer_size) == 0) { | |||
fFreewheelDriver->SetBufferSize(buffer_size); | |||
fEngine->NotifyBufferSize(buffer_size); | |||
fEngineControl->InitFrameTime(); | |||
return fAudioDriver->Start(); | |||
} else { // Failure: try to restore current value | |||
jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | |||
fFreewheelDriver->SetBufferSize(current_buffer_size); | |||
fEngineControl->InitFrameTime(); | |||
return fAudioDriver->Start(); | |||
} | |||
fFreewheelDriver->SetBufferSize(buffer_size); | |||
fEngine->NotifyBufferSize(buffer_size); | |||
fEngineControl->InitFrameTime(); | |||
return fAudioDriver->Start(); | |||
} else { // Failure: try to restore current value | |||
jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | |||
fFreewheelDriver->SetBufferSize(current_buffer_size); | |||
fEngineControl->InitFrameTime(); | |||
return fAudioDriver->Start(); | |||
} | |||
} | |||
/* | |||
Freewheel mode is implemented by switching from the (audio + freewheel) driver to the freewheel driver only: | |||
- "global" connection state is saved | |||
- all audio driver ports are deconnected, thus there is no more dependancies with the audio driver | |||
- the freewheel driver will be synchronized with the end of graph execution : all clients are connected to the freewheel driver | |||
- the freewheel driver becomes the "master" | |||
Normal mode is restored with the connections state valid before freewheel mode was done. Thus one consider that | |||
Normal mode is restored with the connections state valid before freewheel mode was done. Thus one consider that | |||
no graph state change can be done during freewheel mode. | |||
*/ | |||
@@ -231,7 +231,7 @@ int JackServer::SetFreewheel(bool onoff) | |||
fEngine->NotifyFreewheel(onoff); | |||
fFreewheelDriver->SetMaster(false); | |||
fEngineControl->InitFrameTime(); | |||
return fAudioDriver->Start(); | |||
return fAudioDriver->Start(); | |||
} | |||
} else { | |||
if (onoff) { | |||
@@ -241,7 +241,7 @@ int JackServer::SetFreewheel(bool onoff) | |||
fGraphManager->DisconnectAllPorts(fAudioDriver->GetClientControl()->fRefNum); | |||
fEngine->NotifyFreewheel(onoff); | |||
fFreewheelDriver->SetMaster(true); | |||
return fFreewheelDriver->Start(); | |||
return fFreewheelDriver->Start(); | |||
} else { | |||
return -1; | |||
} | |||
@@ -263,10 +263,10 @@ void JackServer::Notify(int refnum, int notify, int value) | |||
case kDeadClient: | |||
JackLog("JackServer: kDeadClient ref = %ld\n", refnum); | |||
if (fEngine->ClientDeactivate(refnum) < 0) | |||
jack_error("JackServer: DeadClient ref = %ld cannot be removed from the graph !!", refnum); | |||
fEngine->ClientExternalClose(refnum); | |||
break; | |||
if (fEngine->ClientDeactivate(refnum) < 0) | |||
jack_error("JackServer: DeadClient ref = %ld cannot be removed from the graph !!", refnum); | |||
fEngine->ClientExternalClose(refnum); | |||
break; | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -55,8 +55,8 @@ class EXPORT JackServer | |||
JackGraphManager* fGraphManager; | |||
JackServerChannelInterface* fChannel; | |||
//JackConnectionManager* fConnectionState; | |||
JackConnectionManager fConnectionState; | |||
JackSynchro* fSynchroTable[CLIENT_NUM]; | |||
JackConnectionManager fConnectionState; | |||
JackSynchro* fSynchroTable[CLIENT_NUM]; | |||
bool fFreewheel; | |||
long fLoopback; | |||
@@ -66,7 +66,7 @@ class EXPORT JackServer | |||
virtual ~JackServer(); | |||
int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); | |||
int Close(); | |||
int Close(); | |||
int Start(); | |||
int Stop(); | |||
@@ -74,14 +74,14 @@ class EXPORT JackServer | |||
int SetBufferSize(jack_nframes_t buffer_size); | |||
int SetFreewheel(bool onoff); | |||
void Notify(int refnum, int notify, int value); | |||
int InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status); | |||
// Transport management | |||
int InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status); | |||
// Transport management | |||
int ReleaseTimebase(int refnum); | |||
int SetTimebaseCallback(int refnum, int conditional); | |||
// Object access | |||
// Object access | |||
JackEngine* GetEngine(); | |||
JackEngineControl* GetEngineControl(); | |||
JackSynchro** GetSynchroTable(); | |||
@@ -18,7 +18,7 @@ This program is free software; you can redistribute it and/or modify | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -32,9 +32,9 @@ This program is free software; you can redistribute it and/or modify | |||
#include "JackTools.h" | |||
#ifdef WIN32 | |||
#define EXPORT __declspec(dllexport) | |||
#define EXPORT __declspec(dllexport) | |||
#else | |||
#define EXPORT | |||
#define EXPORT | |||
#endif | |||
#ifdef __cplusplus | |||
@@ -58,10 +58,10 @@ EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options | |||
va_list ap; /* variable argument pointer */ | |||
jack_varargs_t va; /* variable arguments */ | |||
jack_status_t my_status; | |||
JackClient* client; | |||
char client_name[JACK_CLIENT_NAME_SIZE]; | |||
JackTools::RewriteName(ext_client_name, client_name); | |||
JackClient* client; | |||
char client_name[JACK_CLIENT_NAME_SIZE]; | |||
JackTools::RewriteName(ext_client_name, client_name); | |||
if (status == NULL) /* no status from caller? */ | |||
status = &my_status; /* use local status word */ | |||
@@ -86,26 +86,26 @@ EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options | |||
} | |||
if (!JackServerGlobals::Init()) { // jack server initialisation | |||
int my_status1 = (JackFailure | JackServerError); | |||
int my_status1 = (JackFailure | JackServerError); | |||
*status = (jack_status_t)my_status1; | |||
return NULL; | |||
} | |||
return NULL; | |||
} | |||
#ifndef WIN32 | |||
char* jack_debug = getenv("JACK_CLIENT_DEBUG"); | |||
if (jack_debug && strcmp(jack_debug, "on") == 0) | |||
client = new JackDebugClient(new JackInternalClient(JackServer::fInstance, GetSynchroTable())); // Debug mode | |||
else | |||
client = new JackInternalClient(JackServer::fInstance, GetSynchroTable()); | |||
char* jack_debug = getenv("JACK_CLIENT_DEBUG"); | |||
if (jack_debug && strcmp(jack_debug, "on") == 0) | |||
client = new JackDebugClient(new JackInternalClient(JackServer::fInstance, GetSynchroTable())); // Debug mode | |||
else | |||
client = new JackInternalClient(JackServer::fInstance, GetSynchroTable()); | |||
#else | |||
client = new JackInternalClient(JackServer::fInstance, GetSynchroTable()); | |||
#endif | |||
client = new JackInternalClient(JackServer::fInstance, GetSynchroTable()); | |||
#endif | |||
int res = client->Open(va.server_name, client_name, options, status); | |||
if (res < 0) { | |||
delete client; | |||
JackServerGlobals::Destroy(); // jack server destruction | |||
int my_status1 = (JackFailure | JackServerError); | |||
int my_status1 = (JackFailure | JackServerError); | |||
*status = (jack_status_t)my_status1; | |||
return NULL; | |||
} else { | |||
@@ -121,11 +121,11 @@ EXPORT int jack_client_close(jack_client_t* ext_client) | |||
jack_error("jack_client_close called with a NULL client"); | |||
return -1; | |||
} else { | |||
int res = client->Close(); | |||
delete client; | |||
JackLog("jack_client_close OK\n"); | |||
JackServerGlobals::Destroy(); // jack server destruction | |||
return res; | |||
} | |||
int res = client->Close(); | |||
delete client; | |||
JackLog("jack_client_close OK\n"); | |||
JackServerGlobals::Destroy(); // jack server destruction | |||
return res; | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2005 Grame | |||
Copyright (C) 2005 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -17,7 +17,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -28,7 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#include <getopt.h> | |||
#ifndef WIN32 | |||
#include <dirent.h> | |||
#include <dirent.h> | |||
#endif | |||
static char* server_name = NULL; | |||
@@ -39,19 +39,19 @@ namespace Jack | |||
unsigned int JackServerGlobals::fClientCount = 0; | |||
JackServer* JackServerGlobals::fServer = NULL; | |||
int JackServerGlobals::Start(const char* server_name, | |||
jack_driver_desc_t* driver_desc, | |||
JSList* driver_params, | |||
int sync, | |||
int temporary, | |||
int time_out_ms, | |||
int rt, | |||
int priority, | |||
int loopback, | |||
int verbose) | |||
int JackServerGlobals::Start(const char* server_name, | |||
jack_driver_desc_t* driver_desc, | |||
JSList* driver_params, | |||
int sync, | |||
int temporary, | |||
int time_out_ms, | |||
int rt, | |||
int priority, | |||
int loopback, | |||
int verbose) | |||
{ | |||
JackLog("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld \n", sync, time_out_ms, rt, priority, verbose); | |||
fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name); | |||
fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name); | |||
int res = fServer->Open(driver_desc, driver_params); | |||
return (res < 0) ? res : fServer->Start(); | |||
} | |||
@@ -75,253 +75,254 @@ int JackServerGlobals::Delete() | |||
bool JackServerGlobals::Init() | |||
{ | |||
if (fClientCount++ == 0) { | |||
if (fClientCount++ == 0) { | |||
JackLog("JackServerGlobals Init\n"); | |||
int realtime = 0; | |||
int client_timeout = 0; /* msecs; if zero, use period size. */ | |||
int realtime_priority = 10; | |||
int verbose_aux = 0; | |||
int do_mlock = 1; | |||
unsigned int port_max = 128; | |||
int loopback = 0; | |||
int do_unlock = 0; | |||
int temporary = 0; | |||
jack_driver_desc_t* driver_desc; | |||
const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:"; | |||
static struct option long_options[] = { | |||
{ "driver", 1, 0, 'd'}, | |||
{ "verbose", 0, 0, 'v' }, | |||
{ "help", 0, 0, 'h' }, | |||
{ "port-max", 1, 0, 'p' }, | |||
{ "no-mlock", 0, 0, 'm' }, | |||
{ "name", 0, 0, 'n' }, | |||
{ "unlock", 0, 0, 'u' }, | |||
{ "realtime", 0, 0, 'R' }, | |||
{ "loopback", 0, 0, 'L' }, | |||
{ "realtime-priority", 1, 0, 'P' }, | |||
{ "timeout", 1, 0, 't' }, | |||
{ "temporary", 0, 0, 'T' }, | |||
{ "version", 0, 0, 'V' }, | |||
{ "silent", 0, 0, 's' }, | |||
{ "sync", 0, 0, 'S' }, | |||
{ 0, 0, 0, 0 } | |||
}; | |||
int opt = 0; | |||
int option_index = 0; | |||
int seen_driver = 0; | |||
char *driver_name = NULL; | |||
char **driver_args = NULL; | |||
JSList* driver_params; | |||
int driver_nargs = 1; | |||
JSList* drivers = NULL; | |||
int show_version = 0; | |||
int sync = 0; | |||
int rc, i; | |||
int ret; | |||
FILE* fp = 0; | |||
char filename[255]; | |||
char buffer[255]; | |||
int argc = 0; | |||
char* argv[32]; | |||
snprintf(filename, 255, "%s/.jackdrc", getenv("HOME")); | |||
fp = fopen(filename, "r"); | |||
if (!fp) { | |||
fp = fopen("/etc/jackdrc", "r"); | |||
} | |||
// if still not found, check old config name for backwards compatability | |||
if (!fp) { | |||
fp = fopen("/etc/jackd.conf", "r"); | |||
} | |||
argc = 0; | |||
if (fp) { | |||
ret = fscanf(fp, "%s", buffer); | |||
while (ret != 0 && ret != EOF) { | |||
argv[argc] = (char*)malloc(64); | |||
strcpy(argv[argc], buffer); | |||
ret = fscanf(fp, "%s", buffer); | |||
argc++; | |||
} | |||
fclose(fp); | |||
} | |||
/* | |||
For testing | |||
int argc = 15; | |||
char* argv[] = {"jackdmp", "-R", "-v", "-d", "coreaudio", "-p", "512", "-d", "~:Aggregate:0", "-r", "48000", "-i", "2", "-o", "2" }; | |||
*/ | |||
opterr = 0; | |||
optind = 1; // Important : to reset argv parsing | |||
while (!seen_driver && | |||
(opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) { | |||
switch (opt) { | |||
case 'd': | |||
seen_driver = 1; | |||
driver_name = optarg; | |||
break; | |||
case 'v': | |||
verbose_aux = 1; | |||
break; | |||
case 'S': | |||
sync = 1; | |||
break; | |||
case 'n': | |||
server_name = optarg; | |||
break; | |||
case 'm': | |||
do_mlock = 0; | |||
break; | |||
case 'p': | |||
port_max = (unsigned int)atol(optarg); | |||
break; | |||
case 'P': | |||
realtime_priority = atoi(optarg); | |||
break; | |||
case 'R': | |||
realtime = 1; | |||
break; | |||
case 'L': | |||
loopback = atoi(optarg); | |||
break; | |||
case 'T': | |||
temporary = 1; | |||
break; | |||
case 't': | |||
client_timeout = atoi(optarg); | |||
break; | |||
case 'u': | |||
do_unlock = 1; | |||
break; | |||
case 'V': | |||
show_version = 1; | |||
break; | |||
default: | |||
fprintf(stderr, "unknown option character %c\n", optopt); | |||
break; | |||
} | |||
} | |||
drivers = jack_drivers_load(drivers); | |||
if (!drivers) { | |||
fprintf(stderr, "jackdmp: no drivers found; exiting\n"); | |||
goto error; | |||
} | |||
driver_desc = jack_find_driver_descriptor(drivers, driver_name); | |||
if (!driver_desc) { | |||
fprintf(stderr, "jackdmp: unknown driver '%s'\n", driver_name); | |||
goto error; | |||
} | |||
if (optind < argc) { | |||
driver_nargs = 1 + argc - optind; | |||
} else { | |||
driver_nargs = 1; | |||
} | |||
if (driver_nargs == 0) { | |||
fprintf(stderr, "No driver specified ... hmm. JACK won't do" | |||
" anything when run like this.\n"); | |||
goto error; | |||
} | |||
driver_args = (char**)malloc(sizeof(char*) * driver_nargs); | |||
driver_args[0] = driver_name; | |||
for (i = 1; i < driver_nargs; i++) { | |||
driver_args[i] = argv[optind++]; | |||
} | |||
if (jack_parse_driver_params(driver_desc, driver_nargs, driver_args, &driver_params)) { | |||
goto error; | |||
} | |||
#ifndef WIN32 | |||
if (server_name == NULL) | |||
server_name = (char*)JackTools::DefaultServerName(); | |||
#endif | |||
rc = jack_register_server(server_name, false); | |||
switch (rc) { | |||
case EEXIST: | |||
fprintf(stderr, "`%s' server already active\n", server_name); | |||
goto error; | |||
case ENOSPC: | |||
fprintf(stderr, "too many servers already active\n"); | |||
goto error; | |||
case ENOMEM: | |||
fprintf(stderr, "no access to shm registry\n"); | |||
goto error; | |||
default: | |||
if (jack_verbose) | |||
fprintf(stderr, "server `%s' registered\n", server_name); | |||
} | |||
/* clean up shared memory and files from any previous instance of this server name */ | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
if (!realtime && client_timeout == 0) | |||
client_timeout = 500; /* 0.5 sec; usable when non realtime. */ | |||
for (i = 0; i < argc; i++) { | |||
free(argv[i]); | |||
} | |||
int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux); | |||
if (res < 0) { | |||
jack_error("Cannot start server... exit"); | |||
Delete(); | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
jack_unregister_server(server_name); | |||
goto error; | |||
} | |||
} | |||
return true; | |||
int realtime = 0; | |||
int client_timeout = 0; /* msecs; if zero, use period size. */ | |||
int realtime_priority = 10; | |||
int verbose_aux = 0; | |||
int do_mlock = 1; | |||
unsigned int port_max = 128; | |||
int loopback = 0; | |||
int do_unlock = 0; | |||
int temporary = 0; | |||
jack_driver_desc_t* driver_desc; | |||
const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:"; | |||
static struct option long_options[] = { | |||
{ "driver", 1, 0, 'd' | |||
}, | |||
{ "verbose", 0, 0, 'v' }, | |||
{ "help", 0, 0, 'h' }, | |||
{ "port-max", 1, 0, 'p' }, | |||
{ "no-mlock", 0, 0, 'm' }, | |||
{ "name", 0, 0, 'n' }, | |||
{ "unlock", 0, 0, 'u' }, | |||
{ "realtime", 0, 0, 'R' }, | |||
{ "loopback", 0, 0, 'L' }, | |||
{ "realtime-priority", 1, 0, 'P' }, | |||
{ "timeout", 1, 0, 't' }, | |||
{ "temporary", 0, 0, 'T' }, | |||
{ "version", 0, 0, 'V' }, | |||
{ "silent", 0, 0, 's' }, | |||
{ "sync", 0, 0, 'S' }, | |||
{ 0, 0, 0, 0 } | |||
}; | |||
int opt = 0; | |||
int option_index = 0; | |||
int seen_driver = 0; | |||
char *driver_name = NULL; | |||
char **driver_args = NULL; | |||
JSList* driver_params; | |||
int driver_nargs = 1; | |||
JSList* drivers = NULL; | |||
int show_version = 0; | |||
int sync = 0; | |||
int rc, i; | |||
int ret; | |||
FILE* fp = 0; | |||
char filename[255]; | |||
char buffer[255]; | |||
int argc = 0; | |||
char* argv[32]; | |||
snprintf(filename, 255, "%s/.jackdrc", getenv("HOME")); | |||
fp = fopen(filename, "r"); | |||
if (!fp) { | |||
fp = fopen("/etc/jackdrc", "r"); | |||
} | |||
// if still not found, check old config name for backwards compatability | |||
if (!fp) { | |||
fp = fopen("/etc/jackd.conf", "r"); | |||
} | |||
argc = 0; | |||
if (fp) { | |||
ret = fscanf(fp, "%s", buffer); | |||
while (ret != 0 && ret != EOF) { | |||
argv[argc] = (char*)malloc(64); | |||
strcpy(argv[argc], buffer); | |||
ret = fscanf(fp, "%s", buffer); | |||
argc++; | |||
} | |||
fclose(fp); | |||
} | |||
/* | |||
For testing | |||
int argc = 15; | |||
char* argv[] = {"jackdmp", "-R", "-v", "-d", "coreaudio", "-p", "512", "-d", "~:Aggregate:0", "-r", "48000", "-i", "2", "-o", "2" }; | |||
*/ | |||
opterr = 0; | |||
optind = 1; // Important : to reset argv parsing | |||
while (!seen_driver && | |||
(opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) { | |||
switch (opt) { | |||
case 'd': | |||
seen_driver = 1; | |||
driver_name = optarg; | |||
break; | |||
case 'v': | |||
verbose_aux = 1; | |||
break; | |||
case 'S': | |||
sync = 1; | |||
break; | |||
case 'n': | |||
server_name = optarg; | |||
break; | |||
case 'm': | |||
do_mlock = 0; | |||
break; | |||
case 'p': | |||
port_max = (unsigned int)atol(optarg); | |||
break; | |||
case 'P': | |||
realtime_priority = atoi(optarg); | |||
break; | |||
case 'R': | |||
realtime = 1; | |||
break; | |||
case 'L': | |||
loopback = atoi(optarg); | |||
break; | |||
case 'T': | |||
temporary = 1; | |||
break; | |||
case 't': | |||
client_timeout = atoi(optarg); | |||
break; | |||
case 'u': | |||
do_unlock = 1; | |||
break; | |||
case 'V': | |||
show_version = 1; | |||
break; | |||
default: | |||
fprintf(stderr, "unknown option character %c\n", optopt); | |||
break; | |||
} | |||
} | |||
drivers = jack_drivers_load(drivers); | |||
if (!drivers) { | |||
fprintf(stderr, "jackdmp: no drivers found; exiting\n"); | |||
goto error; | |||
} | |||
driver_desc = jack_find_driver_descriptor(drivers, driver_name); | |||
if (!driver_desc) { | |||
fprintf(stderr, "jackdmp: unknown driver '%s'\n", driver_name); | |||
goto error; | |||
} | |||
if (optind < argc) { | |||
driver_nargs = 1 + argc - optind; | |||
} else { | |||
driver_nargs = 1; | |||
} | |||
if (driver_nargs == 0) { | |||
fprintf(stderr, "No driver specified ... hmm. JACK won't do" | |||
" anything when run like this.\n"); | |||
goto error; | |||
} | |||
driver_args = (char**)malloc(sizeof(char*) * driver_nargs); | |||
driver_args[0] = driver_name; | |||
for (i = 1; i < driver_nargs; i++) { | |||
driver_args[i] = argv[optind++]; | |||
} | |||
if (jack_parse_driver_params(driver_desc, driver_nargs, driver_args, &driver_params)) { | |||
goto error; | |||
} | |||
#ifndef WIN32 | |||
if (server_name == NULL) | |||
server_name = (char*)JackTools::DefaultServerName(); | |||
#endif | |||
rc = jack_register_server(server_name, false); | |||
switch (rc) { | |||
case EEXIST: | |||
fprintf(stderr, "`%s' server already active\n", server_name); | |||
goto error; | |||
case ENOSPC: | |||
fprintf(stderr, "too many servers already active\n"); | |||
goto error; | |||
case ENOMEM: | |||
fprintf(stderr, "no access to shm registry\n"); | |||
goto error; | |||
default: | |||
if (jack_verbose) | |||
fprintf(stderr, "server `%s' registered\n", server_name); | |||
} | |||
/* clean up shared memory and files from any previous instance of this server name */ | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
if (!realtime && client_timeout == 0) | |||
client_timeout = 500; /* 0.5 sec; usable when non realtime. */ | |||
for (i = 0; i < argc; i++) { | |||
free(argv[i]); | |||
} | |||
int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux); | |||
if (res < 0) { | |||
jack_error("Cannot start server... exit"); | |||
Delete(); | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
jack_unregister_server(server_name); | |||
goto error; | |||
} | |||
} | |||
return true; | |||
error: | |||
fClientCount--; | |||
return false; | |||
fClientCount--; | |||
return false; | |||
} | |||
void JackServerGlobals::Destroy() | |||
{ | |||
if (--fClientCount == 0) { | |||
JackLog("JackServerGlobals Destroy\n"); | |||
Stop(); | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
jack_unregister_server(server_name); | |||
Stop(); | |||
jack_cleanup_shm(); | |||
#ifndef WIN32 | |||
JackTools::CleanupFiles(server_name); | |||
#endif | |||
jack_unregister_server(server_name); | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2005 Grame | |||
Copyright (C) 2005 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -37,7 +37,7 @@ class JackClient; | |||
struct JackServerGlobals | |||
{ | |||
static unsigned int fClientCount; | |||
static unsigned int fClientCount; | |||
static JackServer* fServer; | |||
JackServerGlobals(); | |||
@@ -45,16 +45,16 @@ struct JackServerGlobals | |||
static bool Init(); | |||
static void Destroy(); | |||
static int Start(const char* server_name, | |||
jack_driver_desc_t* driver_desc, | |||
JSList* driver_params, | |||
int sync, | |||
int temporary, | |||
int time_out_ms, | |||
int rt, | |||
int priority, | |||
int loopback, | |||
int verbose); | |||
static int Start(const char* server_name, | |||
jack_driver_desc_t* driver_desc, | |||
JSList* driver_params, | |||
int sync, | |||
int temporary, | |||
int time_out_ms, | |||
int rt, | |||
int priority, | |||
int loopback, | |||
int verbose); | |||
static int Stop(); | |||
static int Delete(); | |||
}; | |||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -33,153 +33,153 @@ using namespace Jack; | |||
/* Exec the JACK server in this process. Does not return. */ | |||
static void start_server_aux(const char* server_name) | |||
{ | |||
FILE* fp = 0; | |||
char filename[255]; | |||
char arguments[255]; | |||
char buffer[255]; | |||
char* command = 0; | |||
size_t pos = 0; | |||
size_t result = 0; | |||
char** argv = 0; | |||
int i = 0; | |||
int good = 0; | |||
int ret; | |||
snprintf(filename, 255, "%s/.jackdrc", getenv("HOME")); | |||
fp = fopen(filename, "r"); | |||
if (!fp) { | |||
fp = fopen("/etc/jackdrc", "r"); | |||
} | |||
/* if still not found, check old config name for backwards compatability */ | |||
if (!fp) { | |||
fp = fopen("/etc/jackd.conf", "r"); | |||
} | |||
if (fp) { | |||
arguments[0] = '\0'; | |||
ret = fscanf(fp, "%s", buffer); | |||
while (ret != 0 && ret != EOF) { | |||
strcat(arguments, buffer); | |||
strcat(arguments, " "); | |||
ret = fscanf(fp, "%s", buffer); | |||
} | |||
if (strlen(arguments) > 0) { | |||
good = 1; | |||
} | |||
fclose(fp); | |||
} | |||
if (!good) { | |||
command = (char*)(JACK_LOCATION "/jackd"); | |||
strncpy(arguments, JACK_LOCATION "/jackd -T -d "JACK_DEFAULT_DRIVER, 255); | |||
} else { | |||
result = strcspn(arguments, " "); | |||
command = (char*)malloc(result + 1); | |||
strncpy(command, arguments, result); | |||
command[result] = '\0'; | |||
} | |||
argv = (char**)malloc(255); | |||
while (1) { | |||
/* insert -T and -nserver_name in front of arguments */ | |||
if (i == 1) { | |||
argv[i] = (char*)malloc(strlen ("-T") + 1); | |||
strcpy (argv[i++], "-T"); | |||
if (server_name) { | |||
size_t optlen = strlen("-n"); | |||
char* buf = (char*)malloc(optlen + strlen(server_name) + 1); | |||
strcpy(buf, "-n"); | |||
strcpy(buf + optlen, server_name); | |||
argv[i++] = buf; | |||
} | |||
} | |||
result = strcspn(arguments + pos, " "); | |||
if (result == 0) { | |||
break; | |||
} | |||
argv[i] = (char*)malloc(result + 1); | |||
strncpy(argv[i], arguments + pos, result); | |||
argv[i][result] = '\0'; | |||
pos += result + 1; | |||
++i; | |||
} | |||
argv[i] = 0; | |||
execv(command, argv); | |||
/* If execv() succeeds, it does not return. There's no point | |||
* in calling jack_error() here in the child process. */ | |||
fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno)); | |||
FILE* fp = 0; | |||
char filename[255]; | |||
char arguments[255]; | |||
char buffer[255]; | |||
char* command = 0; | |||
size_t pos = 0; | |||
size_t result = 0; | |||
char** argv = 0; | |||
int i = 0; | |||
int good = 0; | |||
int ret; | |||
snprintf(filename, 255, "%s/.jackdrc", getenv("HOME")); | |||
fp = fopen(filename, "r"); | |||
if (!fp) { | |||
fp = fopen("/etc/jackdrc", "r"); | |||
} | |||
/* if still not found, check old config name for backwards compatability */ | |||
if (!fp) { | |||
fp = fopen("/etc/jackd.conf", "r"); | |||
} | |||
if (fp) { | |||
arguments[0] = '\0'; | |||
ret = fscanf(fp, "%s", buffer); | |||
while (ret != 0 && ret != EOF) { | |||
strcat(arguments, buffer); | |||
strcat(arguments, " "); | |||
ret = fscanf(fp, "%s", buffer); | |||
} | |||
if (strlen(arguments) > 0) { | |||
good = 1; | |||
} | |||
fclose(fp); | |||
} | |||
if (!good) { | |||
command = (char*)(JACK_LOCATION "/jackd"); | |||
strncpy(arguments, JACK_LOCATION "/jackd -T -d "JACK_DEFAULT_DRIVER, 255); | |||
} else { | |||
result = strcspn(arguments, " "); | |||
command = (char*)malloc(result + 1); | |||
strncpy(command, arguments, result); | |||
command[result] = '\0'; | |||
} | |||
argv = (char**)malloc(255); | |||
while (1) { | |||
/* insert -T and -nserver_name in front of arguments */ | |||
if (i == 1) { | |||
argv[i] = (char*)malloc(strlen ("-T") + 1); | |||
strcpy (argv[i++], "-T"); | |||
if (server_name) { | |||
size_t optlen = strlen("-n"); | |||
char* buf = (char*)malloc(optlen + strlen(server_name) + 1); | |||
strcpy(buf, "-n"); | |||
strcpy(buf + optlen, server_name); | |||
argv[i++] = buf; | |||
} | |||
} | |||
result = strcspn(arguments + pos, " "); | |||
if (result == 0) { | |||
break; | |||
} | |||
argv[i] = (char*)malloc(result + 1); | |||
strncpy(argv[i], arguments + pos, result); | |||
argv[i][result] = '\0'; | |||
pos += result + 1; | |||
++i; | |||
} | |||
argv[i] = 0; | |||
execv(command, argv); | |||
/* If execv() succeeds, it does not return. There's no point | |||
* in calling jack_error() here in the child process. */ | |||
fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno)); | |||
} | |||
static int start_server(const char* server_name, jack_options_t options) | |||
{ | |||
if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) { | |||
return 1; | |||
} | |||
/* The double fork() forces the server to become a child of | |||
* init, which will always clean up zombie process state on | |||
* termination. This even works in cases where the server | |||
* terminates but this client does not. | |||
* | |||
* Since fork() is usually implemented using copy-on-write | |||
* virtual memory tricks, the overhead of the second fork() is | |||
* probably relatively small. | |||
*/ | |||
switch (fork()) { | |||
case 0: /* child process */ | |||
switch (fork()) { | |||
case 0: /* grandchild process */ | |||
start_server_aux(server_name); | |||
_exit(99); /* exec failed */ | |||
case -1: | |||
_exit(98); | |||
default: | |||
_exit(0); | |||
} | |||
case -1: /* fork() error */ | |||
return 1; /* failed to start server */ | |||
} | |||
/* only the original parent process goes here */ | |||
return 0; /* (probably) successful */ | |||
if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) { | |||
return 1; | |||
} | |||
/* The double fork() forces the server to become a child of | |||
* init, which will always clean up zombie process state on | |||
* termination. This even works in cases where the server | |||
* terminates but this client does not. | |||
* | |||
* Since fork() is usually implemented using copy-on-write | |||
* virtual memory tricks, the overhead of the second fork() is | |||
* probably relatively small. | |||
*/ | |||
switch (fork()) { | |||
case 0: /* child process */ | |||
switch (fork()) { | |||
case 0: /* grandchild process */ | |||
start_server_aux(server_name); | |||
_exit(99); /* exec failed */ | |||
case - 1: | |||
_exit(98); | |||
default: | |||
_exit(0); | |||
} | |||
case - 1: /* fork() error */ | |||
return 1; /* failed to start server */ | |||
} | |||
/* only the original parent process goes here */ | |||
return 0; /* (probably) successful */ | |||
} | |||
int server_connect(char* server_name) | |||
{ | |||
JackClientChannelInterface* channel = JackGlobals::MakeClientChannel(); | |||
int res = channel->ServerCheck(server_name); | |||
channel->Close(); | |||
delete channel; | |||
return res; | |||
JackClientChannelInterface* channel = JackGlobals::MakeClientChannel(); | |||
int res = channel->ServerCheck(server_name); | |||
channel->Close(); | |||
delete channel; | |||
return res; | |||
} | |||
int try_start_server(jack_varargs_t* va, jack_options_t options, jack_status_t* status) | |||
{ | |||
if (server_connect(va->server_name) < 0) { | |||
int trys; | |||
if (start_server(va->server_name, options)) { | |||
int my_status1 = *status | JackFailure | JackServerFailed; | |||
*status = (jack_status_t)my_status1; | |||
return -1; | |||
} | |||
trys = 5; | |||
do { | |||
sleep(1); | |||
if (--trys < 0) { | |||
int my_status1 = *status | JackFailure | JackServerFailed; | |||
*status = (jack_status_t)my_status1; | |||
return -1; | |||
} | |||
} while (server_connect(va->server_name) < 0); | |||
int my_status1 = *status | JackServerStarted; | |||
*status = (jack_status_t)my_status1; | |||
} | |||
return 0; | |||
if (server_connect(va->server_name) < 0) { | |||
int trys; | |||
if (start_server(va->server_name, options)) { | |||
int my_status1 = *status | JackFailure | JackServerFailed; | |||
*status = (jack_status_t)my_status1; | |||
return -1; | |||
} | |||
trys = 5; | |||
do { | |||
sleep(1); | |||
if (--trys < 0) { | |||
int my_status1 = *status | JackFailure | JackServerFailed; | |||
*status = (jack_status_t)my_status1; | |||
return -1; | |||
} | |||
} while (server_connect(va->server_name) < 0); | |||
int my_status1 = *status | JackServerStarted; | |||
*status = (jack_status_t)my_status1; | |||
} | |||
return 0; | |||
} | |||
#endif |
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -52,9 +52,9 @@ void* JackShmMem::operator new(size_t size) | |||
// It is unsafe to set object fields directly (may be overwritten during object initialization), | |||
// so use an intermediate global data | |||
gInfo.index = info.index; | |||
gInfo.size = size; | |||
gInfo.size = size; | |||
gInfo.attached_at = info.attached_at; | |||
JackLog("JackShmMem::new index = %ld attached = %x size = %ld \n", info.index, info.attached_at, size); | |||
return obj; | |||
@@ -76,40 +76,40 @@ void JackShmMem::operator delete(void* p, size_t size) | |||
jack_destroy_shm(&info); | |||
} | |||
void LockMemoryImp(void* ptr, size_t size) | |||
void LockMemoryImp(void* ptr, size_t size) | |||
{ | |||
if (CHECK_MLOCK(ptr, size)) { | |||
JackLog("Succeeded in locking %u byte memory area\n", size); | |||
} else { | |||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | |||
} | |||
if (CHECK_MLOCK(ptr, size)) { | |||
JackLog("Succeeded in locking %u byte memory area\n", size); | |||
} else { | |||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | |||
} | |||
} | |||
void UnlockMemoryImp(void* ptr, size_t size) | |||
void UnlockMemoryImp(void* ptr, size_t size) | |||
{ | |||
if (CHECK_MUNLOCK(ptr, size)) { | |||
JackLog("Succeeded in unlocking %u byte memory area\n", size); | |||
} else { | |||
jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | |||
} | |||
if (CHECK_MUNLOCK(ptr, size)) { | |||
JackLog("Succeeded in unlocking %u byte memory area\n", size); | |||
} else { | |||
jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | |||
} | |||
} | |||
void LockAllMemory() | |||
void LockAllMemory() | |||
{ | |||
if (CHECK_MLOCKALL()) { | |||
JackLog("Succeeded in locking all memory\n"); | |||
} else { | |||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | |||
} | |||
if (CHECK_MLOCKALL()) { | |||
JackLog("Succeeded in locking all memory\n"); | |||
} else { | |||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | |||
} | |||
} | |||
void UnlockAllMemory() | |||
void UnlockAllMemory() | |||
{ | |||
if (CHECK_MUNLOCKALL()) { | |||
JackLog("Succeeded in unlocking all memory\n"); | |||
} else { | |||
jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | |||
} | |||
if (CHECK_MUNLOCKALL()) { | |||
JackLog("Succeeded in unlocking all memory\n"); | |||
} else { | |||
jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | |||
} | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -25,24 +25,24 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#include "JackError.h" | |||
#include <new> // GCC 4.0 | |||
#include <errno.h> | |||
#include <errno.h> | |||
#include <stdlib.h> | |||
#ifdef WIN32 | |||
#include <windows.h> | |||
#define CHECK_MLOCK(ptr, size) (VirtualLock((ptr), (size)) != 0) | |||
#define CHECK_MUNLOCK(ptr, size) (VirtualUnlock((ptr), (size)) != 0) | |||
#define CHECK_MLOCKALL()(false) | |||
#define CHECK_MUNLOCKALL()(false) | |||
#include <windows.h> | |||
#define CHECK_MLOCK(ptr, size) (VirtualLock((ptr), (size)) != 0) | |||
#define CHECK_MUNLOCK(ptr, size) (VirtualUnlock((ptr), (size)) != 0) | |||
#define CHECK_MLOCKALL()(false) | |||
#define CHECK_MUNLOCKALL()(false) | |||
#else | |||
#include <sys/types.h> | |||
#include <sys/mman.h> | |||
#define CHECK_MLOCK(ptr, size) (mlock((ptr), (size)) == 0) | |||
#define CHECK_MUNLOCK(ptr, size) (munlock((ptr), (size)) == 0) | |||
#define CHECK_MLOCKALL() (mlockall(MCL_CURRENT | MCL_FUTURE) == 0) | |||
#define CHECK_MUNLOCKALL() (munlockall() == 0) | |||
#include <sys/types.h> | |||
#include <sys/mman.h> | |||
#define CHECK_MLOCK(ptr, size) (mlock((ptr), (size)) == 0) | |||
#define CHECK_MUNLOCK(ptr, size) (munlock((ptr), (size)) == 0) | |||
#define CHECK_MLOCKALL() (mlockall(MCL_CURRENT | MCL_FUTURE) == 0) | |||
#define CHECK_MUNLOCKALL() (munlockall() == 0) | |||
#endif | |||
namespace Jack | |||
{ | |||
@@ -51,55 +51,55 @@ void UnlockMemoryImp(void* ptr, size_t size); | |||
class JackMem | |||
{ | |||
private: | |||
private: | |||
size_t fSize; | |||
static size_t gSize; | |||
public: | |||
size_t fSize; | |||
static size_t gSize; | |||
public: | |||
void* operator new(size_t size) | |||
{ | |||
gSize = size; | |||
return calloc(1, size); | |||
} | |||
{ | |||
gSize = size; | |||
return calloc(1, size); | |||
} | |||
void operator delete(void* ptr, size_t size) | |||
{ | |||
free(ptr); | |||
} | |||
{ | |||
free(ptr); | |||
} | |||
JackMem():fSize(gSize) | |||
JackMem(): fSize(gSize) | |||
{} | |||
virtual ~JackMem() | |||
{} | |||
void LockMemory() | |||
{ | |||
LockMemoryImp(this, fSize); | |||
} | |||
void UnlockMemory() | |||
{ | |||
UnlockMemoryImp(this, fSize); | |||
} | |||
void LockMemory() | |||
{ | |||
LockMemoryImp(this, fSize); | |||
} | |||
void UnlockMemory() | |||
{ | |||
UnlockMemoryImp(this, fSize); | |||
} | |||
}; | |||
/*! | |||
\brief The base class for shared memory management. | |||
A class which objects need to be allocated in shared memory derives from this class. | |||
*/ | |||
class JackShmMem | |||
class JackShmMem | |||
{ | |||
protected: | |||
jack_shm_info_t fInfo; | |||
static unsigned int fSegmentNum; | |||
static unsigned int fSegmentNum; | |||
static jack_shm_info_t gInfo; | |||
public: | |||
@@ -110,9 +110,9 @@ class JackShmMem | |||
JackShmMem() | |||
{ | |||
fInfo.index = gInfo.index; | |||
fInfo.attached_at = gInfo.attached_at; | |||
fInfo.size = gInfo.size; | |||
} | |||
fInfo.attached_at = gInfo.attached_at; | |||
fInfo.size = gInfo.size; | |||
} | |||
virtual ~JackShmMem() | |||
{} | |||
@@ -126,16 +126,16 @@ class JackShmMem | |||
{ | |||
return (char*)fInfo.attached_at; | |||
} | |||
void LockMemory() | |||
{ | |||
LockMemoryImp(this, fInfo.size); | |||
} | |||
void UnlockMemory() | |||
{ | |||
UnlockMemoryImp(this, fInfo.size); | |||
} | |||
void LockMemory() | |||
{ | |||
LockMemoryImp(this, fInfo.size); | |||
} | |||
void UnlockMemory() | |||
{ | |||
UnlockMemoryImp(this, fInfo.size); | |||
} | |||
}; | |||
@@ -153,16 +153,16 @@ class JackShmReadWritePtr | |||
void Init(int index, const char* server_name = "default") | |||
{ | |||
if (fInfo.index < 0 && index >= 0) { | |||
if (fInfo.index < 0 && index >= 0) { | |||
JackLog("JackShmReadWritePtr::Init %ld %ld\n", index, fInfo.index); | |||
if (jack_initialize_shm(server_name) < 0) | |||
throw -1; | |||
throw - 1; | |||
fInfo.index = index; | |||
if (jack_attach_shm(&fInfo)) { | |||
//jack_error("cannot attach shared memory segment", strerror(errno)); | |||
throw -2; | |||
throw - 2; | |||
} | |||
} | |||
} | |||
} | |||
public: | |||
@@ -189,12 +189,12 @@ class JackShmReadWritePtr | |||
T* operator->() const | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
operator T*() const | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
JackShmReadWritePtr& operator=(int index) | |||
@@ -202,8 +202,8 @@ class JackShmReadWritePtr | |||
Init(index); | |||
return *this; | |||
} | |||
void SetShmIndex(int index, const char* server_name) | |||
void SetShmIndex(int index, const char* server_name) | |||
{ | |||
Init(index, server_name); | |||
} | |||
@@ -215,7 +215,7 @@ class JackShmReadWritePtr | |||
T* GetShmAddress() | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
}; | |||
@@ -236,17 +236,17 @@ class JackShmReadWritePtr1 | |||
if (fInfo.index < 0 && index >= 0) { | |||
JackLog("JackShmReadWritePtr1::Init %ld %ld\n", index, fInfo.index); | |||
if (jack_initialize_shm(server_name) < 0) | |||
throw -1; | |||
throw - 1; | |||
fInfo.index = index; | |||
if (jack_attach_shm(&fInfo)) { | |||
//jack_error("cannot attach shared memory segment", strerror(errno)); | |||
throw -2; | |||
throw - 2; | |||
} | |||
/* | |||
nobody else needs to access this shared memory any more, so | |||
destroy it. because we have our own attachment to it, it won't | |||
vanish till we exit (and release it). | |||
*/ | |||
/* | |||
nobody else needs to access this shared memory any more, so | |||
destroy it. because we have our own attachment to it, it won't | |||
vanish till we exit (and release it). | |||
*/ | |||
jack_destroy_shm(&fInfo); | |||
} | |||
} | |||
@@ -275,7 +275,7 @@ class JackShmReadWritePtr1 | |||
T* operator->() const | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
operator T*() const | |||
@@ -288,11 +288,11 @@ class JackShmReadWritePtr1 | |||
Init(index); | |||
return *this; | |||
} | |||
void SetShmIndex(int index, const char* server_name) | |||
void SetShmIndex(int index, const char* server_name) | |||
{ | |||
Init(index, server_name); | |||
} | |||
} | |||
int GetShmIndex() | |||
{ | |||
@@ -301,7 +301,7 @@ class JackShmReadWritePtr1 | |||
T* GetShmAddress() | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
}; | |||
@@ -368,20 +368,20 @@ class JackShmReadPtr | |||
Init(index); | |||
return *this; | |||
} | |||
void SetShmIndex(int index, const char* server_name) | |||
void SetShmIndex(int index, const char* server_name) | |||
{ | |||
Init(index, server_name); | |||
} | |||
int GetShmIndex() | |||
int GetShmIndex() | |||
{ | |||
return fInfo.index; | |||
} | |||
T* GetShmAddress() | |||
{ | |||
return (T*)fInfo.attached_at; | |||
return (T*)fInfo.attached_at; | |||
} | |||
}; | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -158,7 +158,7 @@ int JackServerSocket::Bind(const char* dir, const char* name, int which) // A re | |||
// TO CORRECT: always reuse the same name for now... | |||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d", dir, name, which); | |||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | |||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | |||
/* | |||
if (access(addr.sun_path, F_OK) == 0) { | |||
goto error; | |||
@@ -209,7 +209,7 @@ int JackServerSocket::Bind(const char* dir, int which) // A revoir : utilisation | |||
// TO CORRECT: always reuse the same name for now... | |||
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which); | |||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | |||
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); | |||
/* | |||
if (access(addr.sun_path, F_OK) == 0) { | |||
goto error; | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -40,37 +40,37 @@ JackSocketClientChannel::~JackSocketClientChannel() | |||
int JackSocketClientChannel::ServerCheck(const char* server_name) | |||
{ | |||
JackLog("JackSocketClientChannel::ServerCheck = %s\n", server_name); | |||
JackLog("JackSocketClientChannel::ServerCheck = %s\n", server_name); | |||
// Connect to server | |||
if (fRequestSocket.Connect(jack_server_dir, server_name, 0) < 0) { | |||
jack_error("Cannot connect to server socket"); | |||
fRequestSocket.Close(); | |||
jack_error("Cannot connect to server socket"); | |||
fRequestSocket.Close(); | |||
return -1; | |||
} else { | |||
return 0; | |||
} | |||
return 0; | |||
} | |||
} | |||
int JackSocketClientChannel::Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
{ | |||
int result = 0; | |||
int result = 0; | |||
JackLog("JackSocketClientChannel::Open name = %s\n", name); | |||
if (fRequestSocket.Connect(jack_server_dir, server_name, 0) < 0) { | |||
jack_error("Cannot connect to server socket"); | |||
goto error; | |||
} | |||
// Check name in server | |||
ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); | |||
// Check name in server | |||
ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); | |||
if (result < 0) { | |||
int status1 = *status; | |||
if (status1 & JackVersionError) | |||
jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION); | |||
jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION); | |||
else | |||
jack_error("Client name = %s conflits with another running client", name); | |||
goto error; | |||
jack_error("Client name = %s conflits with another running client", name); | |||
goto error; | |||
} | |||
if (fNotificationListenSocket.Bind(jack_client_dir, name_res, 0) < 0) { | |||
@@ -141,11 +141,11 @@ void JackSocketClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res, | |||
void JackSocketClientChannel::ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) | |||
{ | |||
JackClientCheckRequest req(name, protocol, options); | |||
JackClientCheckRequest req(name, protocol, options); | |||
JackClientCheckResult res; | |||
ServerSyncCall(&req, &res, result); | |||
*status = res.fStatus; | |||
strcpy(name_res, res.fName); | |||
*status = res.fStatus; | |||
strcpy(name_res, res.fName); | |||
} | |||
void JackSocketClientChannel::ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) | |||
@@ -255,7 +255,7 @@ void JackSocketClientChannel::GetInternalClientName(int refnum, int int_ref, cha | |||
JackGetInternalClientNameRequest req(refnum, int_ref); | |||
JackGetInternalClientNameResult res; | |||
ServerSyncCall(&req, &res, result); | |||
strcpy(name_res, res.fName); | |||
strcpy(name_res, res.fName); | |||
} | |||
void JackSocketClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) | |||
@@ -263,8 +263,8 @@ void JackSocketClientChannel::InternalClientHandle(int refnum, const char* clien | |||
JackInternalClientHandleRequest req(refnum, client_name); | |||
JackInternalClientHandleResult res; | |||
ServerSyncCall(&req, &res, result); | |||
*int_ref = res.fIntRefNum; | |||
*status = res.fStatus; | |||
*int_ref = res.fIntRefNum; | |||
*status = res.fStatus; | |||
} | |||
void JackSocketClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result) | |||
@@ -272,8 +272,8 @@ void JackSocketClientChannel::InternalClientLoad(int refnum, const char* client_ | |||
JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options); | |||
JackInternalClientLoadResult res; | |||
ServerSyncCall(&req, &res, result); | |||
*int_ref = res.fIntRefNum; | |||
*status = res.fStatus; | |||
*int_ref = res.fIntRefNum; | |||
*status = res.fStatus; | |||
} | |||
void JackSocketClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) | |||
@@ -281,7 +281,7 @@ void JackSocketClientChannel::InternalClientUnload(int refnum, int int_ref, int* | |||
JackInternalClientUnloadRequest req(refnum, int_ref); | |||
JackInternalClientUnloadResult res; | |||
ServerSyncCall(&req, &res, result); | |||
*status = res.fStatus; | |||
*status = res.fStatus; | |||
} | |||
bool JackSocketClientChannel::Init() | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -56,10 +56,10 @@ class JackSocketClientChannel : public JackClientChannelInterface, public JackRu | |||
int Start(); | |||
void Stop(); | |||
int ServerCheck(const char* server_name); | |||
void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result); | |||
int ServerCheck(const char* server_name); | |||
void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result); | |||
void ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result); | |||
void ClientClose(int refnum, int* result); | |||
@@ -80,12 +80,12 @@ class JackSocketClientChannel : public JackClientChannelInterface, public JackRu | |||
void ReleaseTimebase(int refnum, int* result); | |||
void SetTimebaseCallback(int refnum, int conditional, int* result); | |||
void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); | |||
void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); | |||
void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); | |||
void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result); | |||
void InternalClientUnload(int refnum, int int_ref, int* status, int* result); | |||
// JackRunnableInterface interface | |||
bool Init(); | |||
bool Execute(); | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -47,7 +47,7 @@ JackSocketServerChannel::~JackSocketServerChannel() | |||
int JackSocketServerChannel::Open(const char* server_name, JackServer* server) | |||
{ | |||
JackLog("JackSocketServerChannel::Open \n"); | |||
fServer = server; | |||
fServer = server; | |||
// Prepare request socket | |||
if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) { | |||
@@ -93,7 +93,7 @@ void JackSocketServerChannel::ClientAdd(int fd, char* name, int* shared_engine, | |||
{ | |||
JackLog("JackSocketServerChannel::ClientAdd\n"); | |||
int refnum = -1; | |||
*result = fServer->GetEngine()->ClientExternalOpen(name, &refnum, shared_engine, shared_client, shared_graph); | |||
*result = fServer->GetEngine()->ClientExternalOpen(name, &refnum, shared_engine, shared_client, shared_graph); | |||
if (*result == 0) { | |||
fSocketTable[fd].first = refnum; | |||
fRebuild = true; | |||
@@ -150,223 +150,223 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||
// Read data | |||
switch (header.fType) { | |||
case JackRequest::kClientCheck: { | |||
JackLog("JackRequest::kClientCheck\n"); | |||
JackClientCheckRequest req; | |||
JackClientCheckResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, res.fName, req.fProtocol, req.fOptions, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kClientCheck write error name = %s", req.fName); | |||
break; | |||
} | |||
case JackRequest::kClientCheck: { | |||
JackLog("JackRequest::kClientCheck\n"); | |||
JackClientCheckRequest req; | |||
JackClientCheckResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, res.fName, req.fProtocol, req.fOptions, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kClientCheck write error name = %s", req.fName); | |||
break; | |||
} | |||
case JackRequest::kClientOpen: { | |||
JackLog("JackRequest::ClientOpen\n"); | |||
JackClientOpenRequest req; | |||
JackClientOpenResult res; | |||
if (req.Read(socket) == 0) | |||
ClientAdd(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kClientOpen write error name = %s", req.fName); | |||
break; | |||
} | |||
JackLog("JackRequest::ClientOpen\n"); | |||
JackClientOpenRequest req; | |||
JackClientOpenResult res; | |||
if (req.Read(socket) == 0) | |||
ClientAdd(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kClientOpen write error name = %s", req.fName); | |||
break; | |||
} | |||
case JackRequest::kClientClose: { | |||
JackLog("JackRequest::ClientClose\n"); | |||
JackClientCloseRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); | |||
// No write: client is actually doing an "ServerAsyncCall", and not interested by the result | |||
ClientRemove(fd, req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::ClientClose\n"); | |||
JackClientCloseRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); | |||
// No write: client is actually doing an "ServerAsyncCall", and not interested by the result | |||
ClientRemove(fd, req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kActivateClient: { | |||
JackActivateRequest req; | |||
JackResult res; | |||
JackLog("JackRequest::ActivateClient\n"); | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kActivateClient write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackActivateRequest req; | |||
JackResult res; | |||
JackLog("JackRequest::ActivateClient\n"); | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kActivateClient write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kDeactivateClient: { | |||
JackLog("JackRequest::DeactivateClient\n"); | |||
JackDeactivateRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDeactivateClient write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::DeactivateClient\n"); | |||
JackDeactivateRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDeactivateClient write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kRegisterPort: { | |||
JackLog("JackRequest::RegisterPort\n"); | |||
JackPortRegisterRequest req; | |||
JackPortRegisterResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kRegisterPort write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::RegisterPort\n"); | |||
JackPortRegisterRequest req; | |||
JackPortRegisterResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kRegisterPort write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kUnRegisterPort: { | |||
JackLog("JackRequest::UnRegisterPort\n"); | |||
JackPortUnRegisterRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kUnRegisterPort write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::UnRegisterPort\n"); | |||
JackPortUnRegisterRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kUnRegisterPort write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kConnectNamePorts: { | |||
JackLog("JackRequest::ConnectPorts\n"); | |||
JackPortConnectNameRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kConnectNamePorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::ConnectPorts\n"); | |||
JackPortConnectNameRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kConnectNamePorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kDisconnectNamePorts: { | |||
JackLog("JackRequest::DisconnectPorts\n"); | |||
JackPortDisconnectNameRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDisconnectNamePorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::DisconnectPorts\n"); | |||
JackPortDisconnectNameRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDisconnectNamePorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kConnectPorts: { | |||
JackLog("JackRequest::ConnectPorts\n"); | |||
JackPortConnectRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kConnectPorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::ConnectPorts\n"); | |||
JackPortConnectRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kConnectPorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kDisconnectPorts: { | |||
JackLog("JackRequest::DisconnectPorts\n"); | |||
JackPortDisconnectRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDisconnectPorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::DisconnectPorts\n"); | |||
JackPortDisconnectRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kDisconnectPorts write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kSetBufferSize: { | |||
JackLog("JackRequest::SetBufferSize\n"); | |||
JackSetBufferSizeRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetBufferSize write error"); | |||
break; | |||
} | |||
JackLog("JackRequest::SetBufferSize\n"); | |||
JackSetBufferSizeRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetBufferSize write error"); | |||
break; | |||
} | |||
case JackRequest::kSetFreeWheel: { | |||
JackLog("JackRequest::SetFreeWheel\n"); | |||
JackSetFreeWheelRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetFreewheel(req.fOnOff); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetFreeWheel write error"); | |||
break; | |||
} | |||
JackLog("JackRequest::SetFreeWheel\n"); | |||
JackSetFreeWheelRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetFreewheel(req.fOnOff); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetFreeWheel write error"); | |||
break; | |||
} | |||
case JackRequest::kReleaseTimebase: { | |||
JackLog("JackRequest::kReleaseTimebase\n"); | |||
JackReleaseTimebaseRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->ReleaseTimebase(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kReleaseTimebase write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::kReleaseTimebase\n"); | |||
JackReleaseTimebaseRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->ReleaseTimebase(req.fRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kReleaseTimebase write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kSetTimebaseCallback: { | |||
JackLog("JackRequest::kSetTimebaseCallback\n"); | |||
JackSetTimebaseCallbackRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetTimebaseCallback write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kGetInternalClientName: { | |||
JackLog("JackRequest::kGetInternalClientName\n"); | |||
JackGetInternalClientNameRequest req; | |||
JackGetInternalClientNameResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kGetInternalClientName write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kInternalClientHandle: { | |||
JackLog("JackRequest::kInternalClientHandle\n"); | |||
JackInternalClientHandleRequest req; | |||
JackInternalClientHandleResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientHandle write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kInternalClientLoad: { | |||
JackLog("JackRequest::kInternalClientLoad\n"); | |||
JackInternalClientLoadRequest req; | |||
JackInternalClientLoadResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientLoad write error name = %s", req.fName); | |||
break; | |||
} | |||
case JackRequest::kInternalClientUnload: { | |||
JackLog("JackRequest::kInternalClientUnload\n"); | |||
JackInternalClientUnloadRequest req; | |||
JackInternalClientUnloadResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientUnload write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
JackLog("JackRequest::kSetTimebaseCallback\n"); | |||
JackSetTimebaseCallbackRequest req; | |||
JackResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kSetTimebaseCallback write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kGetInternalClientName: { | |||
JackLog("JackRequest::kGetInternalClientName\n"); | |||
JackGetInternalClientNameRequest req; | |||
JackGetInternalClientNameResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kGetInternalClientName write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kInternalClientHandle: { | |||
JackLog("JackRequest::kInternalClientHandle\n"); | |||
JackInternalClientHandleRequest req; | |||
JackInternalClientHandleResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientHandle write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kInternalClientLoad: { | |||
JackLog("JackRequest::kInternalClientLoad\n"); | |||
JackInternalClientLoadRequest req; | |||
JackInternalClientLoadResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientLoad write error name = %s", req.fName); | |||
break; | |||
} | |||
case JackRequest::kInternalClientUnload: { | |||
JackLog("JackRequest::kInternalClientUnload\n"); | |||
JackInternalClientUnloadRequest req; | |||
JackInternalClientUnloadResult res; | |||
if (req.Read(socket) == 0) | |||
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); | |||
if (res.Write(socket) < 0) | |||
jack_error("JackRequest::kInternalClientUnload write error ref = %d", req.fRefNum); | |||
break; | |||
} | |||
case JackRequest::kNotification: { | |||
JackLog("JackRequest::Notification\n"); | |||
JackClientNotificationRequest req; | |||
if (req.Read(socket) == 0) | |||
fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||
break; | |||
} | |||
JackLog("JackRequest::Notification\n"); | |||
JackClientNotificationRequest req; | |||
if (req.Read(socket) == 0) | |||
fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||
break; | |||
} | |||
default: | |||
JackLog("Unknown request %ld\n", header.fType); | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -46,13 +46,13 @@ class JackSocketServerChannel : public JackServerChannelInterface, public JackRu | |||
std::map<int, std::pair<int, JackClientSocket*> > fSocketTable; | |||
int HandleRequest(int fd); | |||
void BuildPoolTable(); | |||
void BuildPoolTable(); | |||
void ClientCreate(); | |||
void ClientAdd(int fd, char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result); | |||
void ClientRemove(int fd, int refnum); | |||
void ClientKill(int fd); | |||
public: | |||
JackSocketServerChannel(); | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -41,9 +41,9 @@ void JackSocketServerNotifyChannel::Close() | |||
} | |||
/* | |||
The requirement is that the Notification from RT thread can be delivered... not sure using a socket is adequate here... | |||
Can the write operation block? | |||
A non blocking write operation shoud be used : check if write can succeed, and ignore the notification otherwise | |||
The requirement is that the Notification from RT thread can be delivered... not sure using a socket is adequate here... | |||
Can the write operation block? | |||
A non blocking write operation shoud be used : check if write can succeed, and ignore the notification otherwise | |||
(since its mainly used for XRun, ignoring a notification is OK, successive XRun will come...) | |||
*/ | |||
void JackSocketServerNotifyChannel::ClientNotify(int refnum, int notify, int value) | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
@@ -22,11 +22,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#define __JackThread__ | |||
#ifdef WIN32 | |||
#include <windows.h> | |||
#include <windows.h> | |||
typedef HANDLE pthread_t; | |||
typedef ULONGLONG UInt64; | |||
#else | |||
#include <pthread.h> | |||
#include <pthread.h> | |||
typedef unsigned long long UInt64; | |||
#endif | |||
@@ -81,7 +81,7 @@ class JackThread | |||
virtual int StartSync() = 0; | |||
virtual int Kill() = 0; | |||
virtual int Stop() = 0; | |||
virtual void Terminate() = 0; | |||
virtual void Terminate() = 0; | |||
virtual int AcquireRealTime() = 0; | |||
virtual int AcquireRealTime(int priority) = 0; | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -18,7 +18,7 @@ | |||
*/ | |||
#ifdef WIN32 | |||
#ifdef WIN32 | |||
#pragma warning (disable : 4786) | |||
#endif | |||
@@ -59,7 +59,7 @@ int JackThreadedDriver::Start() | |||
if (fDriver->IsRealTime()) { | |||
JackLog("JackThreadedDriver::Start IsRealTime\n"); | |||
if (fThread->AcquireRealTime(GetEngineControl()->fPriority) < 0) | |||
if (fThread->AcquireRealTime(GetEngineControl()->fPriority) < 0) | |||
jack_error("AcquireRealTime error"); | |||
} | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -82,8 +82,8 @@ class JackThreadedDriver : public JackDriverClientInterface, public JackRunnable | |||
{ | |||
return fDriver->Detach(); | |||
} | |||
virtual int Read() | |||
virtual int Read() | |||
{ | |||
return fDriver->Read(); | |||
} | |||
@@ -99,8 +99,8 @@ class JackThreadedDriver : public JackDriverClientInterface, public JackRunnable | |||
{ | |||
return fDriver->SetBufferSize(buffer_size); | |||
} | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) | |||
virtual int SetSampleRate(jack_nframes_t sample_rate) | |||
{ | |||
return fDriver->SetSampleRate(sample_rate); | |||
} | |||
@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -37,16 +37,14 @@ extern "C" | |||
extern double __jack_time_ratio; | |||
static inline jack_time_t GetMicroSeconds(void) | |||
{ | |||
static inline jack_time_t GetMicroSeconds(void) { | |||
return (jack_time_t) (mach_absolute_time () * __jack_time_ratio); | |||
} | |||
/* This should only be called ONCE per process. */ | |||
extern void InitTime(); | |||
static inline void JackSleep(int usec) | |||
{ | |||
static inline void JackSleep(int usec) { | |||
usleep(usec); | |||
} | |||
@@ -60,8 +58,7 @@ extern "C" | |||
extern void InitTime(); | |||
static void JackSleep(int usec) | |||
{ | |||
static void JackSleep(int usec) { | |||
Sleep(usec / 1000); | |||
} | |||
@@ -71,25 +68,22 @@ extern "C" | |||
#include <unistd.h> | |||
static inline void JackSleep(long usec) | |||
{ | |||
static inline void JackSleep(long usec) { | |||
usleep(usec); | |||
} | |||
#ifdef GETCYCLE_TIME | |||
#include "cycles.h" | |||
#include "cycles.h" | |||
extern jack_time_t __jack_cpu_mhz; | |||
extern jack_time_t GetMhz(); | |||
extern void InitTime(); | |||
static inline jack_time_t GetMicroSeconds(void) | |||
{ | |||
static inline jack_time_t GetMicroSeconds(void) { | |||
return get_cycles() / __jack_cpu_mhz; | |||
} | |||
#else | |||
#include <time.h> | |||
#include <time.h> | |||
extern void InitTime(); | |||
static inline jack_time_t GetMicroSeconds(void) | |||
{ | |||
static inline jack_time_t GetMicroSeconds(void) { | |||
struct timespec ts; | |||
clock_gettime(CLOCK_MONOTONIC, &ts); | |||
return (jack_time_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000; | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -31,22 +31,22 @@ namespace Jack | |||
#define DEFAULT_TMP_DIR "/tmp" | |||
char* jack_tmpdir = (char*)DEFAULT_TMP_DIR; | |||
int JackTools::GetPID() | |||
int JackTools::GetPID() | |||
{ | |||
#ifdef WIN32 | |||
return _getpid(); | |||
return _getpid(); | |||
#else | |||
return getpid(); | |||
return getpid(); | |||
#endif | |||
} | |||
int JackTools::GetUID() | |||
int JackTools::GetUID() | |||
{ | |||
#ifdef WIN32 | |||
return _getpid(); | |||
//#error "No getuid function available" | |||
return _getpid(); | |||
//#error "No getuid function available" | |||
#else | |||
return getuid(); | |||
return getuid(); | |||
#endif | |||
} | |||
@@ -63,152 +63,151 @@ const char* JackTools::DefaultServerName() | |||
char* JackTools::UserDir() | |||
{ | |||
return ""; | |||
return ""; | |||
} | |||
char* JackTools::ServerDir(const char* server_name, char* server_dir) | |||
{ | |||
return ""; | |||
return ""; | |||
} | |||
void JackTools::CleanupFiles(const char* server_name) | |||
{ | |||
} | |||
int JackTools::GetTmpdir() | |||
{ | |||
return 0; | |||
return 0; | |||
} | |||
#else | |||
char* JackTools::UserDir() | |||
{ | |||
static char user_dir[PATH_MAX + 1] = ""; | |||
/* format the path name on the first call */ | |||
if (user_dir[0] == '\0') { | |||
if (getenv ("JACK_PROMISCUOUS_SERVER")) { | |||
snprintf(user_dir, sizeof(user_dir), "%s/jack", jack_tmpdir); | |||
} else { | |||
snprintf(user_dir, sizeof(user_dir), "%s/jack-%d", jack_tmpdir, GetUID()); | |||
} | |||
} | |||
return user_dir; | |||
static char user_dir[PATH_MAX + 1] = ""; | |||
/* format the path name on the first call */ | |||
if (user_dir[0] == '\0') { | |||
if (getenv ("JACK_PROMISCUOUS_SERVER")) { | |||
snprintf(user_dir, sizeof(user_dir), "%s/jack", jack_tmpdir); | |||
} else { | |||
snprintf(user_dir, sizeof(user_dir), "%s/jack-%d", jack_tmpdir, GetUID()); | |||
} | |||
} | |||
return user_dir; | |||
} | |||
/* returns the name of the per-server subdirectory of jack_user_dir() */ | |||
char* JackTools::ServerDir(const char* server_name, char* server_dir) | |||
{ | |||
/* format the path name into the suppled server_dir char array, | |||
* assuming that server_dir is at least as large as PATH_MAX+1 */ | |||
/* format the path name into the suppled server_dir char array, | |||
* assuming that server_dir is at least as large as PATH_MAX+1 */ | |||
snprintf(server_dir, PATH_MAX + 1, "%s/%s", UserDir(), server_name); | |||
return server_dir; | |||
snprintf(server_dir, PATH_MAX + 1, "%s/%s", UserDir(), server_name); | |||
return server_dir; | |||
} | |||
void JackTools::CleanupFiles(const char* server_name) | |||
{ | |||
DIR* dir; | |||
struct dirent *dirent; | |||
char dir_name[PATH_MAX + 1] = ""; | |||
ServerDir(server_name, dir_name); | |||
/* On termination, we remove all files that jackd creates so | |||
* subsequent attempts to start jackd will not believe that an | |||
* instance is already running. If the server crashes or is | |||
* terminated with SIGKILL, this is not possible. So, cleanup | |||
* is also attempted when jackd starts. | |||
* | |||
* There are several tricky issues. First, the previous JACK | |||
* server may have run for a different user ID, so its files | |||
* may be inaccessible. This is handled by using a separate | |||
* JACK_TMP_DIR subdirectory for each user. Second, there may | |||
* be other servers running with different names. Each gets | |||
* its own subdirectory within the per-user directory. The | |||
* current process has already registered as `server_name', so | |||
* we know there is no other server actively using that name. | |||
*/ | |||
/* nothing to do if the server directory does not exist */ | |||
if ((dir = opendir(dir_name)) == NULL) { | |||
return; | |||
} | |||
/* unlink all the files in this directory, they are mine */ | |||
while ((dirent = readdir(dir)) != NULL) { | |||
char fullpath[PATH_MAX + 1]; | |||
if ((strcmp(dirent->d_name, ".") == 0) || (strcmp (dirent->d_name, "..") == 0)) { | |||
continue; | |||
} | |||
snprintf(fullpath, sizeof(fullpath), "%s/%s", dir_name, dirent->d_name); | |||
if (unlink(fullpath)) { | |||
jack_error("cannot unlink `%s' (%s)", fullpath, strerror(errno)); | |||
} | |||
} | |||
closedir(dir); | |||
/* now, delete the per-server subdirectory, itself */ | |||
if (rmdir(dir_name)) { | |||
jack_error("cannot remove `%s' (%s)", dir_name, strerror(errno)); | |||
} | |||
/* finally, delete the per-user subdirectory, if empty */ | |||
if (rmdir(UserDir())) { | |||
if (errno != ENOTEMPTY) { | |||
jack_error("cannot remove `%s' (%s)", UserDir(), strerror(errno)); | |||
} | |||
} | |||
struct dirent *dirent; | |||
char dir_name[PATH_MAX + 1] = ""; | |||
ServerDir(server_name, dir_name); | |||
/* On termination, we remove all files that jackd creates so | |||
* subsequent attempts to start jackd will not believe that an | |||
* instance is already running. If the server crashes or is | |||
* terminated with SIGKILL, this is not possible. So, cleanup | |||
* is also attempted when jackd starts. | |||
* | |||
* There are several tricky issues. First, the previous JACK | |||
* server may have run for a different user ID, so its files | |||
* may be inaccessible. This is handled by using a separate | |||
* JACK_TMP_DIR subdirectory for each user. Second, there may | |||
* be other servers running with different names. Each gets | |||
* its own subdirectory within the per-user directory. The | |||
* current process has already registered as `server_name', so | |||
* we know there is no other server actively using that name. | |||
*/ | |||
/* nothing to do if the server directory does not exist */ | |||
if ((dir = opendir(dir_name)) == NULL) { | |||
return; | |||
} | |||
/* unlink all the files in this directory, they are mine */ | |||
while ((dirent = readdir(dir)) != NULL) { | |||
char fullpath[PATH_MAX + 1]; | |||
if ((strcmp(dirent->d_name, ".") == 0) || (strcmp (dirent->d_name, "..") == 0)) { | |||
continue; | |||
} | |||
snprintf(fullpath, sizeof(fullpath), "%s/%s", dir_name, dirent->d_name); | |||
if (unlink(fullpath)) { | |||
jack_error("cannot unlink `%s' (%s)", fullpath, strerror(errno)); | |||
} | |||
} | |||
closedir(dir); | |||
/* now, delete the per-server subdirectory, itself */ | |||
if (rmdir(dir_name)) { | |||
jack_error("cannot remove `%s' (%s)", dir_name, strerror(errno)); | |||
} | |||
/* finally, delete the per-user subdirectory, if empty */ | |||
if (rmdir(UserDir())) { | |||
if (errno != ENOTEMPTY) { | |||
jack_error("cannot remove `%s' (%s)", UserDir(), strerror(errno)); | |||
} | |||
} | |||
} | |||
int JackTools::GetTmpdir() | |||
{ | |||
FILE* in; | |||
size_t len; | |||
char buf[PATH_MAX + 2]; /* allow tmpdir to live anywhere, plus newline, plus null */ | |||
if ((in = popen("jackd -l", "r")) == NULL) { | |||
return -1; | |||
} | |||
if (fgets(buf, sizeof(buf), in) == NULL) { | |||
fclose(in); | |||
return -1; | |||
} | |||
len = strlen(buf); | |||
if (buf[len - 1] != '\n') { | |||
/* didn't get a whole line */ | |||
fclose(in); | |||
return -1; | |||
} | |||
jack_tmpdir = (char *)malloc(len); | |||
memcpy(jack_tmpdir, buf, len - 1); | |||
jack_tmpdir[len - 1] = '\0'; | |||
fclose(in); | |||
return 0; | |||
FILE* in; | |||
size_t len; | |||
char buf[PATH_MAX + 2]; /* allow tmpdir to live anywhere, plus newline, plus null */ | |||
if ((in = popen("jackd -l", "r")) == NULL) { | |||
return -1; | |||
} | |||
if (fgets(buf, sizeof(buf), in) == NULL) { | |||
fclose(in); | |||
return -1; | |||
} | |||
len = strlen(buf); | |||
if (buf[len - 1] != '\n') { | |||
/* didn't get a whole line */ | |||
fclose(in); | |||
return -1; | |||
} | |||
jack_tmpdir = (char *)malloc(len); | |||
memcpy(jack_tmpdir, buf, len - 1); | |||
jack_tmpdir[len - 1] = '\0'; | |||
fclose(in); | |||
return 0; | |||
} | |||
#endif | |||
void JackTools::RewriteName(const char* name, char* new_name) | |||
{ | |||
size_t i; | |||
for (i = 0; i < strlen(name); i++) { | |||
if ((name[i] == '/') || (name[i] == '\\')) | |||
new_name[i] = '_'; | |||
else | |||
new_name[i] = name[i]; | |||
} | |||
new_name[i] = '\0'; | |||
size_t i; | |||
for (i = 0; i < strlen(name); i++) { | |||
if ((name[i] == '/') || (name[i] == '\\')) | |||
new_name[i] = '_'; | |||
else | |||
new_name[i] = name[i]; | |||
} | |||
new_name[i] = '\0'; | |||
} | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
@@ -21,33 +21,34 @@ | |||
#define __JackTools__ | |||
#ifdef WIN32 | |||
#include <windows.h> | |||
#include <windows.h> | |||
#else | |||
#include <sys/types.h> | |||
#include <unistd.h> | |||
#include <dirent.h> | |||
#include <sys/types.h> | |||
#include <unistd.h> | |||
#include <dirent.h> | |||
#endif | |||
#ifdef __APPLE__ | |||
#include <sys/syslimits.h> | |||
#include <sys/syslimits.h> | |||
#endif | |||
namespace Jack | |||
{ | |||
struct JackTools { | |||
static int GetPID(); | |||
static int GetUID(); | |||
static char* UserDir(); | |||
static char* ServerDir(const char* server_name, char* server_dir); | |||
static const char* DefaultServerName(); | |||
static void CleanupFiles(const char* server_name); | |||
static int GetTmpdir(); | |||
static void RewriteName(const char* name, char* new_name); | |||
}; | |||
struct JackTools | |||
{ | |||
static int GetPID(); | |||
static int GetUID(); | |||
static char* UserDir(); | |||
static char* ServerDir(const char* server_name, char* server_dir); | |||
static const char* DefaultServerName(); | |||
static void CleanupFiles(const char* server_name); | |||
static int GetTmpdir(); | |||
static void RewriteName(const char* name, char* new_name); | |||
}; | |||
} | |||
#endif |
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -21,7 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#include "JackTransportEngine.h" | |||
#include "JackClientControl.h" | |||
#include "JackError.h" | |||
#include "JackTime.h" | |||
#include "JackTime.h" | |||
#include <assert.h> | |||
#include <stdlib.h> | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -37,17 +37,17 @@ typedef enum { | |||
/*! | |||
\brief The client transport structure. | |||
We have: | |||
- a "current" position | |||
- a "pending" position prepared by the server at each cycle | |||
- a "request" position wanted by a client | |||
At the beginning of a cycle the server needs to select a new current position. When a request and a pending position are available, | |||
the resquest takes precedence on the pending one. The server atomically switches to the new position. | |||
the resquest takes precedence on the pending one. The server atomically switches to the new position. | |||
The current position can be read by clients. | |||
We use a JackAtomicArrayState pattern that allows to manage several "next" states independantly. | |||
*/ | |||
@@ -1,18 +1,18 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
$Id: JackTypes.h,v 1.2.2.1 2006/06/20 14:44:00 letz Exp $ | |||
@@ -32,9 +32,9 @@ typedef signed long SInt32; | |||
#ifdef WIN32 | |||
#include <windows.h> | |||
typedef ULONGLONG UInt64; | |||
typedef ULONGLONG UInt64; | |||
typedef unsigned short uint16_t; | |||
#else | |||
#else | |||
#include <stdint.h> | |||
typedef unsigned long long UInt64; | |||
#endif | |||
@@ -1,5 +1,5 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
@@ -62,34 +62,34 @@ static void silent_jack_error_callback(const char *desc) | |||
static void copyright(FILE* file) | |||
{ | |||
fprintf(file, "jackdmp " VERSION "\n" | |||
"Copyright 2001-2005 Paul Davis and others.\n" | |||
"Copyright 2004-2008 Grame.\n" | |||
"jackdmp comes with ABSOLUTELY NO WARRANTY\n" | |||
"This is free software, and you are welcome to redistribute it\n" | |||
"under certain conditions; see the file COPYING for details\n"); | |||
"Copyright 2001-2005 Paul Davis and others.\n" | |||
"Copyright 2004-2008 Grame.\n" | |||
"jackdmp comes with ABSOLUTELY NO WARRANTY\n" | |||
"This is free software, and you are welcome to redistribute it\n" | |||
"under certain conditions; see the file COPYING for details\n"); | |||
} | |||
static void usage(FILE* file) | |||
{ | |||
copyright(file); | |||
fprintf(file, "\n" | |||
"usage: jackdmp [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n" | |||
" [ --name OR -n server-name ]\n" | |||
// " [ --no-mlock OR -m ]\n" | |||
// " [ --unlock OR -u ]\n" | |||
" [ --timeout OR -t client-timeout-in-msecs ]\n" | |||
" [ --loopback OR -L loopback-port-number ]\n" | |||
// " [ --port-max OR -p maximum-number-of-ports]\n" | |||
" [ --verbose OR -v ]\n" | |||
" [ --replace-registry OR -r ]\n" | |||
" [ --silent OR -s ]\n" | |||
" [ --sync OR -S ]\n" | |||
" [ --temporary OR -T ]\n" | |||
" [ --version OR -V ]\n" | |||
" -d driver [ ... driver args ... ]\n" | |||
" where driver can be `alsa', `coreaudio', 'portaudio' or `dummy'\n" | |||
" jackdmp -d driver --help\n" | |||
" to display options for each driver\n\n"); | |||
"usage: jackdmp [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n" | |||
" [ --name OR -n server-name ]\n" | |||
// " [ --no-mlock OR -m ]\n" | |||
// " [ --unlock OR -u ]\n" | |||
" [ --timeout OR -t client-timeout-in-msecs ]\n" | |||
" [ --loopback OR -L loopback-port-number ]\n" | |||
// " [ --port-max OR -p maximum-number-of-ports]\n" | |||
" [ --verbose OR -v ]\n" | |||
" [ --replace-registry OR -r ]\n" | |||
" [ --silent OR -s ]\n" | |||
" [ --sync OR -S ]\n" | |||
" [ --temporary OR -T ]\n" | |||
" [ --version OR -V ]\n" | |||
" -d driver [ ... driver args ... ]\n" | |||
" where driver can be `alsa', `coreaudio', 'portaudio' or `dummy'\n" | |||
" jackdmp -d driver --help\n" | |||
" to display options for each driver\n\n"); | |||
} | |||
@@ -148,7 +148,8 @@ int main(int argc, char* argv[]) | |||
jack_driver_desc_t* driver_desc; | |||
const char *options = "-ad:P:uvrshVRL:STFl:t:mn:p:"; | |||
struct option long_options[] = { | |||
{ "driver", 1, 0, 'd' }, | |||
{ "driver", 1, 0, 'd' | |||
}, | |||
{ "verbose", 0, 0, 'v' }, | |||
{ "help", 0, 0, 'h' }, | |||
{ "port-max", 1, 0, 'p' }, | |||
@@ -156,7 +157,7 @@ int main(int argc, char* argv[]) | |||
{ "name", 0, 0, 'n' }, | |||
{ "unlock", 0, 0, 'u' }, | |||
{ "realtime", 0, 0, 'R' }, | |||
{ "replace-registry", 0, 0, 'r' }, | |||
{ "replace-registry", 0, 0, 'r' }, | |||
{ "loopback", 0, 0, 'L' }, | |||
{ "realtime-priority", 1, 0, 'P' }, | |||
{ "timeout", 1, 0, 't' }, | |||
@@ -174,7 +175,7 @@ int main(int argc, char* argv[]) | |||
JSList* driver_params; | |||
int driver_nargs = 1; | |||
int show_version = 0; | |||
int replace_registry = 0; | |||
int replace_registry = 0; | |||
int sync = 0; | |||
int rc, i; | |||
@@ -216,11 +217,11 @@ int main(int argc, char* argv[]) | |||
case 'P': | |||
realtime_priority = atoi(optarg); | |||
break; | |||
case 'r': | |||
replace_registry = 1; | |||
break; | |||
case 'r': | |||
replace_registry = 1; | |||
break; | |||
case 'R': | |||
realtime = 1; | |||
break; | |||
@@ -290,7 +291,7 @@ int main(int argc, char* argv[]) | |||
if (driver_nargs == 0) { | |||
fprintf(stderr, "No driver specified ... hmm. JACK won't do" | |||
" anything when run like this.\n"); | |||
" anything when run like this.\n"); | |||
return -1; | |||
} | |||
@@ -302,7 +303,7 @@ int main(int argc, char* argv[]) | |||
} | |||
if (jack_parse_driver_params(driver_desc, driver_nargs, | |||
driver_args, &driver_params)) { | |||
driver_args, &driver_params)) { | |||
exit(0); | |||
} | |||
@@ -360,16 +361,16 @@ int main(int argc, char* argv[]) | |||
} | |||
#ifdef __APPLE__ | |||
CFStringRef ref = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman); | |||
CFStringRef ref = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman); | |||
// Send notification to be used in the JackRouter plugin | |||
CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(), | |||
CFSTR("com.grame.jackserver.start"), | |||
ref, | |||
NULL, | |||
kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions); | |||
CFRelease(ref); | |||
CFSTR("com.grame.jackserver.start"), | |||
ref, | |||
NULL, | |||
kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions); | |||
CFRelease(ref); | |||
#endif | |||
// install a do-nothing handler because otherwise pthreads | |||
// behaviour is undefined when we enter sigwait. | |||
@@ -410,22 +411,22 @@ int main(int argc, char* argv[]) | |||
// bugs that cause segfaults etc. during shutdown. | |||
sigprocmask(SIG_UNBLOCK, &signals, 0); | |||
} | |||
JackStop(); | |||
JackStop(); | |||
jack_cleanup_shm(); | |||
JackTools::CleanupFiles(server_name); | |||
jack_unregister_server(server_name); | |||
#ifdef __APPLE__ | |||
CFStringRef ref1 = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman); | |||
CFStringRef ref1 = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman); | |||
// Send notification to be used in the JackRouter plugin | |||
CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(), | |||
CFSTR("com.grame.jackserver.stop"), | |||
ref1, | |||
NULL, | |||
kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions); | |||
CFRelease(ref1); | |||
CFSTR("com.grame.jackserver.stop"), | |||
ref1, | |||
NULL, | |||
kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions); | |||
CFRelease(ref1); | |||
#endif | |||
return 1; | |||