From 149460f7ea29ce43cb3fe5795cf7395c57e13cba Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 6 Mar 2022 21:05:09 +0100 Subject: [PATCH] mixer: sleep: Cycle audiod on stop. 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 | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/mixer.c b/mixer.c index 013f35fe..48095d03 100644 --- 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); -- 2.39.5