Improve async handling

Don't use special callback in node to receive the results. Instead,
use a generic result callback to receive the result. This makes things
a bit more symetric and generic again because then you can choose how
to match the result to the request and you have a generic way to handle
both the sync and async case. We can then also remove the wait method.
This also makes the remote interface and spa interface to objects very
similar.

Make a helper object to receive and dispatch results. Use this in the
helper for enum_params.

Make device use the same result callbacks.
This commit is contained in:
Wim Taymans 2019-02-25 12:29:57 +01:00
parent 98463b689b
commit d2c18c7b1a
64 changed files with 1298 additions and 1141 deletions

View file

@ -97,6 +97,8 @@ struct data {
bool rebuild_fds;
struct pollfd fds[16];
unsigned int n_fds;
struct spa_pending_queue pending;
};
#define MIN_LATENCY 1024
@ -375,7 +377,8 @@ static int negotiate_formats(struct data *data)
if ((res = spa_node_port_enum_params_sync(data->sink,
SPA_DIRECTION_INPUT, 0,
SPA_PARAM_EnumFormat, &state,
filter, &format, &b)) != 1)
filter, &format, &b,
&data->pending)) != 1)
return -EBADF;
spa_log_debug(&default_log.log, "sink set_param");
@ -511,6 +514,8 @@ int main(int argc, char *argv[])
data.data_loop.remove_source = do_remove_source;
data.data_loop.invoke = do_invoke;
spa_pending_queue_init(&data.pending);
if ((str = getenv("SPA_DEBUG")))
data.log->level = atoi(str);

View file

@ -89,6 +89,8 @@ struct data {
struct spa_buffer *bp[MAX_BUFFERS];
struct buffer buffers[MAX_BUFFERS];
unsigned int n_buffers;
struct spa_pending_queue pending;
};
static int load_handle(struct data *data, struct spa_handle **handle, const char *lib, const char *name)
@ -240,9 +242,16 @@ static int on_source_ready(void *_data, int status)
return 0;
}
static int on_source_result(void *_data, int seq, int res, const void *result)
{
struct data *data = _data;
return spa_pending_queue_complete(&data->pending, seq, res, result);
}
static const struct spa_node_callbacks source_callbacks = {
SPA_VERSION_NODE_CALLBACKS,
.ready = on_source_ready
.ready = on_source_ready,
.result = on_source_result,
};
static int make_nodes(struct data *data, const char *device)
@ -264,7 +273,7 @@ static int make_nodes(struct data *data, const char *device)
index = 0;
spa_pod_builder_init(&b, buffer, sizeof(buffer));
if ((res = spa_node_enum_params_sync(data->source, SPA_PARAM_Props,
&index, NULL, &props, &b)) == 1) {
&index, NULL, &props, &b, &data->pending)) == 1) {
spa_debug_pod(0, NULL, props);
}
@ -468,6 +477,8 @@ int main(int argc, char *argv[])
struct spa_handle *handle = NULL;
void *iface;
spa_pending_queue_init(&data.pending);
if ((res = load_handle(&data, &handle, PATH "support/libspa-support.so", "loop")) < 0)
return res;