/*
- * Copyright (C) 2005-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
* \return The audio format number on success, -E_UNSUPPORTED_AUDIO_FORMAT if
* \a name is not a supported audio format.
*/
-int get_audio_format_num(const char *name)
+static int get_audio_format_num(const char *name)
{
int i;
btr_free_node(s->receiver_node->btrn);
free(s->receiver_node);
s->receiver_node = NULL;
+ tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000),
+ &a->restart_barrier);
}
static void writer_cleanup(struct writer_node *wn)
return -E_NO_MORE_SLOTS;
}
-/**
- * get the number of filters
- *
- * \param audio_format_num the number identifying the audio format
- *
- * \return the number of filters for the given audio format
- *
- * \sa struct filter;
- */
-int num_filters(int audio_format_num)
-{
- return afi[audio_format_num].num_filters;
-}
-
static void open_filters(struct slot_info *s)
{
struct audio_format_info *a = afi + s->format;
ret = get_audio_format_num(arg);
if (ret < 0)
goto out;
+ /*
+ * If multiple receivers are given for this audio format, the
+ * last one wins and we have to free the previous receiver
+ * config here. Since we are iterating backwards, the winning
+ * receiver arg is in fact the first one given.
+ */
+ if (afi[ret].receiver_conf)
+ afi[ret].receiver->free_config(afi[ret].receiver_conf);
afi[ret].receiver_conf = check_receiver_arg(recv_arg, &receiver_num);
if (!afi[ret].receiver_conf) {
ret = -E_RECV_SYNTAX;
}
afi[ret].receiver = &receivers[receiver_num];
}
- /* use the first available receiver with no arguments
- * for those audio formats for which no receiver
- * was specified
+ /*
+ * Use the first available receiver with no arguments for those audio
+ * formats for which no receiver was specified.
*/
cmd = para_strdup(receivers[0].name);
FOR_EACH_AUDIO_FORMAT(i) {
* If udp is used to receive this audiod format, add fecdec as
* the first filter.
*/
- if (strcmp(afi[i].receiver->name, "udp") == 0) {
+ if (strcmp(afi[i].receiver->name, "udp") == 0 ||
+ strcmp(afi[i].receiver->name, "dccp") == 0) {
tmp = para_strdup("fecdec");
add_filter(i, tmp);
free(tmp);
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
-static void signal_post_select(struct sched *s, struct task *t)
+static void signal_post_select(struct sched *s, __a_unused struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
+ int signum;
- if (!FD_ISSET(st->fd, &s->rfds))
- return;
-
- st->signum = para_next_signal();
- switch (st->signum) {
+ signum = para_next_signal(&s->rfds);
+ switch (signum) {
case SIGINT:
case SIGTERM:
case SIGHUP:
- PARA_EMERG_LOG("terminating on signal %d\n", st->signum);
+ PARA_EMERG_LOG("terminating on signal %d\n", signum);
clean_exit(EXIT_FAILURE, "caught deadly signal");
}
}
last_status_dump = *now;
}
- if (!FD_ISSET(ct->fd, &s->rfds))
- return;
- ret = handle_connect(ct->fd);
+ ret = handle_connect(ct->fd, &s->rfds);
if (ret < 0)
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
audiod_status_dump();
if (s->format < 0)
return;
- if (s->receiver_node && s->receiver_node->task.error != -E_TASK_UNREGISTERED)
+ if (s->receiver_node && s->receiver_node->task.error >= 0)
return;
for (i = 0; i < a->num_filters; i++)
- if (s->fns && s->fns[i].task.error != -E_TASK_UNREGISTERED)
+ if (s->fns && s->fns[i].task.error >= 0)
return;
if (a->num_writers > 0) {
for (i = 0; i < a->num_writers; i++)
- if (s->wns && s->wns[i].task.error != -E_TASK_UNREGISTERED)
+ if (s->wns && s->wns[i].task.error >= 0)
return;
} else {
- if (s->wns && s->wns[0].task.error != -E_TASK_UNREGISTERED)
+ if (s->wns && s->wns[0].task.error >= 0)
return;
}
PARA_INFO_LOG("closing slot %d\n", slot_num);
kill_btrn(st->ct->btrn, &st->ct->task, -E_AUDIOD_OFF);
goto out;
}
- if (st->ct->task.error != -E_TASK_UNREGISTERED)
+ if (st->ct->task.error >= 0)
goto out;
close_stat_pipe();
st->clock_diff_count = conf.clock_diff_count_arg;
size_t sz;
int ret;
if (st->ct->task.error < 0) {
- if (st->ct->task.error != -E_TASK_UNREGISTERED)
+ if (st->ct->task.error >= 0)
goto out;
close_stat_pipe();
goto out;
st->min_iqs = sz + 1;
goto out;
}
+ btr_drain(st->btrn);
+ st->current_audio_format_num = -1;
if (tv_diff(now, &st->restart_barrier, NULL) < 0)
goto out;
if (st->clock_diff_count) { /* get status only one time */
static void init_colors_or_die(void)
{
- int ret, i;
+ int i;
if (!want_colors())
return;
daemon_set_default_log_colors();
daemon_set_flag(DF_COLOR_LOG);
- for (i = 0; i < conf.log_color_given; i++) {
- ret = daemon_set_log_color(conf.log_color_arg[i]);
- if (ret < 0)
- exit(EXIT_FAILURE);
- }
+ for (i = 0; i < conf.log_color_given; i++)
+ daemon_set_log_color_or_die(conf.log_color_arg[i]);
}
/**