62#if defined (__linux__) && defined (_GNU_SOURCE)
67#define MOD_NAME "[jack_common] "
71typedef jack_client_t *(*jack_client_open_t)(
const char *client_name,
73 jack_status_t *
status, ...) JACK_OPTIONAL_WEAK_EXPORT;
75 const
char *source_port,
76 const
char *destination_port) JACK_OPTIONAL_WEAK_EXPORT;
79 const
char *source_port,
80 const
char *destination_port) JACK_OPTIONAL_WEAK_EXPORT;
81typedef
void (*
jack_free_t)(
void* ptr) JACK_OPTIONAL_WEAK_EXPORT;
83 const
char *port_name_pattern,
84 const
char *type_name_pattern,
85 unsigned long flags) JACK_OPTIONAL_WEAK_EXPORT;
88typedef const
char * (*
jack_port_name_t)(const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
90 const
char *port_name,
91 const
char *port_type,
93 unsigned long buffer_size) JACK_OPTIONAL_WEAK_EXPORT;
95 JackProcessCallback process_callback,
96 void *arg) JACK_OPTIONAL_WEAK_EXPORT;
98 JackSampleRateCallback srate_callback,
99 void *arg) JACK_OPTIONAL_WEAK_EXPORT;
126 if (s->
libjack != RTLD_DEFAULT) {
135#define JACK_DLSYM(sym) s->sym = (void *) dlsym(s->libjack, "jack_" #sym); if (s->sym == NULL) { log_msg(LOG_LEVEL_ERROR, "JACK symbol %s not found: %s\n", "jack_" #sym, dlerror()); return false; }
162 if (dlsym(RTLD_DEFAULT,
"jack_activate") != NULL) {
171 const char *shlib[] = {
173 "C:/Windows/libjack64.dll"
174#elif defined(__APPLE__)
176 "/opt/homebrew/lib/libjack.dylib",
179 "/usr/local/lib/libjack.dylib"
180#elif defined(__linux__)
186 for (
unsigned i = 0; i <
sizeof shlib /
sizeof shlib[0]; ++i) {
187 s->
libjack = dlopen(shlib[i], RTLD_NOW);
189 MSG(VERBOSE,
"library loaded from: %s\n", shlib[i]);
192 snprintf(err + strlen(err),
sizeof err - strlen(err),
193 "JACK library \"%s\" opening failed: %s\n", shlib[i],
207 dlinfo(s->
libjack, RTLD_DI_ORIGIN, path);
214 unsigned long port_flags,
219 char *last_name = NULL;
230 if(
status & JackFailure) {
243 for(port_count = 0; ports[port_count] != NULL; port_count++);
245 struct device_info *available_devices = port_count > 0 ? calloc(port_count,
sizeof(
struct device_info)) : NULL;
247 int channel_count = 0;
248 for(i = 0; ports[i] != NULL; i++) {
249 char *
item = strdup(ports[i]);
250 assert(
item != NULL);
251 char *save_ptr = NULL;
255 name = strtok_r(
item,
"_", &save_ptr);
261 if(last_name && strcmp(last_name,
name) != 0) {
262 snprintf(available_devices[*
count].
name,
sizeof available_devices[*
count].
name,
"jack:%s (%d channels)", last_name, channel_count);
263 snprintf(available_devices[*
count].
dev,
sizeof available_devices[*
count].
dev,
":\"%s\"", last_name);
268 last_name = strdup(
name);
272 snprintf(available_devices[*
count].
name,
sizeof available_devices[*
count].
name,
"jack:%s (%d channels)", last_name, channel_count);
273 snprintf(available_devices[*
count].
dev,
sizeof available_devices[*
count].
dev,
":\"%s\"", last_name);
277 libjack->
free(ports);
281 return available_devices;
const char unsigned int flags
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_ERROR
general errors
#define LOG_LEVEL_VERBOSE
static int buffer_size(int sock, int optname, int size)
static struct device_info * audio_jack_probe(const char *client_name, unsigned long port_flags, int *count)
int(* jack_activate_t)(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT
int(* jack_client_close_t)(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT
const char *(* jack_port_name_t)(const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT
int(* jack_set_sample_rate_callback_t)(jack_client_t *client, JackSampleRateCallback srate_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT
void *(* jack_port_get_buffer_t)(jack_port_t *port, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT
jack_client_t *(* jack_client_open_t)(const char *client_name, jack_options_t options, jack_status_t *status,...) JACK_OPTIONAL_WEAK_EXPORT
jack_port_t *(* jack_port_register_t)(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size) JACK_OPTIONAL_WEAK_EXPORT
int(* jack_set_process_callback_t)(jack_client_t *client, JackProcessCallback process_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT
jack_nframes_t(* jack_get_sample_rate_t)(jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT
int(* jack_connect_t)(jack_client_t *client, const char *source_port, const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT
static void close_libjack(struct libjack_connection *s)
int(* jack_disconnect_t)(jack_client_t *client, const char *source_port, const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT
static struct libjack_connection * open_libjack(void)
void(* jack_free_t)(void *ptr) JACK_OPTIONAL_WEAK_EXPORT
int(* jack_deactivate_t)(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT
const char **(* jack_get_ports_t)(jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags) JACK_OPTIONAL_WEAK_EXPORT
static bool load_jack_symbols(struct libjack_connection *s)
@ STR_LEN
"standard" string length placeholder
jack_client_close_t client_close
jack_port_register_t port_register
jack_set_sample_rate_callback_t set_sample_rate_callback
LIB_HANDLE libjack
lib connection
jack_get_sample_rate_t get_sample_rate
jack_client_open_t client_open
jack_port_name_t port_name
jack_deactivate_t deactivate
jack_port_get_buffer_t port_get_buffer
jack_get_ports_t get_ports
jack_disconnect_t disconnect
jack_set_process_callback_t set_process_callback
This file contains some common data types.