[pulseaudio-discuss] [PATCH 3/6] pacmd: Add optional argument for quiet mode

Thomas Martitz kugel at rockbox.org
Wed Jul 24 23:58:25 PDT 2013


Am 19.07.2013 21:32, schrieb Peter Meerwald:
> quiet mode allows to turn off PA's welcome message and the >>> prompt
>
> pacmd waits 100 ms; if nothing is coming from the PA daemon, it is a new
> version and we actively ask for the welcome message (non-quiet mode) by sending
> "hello"; in quiet mode, we send "hello quiet" to tell the daemon we are not
> interested in polite messaging and prompts
>
> if something is received from the PA daemon within 100 ms, it must be an old
> version and we just continue as before; quiet is silently ignored for older
> PA daemons (nothing we can do, except filter the data coming from the
> server -- no)
>
> Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>
> ---
>   src/utils/pacmd.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
>   1 file changed, 56 insertions(+), 5 deletions(-)
>
> diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
> index cf0eb44..7dd3c9b 100644
> --- a/src/utils/pacmd.c
> +++ b/src/utils/pacmd.c
> @@ -46,6 +46,7 @@
>   static void help(const char *argv0) {
>       printf("%s %s\n",    argv0, "exit");
>       printf("%s %s\n",    argv0, "help");
> +    printf("%s %s\n",    argv0, "hello");
>       printf("%s %s\n",    argv0, "list-(modules|sinks|sources|clients|cards|samples)");
>       printf("%s %s\n",    argv0, "list-(sink-inputs|source-outputs)");
>       printf("%s %s\n",    argv0, "stat");
> @@ -83,11 +84,13 @@ static void help(const char *argv0) {
>       printf(_("\n"
>            "  -h, --help                            Show this help\n"
>            "      --version                         Show version\n"
> +         "      --quiet                           Don't show welcome message\n"
>            "When no command is given pacmd starts in the interactive mode\n" ));
>   }
>   
>   enum {
> -    ARG_VERSION = 256
> +    ARG_VERSION = 256,
> +    ARG_QUIET
>   };
>   
>   int main(int argc, char*argv[]) {
> @@ -102,7 +105,7 @@ int main(int argc, char*argv[]) {
>       bool ibuf_eof, obuf_eof, ibuf_closed, obuf_closed;
>       struct pollfd pollfd[3];
>       struct pollfd *watch_socket, *watch_stdin, *watch_stdout;
> -
> +    bool quiet = false;
>       int stdin_type = 0, stdout_type = 0, fd_type = 0;
>   
>       char *bn = NULL;
> @@ -110,6 +113,7 @@ int main(int argc, char*argv[]) {
>   
>       static const struct option long_options[] = {
>           {"version",     0, NULL, ARG_VERSION},
> +        {"quiet",       0, NULL, ARG_QUIET},
>           {"help",        0, NULL, 'h'},
>           {NULL,          0, NULL, 0}
>       };
> @@ -121,7 +125,7 @@ int main(int argc, char*argv[]) {
>   
>       bn = pa_path_get_filename(argv[0]);
>   
> -    while ((c = getopt_long(argc, argv, "h", long_options, NULL)) != -1) {
> +    while ((c = getopt_long(argc, argv, "hq", long_options, NULL)) != -1) {
>           switch (c) {
>               case 'h' :
>                   help(bn);
> @@ -136,11 +140,18 @@ int main(int argc, char*argv[]) {
>                          pa_get_library_version());
>                   ret = 0;
>                   goto quit;
> +            case 'q':
> +            case ARG_QUIET:
> +                quiet = true;
> +                break;
>               default:
>                   goto quit;
>           }
>       }
>   
> +    argv += optind;
> +    argc -= optind;
> +
>       if (pa_pid_file_check_running(&pid, "pulseaudio") < 0) {
>           pa_log(_("No PulseAudio daemon running, or not running as session daemon."));
>           goto quit;
> @@ -192,8 +203,8 @@ int main(int argc, char*argv[]) {
>       ibuf_index = ibuf_length = obuf_index = obuf_length = 0;
>       ibuf_eof = obuf_eof = ibuf_closed = obuf_closed = false;
>   
> -    if (argc > 1) {
> -        for (i = 1; i < argc; i++) {
> +    if (argc > 0) {
> +        for (i = 0; i < argc; i++) {
>               size_t k;
>   
>               k = PA_MIN(ibuf_size - ibuf_length, strlen(argv[i]));
> @@ -209,6 +220,46 @@ int main(int argc, char*argv[]) {
>           ibuf_eof = true;
>       }
>   
> +    /* wait for initial welcome */
> +    for (;;) {
> +        struct pollfd *p;
> +        int res;
> +
> +        pa_zero(pollfd);
> +        p = pollfd;
> +
> +        watch_socket = p++;
> +        watch_socket->fd = fd;
> +        watch_socket->events = POLLIN;
> +
> +        if ((res = pa_poll(pollfd, p-pollfd, 100)) < 0) {
> +            if (errno == EINTR)
> +                continue;
> +
> +            pa_log(_("poll(): %s"), strerror(errno));
> +            goto quit;
> +        }

The setup of watch_socket/pollfd and the call (why isn't watch_socket 
passed?) is really awkward to me. Why such strange code?

> +
> +        /* if nothing coming from daemon quickly, it supports explicit hello */
> +        if (res == 0) {
> +            char buf[32];
> +            ssize_t r;
> +
> +            /* send explicit hello */
> +            sprintf(buf, "hello %s\n", quiet ? "quiet" : "");
> +            if ((r = pa_write(fd, buf, strlen(buf), &fd_type)) < 0) {
> +                pa_log(_("write(): %s"), strerror(errno));
> +                goto quit;
> +            }
> +
> +            break;
> +        }
> +
> +        /* got data from the daemon, just continue */
> +        if (watch_socket->revents & POLLIN)
> +            break;
> +    }
> +
>       for (;;) {
>           struct pollfd *p;
>   



More information about the pulseaudio-discuss mailing list