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