Build fds and paused in a single go

This commit is contained in:
Kamil Trzcinski 2022-04-06 09:06:21 +02:00
parent 6234e0706d
commit 4e3c235b36

View File

@ -5,16 +5,22 @@
#define N_FDS 50 #define N_FDS 50
void _update_paused(link_t *all_links) int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_list_t **buf_lists, int max_n)
{ {
int n = 0; int n = 0, nlinks = 0;
for (n = 0; all_links[n].source; n++); for (nlinks = 0; all_links[nlinks].source; nlinks++);
for (int i = n; i-- > 0; ) { // This traverses in reverse order as it requires to first fix outputs
// and go back into captures
for (int i = nlinks; i-- > 0; ) {
link_t *link = &all_links[i]; link_t *link = &all_links[i];
buffer_list_t *source = link->source; buffer_list_t *source = link->source;
if (n >= max_n) {
return -EINVAL;
}
if (!source->streaming) { if (!source->streaming) {
continue; continue;
} }
@ -25,48 +31,6 @@ void _update_paused(link_t *all_links)
paused = false; paused = false;
} }
for (int j = 0; link->sinks[j]; j++) {
buffer_list_t *sink = link->sinks[j];
if (!sink->streaming) {
continue;
}
if (sink->device->paused) {
continue;
}
int count_enqueued = buffer_list_count_enqueued(sink);
if (count_enqueued < sink->nbufs) {
paused = false;
}
}
source->device->paused = paused;
if (source->device->output_device) {
source->device->output_device->paused = paused;
}
}
}
int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_list_t **buf_lists, int max_n)
{
int n = 0;
for (int i = 0; all_links[i].source; i++) {
link_t *link = &all_links[i];
buffer_list_t *source = link->source;
if (n >= max_n) {
return -EINVAL;
}
if (!source->do_mmap) {
continue;
}
if (!source->streaming) {
continue;
}
for (int j = 0; link->sinks[j]; j++) { for (int j = 0; link->sinks[j]; j++) {
buffer_list_t *sink = link->sinks[j]; buffer_list_t *sink = link->sinks[j];
@ -80,20 +44,27 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis
int count_enqueued = buffer_list_count_enqueued(sink); int count_enqueued = buffer_list_count_enqueued(sink);
// Can something be dequeued? // Can something be dequeued?
if (count_enqueued == 0) { if (count_enqueued > 0) {
continue; fds[n] = (struct pollfd){ sink->device->fd, POLLOUT };
buf_lists[n] = sink;
links[n] = link;
n++;
} }
struct pollfd fd = {sink->device->fd, POLLOUT}; // Can this chain pauses
fds[n] = fd; if (!sink->device->paused && count_enqueued < sink->nbufs) {
buf_lists[n] = sink; paused = false;
links[n] = link; }
n++; }
source->device->paused = paused;
if (source->device->output_device) {
source->device->output_device->paused = paused;
} }
if (!source->device->paused) { if (!source->device->paused) {
struct pollfd fd = {source->device->fd, POLLIN}; fds[n] = (struct pollfd){ source->device->fd, POLLIN };
fds[n] = fd;
buf_lists[n] = source; buf_lists[n] = source;
links[n] = link; links[n] = link;
n++; n++;
@ -110,8 +81,6 @@ int links_step(link_t *all_links, int timeout)
buffer_list_t *buf_lists[N_FDS]; buffer_list_t *buf_lists[N_FDS];
buffer_t *buf; buffer_t *buf;
_update_paused(all_links);
int n = _build_fds(all_links, fds, links, buf_lists, N_FDS); int n = _build_fds(all_links, fds, links, buf_lists, N_FDS);
int ret = poll(fds, n, timeout); int ret = poll(fds, n, timeout);