00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackServerGlobals.h"
00021 #include "JackTools.h"
00022 #include "shm.h"
00023 #include <getopt.h>
00024 #include <errno.h>
00025
00026 static char* server_name = NULL;
00027
00028 namespace Jack
00029 {
00030
00031 JackServer* JackServerGlobals::fInstance;
00032 unsigned int JackServerGlobals::fUserCount;
00033
00034 int JackServerGlobals::Start(const char* server_name,
00035 jack_driver_desc_t* driver_desc,
00036 JSList* driver_params,
00037 int sync,
00038 int temporary,
00039 int time_out_ms,
00040 int rt,
00041 int priority,
00042 int loopback,
00043 int verbose)
00044 {
00045 jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose);
00046 new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name);
00047 int res = fInstance->Open(driver_desc, driver_params);
00048 return (res < 0) ? res : fInstance->Start();
00049 }
00050
00051 void JackServerGlobals::Stop()
00052 {
00053 jack_log("Jackdmp: server close");
00054 fInstance->Stop();
00055 fInstance->Close();
00056 }
00057
00058 void JackServerGlobals::Delete()
00059 {
00060 jack_log("Jackdmp: delete server");
00061 delete fInstance;
00062 fInstance = NULL;
00063 }
00064
00065 bool JackServerGlobals::Init()
00066 {
00067 int realtime = 0;
00068 int client_timeout = 0;
00069 int realtime_priority = 60;
00070 int verbose_aux = 0;
00071 int do_mlock = 1;
00072 unsigned int port_max = 128;
00073 int loopback = 0;
00074 int do_unlock = 0;
00075 int temporary = 0;
00076
00077 int opt = 0;
00078 int option_index = 0;
00079 int seen_driver = 0;
00080 char *driver_name = NULL;
00081 char **driver_args = NULL;
00082 JSList* driver_params = NULL;
00083 int driver_nargs = 1;
00084 JSList* drivers = NULL;
00085 int show_version = 0;
00086 int sync = 0;
00087 int rc, i;
00088 int ret;
00089
00090 FILE* fp = 0;
00091 char filename[255];
00092 char buffer[255];
00093 int argc = 0;
00094 char* argv[32];
00095
00096
00097 if (fUserCount++ == 0) {
00098
00099 jack_log("JackServerGlobals Init");
00100
00101 jack_driver_desc_t* driver_desc;
00102 const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:";
00103 static struct option long_options[] = {
00104 { "driver", 1, 0, 'd' },
00105 { "verbose", 0, 0, 'v' },
00106 { "help", 0, 0, 'h' },
00107 { "port-max", 1, 0, 'p' },
00108 { "no-mlock", 0, 0, 'm' },
00109 { "name", 0, 0, 'n' },
00110 { "unlock", 0, 0, 'u' },
00111 { "realtime", 0, 0, 'R' },
00112 { "loopback", 0, 0, 'L' },
00113 { "realtime-priority", 1, 0, 'P' },
00114 { "timeout", 1, 0, 't' },
00115 { "temporary", 0, 0, 'T' },
00116 { "version", 0, 0, 'V' },
00117 { "silent", 0, 0, 's' },
00118 { "sync", 0, 0, 'S' },
00119 { 0, 0, 0, 0 }
00120 };
00121
00122 snprintf(filename, 255, "%s/.jackdrc", getenv("HOME"));
00123 fp = fopen(filename, "r");
00124
00125 if (!fp) {
00126 fp = fopen("/etc/jackdrc", "r");
00127 }
00128
00129 if (!fp) {
00130 fp = fopen("/etc/jackd.conf", "r");
00131 }
00132
00133 argc = 0;
00134 if (fp) {
00135 ret = fscanf(fp, "%s", buffer);
00136 while (ret != 0 && ret != EOF) {
00137 argv[argc] = (char*)malloc(64);
00138 strcpy(argv[argc], buffer);
00139 ret = fscanf(fp, "%s", buffer);
00140 argc++;
00141 }
00142 fclose(fp);
00143 }
00144
00145
00146
00147
00148
00149
00150
00151 opterr = 0;
00152 optind = 1;
00153
00154 while (!seen_driver &&
00155 (opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) {
00156
00157 switch (opt) {
00158
00159 case 'd':
00160 seen_driver = 1;
00161 driver_name = optarg;
00162 break;
00163
00164 case 'v':
00165 verbose_aux = 1;
00166 break;
00167
00168 case 'S':
00169 sync = 1;
00170 break;
00171
00172 case 'n':
00173 server_name = optarg;
00174 break;
00175
00176 case 'm':
00177 do_mlock = 0;
00178 break;
00179
00180 case 'p':
00181 port_max = (unsigned int)atol(optarg);
00182 break;
00183
00184 case 'P':
00185 realtime_priority = atoi(optarg);
00186 break;
00187
00188 case 'R':
00189 realtime = 1;
00190 break;
00191
00192 case 'L':
00193 loopback = atoi(optarg);
00194 break;
00195
00196 case 'T':
00197 temporary = 1;
00198 break;
00199
00200 case 't':
00201 client_timeout = atoi(optarg);
00202 break;
00203
00204 case 'u':
00205 do_unlock = 1;
00206 break;
00207
00208 case 'V':
00209 show_version = 1;
00210 break;
00211
00212 default:
00213 jack_error("unknown option character %c", optopt);
00214 break;
00215 }
00216 }
00217
00218 drivers = jack_drivers_load(drivers);
00219 if (!drivers) {
00220 jack_error("jackdmp: no drivers found; exiting");
00221 goto error;
00222 }
00223
00224 driver_desc = jack_find_driver_descriptor(drivers, driver_name);
00225 if (!driver_desc) {
00226 jack_error("jackdmp: unknown driver '%s'", driver_name);
00227 goto error;
00228 }
00229
00230 if (optind < argc) {
00231 driver_nargs = 1 + argc - optind;
00232 } else {
00233 driver_nargs = 1;
00234 }
00235
00236 if (driver_nargs == 0) {
00237 jack_error("No driver specified ... hmm. JACK won't do"
00238 " anything when run like this.");
00239 goto error;
00240 }
00241
00242 driver_args = (char**)malloc(sizeof(char*) * driver_nargs);
00243 driver_args[0] = driver_name;
00244
00245 for (i = 1; i < driver_nargs; i++) {
00246 driver_args[i] = argv[optind++];
00247 }
00248
00249 if (jack_parse_driver_params(driver_desc, driver_nargs, driver_args, &driver_params)) {
00250 goto error;
00251 }
00252
00253 #ifndef WIN32
00254 if (server_name == NULL)
00255 server_name = (char*)JackTools::DefaultServerName();
00256 #endif
00257
00258 rc = jack_register_server(server_name, false);
00259 switch (rc) {
00260 case EEXIST:
00261 jack_error("`%s' server already active", server_name);
00262 goto error;
00263 case ENOSPC:
00264 jack_error("too many servers already active");
00265 goto error;
00266 case ENOMEM:
00267 jack_error("no access to shm registry");
00268 goto error;
00269 default:
00270 jack_info("server `%s' registered", server_name);
00271 }
00272
00273
00274 jack_cleanup_shm();
00275 JackTools::CleanupFiles(server_name);
00276
00277 if (!realtime && client_timeout == 0)
00278 client_timeout = 500;
00279
00280 for (i = 0; i < argc; i++) {
00281 free(argv[i]);
00282 }
00283
00284 int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux);
00285 if (res < 0) {
00286 jack_error("Cannot start server... exit");
00287 Delete();
00288 jack_cleanup_shm();
00289 JackTools::CleanupFiles(server_name);
00290 jack_unregister_server(server_name);
00291 goto error;
00292 }
00293 }
00294
00295 if (driver_params)
00296 jack_free_driver_params(driver_params);
00297 return true;
00298
00299 error:
00300 if (driver_params)
00301 jack_free_driver_params(driver_params);
00302 fUserCount--;
00303 return false;
00304 }
00305
00306 void JackServerGlobals::Destroy()
00307 {
00308 if (--fUserCount == 0) {
00309 jack_log("JackServerGlobals Destroy");
00310 Stop();
00311 Delete();
00312 jack_cleanup_shm();
00313 JackTools::CleanupFiles(server_name);
00314 jack_unregister_server(server_name);
00315 }
00316 }
00317
00318 }
00319
00320