Build fds and paused in a single go
This commit is contained in:
parent
6234e0706d
commit
4e3c235b36
83
hw/links.c
83
hw/links.c
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user