source: roaraudio/roard/roard.c @ 285:bf23d797553e

Last change on this file since 285:bf23d797553e was 285:bf23d797553e, checked in by phi, 16 years ago

added wait() an SIGCHLD

File size: 8.2 KB
RevLine 
[0]1//roard.c:
2
3#include "roard.h"
4
[60]5char * server = ROAR_DEFAULT_SOCK_GLOBAL; // global server address
6
[0]7void usage (void) {
8 printf("Usage: roard [OPTIONS]...\n\n");
9
[68]10 printf("Misc Options:\n\n");
11 printf(
[71]12        " --demon               - Bring the server into background after init\n"
13        " --terminate           - Terminate after last client quited\n"
[274]14        " --restart             - Trys to stop an old instance and start a new with new settings\n"
[276]15        " --realtime            - Trys to get realtime priority,\n"
16        "                         give multible times for being more realtime\n"
[68]17       );
18
19 printf("\nAudio Options:\n\n");
[0]20 printf(
21        " -R  --rate   RATE     - Set server rate\n"
22        " -B  --bits   BITS     - Set server bits\n"
23        " -C  --chans  CHANNELS - Set server channels\n"
24       );
25
26 printf("\nDriver Options:\n\n");
27 printf(" -d  --driver DRV      - Set the driver, use '-d list' to get a list (default: %s)\n", ROAR_DRIVER_DEFAULT);
28 printf(" -D  --device DEV      - Set the device\n");
29 printf(" -dO OPTS              - Set output options\n");
30
31 printf("\nSource Options:\n\n");
32 printf(" -s  --source DRV      - Use DRV as input driver\n"
33        " -S           DEV      - Use DEV as input device\n"
34        " -sO          OPTS     - Use OPTS as input options\n"
35        " -sP                   - Make souce as primary\n"
36       );
37
[280]38 printf("\nCodec Filter Options:\n\n");
39 printf(" --list-cf             - List all codec filter\n"
40       );
[0]41
42 printf("\nServer Options:\n\n");
43 printf(" -t  --tcp             - Use TCP listen socket\n"
44        " -u  --unix            - Use UNIX Domain listen socket (default)\n"
45        " -p  --port            - TCP Port to bind to\n"
46        " -b  --bind            - IP/Hostname to bind to\n"
47        " -s  --sock            - Filename for UNIX Domain Socket\n"
[60]48        " -G  GROUP             - Sets the group for the UNIX Domain Socket, (default: audio)\n"
49        "                         You need the permittions to change the GID\n"
[68]50        " --no-listen           - Do not listen for new clients (only usefull for relaing)\n"
[274]51        " --client-fh           - Comunicate with a client over this handle\n"
[68]52        "                         (only usefull for relaing)\n"
[0]53       );
54// printf("\n Options:\n\n");
55 printf("\n");
56}
57
58int main (int argc, char * argv[]) {
59 int i;
60 char * k;
[60]61 char user_sock[80] = {0};
[0]62 struct roar_audio_info sa;
[275]63 int    demon    = 0;
64 int    realtime = 0;
[74]65 char * driver = getenv("ROAR_DRIVER");
66 char * device = getenv("ROAR_DEVICE");
[0]67 char * opts   = NULL;
[60]68// char * server = ROAR_DEFAULT_SOCK_GLOBAL;
[0]69 int      port = ROAR_DEFAULT_PORT;
70 int               drvid;
71 char * s_dev  = NULL;
72 char * s_con  = NULL;
73 char * s_opt  = NULL;
74 int    s_prim = 0;
[60]75 char * sock_grp = "audio";
76 struct group * grp;
[0]77 DRIVER_USERDATA_T drvinst;
[39]78 struct roar_client * self = NULL;
[0]79
80 g_listen_socket = -1;
81 g_standby       =  0;
82
83 sa.bits     = ROAR_BITS_DEFAULT;
84 sa.channels = ROAR_CHANNELS_DEFAULT;
85 sa.rate     = ROAR_RATE_DEFAULT;
86 sa.codec    = ROAR_CODEC_DEFAULT;
87
88 g_sa = &sa;
89
[60]90
91 if ( getuid() != 0 && getenv("HOME") ) {
92  snprintf(user_sock, 79, "%s/%s", getenv("HOME"), ROAR_DEFAULT_SOCK_USER);
93  server = user_sock;
94 }
95
[279]96 if ( getenv("ROAR_SERVER") != NULL )
97  server = getenv("ROAR_SERVER");
98
[63]99 if ( clients_init() == -1 ) {
100  ROAR_ERR("Can not init clients!");
101  return 1;
102 }
103
104 if ( streams_init() == -1 ) {
105  ROAR_ERR("Can not init streams!");
106  return 1;
107 }
108
[64]109 if ( (g_self_client = clients_new()) == -1 ) {
110  ROAR_ERR("Can not create self client!");
111  return 1;
112 }
113
[0]114 if ( sources_init() == -1 ) {
115  ROAR_ERR("Can not init sources!");
116  return 1;
117 }
118
[64]119 if ( (sources_set_client(g_self_client)) == -1 ) {
120  ROAR_ERR("Can not init set source client!");
121  return 1;
122 }
123
[0]124 for (i = 1; i < argc; i++) {
125  k = argv[i];
126
127  if ( strcmp(k, "-h") == 0 || strcmp(k, "--help") == 0 ) {
128   usage();
129   return 0;
130
[68]131  } else if ( strcmp(k, "--demon") == 0 ) {
132   demon = 1;
[71]133  } else if ( strcmp(k, "--terminate") == 0 ) {
134   g_terminate = 1;
[275]135  } else if ( strcmp(k, "--realtime") == 0 ) {
[276]136   realtime++;
[68]137
[280]138  } else if ( strcmp(k, "--list-cf") == 0 ) {
139   print_codecfilterlist();
140   return 0;
141
[0]142  } else if ( strcmp(k, "-R") == 0 || strcmp(k, "--rate") == 0 ) {
143   sa.rate = atoi(argv[++i]);
144  } else if ( strcmp(k, "-B") == 0 || strcmp(k, "--bits") == 0 ) {
145   sa.bits = atoi(argv[++i]);
146  } else if ( strcmp(k, "-C") == 0 || strcmp(k, "--chans") == 0 ) {
147   sa.channels = atoi(argv[++i]);
148
149  } else if ( strcmp(k, "-d") == 0 || strcmp(k, "--driver") == 0 ) {
150   driver = argv[++i];
151   if ( strcmp(driver, "list") == 0 ) {
152    print_driverlist();
153   }
154  } else if ( strcmp(k, "-D") == 0 || strcmp(k, "--device") == 0 ) {
155   device = argv[++i];
156  } else if ( strcmp(k, "-dO") == 0 ) {
157   opts = argv[++i];
158
159  } else if ( strcmp(k, "-s") == 0 || strcmp(k, "--source") == 0 ) {
160   k = argv[++i];
161   if ( sources_add(k, s_dev, s_con, s_opt, s_prim) == -1 ) {
162    ROAR_ERR("main(*): adding source '%s' via '%s' failed!", s_dev, k);
163   }
164   s_opt = s_dev = s_con = NULL;
165   s_prim = 0;
166  } else if ( strcmp(k, "-S") == 0 ) {
167   s_dev = argv[++i];
168  } else if ( strcmp(k, "-sO") == 0 ) {
169   s_opt = argv[++i];
170  } else if ( strcmp(k, "-sC") == 0 ) {
171   s_con = argv[++i];
172  } else if ( strcmp(k, "-sP") == 0 ) {
173   s_prim = 1;
174
175  } else if ( strcmp(k, "-p") == 0 || strcmp(k, "--port") == 0 ) {
176   port = atoi(argv[++i]);
[68]177  } else if ( strcmp(k, "-b") == 0 || strcmp(k, "--bind") == 0 || strcmp(k, "-s") == 0 || strcmp(k, "--sock") == 0 ) {
[0]178   server = argv[++i];
[62]179  } else if ( strcmp(k, "-t") == 0 ) {
180   server = ROAR_DEFAULT_HOST;
181  } else if ( strcmp(k, "-u") == 0 ) {
182   // ignore this case as it is the default behavor.
[60]183  } else if ( strcmp(k, "-G") == 0 ) {
184   sock_grp = argv[++i];
[0]185
[68]186  } else if ( strcmp(k, "--no-listen") == 0 ) {
187   *server = 0;
188  } else if ( strcmp(k, "--client-fh") == 0 ) {
189   if ( clients_set_fh(clients_new(), atoi(argv[++i])) == -1 ) {
190    ROAR_ERR("main(*): Can not set client's fh");
191    return 1;
192   }
193
[0]194  } else {
195   usage();
196   return 1;
197  }
198
199 }
200
201 ROAR_DBG("Server config: rate=%i, bits=%i, chans=%i", sa.rate, sa.bits, sa.channels);
202
[281]203 if ( midi_init() == -1 )
204  ROAR_ERR("Can not initialize MIDI subsystem");
205
[68]206 if ( *server != 0 ) {
207  if ( (g_listen_socket = roar_socket_listen(ROAR_SOCKET_TYPE_UNKNOWN, server, port)) == -1 ) {
208   ROAR_ERR("Can not open listen socket!");
209   return 1;
210  }
[0]211
[68]212  if ( *server == '/' ) {
213   if ( (grp = getgrnam(sock_grp)) == NULL ) {
214    ROAR_ERR("Can not get GID for group %s: %s", sock_grp, strerror(errno));
215   } else {
216    chown(server, -1, grp->gr_gid);
217    if ( getuid() == 0 )
218     chmod(server, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
219   }
[60]220  }
221 }
222
[0]223 if ( output_buffer_init(&sa) == -1 ) {
224  ROAR_ERR("Can not init output buffer!");
225  return 1;
226 }
227
228 if ( driver_open(&drvinst, &drvid, driver, device, &sa) == -1 ) {
229  ROAR_ERR("Can not open output driver!");
230  return 1;
231 }
232
[44]233 if ( samples_init() == -1 ) {
234  ROAR_ERR("Can not init samples!");
235  return 1;
236 }
237
238
[0]239 signal(SIGINT,  on_sig_int);
[285]240 signal(SIGCHLD, on_sig_chld);
[0]241 signal(SIGPIPE, SIG_IGN);  // ignore broken pipes
242
[275]243 if ( realtime ) {
[278]244#ifdef DEBUG
245  ROAR_WARN("compiled with -DDEBUG but realtime is enabled: for real realtime support compiel without -DDEBUG");
246#endif
247
[275]248  errno = 0;
[276]249  nice(-5*realtime); // -5 for each --realtime
[275]250  if ( errno )
251   ROAR_WARN("Can not decrease nice value by 5: %s", strerror(errno));
[277]252/*
[276]253#ifdef __linux__
[277]254  if ( ioprio_set(IOPRIO_WHO_PROCESS, getpid(), IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 0)) == -1 )
255   ROAR_WARN("Can not set io priority: %s", strerror(errno));
[276]256#endif
[277]257*/
[275]258 }
259
[0]260
[39]261 clients_set_pid(g_self_client, getpid());
262 clients_get(g_self_client, &self);
[37]263
[39]264 if ( self == NULL ) {
265  ROAR_ERR("Can not get self client!");
266  return 1;
267 }
268
269 strcpy(self->name, "RoarAudio demon internal");
[68]270
271 if ( demon ) {
272  close(ROAR_STDIN );
273  close(ROAR_STDOUT);
274  close(ROAR_STDERR);
275  if ( fork() )
276   _exit(0);
277 }
278
[0]279 // start main loop...
280 main_loop(drvid, drvinst, &sa);
281
282 // clean up.
283 clean_quit_prep();
284 driver_close(drvinst, drvid);
285 output_buffer_free();
286
287 return 0;
288}
289
290void clean_quit_prep (void) {
291 close(g_listen_socket);
[60]292
293 if ( *server == '/' )
294  unlink(server);
295
296
[0]297 sources_free();
298 streams_free();
299 clients_free();
[282]300 midi_cb_stop(); // stop console beep
[281]301 midi_free();
[0]302}
303
304void clean_quit (void) {
305 clean_quit_prep();
306// driver_close(drvinst, drvid);
307// output_buffer_free();
308 exit(0);
309}
310
311//ll
Note: See TracBrowser for help on using the repository browser.