alsa: small cleanups

Use flags for buffers
This commit is contained in:
Wim Taymans 2018-03-08 11:02:21 +01:00
parent 5bff143eaf
commit e7bff4293d
4 changed files with 22 additions and 17 deletions

View file

@ -490,7 +490,7 @@ impl_node_port_use_buffers(struct spa_node *node,
uint32_t type;
b->outbuf = buffers[i];
b->outstanding = true;
b->flags = BUFFER_FLAG_OUT;
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header);
@ -582,10 +582,12 @@ static int impl_node_process_input(struct spa_node *node)
input = this->io;
spa_return_val_if_fail(input != NULL, -EIO);
spa_log_trace(this->log, NAME " %p: process input %d %d", this, input->status, input->buffer_id);
if (input->status == SPA_STATUS_HAVE_BUFFER && input->buffer_id < this->n_buffers) {
struct buffer *b = &this->buffers[input->buffer_id];
if (!b->outstanding) {
if (!SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_OUT)) {
spa_log_warn(this->log, NAME " %p: buffer %u in use", this, input->buffer_id);
input->status = -EINVAL;
return -EINVAL;
@ -594,10 +596,11 @@ static int impl_node_process_input(struct spa_node *node)
spa_log_trace(this->log, NAME " %p: queue buffer %u", this, input->buffer_id);
spa_list_append(&this->ready, &b->link);
b->outstanding = false;
input->buffer_id = SPA_ID_INVALID;
input->status = SPA_STATUS_OK;
SPA_FLAG_UNSET(b->flags, BUFFER_FLAG_OUT);
}
input->buffer_id = SPA_ID_INVALID;
input->status = SPA_STATUS_OK;
return SPA_STATUS_OK;
}

View file

@ -276,15 +276,13 @@ impl_node_port_get_info(struct spa_node *node,
static void recycle_buffer(struct state *this, uint32_t buffer_id)
{
struct buffer *b;
struct buffer *b = &this->buffers[buffer_id];
spa_log_trace(this->log, NAME " %p: recycle buffer %u", this, buffer_id);
b = &this->buffers[buffer_id];
spa_return_if_fail(b->outstanding);
b->outstanding = false;
spa_list_append(&this->free, &b->link);
if (SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_OUT)) {
spa_log_trace(this->log, NAME " %p: recycle buffer %u", this, buffer_id);
spa_list_append(&this->free, &b->link);
SPA_FLAG_UNSET(b->flags, BUFFER_FLAG_OUT);
}
}
static int port_get_format(struct spa_node *node,
@ -499,7 +497,7 @@ impl_node_port_use_buffers(struct spa_node *node,
struct spa_data *d = buffers[i]->datas;
b->outbuf = buffers[i];
b->outstanding = false;
b->flags = 0;
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header);

View file

@ -397,7 +397,7 @@ pull_frames(struct state *state,
if (state->ready_offset >= d[0].chunk->size) {
spa_list_remove(&b->link);
b->outstanding = true;
SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
spa_log_trace(state->log, "alsa-util %p: reuse buffer %u", state, b->outbuf->id);
state->callbacks->reuse_buffer(state->callbacks_data, 0, b->outbuf->id);
state->ready_offset = 0;
@ -477,7 +477,7 @@ push_frames(struct state *state,
d[0].chunk->size = n_bytes;
d[0].chunk->stride = state->frame_size;
b->outstanding = true;
SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
io->buffer_id = b->outbuf->id;
io->status = SPA_STATUS_HAVE_BUFFER;
state->callbacks->have_output(state->callbacks_data);
@ -707,6 +707,9 @@ int spa_alsa_start(struct state *state, bool xrun_recover)
ts.it_interval.tv_nsec = 0;
timerfd_settime(state->timerfd, 0, &ts, NULL);
state->io->status = SPA_STATUS_OK;
state->io->buffer_id = SPA_ID_INVALID;
state->started = true;
return 0;

View file

@ -53,7 +53,8 @@ struct props {
struct buffer {
struct spa_buffer *outbuf;
struct spa_meta_header *h;
bool outstanding;
#define BUFFER_FLAG_OUT (1<<0)
uint32_t flags;
struct spa_list link;
};