21 #include "JackConstants.h"
22 #include "JackChannel.h"
23 #include "JackLibGlobals.h"
24 #include "JackServerLaunch.h"
25 #include "JackPlatformPlug.h"
29 #if defined(USE_LIBDBUS_AUTOLAUNCH)
31 #include <dbus/dbus.h>
33 static int start_server_dbus(
const char* server_name)
40 dbus_error_init(&err);
43 conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
44 if (dbus_error_is_set(&err)) {
45 fprintf(stderr,
"Connection Error (%s)\n", err.message);
46 dbus_error_free(&err);
52 msg = dbus_message_new_method_call(
53 "org.jackaudio.service",
54 "/org/jackaudio/Controller",
55 "org.jackaudio.JackControl",
58 fprintf(stderr,
"Message Null\n");
63 if (!dbus_connection_send(conn, msg, NULL))
65 fprintf(stderr,
"Out Of Memory!\n");
69 dbus_message_unref(msg);
70 dbus_connection_flush(conn);
71 dbus_error_free(&err);
76 #elif defined(USE_CLASSIC_AUTOLAUNCH)
79 static void start_server_classic_aux(
const char* server_name)
93 snprintf(filename, 255,
"%s/.jackdrc", getenv(
"HOME"));
94 fp = fopen(filename,
"r");
97 fp = fopen(
"/etc/jackdrc",
"r");
101 fp = fopen(
"/etc/jackd.conf",
"r");
106 ret = fscanf(fp,
"%s", buffer);
107 while (ret != 0 && ret != EOF) {
108 strcat(arguments, buffer);
109 strcat(arguments,
" ");
110 ret = fscanf(fp,
"%s", buffer);
112 if (strlen(arguments) > 0) {
119 command = (
char*)(JACK_LOCATION
"/jackd");
120 strncpy(arguments, JACK_LOCATION
"/jackd -T -d "JACK_DEFAULT_DRIVER, 255);
122 result = strcspn(arguments,
" ");
123 command = (
char*)malloc(result + 1);
124 strncpy(command, arguments, result);
125 command[result] =
'\0';
128 argv = (
char**)malloc(255);
133 argv[i] = (
char*)malloc(strlen (
"-T") + 1);
134 strcpy (argv[i++],
"-T");
136 size_t optlen = strlen(
"-n");
137 char* buf = (
char*)malloc(optlen + strlen(server_name) + 1);
139 strcpy(buf + optlen, server_name);
144 result = strcspn(arguments + pos,
" ");
148 argv[i] = (
char*)malloc(result + 1);
149 strncpy(argv[i], arguments + pos, result);
150 argv[i][result] =
'\0';
155 execv(command, argv);
159 fprintf(stderr,
"exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno));
162 static int start_server_classic(
const char* server_name)
177 start_server_classic_aux(server_name);
194 static int start_server(
const char* server_name, jack_options_t options)
196 if ((options & JackNoStartServer) || getenv(
"JACK_NO_START_SERVER")) {
200 #if defined(USE_LIBDBUS_AUTOLAUNCH)
201 return start_server_dbus(server_name);
202 #elif defined(USE_CLASSIC_AUTOLAUNCH)
203 return start_server_classic(server_name);
205 fprintf(stderr,
"Automatic start of JACK server is disabled at configure time\n");
210 static int server_connect(
char* server_name)
213 int res = channel.ServerCheck(server_name);
220 int try_start_server(
jack_varargs_t* va, jack_options_t options, jack_status_t* status)
222 if (server_connect(va->server_name) < 0) {
224 if (start_server(va->server_name, options)) {
225 int my_status1 = *status | JackFailure | JackServerFailed;
226 *status = (jack_status_t)my_status1;
233 int my_status1 = *status | JackFailure | JackServerFailed;
234 *status = (jack_status_t)my_status1;
237 }
while (server_connect(va->server_name) < 0);
238 int my_status1 = *status | JackServerStarted;
239 *status = (jack_status_t)my_status1;
JackClientChannel using sockets.