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