X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mixer.c;h=dda7fc1df729722266db7136733a28ac2391e977;hb=6bbc7c29dd69ed34ef90dac72951abbfd7cc1877;hp=55282e77b6b3093e88f9bc66514d684956653e31;hpb=ac289a22fd438a97d5eda86793a47377d0d570ce;p=paraslash.git diff --git a/mixer.c b/mixer.c index 55282e77..dda7fc1d 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,20 @@ static int set_initial_volume(const struct mixer *m, struct mixer_handle *h) return 1; } +static void stop(const struct mixer *m, struct mixer_handle *h) +{ + int ret, old_vol = 0; + + ret = m->get(h); + if (ret > 0) + old_vol = ret; + fade(m, h, 0, 3); + audioc_cmd("off"); + client_cmd("stop"); + audioc_cmd("on"); + m->set(h, old_vol); +} + static int com_sleep(const struct mixer *m) { time_t t1, wake_time_epoch; @@ -270,6 +294,7 @@ static int com_sleep(const struct mixer *m) struct tm *tm; int ret; const char *wake_time = OPT_STRING_VAL(SLEEP, WAKE_TIME); + const char *initial_mood = OPT_STRING_VAL(SLEEP, INITIAL_MOOD); const char *fo_mood = OPT_STRING_VAL(SLEEP, FO_MOOD); const char *fi_mood = OPT_STRING_VAL(SLEEP, FI_MOOD); const char *sleep_mood = OPT_STRING_VAL(SLEEP, SLEEP_MOOD); @@ -316,17 +341,27 @@ 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); - if (fot && fo_mood) { - ret = set_initial_volume(m, h); - if (ret < 0) - goto close_mixer; + stop(m, h); + ret = set_initial_volume(m, h); + if (ret < 0) + goto close_mixer; + /* + * Setting the volume invalidates the current channel setting, so we + * have to set it again. + */ + ret = set_channel(m, h, OPT_STRING_VAL(PARA_MIXER, MIXER_CHANNEL)); + if (ret < 0) + goto close_mixer; + delay = OPT_UINT32_VAL(SLEEP, INITIAL_DELAY); + if (delay > 0 && initial_mood && *initial_mood) { + change_afs_mode(initial_mood); + client_cmd("play"); + sleep(delay); + stop(m, h); + } + if (fot && fo_mood && *fo_mood) { change_afs_mode(fo_mood); client_cmd("play"); - ret = set_channel(m, h, OPT_STRING_VAL(PARA_MIXER, MIXER_CHANNEL)); - if (ret < 0) - goto close_mixer; ret = fade(m, h, fov, fot); if (ret < 0) goto close_mixer; @@ -335,14 +370,14 @@ static int com_sleep(const struct mixer *m) if (ret < 0) goto close_mixer; } - if (sleep_mood) { + if (sleep_mood && *sleep_mood) { change_afs_mode(sleep_mood); if (!fot || !fo_mood) /* currently stopped */ client_cmd("play"); - } else if (fot && fo_mood) /* currently playing */ - client_cmd("stop"); + } else if (fot && fo_mood && *fo_mood) /* currently playing */ + stop(m, h); m->close(&h); - if (!fit || !fi_mood) /* nothing to do */ + if (!fit || !fi_mood || !*fi_mood) /* nothing to do */ return 1; for (;;) { time(&t1); @@ -355,13 +390,12 @@ static int com_sleep(const struct mixer *m) sleep(delay); } change_afs_mode(fi_mood); - if (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(m, h); + client_cmd("play"); ret = fade(m, h, fiv, fit); close_mixer: m->close(&h);