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

David Henningsson david.henningsson at canonical.com
Sat Jul 20 11:23:37 PDT 2013


On 07/19/2013 09:32 PM, Peter Meerwald wrote:
> 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)

So in case of e g scripting, you have now limited the amount of "pacmd"s 
you can execute (in serial) to 10 per second, which is IMO a bad thing.
Btw, since we don't guarantee backwards compatibility anyway, using 
pacmd for scripting is probably a bad idea in the first place...

Anyway, I'm also annoyed by the chattiness so I think the quiet argument 
is good, but since pacmd can't connect to remote servers,
you don't need to wait 100 ms to try to detect whether the server is old 
or new. A new pacmd can just assume a new server.

At least in my opinion. Other opinions?

>
> 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;
> +        }
> +
> +        /* 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;
>
>



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list