20 #if !defined(WIN32) || defined(__CYGWIN__)
22 #ifdef PTHREAD_WIN32 // Added by JE - 13-02-2010
23 #include <ptw32/pthread.h>
24 #endif // consistency - even though we won't need it !
26 #include "JackConstants.h"
27 #include "JackChannel.h"
28 #include "JackLibGlobals.h"
29 #include "JackServerLaunch.h"
30 #include "JackPlatformPlug.h"
36 #if defined(USE_LIBDBUS_AUTOLAUNCH)
38 #include <dbus/dbus.h>
40 static int start_server_dbus(
const char* server_name)
47 dbus_error_init(&err);
50 conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
51 if (dbus_error_is_set(&err)) {
52 fprintf(stderr,
"Connection Error (%s)\n", err.message);
53 dbus_error_free(&err);
59 msg = dbus_message_new_method_call(
60 "org.jackaudio.service",
61 "/org/jackaudio/Controller",
62 "org.jackaudio.JackControl",
65 fprintf(stderr,
"Message Null\n");
70 if (!dbus_connection_send(conn, msg, NULL))
72 fprintf(stderr,
"Out Of Memory!\n");
76 dbus_message_unref(msg);
77 dbus_connection_flush(conn);
78 dbus_error_free(&err);
83 #elif defined(USE_CLASSIC_AUTOLAUNCH)
86 static void start_server_classic_aux(
const char* server_name)
100 snprintf(filename, 255,
"%s/.jackdrc", getenv(
"HOME"));
101 fp = fopen(filename,
"r");
104 fp = fopen(
"/etc/jackdrc",
"r");
108 fp = fopen(
"/etc/jackd.conf",
"r");
113 res = fscanf(fp,
"%s", buffer);
114 while (res != 0 && res != EOF) {
115 strcat(arguments, buffer);
116 strcat(arguments,
" ");
117 res = fscanf(fp,
"%s", buffer);
119 if (strlen(arguments) > 0) {
126 command = (
char*)(JACK_LOCATION
"/jackd");
127 strncpy(arguments, JACK_LOCATION
"/jackd -T -d "JACK_DEFAULT_DRIVER, 255);
129 result = strcspn(arguments,
" ");
130 command = (
char*)malloc(result + 1);
131 strncpy(command, arguments, result);
132 command[result] =
'\0';
135 argv = (
char**)malloc(255);
140 argv[i] = (
char*)malloc(strlen (
"-T") + 1);
141 strcpy (argv[i++],
"-T");
143 size_t optlen = strlen(
"-n");
144 char* buf = (
char*)malloc(optlen + strlen(server_name) + 1);
146 strcpy(buf + optlen, server_name);
151 result = strcspn(arguments + pos,
" ");
155 argv[i] = (
char*)malloc(result + 1);
156 strncpy(argv[i], arguments + pos, result);
157 argv[i][result] =
'\0';
162 execv(command, argv);
166 fprintf(stderr,
"exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno));
169 static int start_server_classic(
const char* server_name)
182 pid_t first_child_pid;
184 first_child_pid = fork();
185 switch (first_child_pid) {
189 start_server_classic_aux(server_name);
199 waitpid(first_child_pid, &status, 0);
207 static int start_server(
const char* server_name, jack_options_t options)
209 if ((options & JackNoStartServer) || getenv(
"JACK_NO_START_SERVER")) {
213 #if defined(USE_LIBDBUS_AUTOLAUNCH)
214 return start_server_dbus(server_name);
215 #elif defined(USE_CLASSIC_AUTOLAUNCH)
216 return start_server_classic(server_name);
218 fprintf(stderr,
"Automatic start of JACK server is disabled at configure time\n");
223 static int server_connect(
char* server_name)
226 int res = channel.ServerCheck(server_name);
233 int try_start_server(
jack_varargs_t* va, jack_options_t options, jack_status_t* status)
235 if (server_connect(va->server_name) < 0) {
237 if (start_server(va->server_name, options)) {
238 int my_status1 = *status | JackFailure | JackServerFailed;
239 *status = (jack_status_t)my_status1;
246 int my_status1 = *status | JackFailure | JackServerFailed;
247 *status = (jack_status_t)my_status1;
250 }
while (server_connect(va->server_name) < 0);
251 int my_status1 = *status | JackServerStarted;
252 *status = (jack_status_t)my_status1;
258 #endif // !defined(WIN32) || defined(__CYGWIN__)