X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=695a6cfd32077e0ee0477078076ab2f8b8f11d29;hp=741bd68b0344c510ecdd750e897aedfa25b9ee48;hb=e2213f2468eb1c6f8ca033c6529ee1b5ceadab7f;hpb=513a3be6c609dd812e2b7755bab533d28676bd9c diff --git a/audiod.c b/audiod.c index 741bd68b..695a6cfd 100644 --- a/audiod.c +++ b/audiod.c @@ -153,11 +153,13 @@ static struct audiod_command cmds[] = { .description = "grab the audio stream", .synopsis = "-- grab [grab_options]", .help = + "grab ('splice') the audio stream at any position in the filter \n" -"chain and send that data back to the client. \n" -"Available options:\n\n" -GRAB_HELP_TXT +"chain and send that data back to the client. Try\n" +"\t para_audioc -- grab -h\n" +"for the list of available options.\n" }, + { .name = "help", .handler = com_help, @@ -1345,7 +1347,8 @@ static int com_grab(int fd, int argc, char **argv) { struct grab_client *gc; struct filter_node *fn; - int err; + int i, err; + char *msg; PARA_INFO_LOG("argc: %d, argv[0]: %s, optind: %d\n", argc, argv[0], optind); gc = grab_client_new(fd, argc, argv, &err); @@ -1357,13 +1360,22 @@ static int com_grab(int fd, int argc, char **argv) activate_grab_client(gc, fn); return 1; err_out: - if (err != -E_GC_HELP_GIVEN) + if (err != -E_GC_HELP_GIVEN && err != -E_GC_VERSION_GIVEN) return err; - err = client_write(fd, "Usage: para_audioc [audioc_options] -- " - "grab [grab_options]\nAvailable options:\n"); - if (err < 0) - return err; - err = client_write(fd, GRAB_HELP_TXT); + if (err == -E_GC_HELP_GIVEN) { + msg = make_message("%s\n\n", grab_client_args_info_usage); + for (i = 0; grab_client_args_info_help[i]; i++) { + char *tmp = make_message("%s%s\n", msg, + grab_client_args_info_help[i]); + free(msg); + msg = tmp; + } + } else + msg = make_message("%s %s\n", + GRAB_CLIENT_CMDLINE_PARSER_PACKAGE, + GRAB_CLIENT_CMDLINE_PARSER_VERSION); + err = client_write(fd, msg); + free(msg); if (err < 0) return err; close(fd); @@ -1508,7 +1520,7 @@ static int open_stat_pipe(void) return ret; } -static int pre_select(fd_set *rfds, fd_set *wfds, struct timeval *tv) +static int audiod_pre_select(fd_set *rfds, fd_set *wfds, struct timeval *tv) { int i, ret, max = -1; @@ -1559,15 +1571,21 @@ static void __noreturn audiod_mainloop(void) char status_buf[STRINGSIZE] = ""; struct timeval tv; repeat: - FD_ZERO(&rfds); FD_ZERO(&wfds); - max_fileno = 0; + FD_ZERO(&rfds); + /* always check signal pipe and the local socket */ + FD_SET(signal_pipe, &rfds); + max_fileno = signal_pipe; + FD_SET(audiod_socket, &rfds); + max_fileno = MAX(max_fileno, audiod_socket); + if (audiod_status != AUDIOD_ON) kill_all_decoders(); else if (playing) start_current_receiver(); - max_fileno = set_stream_fds(&wfds); - /* stat pipe (read) */ + + max_fileno = MAX(max_fileno, set_stream_fds(&wfds)); + /* status pipe */ if (stat_pipe >= 0 && audiod_status == AUDIOD_OFF) close_stat_pipe(); if (stat_pipe < 0 && audiod_status != AUDIOD_OFF) { @@ -1579,18 +1597,12 @@ repeat: FD_SET(stat_pipe, &rfds); max_fileno = MAX(max_fileno, stat_pipe); } - /* always check signal pipe */ - FD_SET(signal_pipe, &rfds); - max_fileno = MAX(max_fileno, signal_pipe); /* local socket */ - if (audiod_socket < 0) - audiod_get_socket(); /* doesn't return on errors */ - FD_SET(audiod_socket, &rfds); - max_fileno = MAX(max_fileno, audiod_socket); tv.tv_sec = 0; tv.tv_usec = 200 * 1000; - ret = pre_select(&rfds, &wfds, &tv); + ret = audiod_pre_select(&rfds, &wfds, &tv); max_fileno = MAX(max_fileno, ret); + ret = select(max_fileno + 1, &rfds, &wfds, NULL, &tv); if (ret < 0 && errno != EINTR) PARA_ERROR_LOG("select returned %d (%s)\n", ret, @@ -1678,5 +1690,6 @@ int __noreturn main(int argc, char *argv[]) setup_signal_handling(); if (conf.daemon_given) daemon_init(); + audiod_get_socket(); /* doesn't return on errors */ audiod_mainloop(); }