source: roaraudio/roard/roard.c @ 274:7da1849ab394

Last change on this file since 274:7da1849ab394 was 274:7da1849ab394, checked in by phi, 16 years ago

added --restart to help, typo

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