static struct status_task status_task_struct;
struct status_task *stat_task = &status_task_struct;
+static struct timeval initial_delay_barrier;
/**
* the task for handling audiod commands
struct task task;
};
+/**
+ * task for signal handling
+ */
struct signal_task {
+ /** the signal pipe */
int fd;
+ /** the number of the most recent signal */
int signum;
+ /** the associated task structure */
struct task task;
};
break;
case SI_STREAM_START:
if (sscanf(line + ilen + 1, "%lu.%lu", &sec, &usec) == 2) {
+ struct timeval tmp, delay;
+ delay.tv_sec = conf.stream_delay_arg / 1000;
+ delay.tv_usec = (conf.stream_delay_arg % 1000) * 1000;
stat_task->server_stream_start.tv_sec = sec;
stat_task->server_stream_start.tv_usec = usec;
+ if (stat_task->sa_time_diff_sign < 0)
+ tv_add(&stat_task->server_stream_start,
+ &stat_task->sa_time_diff, &tmp);
+ else
+ tv_diff(&stat_task->server_stream_start,
+ &stat_task->sa_time_diff, &tmp);
+ tv_add(&tmp, &delay, &initial_delay_barrier);
}
break;
case SI_CURRENT_TIME:
FOR_EACH_SLOT(i) {
struct slot_info *sl = &slot[i];
struct audio_format_info *a;
+ struct timeval diff;
if (sl->format < 0)
continue;
s->timeout = min_delay;
continue;
}
- if (sl->fc && *sl->fc->out_loaded && !sl->wng) {
+ if (!sl->fc || !*sl->fc->out_loaded || sl->wng)
+ continue;
+ if (tv_diff(now, &initial_delay_barrier, &diff) > 0) {
+ PARA_INFO_LOG("barrier: %lu:%lu, now: %lu, %lu\n",
+ initial_delay_barrier.tv_sec,
+ initial_delay_barrier.tv_usec,
+ now->tv_sec, now->tv_usec);
open_writers(i);
s->timeout = min_delay;
+ continue;
+ }
+ PARA_INFO_LOG("inital delay: %lu ms left\n", tv2ms(&diff));
+ if (tv_diff(&s->timeout, &diff, NULL) > 0) {
+ s->timeout = diff;
}
}
}
PARA_INFO_LOG("initializing %s receiver\n", receivers[i].name);
receivers[i].init(&receivers[i]);
}
- for (i = 0; i < conf.receiver_given; i++) {
+ for (i = conf.receiver_given - 1; i >= 0; i--) {
char *arg = conf.receiver_arg[i];
char *recv = strchr(arg, ':');
+ PARA_INFO_LOG("arg: %s\n", arg);
ret = -E_MISSING_COLON;
if (!recv)
goto out;
return fd;
}
-void signal_event_handler(struct task *t)
+static void signal_event_handler(struct task *t)
{
struct signal_task *st = t->private_data;
handle_signal(st->signum);
}
-void signal_pre_select(struct sched *s, struct task *t)
+static void signal_pre_select(struct sched *s, struct task *t)
{
struct signal_task *st = t->private_data;
t->ret = 1;
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
-void signal_post_select(struct sched *s, struct task *t)
+static void signal_post_select(struct sched *s, struct task *t)
{
struct signal_task *st = t->private_data;
t->ret = 1;
st->signum = para_next_signal();
}
-void signal_setup_default(struct signal_task *st)
+static void signal_setup_default(struct signal_task *st)
{
st->task.pre_select = signal_pre_select;
st->task.post_select = signal_post_select;