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; uint32_t type;
b->outbuf = buffers[i]; b->outbuf = buffers[i];
b->outstanding = true; b->flags = BUFFER_FLAG_OUT;
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header); 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; input = this->io;
spa_return_val_if_fail(input != NULL, -EIO); 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) { if (input->status == SPA_STATUS_HAVE_BUFFER && input->buffer_id < this->n_buffers) {
struct buffer *b = &this->buffers[input->buffer_id]; 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); spa_log_warn(this->log, NAME " %p: buffer %u in use", this, input->buffer_id);
input->status = -EINVAL; input->status = -EINVAL;
return -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_log_trace(this->log, NAME " %p: queue buffer %u", this, input->buffer_id);
spa_list_append(&this->ready, &b->link); spa_list_append(&this->ready, &b->link);
b->outstanding = false; SPA_FLAG_UNSET(b->flags, BUFFER_FLAG_OUT);
input->buffer_id = SPA_ID_INVALID;
input->status = SPA_STATUS_OK;
} }
input->buffer_id = SPA_ID_INVALID;
input->status = SPA_STATUS_OK;
return 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) 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); if (SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_OUT)) {
spa_log_trace(this->log, NAME " %p: recycle buffer %u", this, buffer_id);
b = &this->buffers[buffer_id]; spa_list_append(&this->free, &b->link);
spa_return_if_fail(b->outstanding); SPA_FLAG_UNSET(b->flags, BUFFER_FLAG_OUT);
}
b->outstanding = false;
spa_list_append(&this->free, &b->link);
} }
static int port_get_format(struct spa_node *node, 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; struct spa_data *d = buffers[i]->datas;
b->outbuf = buffers[i]; b->outbuf = buffers[i];
b->outstanding = false; b->flags = 0;
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header); 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) { if (state->ready_offset >= d[0].chunk->size) {
spa_list_remove(&b->link); 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); 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->callbacks->reuse_buffer(state->callbacks_data, 0, b->outbuf->id);
state->ready_offset = 0; state->ready_offset = 0;
@ -477,7 +477,7 @@ push_frames(struct state *state,
d[0].chunk->size = n_bytes; d[0].chunk->size = n_bytes;
d[0].chunk->stride = state->frame_size; 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->buffer_id = b->outbuf->id;
io->status = SPA_STATUS_HAVE_BUFFER; io->status = SPA_STATUS_HAVE_BUFFER;
state->callbacks->have_output(state->callbacks_data); 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; ts.it_interval.tv_nsec = 0;
timerfd_settime(state->timerfd, 0, &ts, NULL); timerfd_settime(state->timerfd, 0, &ts, NULL);
state->io->status = SPA_STATUS_OK;
state->io->buffer_id = SPA_ID_INVALID;
state->started = true; state->started = true;
return 0; return 0;

View file

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