Signed-off-by: Peter Meerwald <[email protected]>
---
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;