node: Add id to set_io

Make it possible to configure multiple io areas on a port by giving
an id to set_io.
Add some types to enumerate the supported ids
Make an area to exchange buffers and one to specify pull ranges.
The idea is to make more area types for controlable properties.
Implement enumeration of IO areas in volume.
This commit is contained in:
Wim Taymans 2017-11-21 19:34:37 +01:00
parent 4288a634f4
commit 8efea3e1ea
40 changed files with 583 additions and 208 deletions

View file

@ -30,6 +30,7 @@
#include <spa/support/loop.h>
#include <spa/support/type-map-impl.h>
#include <spa/node/node.h>
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/param/props.h>
#include <spa/param/audio/format-utils.h>
@ -54,6 +55,7 @@ struct type {
uint32_t props_volume;
uint32_t props_min_latency;
uint32_t props_live;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_meta meta;
struct spa_type_data data;
@ -75,6 +77,7 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
type->props_volume = spa_type_map_get_id(map, SPA_TYPE_PROPS__volume);
type->props_min_latency = spa_type_map_get_id(map, SPA_TYPE_PROPS__minLatency);
type->props_live = spa_type_map_get_id(map, SPA_TYPE_PROPS__live);
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_meta_map(map, &type->meta);
spa_type_data_map(map, &type->data);
@ -114,14 +117,14 @@ struct data {
struct spa_graph_node sink_node;
struct spa_node *sink;
struct spa_port_io volume_sink_io[1];
struct spa_io_buffers volume_sink_io[1];
struct spa_node *volume;
struct spa_buffer *volume_buffers[1];
struct buffer volume_buffer[1];
struct spa_node *source;
struct spa_port_io source_volume_io[1];
struct spa_io_buffers source_volume_io[1];
struct spa_buffer *source_buffers[1];
struct buffer source_buffer[1];
@ -330,13 +333,21 @@ static int make_nodes(struct data *data, const char *device)
if ((res = spa_node_set_param(data->source, data->type.param.idProps, 0, props)) < 0)
printf("got set_props error %d\n", res);
data->source_volume_io[0] = SPA_PORT_IO_INIT;
data->volume_sink_io[0] = SPA_PORT_IO_INIT;
data->source_volume_io[0] = SPA_IO_BUFFERS_INIT;
data->volume_sink_io[0] = SPA_IO_BUFFERS_INIT;
spa_node_port_set_io(data->source, SPA_DIRECTION_OUTPUT, 0, &data->source_volume_io[0]);
spa_node_port_set_io(data->volume, SPA_DIRECTION_INPUT, 0, &data->source_volume_io[0]);
spa_node_port_set_io(data->volume, SPA_DIRECTION_OUTPUT, 0, &data->volume_sink_io[0]);
spa_node_port_set_io(data->sink, SPA_DIRECTION_INPUT, 0, &data->volume_sink_io[0]);
spa_node_port_set_io(data->source,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source_volume_io[0]);
spa_node_port_set_io(data->volume,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->source_volume_io[0]);
spa_node_port_set_io(data->volume,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->volume_sink_io[0]);
spa_node_port_set_io(data->sink,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->volume_sink_io[0]);
spa_graph_node_init(&data->source_node);
spa_graph_node_set_implementation(&data->source_node, data->source);

View file

@ -32,6 +32,7 @@
#include <spa/support/type-map.h>
#include <spa/support/type-map-impl.h>
#include <spa/node/node.h>
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/param/props.h>
#include <spa/param/audio/format-utils.h>
@ -56,6 +57,7 @@ struct type {
uint32_t props_volume;
uint32_t props_min_latency;
uint32_t props_live;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_meta meta;
struct spa_type_data data;
@ -77,6 +79,7 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
type->props_volume = spa_type_map_get_id(map, SPA_TYPE_PROPS__volume);
type->props_min_latency = spa_type_map_get_id(map, SPA_TYPE_PROPS__minLatency);
type->props_live = spa_type_map_get_id(map, SPA_TYPE_PROPS__live);
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_meta_map(map, &type->meta);
spa_type_data_map(map, &type->data);
@ -118,7 +121,7 @@ struct data {
struct spa_graph_node sink_node;
struct spa_node *sink;
struct spa_port_io mix_sink_io[1];
struct spa_io_buffers mix_sink_io[1];
struct spa_node *mix;
uint32_t mix_ports[2];
@ -126,12 +129,12 @@ struct data {
struct buffer mix_buffer[1];
struct spa_node *source1;
struct spa_port_io source1_mix_io[1];
struct spa_io_buffers source1_mix_io[1];
struct spa_buffer *source1_buffers[2];
struct buffer source1_buffer[2];
struct spa_node *source2;
struct spa_port_io source2_mix_io[1];
struct spa_io_buffers source2_mix_io[1];
struct spa_buffer *source2_buffers[2];
struct buffer source2_buffer[2];
@ -398,16 +401,28 @@ static int make_nodes(struct data *data, const char *device)
if ((res = spa_node_add_port(data->mix, SPA_DIRECTION_INPUT, 1)) < 0)
return res;
data->source1_mix_io[0] = SPA_PORT_IO_INIT;
data->source2_mix_io[0] = SPA_PORT_IO_INIT;
data->mix_sink_io[0] = SPA_PORT_IO_INIT;
data->source1_mix_io[0] = SPA_IO_BUFFERS_INIT;
data->source2_mix_io[0] = SPA_IO_BUFFERS_INIT;
data->mix_sink_io[0] = SPA_IO_BUFFERS_INIT;
spa_node_port_set_io(data->source1, SPA_DIRECTION_OUTPUT, 0, &data->source1_mix_io[0]);
spa_node_port_set_io(data->source2, SPA_DIRECTION_OUTPUT, 0, &data->source2_mix_io[0]);
spa_node_port_set_io(data->mix, SPA_DIRECTION_INPUT, 0, &data->source1_mix_io[0]);
spa_node_port_set_io(data->mix, SPA_DIRECTION_INPUT, 1, &data->source2_mix_io[0]);
spa_node_port_set_io(data->mix, SPA_DIRECTION_OUTPUT, 0, &data->mix_sink_io[0]);
spa_node_port_set_io(data->sink, SPA_DIRECTION_INPUT, 0, &data->mix_sink_io[0]);
spa_node_port_set_io(data->source1,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source1_mix_io[0]);
spa_node_port_set_io(data->source2,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source2_mix_io[0]);
spa_node_port_set_io(data->mix,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->source1_mix_io[0]);
spa_node_port_set_io(data->mix,
SPA_DIRECTION_INPUT, 1,
data->type.io.Buffers, &data->source2_mix_io[0]);
spa_node_port_set_io(data->mix,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->mix_sink_io[0]);
spa_node_port_set_io(data->sink,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->mix_sink_io[0]);
#ifdef USE_GRAPH
spa_graph_node_init(&data->source1_node);

View file

@ -30,6 +30,7 @@
#include <spa/support/loop.h>
#include <spa/support/type-map-impl.h>
#include <spa/node/node.h>
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/param/props.h>
#include <spa/param/audio/format-utils.h>
@ -56,6 +57,7 @@ struct type {
uint32_t props_volume;
uint32_t props_min_latency;
uint32_t props_live;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_meta meta;
struct spa_type_data data;
@ -75,6 +77,7 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
type->props_volume = spa_type_map_get_id(map, SPA_TYPE_PROPS__volume);
type->props_min_latency = spa_type_map_get_id(map, SPA_TYPE_PROPS__minLatency);
type->props_live = spa_type_map_get_id(map, SPA_TYPE_PROPS__live);
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_meta_map(map, &type->meta);
spa_type_data_map(map, &type->data);
@ -113,7 +116,7 @@ struct data {
struct spa_graph_node sink_node;
struct spa_node *sink;
struct spa_port_io source_sink_io[1];
struct spa_io_buffers source_sink_io[1];
struct spa_node *source;
struct spa_buffer *source_buffers[1];
@ -358,11 +361,15 @@ static int make_nodes(struct data *data)
if (data->mode & MODE_ASYNC_PUSH)
spa_node_set_callbacks(data->source, &source_callbacks, data);
data->source_sink_io[0] = SPA_PORT_IO_INIT;
data->source_sink_io[0] = SPA_IO_BUFFERS_INIT;
data->source_sink_io[0].status = SPA_STATUS_NEED_BUFFER;
spa_node_port_set_io(data->source, SPA_DIRECTION_OUTPUT, 0, &data->source_sink_io[0]);
spa_node_port_set_io(data->sink, SPA_DIRECTION_INPUT, 0, &data->source_sink_io[0]);
spa_node_port_set_io(data->source,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source_sink_io[0]);
spa_node_port_set_io(data->sink,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->source_sink_io[0]);
spa_graph_node_init(&data->source_node);
spa_graph_node_set_implementation(&data->source_node, data->source);

View file

@ -30,6 +30,7 @@
#include <spa/support/loop.h>
#include <spa/support/type-map-impl.h>
#include <spa/node/node.h>
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/param/props.h>
#include <spa/param/audio/format-utils.h>
@ -49,6 +50,7 @@ struct type {
uint32_t props_volume;
uint32_t props_min_latency;
uint32_t props_live;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_meta meta;
struct spa_type_data data;
@ -70,6 +72,7 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
type->props_volume = spa_type_map_get_id(map, SPA_TYPE_PROPS__volume);
type->props_min_latency = spa_type_map_get_id(map, SPA_TYPE_PROPS__minLatency);
type->props_live = spa_type_map_get_id(map, SPA_TYPE_PROPS__live);
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_meta_map(map, &type->meta);
spa_type_data_map(map, &type->data);
@ -99,7 +102,7 @@ struct data {
uint32_t n_support;
struct spa_node *sink;
struct spa_port_io source_sink_io[1];
struct spa_io_buffers source_sink_io[1];
struct spa_node *source;
struct spa_buffer *source_buffers[1];
@ -339,10 +342,14 @@ static int negotiate_formats(struct data *data)
format)) < 0)
return res;
data->source_sink_io[0] = SPA_PORT_IO_INIT;
data->source_sink_io[0] = SPA_IO_BUFFERS_INIT;
spa_node_port_set_io(data->source, SPA_DIRECTION_OUTPUT, 0, &data->source_sink_io[0]);
spa_node_port_set_io(data->sink, SPA_DIRECTION_INPUT, 0, &data->source_sink_io[0]);
spa_node_port_set_io(data->source,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source_sink_io[0]);
spa_node_port_set_io(data->sink,
SPA_DIRECTION_INPUT, 0,
data->type.io.Buffers, &data->source_sink_io[0]);
if ((res = spa_node_port_set_param(data->source,
SPA_DIRECTION_OUTPUT, 0,

View file

@ -33,6 +33,7 @@
#include <spa/support/loop.h>
#include <spa/support/type-map-impl.h>
#include <spa/node/node.h>
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/param/props.h>
#include <spa/param/video/format-utils.h>
@ -49,6 +50,7 @@ struct type {
uint32_t format;
uint32_t props_device;
uint32_t SDL_Texture;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_meta meta;
struct spa_type_data data;
@ -67,6 +69,7 @@ static inline void init_type(struct type *type, struct spa_type_map *map)
type->format = spa_type_map_get_id(map, SPA_TYPE__Format);
type->props_device = spa_type_map_get_id(map, SPA_TYPE_PROPS__device);
type->SDL_Texture = spa_type_map_get_id(map, SPA_TYPE_POINTER_BASE "SDL_Texture");
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_meta_map(map, &type->meta);
spa_type_data_map(map, &type->data);
@ -100,7 +103,7 @@ struct data {
uint32_t n_support;
struct spa_node *source;
struct spa_port_io source_output[1];
struct spa_io_buffers source_output[1];
SDL_Renderer *renderer;
SDL_Window *window;
@ -205,7 +208,7 @@ static void on_source_have_output(void *_data)
int i;
uint8_t *src, *dst;
struct spa_data *datas;
struct spa_port_io *io = &data->source_output[0];
struct spa_io_buffers *io = &data->source_output[0];
handle_events(data);
@ -419,11 +422,12 @@ static int negotiate_formats(struct data *data)
uint8_t buffer[256];
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
data->source_output[0] = SPA_PORT_IO_INIT;
data->source_output[0] = SPA_IO_BUFFERS_INIT;
if ((res =
spa_node_port_set_io(data->source, SPA_DIRECTION_OUTPUT, 0,
&data->source_output[0])) < 0)
spa_node_port_set_io(data->source,
SPA_DIRECTION_OUTPUT, 0,
data->type.io.Buffers, &data->source_output[0])) < 0)
return res;
format = spa_pod_builder_object(&b,