fade.c: replace args_info by conf
[paraslash.git] / fade.c
diff --git a/fade.c b/fade.c
index 33a6fa055b7e00c4852c79b4daba207e2acdebe6..8da91134a5208d36700e6aba4aafbc02ebc685ff 100644 (file)
--- a/fade.c
+++ b/fade.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1998-2005 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2007 Andre Noll <maan@systemlinux.org>
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include "para.h"
 #include "fd.h"
 
+#include <stropts.h>
 #include <ctype.h>
 #include <curses.h>
 #include <stdlib.h> /* EXIT_SUCCESS */
@@ -33,9 +34,9 @@
 #include "string.h"
 
 
-struct gengetopt_args_info args_info;
+struct fade_args_info conf;
 
-void para_log(__unused int ll, const char *fmt,...)
+void para_log(__a_unused int ll, const char *fmt,...)
 {
        va_list argp;
        time_t t1;
@@ -54,11 +55,11 @@ void para_log(__unused int ll, const char *fmt,...)
  */
 static int open_mixer(void)
 {
-        int mixer_fd;
+       int mixer_fd;
 
-        if ((mixer_fd = open(args_info.mixer_device_arg, O_RDWR, 0)) < 0)
-                return -1;
-        return mixer_fd;
+       if ((mixer_fd = open(conf.mixer_device_arg, O_RDWR, 0)) < 0)
+               return -1;
+       return mixer_fd;
 }
 
 /*
@@ -126,16 +127,17 @@ out:
  * Open mixer, get volume, fade to new_vol in secs seconds and
  * close mixer
  */
-static int fade(int new_vol, unsigned int secs)
+static void fade(int new_vol, int fade_time)
 {
-       int vol, mixer_fd = -1, diff, incr, ret;
+       int vol, mixer_fd = -1, diff, incr;
+       unsigned secs;
        struct timespec ts;
        unsigned long long tmp, tmp2; /* Careful with that axe, Eugene! */
 
-       PARA_NOTICE_LOG("fading to %d in %d seconds\n", new_vol, secs);
-       ret = 0;
-       if (!secs)
+       if (fade_time <= 0)
                goto out;
+       secs = fade_time;
+       PARA_NOTICE_LOG("fading to %d in %d seconds\n", new_vol, secs);
        mixer_fd = open_mixer();
        if (mixer_fd < 0)
                goto out;
@@ -145,7 +147,6 @@ static int fade(int new_vol, unsigned int secs)
        diff = new_vol - vol;
        if (!diff) {
                sleep(secs);
-               ret = 1;
                goto out;
        }
        incr = diff > 0? 1: -1;
@@ -165,7 +166,6 @@ static int fade(int new_vol, unsigned int secs)
 out:
        if (mixer_fd >= 0)
                close(mixer_fd);
-       return 1;
 }
 
 static int client_cmd(const char *cmd,...)
@@ -173,7 +173,7 @@ static int client_cmd(const char *cmd,...)
        int ret, fds[3] = {0, 0, 0};
        pid_t pid;
        char *cmdline = make_message(BINDIR "/para_client %s", cmd);
-       PARA_INFO_LOG("%s", cmdline);
+       PARA_INFO_LOG("%s\n", cmdline);
        ret = para_exec_cmdline_pid(&pid, cmdline, fds);
        free(cmdline);
        return ret;
@@ -187,19 +187,37 @@ static void sweet_dreams(void)
        time_t t1, wake_time_epoch;
        unsigned int delay;
        struct tm *tm;
-       int hour = args_info.wake_hour_arg;
-       int min = args_info.wake_min_arg;
-       char *fa_stream = args_info.fa_stream_arg;
-       char *wake_stream = args_info.wake_stream_arg;
+       int min = conf.wake_min_arg;
+       char *fa_stream = conf.fa_stream_arg;
+       char *wake_stream = conf.wake_stream_arg;
        //char *current_stream = stat_items[STREAM].content;
-       int wf = args_info.wake_fade_arg;
-       int sf = args_info.fa_fade_arg;
-       int wv = args_info.wake_vol_arg;
-       int sv = args_info.fa_vol_arg;
-       int iv = args_info.sleep_ivol_arg;
-       char *cmd, *sleep_stream = args_info.sleep_stream_given?
-               args_info.sleep_stream_arg : NULL;
+       int wf = conf.wake_fade_arg;
+       int sf = conf.fa_fade_arg;
+       int wv = conf.wake_vol_arg;
+       int sv = conf.fa_vol_arg;
+       int iv = conf.sleep_ivol_arg;
+       char *cmd, *sleep_stream = conf.sleep_stream_given?
+               conf.sleep_stream_arg : NULL;
 
+       /* calculate wake time */
+       time(&t1);
+       if (conf.wake_hour_given) {
+               int hour = conf.wake_hour_arg;
+               tm = localtime(&t1);
+               if (tm->tm_hour > hour || (tm->tm_hour == hour && tm->tm_min> min)) {
+                       t1 += 86400; /* wake time is tomorrow */
+                       tm = localtime(&t1);
+               }
+               tm->tm_hour = hour;
+               tm->tm_min = min;
+               tm->tm_sec = 0;
+       } else {
+               t1 += 8 * 60 * 60;
+               PARA_INFO_LOG("default wake time: %lu\n", t1);
+               tm = localtime(&t1);
+       }
+       wake_time_epoch = mktime(tm);
+       PARA_INFO_LOG("waketime: %s", asctime(tm));
        if (sf) {
                PARA_INFO_LOG("initial volume: %d\n", iv);
                set_vol(iv);
@@ -216,27 +234,15 @@ static void sweet_dreams(void)
                client_cmd("stop");
        if (!wf)
                return;
-       /* calculate wake time */
-       time(&t1);
-       tm = localtime(&t1);
-       if (tm->tm_hour > hour || (tm->tm_hour == hour && tm->tm_min> min)) {
-               /* wake time is tomorrow */
-               t1 += 86400;
-               tm = localtime(&t1);
-               t1 -= 86400;
-       }
-       tm->tm_hour = hour;
-       tm->tm_min = min;
-       tm->tm_sec = 0;
-       wake_time_epoch = mktime(tm);
-       PARA_INFO_LOG("waketime: %s", asctime(tm));
-       while (wake_time_epoch > t1 + wf) {
+       for (;;) {
+               time(&t1);
+               if (wake_time_epoch <= t1 + wf)
+                       break;
                delay = wake_time_epoch - t1 - wf;
                PARA_INFO_LOG("sleeping %u seconds (%u:%02u)\n",
                        delay, delay / 3600, 
                        (delay % 3600) / 60);
                sleep(delay);
-               time(&t1);
        }
        cmd = make_message("csp %s\n", wake_stream);
        client_cmd(cmd);
@@ -247,30 +253,34 @@ static void sweet_dreams(void)
 
 static void snooze(void)
 {
-       if (get_vol() < args_info.snooze_out_vol_arg)
-               set_vol(args_info.snooze_out_vol_arg);
+       unsigned sleep_time;
+
+       if (conf.snooze_time_arg <= 0)
+               return;
+       sleep_time = conf.snooze_time_arg;
+       if (get_vol() < conf.snooze_out_vol_arg)
+               set_vol(conf.snooze_out_vol_arg);
        else
-               fade(args_info.snooze_out_vol_arg, args_info.snooze_out_fade_arg);
+               fade(conf.snooze_out_vol_arg, conf.snooze_out_fade_arg);
        client_cmd("pause");
-       PARA_NOTICE_LOG("%d seconds snooze time...\n", args_info.snooze_time_arg);
-       sleep(args_info.snooze_time_arg);
+       PARA_NOTICE_LOG("%d seconds snooze time...\n", conf.snooze_time_arg);
+       sleep(sleep_time);
        client_cmd("play");
-       fade(args_info.snooze_in_vol_arg, args_info.snooze_in_fade_arg);
+       fade(conf.snooze_in_vol_arg, conf.snooze_in_fade_arg);
 }
 
 static int configfile_exists(void)
 {
-        static char *config_file;
+       static char *config_file;
 
-        if (!args_info.config_file_given) {
+       if (!conf.config_file_given) {
                char *home = para_homedir();
-               const char *conf = ".paraslash/fade.conf";
                free(config_file);
-               config_file = make_message("%s/%s", home, conf);
+               config_file = make_message("%s/.paraslash/fade.conf", home);
                free(home);
-                args_info.config_file_arg = config_file;
-        }
-        return file_exists(args_info.config_file_arg);
+               conf.config_file_arg = config_file;
+       }
+       return file_exists(conf.config_file_arg);
 }
 
 
@@ -278,34 +288,35 @@ int main(int argc, char *argv[])
 {
        int ret;
 
-       if (cmdline_parser(argc, argv, &args_info))
+       if (fade_cmdline_parser(argc, argv, &conf))
                exit(EXIT_FAILURE);
+       HANDLE_VERSION_FLAG("fade", conf);
        ret = configfile_exists();
-       if (!ret && args_info.config_file_given) {
+       if (!ret && conf.config_file_given) {
                PARA_EMERG_LOG("can not read config file %s\n",
-                       args_info.config_file_arg);
+                       conf.config_file_arg);
                exit(EXIT_FAILURE);
        }
        if (ret)
-               cmdline_parser_configfile(args_info.config_file_arg,
-                       &args_info, 0, 0, 0);
+               fade_cmdline_parser_configfile(conf.config_file_arg,
+                       &conf, 0, 0, 0);
        if ((ret = open_mixer()) < 0) {
                PARA_EMERG_LOG("can not open mixer device %s.",
-                       args_info.mixer_device_arg);
+                       conf.mixer_device_arg);
                exit(EXIT_FAILURE);
        } else
                close(ret);
        ret = 0;
        setlinebuf(stdout);
-       if (!strcmp(args_info.mode_arg, "sleep")) {
+       if (!strcmp(conf.mode_arg, "sleep")) {
                sweet_dreams();
                goto out;
        }
-       if (!strcmp(args_info.mode_arg, "fade")) {
-               fade(args_info.fade_vol_arg, args_info.fade_time_arg);
+       if (!strcmp(conf.mode_arg, "fade")) {
+               fade(conf.fade_vol_arg, conf.fade_time_arg);
                goto out;
        }
-       if (!strcmp(args_info.mode_arg, "snooze")) {
+       if (!strcmp(conf.mode_arg, "snooze")) {
                snooze();
                goto out;
        }