audio_formats[s->format], slot_num);
a->receiver->close(s->receiver_node);
btr_remove_node(&s->receiver_node->btrn);
+ task_reap(&s->receiver_node->task);
free(s->receiver_node);
s->receiver_node = NULL;
tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000),
continue;
if (!s->receiver_node)
continue;
- task_notify(&s->receiver_node->task, error);
+ task_notify(s->receiver_node->task, error);
}
}
s->receiver_node = rn;
PARA_NOTICE_LOG("started %s: %s receiver in slot %d\n",
audio_formats[format], r->name, slot_num);
- rn->task.pre_select = r->pre_select;
- rn->task.post_select = r->post_select;
- sprintf(rn->task.status, "%s receiver node", r->name);
- register_task(&sched, &rn->task);
+ rn->task = task_register(&(struct task_info) {
+ .name = r->name,
+ .pre_select = r->pre_select,
+ .post_select = r->post_select,
+ .context = rn,
+ }, &sched);
return slot_num;
}
if (!s->receiver_node)
continue;
- if (s->receiver_node->task.error >= 0)
+ if (s->receiver_node->task->error >= 0)
return true;
if (ss1 == ss2)
return true;
struct timeval rstime;
if (!s->receiver_node)
continue;
- if (s->receiver_node->task.error < 0)
+ if (s->receiver_node->task->error < 0)
continue;
btr_get_node_start(s->receiver_node->btrn, &rstime);
if (newest_slot >= 0 && tv_diff(&rstime, &newest_rstime, NULL) < 0)
if (s->format < 0)
return false;
- if (s->receiver_node && s->receiver_node->task.error >= 0)
+ if (s->receiver_node && s->receiver_node->task->error >= 0)
return false;
for (i = 0; i < a->num_filters; i++)
if (s->fns && s->fns[i].task.error >= 0)
*/
void __noreturn clean_exit(int status, const char *msg)
{
- int i;
-
if (socket_name)
unlink(socket_name);
close_stat_pipe();
- FOR_EACH_SLOT(i)
- close_slot(i);
+ close_unused_slots();
audiod_cmdline_parser_free(&conf);
close_stat_clients();
PARA_EMERG_LOG("%s\n", msg);
{
int ret;
struct slot_info *sl;
- struct audio_format_info *a;
close_unused_slots();
if (audiod_status != AUDIOD_ON ||
return;
}
sl = slot + ret;
- a = afi + sl->format;
- if (a->num_filters)
- open_filters(sl);
+ open_filters(sl);
open_writers(sl);
activate_grab_clients(&sched);
btr_log_tree(sl->receiver_node->btrn, LL_NOTICE);
sched.default_timeout.tv_sec = 2;
sched.default_timeout.tv_usec = 999 * 1000;
ret = schedule(&sched);
+ sched_shutdown(&sched);
PARA_EMERG_LOG("%s\n", para_strerror(-ret));
return EXIT_FAILURE;