* Licensed under the GPL v2. For licencing details see COPYING.
*/
-/** \file fade.c a volume fader and alarm clock */
+/** \file fade.c A volume fader and alarm clock for linux. */
#include <sys/types.h>
#include <dirent.h>
#include <limits.h>
#include <linux/soundcard.h>
#include "string.h"
+#include "error.h"
+INIT_FADE_ERRLISTS;
struct fade_args_info conf;
void para_log(__a_unused int ll, const char *fmt,...)
*/
static int open_mixer(void)
{
- return open(conf.mixer_device_arg, O_RDWR, 0);
+ return para_open(conf.mixer_device_arg, O_RDWR, 42);
}
/*
int volume;
if (ioctl(mixer_fd, MIXER_READ(SOUND_MIXER_VOLUME), &volume) < 0)
- return -1;
+ return -ERRNO_TO_PARA_ERROR(errno);
/* take the mean value of left and right volume */
return (volume % 256 + (volume >> 8)) / 2;
}
mixer_fd = open_mixer();
if (mixer_fd < 0)
- return -1;
+ return mixer_fd;
volume = do_get_vol(mixer_fd);
close(mixer_fd);
return volume;
int tmp = (volume << 8) + volume;
if (ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_VOLUME), &tmp) < 0)
- return -1;
+ return -ERRNO_TO_PARA_ERROR(errno);
return 1;
}
* Open mixer, get volume, fade to new_vol in secs seconds and
* close mixer
*/
-static void fade(int new_vol, int fade_time)
+static int fade(int new_vol, int fade_time)
{
- int vol, mixer_fd, diff, incr;
+ int vol, mixer_fd, diff, incr, ret;
unsigned secs;
struct timespec ts;
unsigned long long tmp, tmp2; /* Careful with that axe, Eugene! */
if (fade_time <= 0)
- return;
+ return 1;
secs = fade_time;
PARA_NOTICE_LOG("fading to %d in %d seconds\n", new_vol, secs);
- mixer_fd = open_mixer();
- if (mixer_fd < 0)
- return;
- vol = do_get_vol(mixer_fd);
- if (vol < 0)
+ ret = open_mixer();
+ if (ret < 0)
+ return ret;
+ mixer_fd = ret;
+ ret = do_get_vol(mixer_fd);
+ if (ret < 0)
goto out;
+ vol = ret;
diff = new_vol - vol;
if (!diff) {
sleep(secs);
ts.tv_sec = tmp / 1000; /* really nec ?*/
//printf("ts.tv_sec: %i\n", ts.tv_nsec);
vol += incr;
- if (do_set_vol(mixer_fd, vol) < 0)
+ ret = do_set_vol(mixer_fd, vol);
+ if (ret < 0)
goto out;
//printf("vol = %i\n", vol);
nanosleep(&ts, NULL);
}
out:
close(mixer_fd);
+ return ret;
}
static void client_cmd(const char *cmd)
PARA_INFO_LOG("%s\n", cmdline);
ret = para_exec_cmdline_pid(&pid, cmdline, fds);
free(cmdline);
- if (ret < 0)
+ if (ret < 0) {
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
exit(EXIT_FAILURE);
+ }
do
ret = wait(NULL);
while (ret != -1 && errno != ECHILD);
/*
* sleep
*/
-static void sweet_dreams(void)
+static int sweet_dreams(void)
{
time_t t1, wake_time_epoch;
unsigned int delay;
struct tm *tm;
- int min = conf.wake_min_arg;
+ int ret, min = conf.wake_min_arg;
char *fa_mode = conf.fa_mode_arg;
char *wake_mode = conf.wake_mode_arg;
char *sleep_mode = conf.sleep_mode_arg;
sleep(1);
if (sf) {
PARA_INFO_LOG("initial volume: %d\n", iv);
- set_vol(iv);
+ ret = set_vol(iv);
+ if (ret < 0)
+ return ret;
change_afs_mode_and_play(fa_mode);
- fade(sv, sf);
- } else
- set_vol(sf);
+ ret = fade(sv, sf);
+ if (ret < 0)
+ return ret;
+ } else {
+ ret = set_vol(sf);
+ if (ret < 0)
+ return ret;
+ }
change_afs_mode_and_play(sleep_mode);
if (!wf)
- return;
+ return 1;
for (;;) {
time(&t1);
if (wake_time_epoch <= t1 + wf)
sleep(delay);
}
change_afs_mode_and_play(wake_mode);
- fade(wv, wf);
+ ret = fade(wv, wf);
PARA_INFO_LOG("fade complete, returning\n");
+ return ret;
}
-static void snooze(void)
+static int snooze(void)
{
+ int ret;
unsigned sleep_time;
if (conf.snooze_time_arg <= 0)
- return;
+ return 1;
sleep_time = conf.snooze_time_arg;
if (get_vol() < conf.snooze_out_vol_arg)
- set_vol(conf.snooze_out_vol_arg);
+ ret = set_vol(conf.snooze_out_vol_arg);
else
- fade(conf.snooze_out_vol_arg, conf.snooze_out_fade_arg);
+ ret = fade(conf.snooze_out_vol_arg, conf.snooze_out_fade_arg);
+ if (ret < 0)
+ return ret;
client_cmd("pause");
PARA_NOTICE_LOG("%d seconds snooze time...\n", conf.snooze_time_arg);
sleep(sleep_time);
client_cmd("play");
- fade(conf.snooze_in_vol_arg, conf.snooze_in_fade_arg);
+ return fade(conf.snooze_in_vol_arg, conf.snooze_in_fade_arg);
}
static int configfile_exists(void)
return file_exists(conf.config_file_arg);
}
-
int main(int argc, char *argv[])
{
int ret;
fade_cmdline_parser_config_file(conf.config_file_arg,
&conf, ¶ms);
}
- ret = open_mixer();
- if (ret < 0) {
- PARA_EMERG_LOG("can not open mixer device %s.",
- conf.mixer_device_arg);
- exit(EXIT_FAILURE);
- }
- close(ret);
- ret = 0;
-// setlinebuf(stdout);
if (!strcmp(conf.mode_arg, "sleep")) {
- sweet_dreams();
+ ret = sweet_dreams();
goto out;
}
if (!strcmp(conf.mode_arg, "fade")) {
- fade(conf.fade_vol_arg, conf.fade_time_arg);
+ ret = fade(conf.fade_vol_arg, conf.fade_time_arg);
goto out;
}
if (!strcmp(conf.mode_arg, "snooze")) {
- snooze();
+ ret = snooze();
goto out;
}
- ret = -1;
+ ret = -E_FADE_SYNTAX;
out:
+ if (ret < 0)
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
}