node: improve callbacks

Make separate callbacks for events and RT notifications.
This commit is contained in:
Wim Taymans 2017-05-11 10:29:20 +02:00
parent fb0919b8b7
commit 3b33e3d362
32 changed files with 557 additions and 481 deletions

View file

@ -99,7 +99,7 @@ do_send_event (SpaLoop *loop,
{
SpaALSASink *this = user_data;
this->event_cb (&this->node, data, this->user_data);
this->callbacks.event (&this->node, data, this->user_data);
return SPA_RESULT_OK;
}
@ -171,9 +171,10 @@ spa_alsa_sink_node_send_command (SpaNode *node,
}
static SpaResult
spa_alsa_sink_node_set_event_callback (SpaNode *node,
SpaEventNodeCallback event,
void *user_data)
spa_alsa_sink_node_set_callbacks (SpaNode *node,
const SpaNodeCallbacks *callbacks,
size_t callbacks_size,
void *user_data)
{
SpaALSASink *this;
@ -181,7 +182,7 @@ spa_alsa_sink_node_set_event_callback (SpaNode *node,
this = SPA_CONTAINER_OF (node, SpaALSASink, node);
this->event_cb = event;
this->callbacks = *callbacks;
this->user_data = user_data;
return SPA_RESULT_OK;
@ -271,11 +272,11 @@ spa_alsa_clear_buffers (SpaALSASink *this)
}
static SpaResult
spa_alsa_sink_node_port_set_format (SpaNode *node,
SpaDirection direction,
uint32_t port_id,
SpaPortFormatFlags flags,
const SpaFormat *format)
spa_alsa_sink_node_port_set_format (SpaNode *node,
SpaDirection direction,
uint32_t port_id,
uint32_t flags,
const SpaFormat *format)
{
SpaALSASink *this;
SpaPODBuilder b = { NULL };
@ -590,7 +591,7 @@ static const SpaNode alsasink_node = {
spa_alsa_sink_node_get_props,
spa_alsa_sink_node_set_props,
spa_alsa_sink_node_send_command,
spa_alsa_sink_node_set_event_callback,
spa_alsa_sink_node_set_callbacks,
spa_alsa_sink_node_get_n_ports,
spa_alsa_sink_node_get_port_ids,
spa_alsa_sink_node_add_port,

View file

@ -101,7 +101,7 @@ do_send_event (SpaLoop *loop,
{
SpaALSASource *this = user_data;
this->event_cb (&this->node, data, this->user_data);
this->callbacks.event (&this->node, data, this->user_data);
return SPA_RESULT_OK;
}
@ -204,9 +204,10 @@ spa_alsa_source_node_send_command (SpaNode *node,
}
static SpaResult
spa_alsa_source_node_set_event_callback (SpaNode *node,
SpaEventNodeCallback event,
void *user_data)
spa_alsa_source_node_set_callbacks (SpaNode *node,
const SpaNodeCallbacks *callbacks,
size_t callbacks_size,
void *user_data)
{
SpaALSASource *this;
@ -214,7 +215,7 @@ spa_alsa_source_node_set_event_callback (SpaNode *node,
this = SPA_CONTAINER_OF (node, SpaALSASource, node);
this->event_cb = event;
this->callbacks = *callbacks;
this->user_data = user_data;
return SPA_RESULT_OK;
@ -319,11 +320,11 @@ spa_alsa_clear_buffers (SpaALSASource *this)
}
static SpaResult
spa_alsa_source_node_port_set_format (SpaNode *node,
SpaDirection direction,
uint32_t port_id,
SpaPortFormatFlags flags,
const SpaFormat *format)
spa_alsa_source_node_port_set_format (SpaNode *node,
SpaDirection direction,
uint32_t port_id,
uint32_t flags,
const SpaFormat *format)
{
SpaALSASource *this;
SpaPODBuilder b = { NULL };
@ -631,7 +632,7 @@ static const SpaNode alsasource_node = {
spa_alsa_source_node_get_props,
spa_alsa_source_node_set_props,
spa_alsa_source_node_send_command,
spa_alsa_source_node_set_event_callback,
spa_alsa_source_node_set_callbacks,
spa_alsa_source_node_get_n_ports,
spa_alsa_source_node_get_port_ids,
spa_alsa_source_node_add_port,

View file

@ -213,7 +213,7 @@ spa_alsa_enum_format (SpaALSAState *state,
}
int
spa_alsa_set_format (SpaALSAState *state, SpaAudioInfo *fmt, SpaPortFormatFlags flags)
spa_alsa_set_format (SpaALSAState *state, SpaAudioInfo *fmt, uint32_t flags)
{
unsigned int rrate, rchannels;
snd_pcm_uframes_t period_size;
@ -336,13 +336,11 @@ pull_frames (SpaALSAState *state,
SpaPortIO *io = state->io;
if (spa_list_is_empty (&state->ready) && do_pull) {
SpaEvent event = SPA_EVENT_INIT (state->type.event_node.NeedInput);
io->status = SPA_RESULT_NEED_BUFFER;
io->range.offset = state->sample_count * state->frame_size;
io->range.min_size = state->threshold * state->frame_size;
io->range.max_size = frames * state->frame_size;
state->event_cb (&state->node, &event, state->user_data);
state->callbacks.need_input (&state->node, state->user_data);
}
while (!spa_list_is_empty (&state->ready) && to_write > 0) {
uint8_t *src, *dst;
@ -389,14 +387,11 @@ pull_frames (SpaALSAState *state,
reuse = (state->ready_offset >= size);
}
if (reuse) {
SpaEventNodeReuseBuffer rb = SPA_EVENT_NODE_REUSE_BUFFER_INIT (state->type.event_node.ReuseBuffer,
0, b->outbuf->id);
spa_list_remove (&b->link);
b->outstanding = true;
state->io->buffer_id = b->outbuf->id;
spa_log_trace (state->log, "alsa-util %p: reuse buffer %u", state, b->outbuf->id);
state->event_cb (&state->node, (SpaEvent *)&rb, state->user_data);
state->callbacks.reuse_buffer (&state->node, 0, b->outbuf->id, state->user_data);
state->ready_offset = 0;
}
total_frames += n_frames;
@ -450,13 +445,10 @@ push_frames (SpaALSAState *state,
d[0].chunk->stride = 0;
{
SpaEvent event = SPA_EVENT_INIT (state->type.event_node.HaveOutput);
b->outstanding = true;
io->buffer_id = b->outbuf->id;
io->status = SPA_RESULT_HAVE_BUFFER;
state->event_cb (&state->node, &event, state->user_data);
state->callbacks.have_output (&state->node, state->user_data);
}
}
return total_frames;

View file

@ -121,7 +121,7 @@ struct _SpaALSAState {
snd_pcm_stream_t stream;
snd_output_t *output;
SpaEventNodeCallback event_cb;
SpaNodeCallbacks callbacks;
void *user_data;
uint8_t props_buffer[1024];
@ -185,7 +185,7 @@ spa_alsa_enum_format (SpaALSAState *state,
int spa_alsa_set_format (SpaALSAState *state,
SpaAudioInfo *info,
SpaPortFormatFlags flags);
uint32_t flags);
SpaResult spa_alsa_start (SpaALSAState *state, bool xrun_recover);
SpaResult spa_alsa_pause (SpaALSAState *state, bool xrun_recover);