/*
- * Copyright (C) 1998-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
}
__printf_2_3 void (*para_log)(int, const char*, ...) = date_log;
+static int set_channel(struct mixer *m, struct mixer_handle *h, const char *channel)
+{
+
+ PARA_NOTICE_LOG("using %s mixer channel\n", channel?
+ channel : "default");
+ return m->set_channel(h, channel);
+}
+
/* Fade to new volume in fade_time seconds. */
static int fade(struct mixer *m, struct mixer_handle *h, int new_vol, int fade_time)
{
if (fade_time <= 0)
return m->set(h, new_vol);
secs = fade_time;
- PARA_NOTICE_LOG("fading to %d in %d seconds\n", new_vol, secs);
ret = m->get(h);
if (ret < 0)
goto out;
vol = ret;
+ PARA_NOTICE_LOG("fading %s from %d to %d in %d seconds\n",
+ conf.mixer_channel_arg, vol, new_vol, secs);
diff = new_vol - vol;
if (!diff) {
sleep(secs);
exit(EXIT_FAILURE);
}
-static void change_afs_mode_and_play(char *afs_mode)
+static void change_afs_mode(char *afs_mode)
{
char *cmd;
cmd = make_message("select %s", afs_mode);
client_cmd(cmd);
free(cmd);
- client_cmd("play");
+}
+
+static int set_initial_volume(struct mixer *m, struct mixer_handle *h)
+{
+ int i, ret;
+
+ for (i = 0; i < conf.ivol_given; i++) {
+ char *p, *ch, *arg = para_strdup(conf.ivol_arg[i]);
+ int32_t iv;
+ p = strchr(arg, ':');
+ if (p) {
+ *p = '\0';
+ p++;
+ ch = arg;
+ } else {
+ p = arg;
+ ch = NULL;
+ }
+ ret = para_atoi32(p, &iv);
+ if (ret < 0) {
+ free(arg);
+ return ret;
+ }
+ ret = set_channel(m, h, ch);
+ if (!ch)
+ ch = "default";
+ if (ret < 0) {
+ PARA_WARNING_LOG("ignoring channel %s\n", ch);
+ ret = 0;
+ } else {
+ PARA_INFO_LOG("initial volume %s: %d\n", ch, iv);
+ ret = m->set(h, iv);
+ }
+ free(arg);
+ if (ret < 0)
+ return ret;
+ }
+ return 1;
}
static int sweet_dreams(struct mixer *m, struct mixer_handle *h)
int fot = conf.fo_time_arg;
int fiv = conf.fi_vol_arg;
int fov = conf.fo_vol_arg;
- int iv = conf.ivol_arg;
/* calculate wake time */
time(&t1);
tm = localtime(&t1);
}
wake_time_epoch = mktime(tm);
- PARA_INFO_LOG("waketime: %s", asctime(tm));
+ PARA_INFO_LOG("waketime: %u:%02u\n", tm->tm_hour, tm->tm_min);
client_cmd("stop");
sleep(1);
if (fot) {
- PARA_INFO_LOG("initial volume: %d\n", iv);
- ret = m->set(h, iv);
+ ret = set_initial_volume(m, h);
+ if (ret < 0)
+ return ret;
+ change_afs_mode(fo_mood);
+ client_cmd("play");
+ ret = set_channel(m, h, conf.mixer_channel_arg);
if (ret < 0)
return ret;
- change_afs_mode_and_play(fo_mood);
ret = fade(m, h, fov, fot);
if (ret < 0)
return ret;
if (ret < 0)
return ret;
}
- if (conf.sleep_mood_given)
- change_afs_mode_and_play(sleep_mood);
- else
+ if (conf.sleep_mood_given) {
+ change_afs_mode(sleep_mood);
+ client_cmd("play");
+ } else
client_cmd("stop");
if (!fit)
return 1;
+ change_afs_mode(fi_mood);
for (;;) {
time(&t1);
if (wake_time_epoch <= t1 + fit)
(delay % 3600) / 60);
sleep(delay);
}
- change_afs_mode_and_play(fi_mood);
+ client_cmd("play");
ret = fade(m, h, fiv, fit);
PARA_INFO_LOG("fade complete, returning\n");
return ret;
}
}
-static int set_channel(struct mixer *m, struct mixer_handle *h)
+static int set_val(struct mixer *m, struct mixer_handle *h)
{
- char *channels;
- int ret;
-
- ret = m->set_channel(h, conf.mixer_channel_arg);
- if (ret >= 0) {
- PARA_NOTICE_LOG("using %s mixer channel\n",
- conf.mixer_channel_arg? conf.mixer_channel_arg
- : "default");
- return ret;
- }
- channels = m->get_channels(h);
- printf("Available channels: %s\n", channels);
- free(channels);
- return ret;
+ return m->set(h, conf.val_arg);
}
static struct mixer *get_mixer_or_die(void)
ret = m->open(conf.mixer_device_arg, &h);
if (ret < 0)
goto out;
- ret = set_channel(m, h);
+ ret = set_channel(m, h, conf.mixer_channel_arg);
+ if (ret == -E_BAD_CHANNEL) {
+ char *channels = m->get_channels(h);
+ printf("Available channels: %s\n", channels);
+ free(channels);
+ }
if (ret < 0)
goto out;
switch (conf.mode_arg) {
case mode_arg_snooze:
ret = snooze(m, h);
break;
+ case mode_arg_set:
+ ret = set_val(m, h);
+ break;
default: /* sleep mode */
ret = sweet_dreams(m, h);
break;