device: some random fixes
This commit is contained in:
parent
fc8255ed90
commit
4ff6bee511
@ -8,11 +8,14 @@
|
|||||||
|
|
||||||
#define N_FDS 50
|
#define N_FDS 50
|
||||||
#define QUEUE_ON_CAPTURE // seems to provide better latency
|
#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 _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;
|
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++);
|
for (nlinks = 0; all_links[nlinks].source; nlinks++);
|
||||||
|
|
||||||
// This traverses in reverse order as it requires to first fix outputs
|
// 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);
|
int count_enqueued = buffer_list_count_enqueued(sink);
|
||||||
if (!sink->dev->paused && count_enqueued < sink->nbufs) {
|
if (!sink->dev->paused && count_enqueued < sink->nbufs) {
|
||||||
paused = false;
|
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;
|
bool can_dequeue = count_enqueued > 0;
|
||||||
|
|
||||||
#ifndef QUEUE_ON_CAPTURE
|
#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;
|
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
|
#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);
|
int ret = poll(fds, n, timeout_now_ms);
|
||||||
print_pollfds(fds, n);
|
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) {
|
if (ret < 0 && errno != EINTR) {
|
||||||
return errno;
|
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));
|
buffer_list_count_enqueued(buf_list));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
// feed capture queue (two buffers)
|
// feed capture queue (two buffers)
|
||||||
int count_enqueued = buffer_list_count_enqueued(buf_list);
|
int count_enqueued = buffer_list_count_enqueued(buf_list);
|
||||||
if (count_enqueued > 1)
|
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
|
#endif
|
||||||
|
|
||||||
if ((buf = buffer_list_find_slot(buf_list)) != NULL) {
|
if ((buf = buffer_list_find_slot(buf_list)) != NULL) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user