Merge branch 'refs/heads/t/mixer-fix'
[paraslash.git] / mixer.c
diff --git a/mixer.c b/mixer.c
index 52af25f9c22ae5397f03c5bf61daaae0f1bb67bd..efa42b93efb9ce0cf6f277b0f117806845455a26 100644 (file)
--- a/mixer.c
+++ b/mixer.c
@@ -1,6 +1,6 @@
 /* Copyright (C) 1998 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
-/** \file mixer.c A volume fader and alarm clock for OSS. */
+/** \file mixer.c A volume fader and alarm clock. */
 
 #include <regex.h>
 #include <lopsub.h>
@@ -8,6 +8,7 @@
 
 #include "mixer.lsg.h"
 #include "para.h"
+#include "lsu.h"
 #include "fd.h"
 #include "string.h"
 #include "mix.h"
@@ -312,7 +313,6 @@ static int com_sleep(const struct mixer *m, struct mixer_handle *h)
                client_cmd("stop");
        if (!fit || !fi_mood) /* nothing to do */
                return 1;
-       change_afs_mode(fi_mood);
        for (;;) {
                time(&t1);
                if (wake_time_epoch <= t1 + fit)
@@ -323,7 +323,11 @@ static int com_sleep(const struct mixer *m, struct mixer_handle *h)
                        (delay % 3600) / 60);
                sleep(delay);
        }
-       client_cmd("play");
+       change_afs_mode(fi_mood);
+       if (sleep_mood) /* currently playing */
+               client_cmd("next");
+       else /* currently stopped */
+               client_cmd("play");
        ret = fade(m, h, fiv, fit);
        PARA_INFO_LOG("fade complete, returning\n");
        return ret;
@@ -453,60 +457,16 @@ static void handle_help_flags(void)
 static int parse_and_merge_config_file(const struct lls_command *cmd)
 {
        int ret;
-       int cf_argc;
-       char **cf_argv;
-       char *cf, *errctx = NULL;
-       struct lls_parse_result **lprp, *cf_lpr, *merged_lpr;
-       void *map;
-       size_t sz;
-       const char *subcmd_name;
-
-       if (cmd == lls_cmd(0, mixer_suite)) {
-               lprp = &lpr;
-               subcmd_name = NULL;
-       } else {
-               lprp = &sub_lpr;
-               subcmd_name = lls_command_name(cmd);
-       }
-       if (OPT_GIVEN(PARA_MIXER, CONFIG_FILE))
-               cf = para_strdup(OPT_STRING_VAL(PARA_MIXER, CONFIG_FILE));
-       else {
-               char *home = para_homedir();
-               cf = make_message("%s/.paraslash/mixer.conf", home);
-               free(home);
-       }
-       ret = mmap_full_file(cf, O_RDONLY, &map, &sz, NULL);
-       if (ret < 0) {
-               if (ret != -E_EMPTY && ret != -ERRNO_TO_PARA_ERROR(ENOENT))
-                       goto free_cf;
-               if (ret == -ERRNO_TO_PARA_ERROR(ENOENT) &&
-                               OPT_GIVEN(PARA_MIXER, CONFIG_FILE))
-                       goto free_cf;
-       } else {
-               ret = lls(lls_convert_config(map, sz, subcmd_name, &cf_argv, &errctx));
-               para_munmap(map, sz);
-               if (ret < 0)
-                       goto free_cf;
-               cf_argc = ret;
-               ret = lls(lls_parse(cf_argc, cf_argv, cmd, &cf_lpr, &errctx));
-               lls_free_argv(cf_argv);
-               if (ret < 0)
-                       goto free_cf;
-               ret = lls(lls_merge(*lprp, cf_lpr, cmd, &merged_lpr, &errctx));
-               lls_free_parse_result(cf_lpr, cmd);
-               if (ret < 0)
-                       goto free_cf;
-               lls_free_parse_result(*lprp, cmd);
-               *lprp = merged_lpr;
-               loglevel = OPT_UINT32_VAL(PARA_MIXER, LOGLEVEL);
-       }
-       ret = 1;
-free_cf:
-       free(cf);
-       if (errctx)
-               PARA_ERROR_LOG("%s\n", errctx);
-       free(errctx);
-       return ret;
+       struct lls_parse_result **lprp = (cmd == lls_cmd(0, mixer_suite))?
+               &lpr : &sub_lpr;
+
+       ret = lsu_merge_config_file_options(OPT_STRING_VAL(PARA_MIXER,
+               CONFIG_FILE), "mixer.conf", lprp, cmd, mixer_suite,
+               0 /* flags */);
+       if (ret < 0)
+               return ret;
+       loglevel = OPT_UINT32_VAL(PARA_MIXER, LOGLEVEL);
+       return 1;
 }
 
 /**
@@ -569,7 +529,7 @@ int main(int argc, char *argv[])
        }
        if (ret < 0)
                goto close_mixer;
-       ret = (*(mixer_subcommand_handler_t *)(lls_user_data(cmd)))(m ,h);
+       ret = (*(mixer_subcommand_handler_t *)(lls_user_data(cmd)))(mh);
 close_mixer:
        m->close(&h);
 free_sub_lpr: