- close_decoder_if_idle(i);
- s->wcheck = 0;
- if (s->format < 0)
- continue;
- a = &afi[s->format];
- rn = s->receiver_node;
- if (rn && rn->loaded && !s->wpid) {
- PARA_INFO_LOG("no writer in slot %d\n", i);
- start_stream_writer(i);
- }
- if (s->write_fd <= 0)
- continue;
- if (!get_loaded_bytes(i))
- continue;
- FD_SET(s->write_fd, wfds);
- s->wcheck = 1;
- max_fileno = MAX(s->write_fd, max_fileno);
- }
-// PARA_INFO_LOG("return %d\n", max_fileno);
- return max_fileno;
-}
-
-static int write_audio_data(int slot_num)
-{
- struct slot_info *s = &slot[slot_num];
- struct audio_format_info *a = &afi[s->format];
- struct receiver_node *rn = s->receiver_node;
- int rv;
- char **buf;
- size_t *len;
-
- if (a->num_filters) {
- buf = &s->fci->outbuf;
- len = s->fci->out_loaded;
- } else {
- buf = &rn->buf;
- len = &rn->loaded;
- }
- PARA_DEBUG_LOG("writing %p (%zd bytes)\n", *buf, *len);
- rv = write(s->write_fd, *buf, *len);
- PARA_DEBUG_LOG("wrote %d/%zd\n", rv, *len);
- if (rv < 0) {
- PARA_WARNING_LOG("write error in slot %d (fd %d): %s\n",
- slot_num, s->write_fd, strerror(errno));
- *len = 0;
- s->fci->error = E_WRITE_AUDIO_DATA;
- } else if (rv != *len) {
- PARA_DEBUG_LOG("partial %s write (%i/%zd) for slot %d\n",
- audio_formats[s->format], rv, *len, slot_num);
- *len -= rv;
- memmove(*buf, *buf + rv, *len);
- } else
- *len = 0;
- if (rv > 0)
- gettimeofday(&s->wtime, NULL);
- return rv;
-}
-
-static void slot_io(fd_set *wfds)
-{
- int ret, i;
-
- FOR_EACH_SLOT(i) {
- struct slot_info *s = &slot[i];
- struct receiver_node *rn = s->receiver_node;
-
- if (rn && rn->loaded)
- gettimeofday(&s->rtime, NULL);
- if (s->format >= 0 && s->write_fd > 0 && s->fci) {
- ret = filter_io(s->fci);
- if (ret < 0)
- s->fci->error = -ret;
-// PARA_DEBUG_LOG("slot %d, filter io %d bytes, check write: %d, loaded: %d/%d, eof: %d\n",
-// i, ret, s->wcheck, rn->loaded, *s->fci->out_loaded, rn->eof);
+ for (i = conf.receiver_given - 1; i >= 0; i--) {
+ char *arg = conf.receiver_arg[i];
+ char *recv_arg = strchr(arg, ':');
+ ret = -E_MISSING_COLON;
+ if (!recv_arg)
+ goto out;
+ *recv_arg = '\0';
+ recv_arg++;
+ ret = get_audio_format_num(arg);
+ if (ret < 0)
+ goto out;
+ afi[ret].receiver_conf = check_receiver_arg(recv_arg, &receiver_num);
+ if (!afi[ret].receiver_conf) {
+ ret = -E_RECV_SYNTAX;
+ goto out;