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

@ -80,7 +80,7 @@ struct proxy_port {
bool have_format;
uint32_t n_params;
struct spa_pod **params;
struct spa_port_io *io;
struct spa_io_buffers *io;
uint32_t n_buffers;
struct proxy_buffer buffers[MAX_BUFFERS];
@ -511,21 +511,30 @@ spa_proxy_node_port_set_param(struct spa_node *node,
static int
spa_proxy_node_port_set_io(struct spa_node *node,
enum spa_direction direction, uint32_t port_id, struct spa_port_io *io)
enum spa_direction direction,
uint32_t port_id,
uint32_t id,
void *io)
{
struct proxy *this;
struct proxy_port *port;
struct pw_type *t;
if (node == NULL)
return -EINVAL;
this = SPA_CONTAINER_OF(node, struct proxy, node);
t = this->impl->t;
if (!CHECK_PORT(this, direction, port_id))
return -EINVAL;
port = GET_PORT(this, direction, port_id);
port->io = io;
if (id == t->io.Buffers)
port->io = io;
else
return -ENOENT;
return 0;
}
@ -737,7 +746,7 @@ static int spa_proxy_node_process_input(struct spa_node *node)
}
else {
spa_list_for_each(p, &n->ports[SPA_DIRECTION_INPUT], link) {
struct spa_port_io *io = p->io;
struct spa_io_buffers *io = p->io;
pw_log_trace("set io status to %d %d", io->status, io->buffer_id);
impl->transport->inputs[p->port_id] = *io;
@ -773,7 +782,7 @@ static int spa_proxy_node_process_output(struct spa_node *node)
impl->out_pending = true;
spa_list_for_each(p, &n->ports[SPA_DIRECTION_OUTPUT], link) {
struct spa_port_io *io = p->io;
struct spa_io_buffers *io = p->io;
impl->transport->outputs[p->port_id] = *io;

View file

@ -22,6 +22,7 @@
#include <sys/mman.h>
#include <spa/utils/ringbuffer.h>
#include <spa/node/io.h>
#include <pipewire/log.h>
#include <extensions/client-node.h>
@ -47,8 +48,8 @@ static size_t area_get_size(struct pw_client_node_area *area)
{
size_t size;
size = sizeof(struct pw_client_node_area);
size += area->max_input_ports * sizeof(struct spa_port_io);
size += area->max_output_ports * sizeof(struct spa_port_io);
size += area->max_input_ports * sizeof(struct spa_io_buffers);
size += area->max_output_ports * sizeof(struct spa_io_buffers);
size += sizeof(struct spa_ringbuffer);
size += INPUT_BUFFER_SIZE;
size += sizeof(struct spa_ringbuffer);
@ -61,13 +62,13 @@ static void transport_setup_area(void *p, struct pw_client_node_transport *trans
struct pw_client_node_area *a;
trans->area = a = p;
p = SPA_MEMBER(p, sizeof(struct pw_client_node_area), struct spa_port_io);
p = SPA_MEMBER(p, sizeof(struct pw_client_node_area), struct spa_io_buffers);
trans->inputs = p;
p = SPA_MEMBER(p, a->max_input_ports * sizeof(struct spa_port_io), void);
p = SPA_MEMBER(p, a->max_input_ports * sizeof(struct spa_io_buffers), void);
trans->outputs = p;
p = SPA_MEMBER(p, a->max_output_ports * sizeof(struct spa_port_io), void);
p = SPA_MEMBER(p, a->max_output_ports * sizeof(struct spa_io_buffers), void);
trans->input_buffer = p;
p = SPA_MEMBER(p, sizeof(struct spa_ringbuffer), void);

View file

@ -47,6 +47,7 @@
struct type {
uint32_t format;
struct spa_type_io io;
struct spa_type_param param;
struct spa_type_data data;
struct spa_type_media_type media_type;
@ -59,6 +60,7 @@ struct type {
static inline void init_type(struct type *type, struct spa_type_map *map)
{
type->format = spa_type_map_get_id(map, SPA_TYPE__Format);
spa_type_io_map(map, &type->io);
spa_type_param_map(map, &type->param);
spa_type_data_map(map, &type->data);
spa_type_media_type_map(map, &type->media_type);
@ -106,7 +108,7 @@ struct port_data {
struct spa_port_info info;
struct spa_port_io *io;
struct spa_io_buffers *io;
bool have_buffers;
struct buffer buffers[64];
@ -261,7 +263,7 @@ static int driver_process_output(struct spa_node *node)
struct spa_graph_node *gn = &this->node->rt.node;
struct spa_graph_port *p;
struct port_data *opd = SPA_CONTAINER_OF(this->driver_out, struct port_data, port);
struct spa_port_io *out_io = opd->io;
struct spa_io_buffers *out_io = opd->io;
struct jack_engine_control *ctrl = this->server->engine_control;
struct buffer *out;
int16_t *op;
@ -290,7 +292,7 @@ static int driver_process_output(struct spa_node *node)
spa_list_for_each(p, &gn->ports[SPA_DIRECTION_INPUT], link) {
struct pw_port *port = p->scheduler_data;
struct port_data *ipd = pw_port_get_user_data(port);
struct spa_port_io *in_io = ipd->io;
struct spa_io_buffers *in_io = ipd->io;
struct buffer *in;
int stride = 2;
@ -342,7 +344,7 @@ static int node_process_input(struct spa_node *node)
spa_list_for_each(p, &gn->ports[SPA_DIRECTION_OUTPUT], link) {
struct pw_port *port = p->scheduler_data;
struct port_data *opd = pw_port_get_user_data(port);
struct spa_port_io *out_io = opd->io;
struct spa_io_buffers *out_io = opd->io;
out_io->buffer_id = 0;
out_io->status = SPA_STATUS_HAVE_BUFFER;
pw_log_trace(NAME " %p: port %p: %d %d", nd, p, out_io->buffer_id, out_io->status);
@ -361,7 +363,7 @@ static int node_process_output(struct spa_node *node)
spa_list_for_each(p, &gn->ports[SPA_DIRECTION_INPUT], link) {
struct pw_port *port = p->scheduler_data;
struct port_data *ipd = pw_port_get_user_data(port);
struct spa_port_io *in_io = ipd->io;
struct spa_io_buffers *in_io = ipd->io;
in_io->buffer_id = 0;
in_io->status = SPA_STATUS_NEED_BUFFER;
pw_log_trace(NAME " %p: port %p: %d %d", nd, p, in_io->buffer_id, in_io->status);
@ -370,12 +372,19 @@ static int node_process_output(struct spa_node *node)
}
static int port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
struct spa_port_io *io)
static int port_set_io(struct spa_node *node,
enum spa_direction direction, uint32_t port_id,
uint32_t id, void *io)
{
struct node_data *nd = SPA_CONTAINER_OF(node, struct node_data, node_impl);
struct port_data *pd = nd->port_data[direction][port_id];
pd->io = io;
struct type *t = &pd->node->type;
if (id == t->io.Buffers)
pd->io = io;
else
return -ENOENT;
return 0;
}
@ -619,7 +628,7 @@ static int schedule_mix_input(struct spa_node *_node)
struct pw_jack_port *this = &pd->port;
struct spa_graph_node *node = &this->port->rt.mix_node;
struct spa_graph_port *p;
struct spa_port_io *io = this->port->rt.mix_port.io;
struct spa_io_buffers *io = this->port->rt.mix_port.io;
size_t buffer_size = pd->node->node.server->engine_control->buffer_size;
int layer = 0;
@ -655,7 +664,7 @@ static int schedule_mix_output(struct spa_node *_node)
struct pw_jack_port *this = &pd->port;
struct spa_graph_node *node = &this->port->rt.mix_node;
struct spa_graph_port *p;
struct spa_port_io *io = this->port->rt.mix_port.io;
struct spa_io_buffers *io = this->port->rt.mix_port.io;
spa_list_for_each(p, &node->ports[SPA_DIRECTION_INPUT], link)
*p->io = *io;