avb: add follower mode

As a follower we disable our own timer and produce a buffer from what we
have when _process is called.
This commit is contained in:
Wim Taymans 2022-03-10 10:04:37 +01:00
parent ff5201ef3d
commit 5c3629a165
2 changed files with 20 additions and 6 deletions

View file

@ -712,8 +712,8 @@ static int impl_node_process(void *object)
io = port->io;
spa_return_val_if_fail(io != NULL, -EIO);
spa_log_trace_fp(this->log, "%p: process %d %d/%d", this, io->status,
io->buffer_id, port->n_buffers);
spa_log_trace_fp(this->log, "%p: process %d %d/%d %d", this, io->status,
io->buffer_id, port->n_buffers, this->following);
if (io->status == SPA_STATUS_HAVE_DATA)
return SPA_STATUS_HAVE_DATA;
@ -724,6 +724,7 @@ static int impl_node_process(void *object)
}
if (spa_list_is_empty(&port->ready) && this->following) {
spa_avb_read(this);
}
if (spa_list_is_empty(&port->ready) || !this->following)
return SPA_STATUS_OK;

View file

@ -945,20 +945,22 @@ done:
return 0;
}
static int handle_capture(struct state *state, uint64_t current_time)
int spa_avb_read(struct state *state)
{
int32_t avail, wanted;
uint32_t index;
struct port *port = &state->ports[0];
struct spa_io_buffers *io;
struct buffer *b;
if (state->position)
state->duration = state->position->clock.duration;
avail = spa_ringbuffer_get_read_index(&state->ring, &index);
wanted = state->duration * state->stride;
if (avail < wanted) {
spa_log_warn(state->log, "capture underrun %d < %d", avail, wanted);
goto done;
return 0;
}
while (avail >= wanted) {
struct spa_data *d;
@ -990,6 +992,16 @@ static int handle_capture(struct state *state, uint64_t current_time)
avail -= n_bytes;
spa_ringbuffer_read_update(&state->ring, index);
}
return 0;
}
static int handle_capture(struct state *state, uint64_t current_time)
{
struct port *port = &state->ports[0];
struct spa_io_buffers *io;
struct buffer *b;
spa_avb_read(state);
if (spa_list_is_empty(&port->ready))
return 0;
@ -1009,7 +1021,6 @@ static int handle_capture(struct state *state, uint64_t current_time)
spa_log_trace_fp(state->log, "%p: output buffer:%d", state, b->id);
}
spa_node_call_ready(&state->callbacks, SPA_STATUS_HAVE_DATA);
done:
return 0;
}
@ -1133,6 +1144,8 @@ int spa_avb_start(struct state *state)
spa_dll_init(&state->dll);
state->max_error = (256.0 * state->rate) / state->rate_denom;
state->following = is_following(state);
state->timer_source.func = avb_on_timeout_event;
state->timer_source.data = state;
state->timer_source.fd = state->timerfd;