}
__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)
+{
+ char *channels;
+ int ret;
+
+ ret = m->set_channel(h, channel);
+ if (ret >= 0) {
+ PARA_NOTICE_LOG("using %s mixer channel\n",
+ channel? channel : "default");
+ return ret;
+ }
+ channels = m->get_channels(h);
+ printf("Available channels: %s\n", channels);
+ free(channels);
+ return ret;
+}
+
/* 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);
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)
{
time_t t1, wake_time_epoch;
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);
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_and_play(fo_mood);
+ ret = set_channel(m, h, conf.mixer_channel_arg);
+ if (ret < 0)
+ return ret;
ret = fade(m, h, fov, fot);
if (ret < 0)
return ret;
}
}
-static int set_channel(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;
-}
-
static int set_val(struct mixer *m, struct mixer_handle *h)
{
return m->set(h, conf.val_arg);
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 < 0)
goto out;
switch (conf.mode_arg) {