client-node: track io areas per mixer

This commit is contained in:
Wim Taymans 2018-03-21 18:30:41 +01:00
parent a10d7a4e90
commit 97547d726f
2 changed files with 19 additions and 9 deletions

View file

@ -47,7 +47,7 @@
#define MAX_BUFFERS 64 #define MAX_BUFFERS 64
#define MAX_AREAS 1024 #define MAX_AREAS 1024
#define MAX_IO 16 #define MAX_IO 32
#define CHECK_IN_PORT_ID(this,d,p) ((d) == SPA_DIRECTION_INPUT && (p) < MAX_INPUTS) #define CHECK_IN_PORT_ID(this,d,p) ((d) == SPA_DIRECTION_INPUT && (p) < MAX_INPUTS)
#define CHECK_OUT_PORT_ID(this,d,p) ((d) == SPA_DIRECTION_OUTPUT && (p) < MAX_OUTPUTS) #define CHECK_OUT_PORT_ID(this,d,p) ((d) == SPA_DIRECTION_OUTPUT && (p) < MAX_OUTPUTS)
@ -85,6 +85,7 @@ struct buffer {
struct io { struct io {
uint32_t id; uint32_t id;
uint32_t memid; uint32_t memid;
uint32_t mix_id;
}; };
struct port { struct port {
@ -199,7 +200,8 @@ static void clear_io(struct node *node, struct io *io)
io->id = SPA_ID_INVALID; io->id = SPA_ID_INVALID;
} }
static struct io *update_io(struct impl *impl, struct port *port, uint32_t id, uint32_t memid) static struct io *update_io(struct impl *impl, struct port *port,
uint32_t mix_id, uint32_t id, uint32_t memid)
{ {
int i; int i;
struct io *io, *f = NULL; struct io *io, *f = NULL;
@ -208,7 +210,7 @@ static struct io *update_io(struct impl *impl, struct port *port, uint32_t id, u
io = &port->ios[i]; io = &port->ios[i];
if (io->id == SPA_ID_INVALID) if (io->id == SPA_ID_INVALID)
f = io; f = io;
else if (io->id == id) { else if (io->id == id && io->mix_id == mix_id) {
if (io->memid != memid) { if (io->memid != memid) {
clear_io(&impl->node, io); clear_io(&impl->node, io);
if (memid == SPA_ID_INVALID) if (memid == SPA_ID_INVALID)
@ -223,6 +225,7 @@ static struct io *update_io(struct impl *impl, struct port *port, uint32_t id, u
io = f; io = f;
io->id = id; io->id = id;
io->memid = memid; io->memid = memid;
io->mix_id = mix_id;
found: found:
return io; return io;
@ -644,7 +647,8 @@ impl_node_port_set_param(struct spa_node *node,
} }
static int do_port_set_io(struct impl *impl, static int do_port_set_io(struct impl *impl,
enum spa_direction direction, uint32_t port_id, uint32_t mix_id, enum spa_direction direction, uint32_t port_id,
struct pw_port_mix *mix,
uint32_t id, void *data, size_t size) uint32_t id, void *data, size_t size)
{ {
struct node *this = &impl->node; struct node *this = &impl->node;
@ -656,7 +660,7 @@ static int do_port_set_io(struct impl *impl,
pw_log_debug("client-node %p: %s port %d.%d set io %p %zd", impl, pw_log_debug("client-node %p: %s port %d.%d set io %p %zd", impl,
direction == SPA_DIRECTION_INPUT ? "input" : "output", direction == SPA_DIRECTION_INPUT ? "input" : "output",
port_id, mix_id, data, size); port_id, mix->port.port_id, data, size);
if (!CHECK_PORT(this, direction, port_id)) if (!CHECK_PORT(this, direction, port_id))
return -EINVAL; return -EINVAL;
@ -683,11 +687,12 @@ static int do_port_set_io(struct impl *impl,
memid = SPA_ID_INVALID; memid = SPA_ID_INVALID;
mem_offset = mem_size = 0; mem_offset = mem_size = 0;
} }
update_io(impl, port, id, memid); update_io(impl, port, mix->port.port_id, id, memid);
pw_client_node_resource_port_set_io(this->resource, pw_client_node_resource_port_set_io(this->resource,
this->seq, this->seq,
direction, port_id, mix_id, direction, port_id,
mix->port.port_id,
id, id,
memid, memid,
mem_offset, mem_size); mem_offset, mem_size);
@ -1240,12 +1245,17 @@ static int mix_port_set_io(struct spa_node *node,
{ {
struct pw_port *p = SPA_CONTAINER_OF(node, struct pw_port, mix_node); struct pw_port *p = SPA_CONTAINER_OF(node, struct pw_port, mix_node);
struct impl *impl = p->owner_data; struct impl *impl = p->owner_data;
struct pw_port_mix *mix;
p->rt.port.io = data; p->rt.port.io = data;
p->rt.mix_port.io = data; p->rt.mix_port.io = data;
mix = pw_map_lookup(&p->mix_port_map, port_id);
if (mix == NULL)
return -EIO;
return do_port_set_io(impl, return do_port_set_io(impl,
direction, p->port_id, port_id, direction, p->port_id, mix,
id, data, size); id, data, size);
} }