device: some random fixes

This commit is contained in:
Kamil Trzcinski 2023-02-21 18:31:12 +01:00
parent fc8255ed90
commit 4ff6bee511

View File

@ -8,11 +8,14 @@
#define N_FDS 50
#define QUEUE_ON_CAPTURE // seems to provide better latency
// #define LIMIT_CAPTURE_BUFFERS
int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_list_t **buf_lists, int max_n, int *max_timeout_ms)
{
int n = 0, nlinks = 0;
uint64_t now_us __attribute__((unused)) = get_monotonic_time_us(NULL, NULL);
for (nlinks = 0; all_links[nlinks].source; nlinks++);
// This traverses in reverse order as it requires to first fix outputs
@ -60,6 +63,8 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis
int count_enqueued = buffer_list_count_enqueued(sink);
if (!sink->dev->paused && count_enqueued < sink->nbufs) {
paused = false;
} else if (count_enqueued > 0) {
paused = false;
}
}
@ -69,9 +74,9 @@ int _build_fds(link_t *all_links, struct pollfd *fds, link_t **links, buffer_lis
bool can_dequeue = count_enqueued > 0;
#ifndef QUEUE_ON_CAPTURE
if (now_us - source->last_dequeued_us < source->fmt_interval_us) {
if (now_us - source->last_dequeued_us < source->fmt.interval_us) {
can_dequeue = false;
*max_timeout_ms = MIN(*max_timeout_ms, (source->last_dequeued_us + source->fmt_interval_us - now_us) / 1000);
*max_timeout_ms = MIN(*max_timeout_ms, (source->last_dequeued_us + source->fmt.interval_us - now_us) / 1000);
}
#endif
@ -186,7 +191,7 @@ int links_step(link_t *all_links, int timeout_now_ms, int *timeout_next_ms)
int ret = poll(fds, n, timeout_now_ms);
print_pollfds(fds, n);
uint64_t now_us = get_monotonic_time_us(NULL, NULL);
uint64_t now_us __attribute__((unused)) = get_monotonic_time_us(NULL, NULL);
if (ret < 0 && errno != EINTR) {
return errno;
@ -250,10 +255,17 @@ int links_step(link_t *all_links, int timeout_now_ms, int *timeout_next_ms)
buffer_list_count_enqueued(buf_list));
}
#else
// feed capture queue (two buffers)
// feed capture queue (two buffers)
int count_enqueued = buffer_list_count_enqueued(buf_list);
if (count_enqueued > 1)
continue;
continue;
#endif
#ifdef LIMIT_CAPTURE_BUFFERS
// Do not enqueue more buffers than enqueued by output
if (buf_list->dev->output_list && buffer_list_count_enqueued(buf_list) >= buffer_list_count_enqueued(buf_list->dev->output_list)) {
continue;
}
#endif
if ((buf = buffer_list_find_slot(buf_list)) != NULL) {