]> git.tue.mpg.de Git - paraslash.git/commitdiff
mixer: sleep: Cycle audiod on stop.
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 6 Mar 2022 20:05:09 +0000 (21:05 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 16 Oct 2022 16:53:33 +0000 (18:53 +0200)
This modifies the sleep command to turn off audiod before sending the
stop command to the server. This way the stream terminates immediately
(on the local machine) rather than when the input queue of the stream
has drained, which may be a several seconds later.

This is important because we are going to set the initial volume but
don't want to change the volume of the stream which is about to end.
Currently this is "solved" by sleeping one second, but this has always
been a hack that never worked well in practice.

In order to be able to send commands to para_audiod we introduce
audioc_cmd() which shares most of the implementation of client_cmd(),
so we make both functions wrappers for the new run() which works for both
command types.

To avoid code duplications we also introduce stop() which does the
equivalent of

para_audioc off
para_client stop
para_audioc on

mixer.c

diff --git a/mixer.c b/mixer.c
index 013f35fe3e37c60db0404bfe0e80eeee95cfc5a0..48095d03ff7f0c0b9326223fd86222e2c48fe647 100644 (file)
--- a/mixer.c
+++ b/mixer.c
@@ -187,11 +187,11 @@ static int com_fade(const struct mixer *m)
 }
 EXPORT_CMD(fade);
 
-static void client_cmd(const char *cmd)
+static void run(const char *exe, const char *cmd)
 {
        int ret, status, fds[3] = {0, 0, 0};
        pid_t pid;
-       char *cmdline = make_message(BINDIR "/para_client %s", cmd);
+       char *cmdline = make_message("%s %s", exe, cmd);
 
        PARA_NOTICE_LOG("%s\n", cmdline);
        ret = para_exec_cmdline_pid(&pid, cmdline, fds);
@@ -215,6 +215,16 @@ fail:
        exit(EXIT_FAILURE);
 }
 
+static void client_cmd(const char *cmd)
+{
+       run(BINDIR "/para_client", cmd);
+}
+
+static void audioc_cmd(const char *cmd)
+{
+       run(BINDIR "/para_audioc", cmd);
+}
+
 static void change_afs_mode(const char *afs_mode)
 {
        char *cmd;
@@ -263,6 +273,13 @@ static int set_initial_volume(const struct mixer *m, struct mixer_handle *h)
        return 1;
 }
 
+static void stop(void)
+{
+       audioc_cmd("off");
+       client_cmd("stop");
+       audioc_cmd("on");
+}
+
 static int com_sleep(const struct mixer *m)
 {
        time_t t1, wake_time_epoch;
@@ -317,8 +334,7 @@ static int com_sleep(const struct mixer *m)
        }
        wake_time_epoch = mktime(tm);
        PARA_INFO_LOG("waketime: %d:%02d\n", tm->tm_hour, tm->tm_min);
-       client_cmd("stop");
-       sleep(1);
+       stop();
        ret = set_initial_volume(m, h);
        if (ret < 0)
                goto close_mixer;
@@ -334,7 +350,7 @@ static int com_sleep(const struct mixer *m)
                change_afs_mode(initial_mood);
                client_cmd("play");
                sleep(delay);
-               client_cmd("stop");
+               stop();
        }
        if (fot && fo_mood && *fo_mood) {
                change_afs_mode(fo_mood);
@@ -352,7 +368,7 @@ static int com_sleep(const struct mixer *m)
                if (!fot || !fo_mood) /* currently stopped */
                        client_cmd("play");
        } else if (fot && fo_mood && *fo_mood) /* currently playing */
-               client_cmd("stop");
+               stop();
        m->close(&h);
        if (!fit || !fi_mood || !*fi_mood) /* nothing to do */
                return 1;
@@ -367,13 +383,12 @@ static int com_sleep(const struct mixer *m)
                sleep(delay);
        }
        change_afs_mode(fi_mood);
-       if (sleep_mood && *sleep_mood) /* currently playing */
-               client_cmd("next");
-       else /* currently stopped */
-               client_cmd("play");
        ret = open_mixer_and_set_channel(m, &h);
        if (ret < 0)
                return ret;
+       if (sleep_mood && *sleep_mood) /* currently playing */
+               stop();
+       client_cmd("play");
        ret = fade(m, h, fiv, fit);
 close_mixer:
        m->close(&h);