node: always use a spa_node as the implementation

Avoid duplicating API, remove implementations from port and node and
always use an spa_node as the implementation, it's just as easy to
implement a spa node. With the implementation always being a spa_node
we will be able to better implement the negotiation of the mixers.
This commit is contained in:
Wim Taymans 2017-08-25 18:59:01 +02:00
parent b7b80683bc
commit 28ae844de9
14 changed files with 548 additions and 761 deletions

View file

@ -83,8 +83,12 @@ struct data {
struct pw_link *link;
struct spa_node impl_node;
struct spa_port_io *io;
const struct spa_node_callbacks *callbacks;
void *callbacks_data;
uint8_t buffer[1024];
struct spa_video_info_raw format;
@ -183,19 +187,34 @@ static Uint32 id_to_sdl_format(struct data *data, uint32_t id)
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
static int impl_port_set_io(void *data, struct spa_port_io *io)
static int impl_send_command(struct spa_node *node, const struct spa_command *command)
{
struct data *d = data;
return SPA_RESULT_OK;
}
static int impl_set_callbacks(struct spa_node *node,
const struct spa_node_callbacks *callbacks, void *data)
{
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
d->callbacks = callbacks;
d->callbacks_data = data;
return SPA_RESULT_OK;
}
static int impl_port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
struct spa_port_io *io)
{
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
d->io = io;
return SPA_RESULT_OK;
}
static int impl_port_enum_formats(void *data,
static int impl_port_enum_formats(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
struct spa_format **format,
const struct spa_format *filter,
int32_t index)
uint32_t index)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
const struct spa_format *formats[1];
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
struct spa_pod_frame f[2];
@ -248,9 +267,10 @@ static int impl_port_enum_formats(void *data,
return SPA_RESULT_OK;
}
static int impl_port_set_format(void *data, uint32_t flags, const struct spa_format *format)
static int impl_port_set_format(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
uint32_t flags, const struct spa_format *format)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
struct pw_type *t = d->t;
struct spa_pod_builder b = { NULL };
struct spa_pod_frame f[2];
@ -300,9 +320,10 @@ static int impl_port_set_format(void *data, uint32_t flags, const struct spa_for
return SPA_RESULT_OK;
}
static int impl_port_get_info(void *data, const struct spa_port_info **info)
static int impl_port_get_info(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
const struct spa_port_info **info)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
d->port_info.flags = SPA_PORT_INFO_FLAG_CAN_USE_BUFFERS;
d->port_info.rate = 0;
@ -313,9 +334,10 @@ static int impl_port_get_info(void *data, const struct spa_port_info **info)
return SPA_RESULT_OK;
}
static int impl_port_enum_params(void *data, uint32_t index, struct spa_param **param)
static int impl_port_enum_params(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
uint32_t index, struct spa_param **param)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
if (index >= 2)
return SPA_RESULT_ENUM_END;
@ -325,9 +347,10 @@ static int impl_port_enum_params(void *data, uint32_t index, struct spa_param **
return SPA_RESULT_OK;
}
static int impl_port_use_buffers(void *data, struct spa_buffer **buffers, uint32_t n_buffers)
static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
struct spa_buffer **buffers, uint32_t n_buffers)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
int i;
for (i = 0; i < n_buffers; i++)
d->buffers[i] = buffers[i];
@ -335,19 +358,9 @@ static int impl_port_use_buffers(void *data, struct spa_buffer **buffers, uint32
return SPA_RESULT_OK;
}
static const struct pw_port_implementation impl_port = {
PW_VERSION_PORT_IMPLEMENTATION,
.set_io = impl_port_set_io,
.enum_formats = impl_port_enum_formats,
.set_format = impl_port_set_format,
.get_info = impl_port_get_info,
.enum_params = impl_port_enum_params,
.use_buffers = impl_port_use_buffers,
};
static int impl_node_process_input(void *data)
static int impl_node_process_input(struct spa_node *node)
{
struct data *d = data;
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
struct spa_buffer *buf;
uint8_t *map;
void *sdata, *ddata;
@ -398,8 +411,17 @@ static int impl_node_process_input(void *data)
return SPA_RESULT_NEED_BUFFER;
}
static const struct pw_node_implementation impl_node = {
PW_VERSION_NODE_IMPLEMENTATION,
static const struct spa_node impl_node = {
SPA_VERSION_NODE,
NULL,
.send_command = impl_send_command,
.set_callbacks = impl_set_callbacks,
.port_set_io = impl_port_set_io,
.port_enum_formats = impl_port_enum_formats,
.port_set_format = impl_port_set_format,
.port_get_info = impl_port_get_info,
.port_enum_params = impl_port_enum_params,
.port_use_buffers = impl_port_use_buffers,
.process_input = impl_node_process_input,
};
@ -409,10 +431,10 @@ static void make_nodes(struct data *data)
struct pw_properties *props;
data->node = pw_node_new(data->core, NULL, NULL, "SDL-sink", NULL, 0);
pw_node_set_implementation(data->node, &impl_node, data);
data->impl_node = impl_node;
pw_node_set_implementation(data->node, &data->impl_node);
data->port = pw_port_new(PW_DIRECTION_INPUT, 0, NULL, 0);
pw_port_set_implementation(data->port, &impl_port, data);
pw_port_add(data->port, data->node);
pw_node_register(data->node);