mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
graph: remove io from graph port, it's not needed
This commit is contained in:
parent
249110eb79
commit
d93dd5ec93
10 changed files with 47 additions and 63 deletions
|
|
@ -125,7 +125,6 @@ struct spa_graph_port {
|
||||||
enum spa_direction direction; /**< port direction */
|
enum spa_direction direction; /**< port direction */
|
||||||
uint32_t port_id; /**< port id */
|
uint32_t port_id; /**< port id */
|
||||||
uint32_t flags; /**< port flags */
|
uint32_t flags; /**< port flags */
|
||||||
struct spa_io_buffers *io; /**< io area of the port */
|
|
||||||
struct spa_graph_port *peer; /**< peer */
|
struct spa_graph_port *peer; /**< peer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -255,14 +254,12 @@ static inline void
|
||||||
spa_graph_port_init(struct spa_graph_port *port,
|
spa_graph_port_init(struct spa_graph_port *port,
|
||||||
enum spa_direction direction,
|
enum spa_direction direction,
|
||||||
uint32_t port_id,
|
uint32_t port_id,
|
||||||
uint32_t flags,
|
uint32_t flags)
|
||||||
struct spa_io_buffers *io)
|
|
||||||
{
|
{
|
||||||
spa_debug("port %p init type %d id %d", port, direction, port_id);
|
spa_debug("port %p init type %d id %d", port, direction, port_id);
|
||||||
port->direction = direction;
|
port->direction = direction;
|
||||||
port->port_id = port_id;
|
port->port_id = port_id;
|
||||||
port->flags = flags;
|
port->flags = flags;
|
||||||
port->io = io;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
||||||
|
|
@ -402,13 +402,13 @@ static int make_nodes(struct data *data, const char *device)
|
||||||
spa_graph_node_init(&data->source_node, &data->source_state);
|
spa_graph_node_init(&data->source_node, &data->source_state);
|
||||||
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
||||||
spa_graph_node_add(&data->graph, &data->source_node);
|
spa_graph_node_add(&data->graph, &data->source_node);
|
||||||
spa_graph_port_init(&data->source_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source_sink_io[0]);
|
spa_graph_port_init(&data->source_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->source_node, &data->source_out);
|
spa_graph_port_add(&data->source_node, &data->source_out);
|
||||||
|
|
||||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||||
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
||||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_sink_io[0]);
|
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||||
|
|
||||||
spa_graph_port_link(&data->source_out, &data->sink_in);
|
spa_graph_port_link(&data->source_out, &data->sink_in);
|
||||||
|
|
|
||||||
|
|
@ -359,24 +359,24 @@ static int make_nodes(struct data *data, const char *device)
|
||||||
spa_graph_node_init(&data->source_node, &data->source_state);
|
spa_graph_node_init(&data->source_node, &data->source_state);
|
||||||
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
||||||
spa_graph_node_add(&data->graph, &data->source_node);
|
spa_graph_node_add(&data->graph, &data->source_node);
|
||||||
spa_graph_port_init(&data->source_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source_volume_io[0]);
|
spa_graph_port_init(&data->source_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->source_node, &data->source_out);
|
spa_graph_port_add(&data->source_node, &data->source_out);
|
||||||
|
|
||||||
spa_graph_node_init(&data->volume_node, &data->volume_state);
|
spa_graph_node_init(&data->volume_node, &data->volume_state);
|
||||||
spa_graph_node_set_callbacks(&data->volume_node, &spa_graph_node_impl_default, data->volume);
|
spa_graph_node_set_callbacks(&data->volume_node, &spa_graph_node_impl_default, data->volume);
|
||||||
spa_graph_node_add(&data->graph, &data->volume_node);
|
spa_graph_node_add(&data->graph, &data->volume_node);
|
||||||
spa_graph_port_init(&data->volume_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_volume_io[0]);
|
spa_graph_port_init(&data->volume_in, SPA_DIRECTION_INPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->volume_node, &data->volume_in);
|
spa_graph_port_add(&data->volume_node, &data->volume_in);
|
||||||
|
|
||||||
spa_graph_port_link(&data->source_out, &data->volume_in);
|
spa_graph_port_link(&data->source_out, &data->volume_in);
|
||||||
|
|
||||||
spa_graph_port_init(&data->volume_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->volume_sink_io[0]);
|
spa_graph_port_init(&data->volume_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->volume_node, &data->volume_out);
|
spa_graph_port_add(&data->volume_node, &data->volume_out);
|
||||||
|
|
||||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||||
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
||||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->volume_sink_io[0]);
|
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||||
|
|
||||||
spa_graph_port_link(&data->volume_out, &data->sink_in);
|
spa_graph_port_link(&data->volume_out, &data->sink_in);
|
||||||
|
|
|
||||||
|
|
@ -474,35 +474,35 @@ static int make_nodes(struct data *data, const char *device)
|
||||||
#ifdef USE_GRAPH
|
#ifdef USE_GRAPH
|
||||||
spa_graph_node_init(&data->source1_node, &data->source1_state);
|
spa_graph_node_init(&data->source1_node, &data->source1_state);
|
||||||
spa_graph_node_set_callbacks(&data->source1_node, &spa_graph_node_impl_default, data->source1);
|
spa_graph_node_set_callbacks(&data->source1_node, &spa_graph_node_impl_default, data->source1);
|
||||||
spa_graph_port_init(&data->source1_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source1_mix_io[0]);
|
spa_graph_port_init(&data->source1_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->source1_node, &data->source1_out);
|
spa_graph_port_add(&data->source1_node, &data->source1_out);
|
||||||
spa_graph_node_add(&data->graph, &data->source1_node);
|
spa_graph_node_add(&data->graph, &data->source1_node);
|
||||||
|
|
||||||
spa_graph_node_init(&data->source2_node, &data->source2_state);
|
spa_graph_node_init(&data->source2_node, &data->source2_state);
|
||||||
spa_graph_node_set_callbacks(&data->source2_node, &spa_graph_node_impl_default, data->source2);
|
spa_graph_node_set_callbacks(&data->source2_node, &spa_graph_node_impl_default, data->source2);
|
||||||
spa_graph_port_init(&data->source2_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source2_mix_io[0]);
|
spa_graph_port_init(&data->source2_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->source2_node, &data->source2_out);
|
spa_graph_port_add(&data->source2_node, &data->source2_out);
|
||||||
spa_graph_node_add(&data->graph, &data->source2_node);
|
spa_graph_node_add(&data->graph, &data->source2_node);
|
||||||
|
|
||||||
spa_graph_node_init(&data->mix_node, &data->mix_state);
|
spa_graph_node_init(&data->mix_node, &data->mix_state);
|
||||||
spa_graph_node_set_callbacks(&data->mix_node, &spa_graph_node_impl_default, data->mix);
|
spa_graph_node_set_callbacks(&data->mix_node, &spa_graph_node_impl_default, data->mix);
|
||||||
spa_graph_port_init(&data->mix_in[0], SPA_DIRECTION_INPUT,
|
spa_graph_port_init(&data->mix_in[0], SPA_DIRECTION_INPUT,
|
||||||
data->mix_ports[0], 0, &data->source1_mix_io[0]);
|
data->mix_ports[0], 0);
|
||||||
spa_graph_port_add(&data->mix_node, &data->mix_in[0]);
|
spa_graph_port_add(&data->mix_node, &data->mix_in[0]);
|
||||||
spa_graph_port_init(&data->mix_in[1], SPA_DIRECTION_INPUT,
|
spa_graph_port_init(&data->mix_in[1], SPA_DIRECTION_INPUT,
|
||||||
data->mix_ports[1], 0, &data->source2_mix_io[0]);
|
data->mix_ports[1], 0);
|
||||||
spa_graph_port_add(&data->mix_node, &data->mix_in[1]);
|
spa_graph_port_add(&data->mix_node, &data->mix_in[1]);
|
||||||
spa_graph_node_add(&data->graph, &data->mix_node);
|
spa_graph_node_add(&data->graph, &data->mix_node);
|
||||||
|
|
||||||
spa_graph_port_link(&data->source1_out, &data->mix_in[0]);
|
spa_graph_port_link(&data->source1_out, &data->mix_in[0]);
|
||||||
spa_graph_port_link(&data->source2_out, &data->mix_in[1]);
|
spa_graph_port_link(&data->source2_out, &data->mix_in[1]);
|
||||||
|
|
||||||
spa_graph_port_init(&data->mix_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->mix_sink_io[0]);
|
spa_graph_port_init(&data->mix_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->mix_node, &data->mix_out);
|
spa_graph_port_add(&data->mix_node, &data->mix_out);
|
||||||
|
|
||||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||||
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
||||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->mix_sink_io[0]);
|
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -379,14 +379,14 @@ static int make_nodes(struct data *data)
|
||||||
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
||||||
spa_graph_node_add(&data->graph, &data->source_node);
|
spa_graph_node_add(&data->graph, &data->source_node);
|
||||||
|
|
||||||
spa_graph_port_init( &data->source_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source_sink_io[0]);
|
spa_graph_port_init( &data->source_out, SPA_DIRECTION_OUTPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->source_node, &data->source_out);
|
spa_graph_port_add(&data->source_node, &data->source_out);
|
||||||
|
|
||||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||||
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
||||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||||
|
|
||||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_sink_io[0]);
|
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0);
|
||||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||||
|
|
||||||
spa_graph_port_link(&data->source_out, &data->sink_in);
|
spa_graph_port_link(&data->source_out, &data->sink_in);
|
||||||
|
|
|
||||||
|
|
@ -746,7 +746,6 @@ static int schedule_mix(struct spa_node *_node)
|
||||||
struct port *outp = GET_OUT_PORT(n, 0);
|
struct port *outp = GET_OUT_PORT(n, 0);
|
||||||
struct spa_graph_node *node = &port->rt.mix_node;
|
struct spa_graph_node *node = &port->rt.mix_node;
|
||||||
struct spa_graph_port *gp;
|
struct spa_graph_port *gp;
|
||||||
struct spa_io_buffers *io = port->rt.mix_port.io;
|
|
||||||
size_t buffer_size = 0;
|
size_t buffer_size = 0;
|
||||||
struct buffer *outb;
|
struct buffer *outb;
|
||||||
float *out = NULL;
|
float *out = NULL;
|
||||||
|
|
@ -760,7 +759,7 @@ static int schedule_mix(struct spa_node *_node)
|
||||||
struct spa_io_buffers *inio;
|
struct spa_io_buffers *inio;
|
||||||
struct spa_buffer *inb;
|
struct spa_buffer *inb;
|
||||||
|
|
||||||
if ((inio = gp->io) == NULL ||
|
if ((inio = mix->io) == NULL ||
|
||||||
inio->buffer_id >= mix->n_buffers ||
|
inio->buffer_id >= mix->n_buffers ||
|
||||||
inio->status != SPA_STATUS_HAVE_BUFFER)
|
inio->status != SPA_STATUS_HAVE_BUFFER)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -778,7 +777,7 @@ static int schedule_mix(struct spa_node *_node)
|
||||||
add_f32(out, inb->datas[0].data, buffer_size);
|
add_f32(out, inb->datas[0].data, buffer_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
pw_log_trace("mix %p: input %p %p %zd", node, inio, io, buffer_size);
|
pw_log_trace("mix %p: input %p %p %zd", node, inio, mix->io, buffer_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
outb = peek_buffer(n, outp);
|
outb = peek_buffer(n, outp);
|
||||||
|
|
|
||||||
|
|
@ -676,6 +676,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
mix->io = data;
|
||||||
update_io(impl, port, mix->port.port_id, 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,
|
||||||
|
|
@ -1215,8 +1216,6 @@ static int port_init_mix(void *data, struct pw_port_mix *mix)
|
||||||
mix->io->buffer_id = SPA_ID_INVALID;
|
mix->io->buffer_id = SPA_ID_INVALID;
|
||||||
mix->io->status = SPA_STATUS_NEED_BUFFER;
|
mix->io->status = SPA_STATUS_NEED_BUFFER;
|
||||||
|
|
||||||
mix->port.io = mix->io;
|
|
||||||
|
|
||||||
pw_log_debug("client-node %p: init mix io %d %p %p", impl, mix->id, mix->io,
|
pw_log_debug("client-node %p: init mix io %d %p %p", impl, mix->id, mix->io,
|
||||||
impl->io_areas->ptr);
|
impl->io_areas->ptr);
|
||||||
|
|
||||||
|
|
@ -1248,9 +1247,6 @@ static int mix_port_set_io(struct spa_node *node,
|
||||||
struct impl *impl = p->owner_data;
|
struct impl *impl = p->owner_data;
|
||||||
struct pw_port_mix *mix;
|
struct pw_port_mix *mix;
|
||||||
|
|
||||||
p->rt.port.io = data;
|
|
||||||
p->rt.mix_port.io = data;
|
|
||||||
|
|
||||||
mix = pw_map_lookup(&p->mix_port_map, port_id);
|
mix = pw_map_lookup(&p->mix_port_map, port_id);
|
||||||
if (mix == NULL)
|
if (mix == NULL)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
@ -1262,11 +1258,6 @@ static int mix_port_set_io(struct spa_node *node,
|
||||||
|
|
||||||
static int mix_port_process(struct spa_node *data)
|
static int mix_port_process(struct spa_node *data)
|
||||||
{
|
{
|
||||||
struct pw_port *p = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
|
||||||
struct spa_io_buffers *io = p->rt.mix_port.io;
|
|
||||||
if (io != NULL) {
|
|
||||||
pw_log_trace("client-node %p: pass %d %d", data, io->status, io->buffer_id);
|
|
||||||
}
|
|
||||||
return SPA_STATUS_HAVE_BUFFER;
|
return SPA_STATUS_HAVE_BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -486,12 +486,13 @@ param_filter(struct pw_link *this,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int port_set_io(struct pw_link *this, struct pw_port *port, void *data, size_t size,
|
static int port_set_io(struct pw_link *this, struct pw_port *port, void *data, size_t size,
|
||||||
struct spa_graph_port *p)
|
struct pw_port_mix *mix)
|
||||||
{
|
{
|
||||||
struct pw_type *t = &this->core->type;
|
struct pw_type *t = &this->core->type;
|
||||||
|
struct spa_graph_port *p = &mix->port;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
p->io = data;
|
mix->io = data;
|
||||||
pw_log_debug("link %p: %s port %p %d.%d set io: %p", this,
|
pw_log_debug("link %p: %s port %p %d.%d set io: %p", this,
|
||||||
pw_direction_as_string(port->direction),
|
pw_direction_as_string(port->direction),
|
||||||
port, port->port_id, p->port_id, data);
|
port, port->port_id, p->port_id, data);
|
||||||
|
|
@ -516,20 +517,20 @@ static int select_io(struct pw_link *this)
|
||||||
if (impl->have_io)
|
if (impl->have_io)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
io = this->rt.mix[SPA_DIRECTION_INPUT].port.io;
|
io = this->rt.mix[SPA_DIRECTION_INPUT].io;
|
||||||
if (io == NULL)
|
if (io == NULL)
|
||||||
io = this->rt.mix[SPA_DIRECTION_OUTPUT].port.io;
|
io = this->rt.mix[SPA_DIRECTION_OUTPUT].io;
|
||||||
if (io == NULL)
|
if (io == NULL)
|
||||||
io = &impl->io;
|
io = &impl->io;
|
||||||
if (io == NULL)
|
if (io == NULL)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if ((res = port_set_io(this, this->input, io,
|
if ((res = port_set_io(this, this->input, io,
|
||||||
sizeof(struct spa_io_buffers), &this->rt.mix[SPA_DIRECTION_INPUT].port)) < 0)
|
sizeof(struct spa_io_buffers), &this->rt.mix[SPA_DIRECTION_INPUT])) < 0)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
if ((res = port_set_io(this, this->output, io,
|
if ((res = port_set_io(this, this->output, io,
|
||||||
sizeof(struct spa_io_buffers), &this->rt.mix[SPA_DIRECTION_OUTPUT].port)) < 0)
|
sizeof(struct spa_io_buffers), &this->rt.mix[SPA_DIRECTION_OUTPUT])) < 0)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
this->io = io;
|
this->io = io;
|
||||||
|
|
@ -940,7 +941,6 @@ static void input_remove(struct pw_link *this, struct pw_port *port)
|
||||||
{
|
{
|
||||||
struct impl *impl = (struct impl *) this;
|
struct impl *impl = (struct impl *) this;
|
||||||
struct pw_port_mix *mix = &this->rt.mix[SPA_DIRECTION_INPUT];
|
struct pw_port_mix *mix = &this->rt.mix[SPA_DIRECTION_INPUT];
|
||||||
struct spa_graph_port *p = &mix->port;
|
|
||||||
|
|
||||||
pw_log_debug("link %p: remove input port %p", this, port);
|
pw_log_debug("link %p: remove input port %p", this, port);
|
||||||
spa_hook_remove(&impl->input_port_listener);
|
spa_hook_remove(&impl->input_port_listener);
|
||||||
|
|
@ -951,7 +951,7 @@ static void input_remove(struct pw_link *this, struct pw_port *port)
|
||||||
|
|
||||||
clear_port_buffers(this, port);
|
clear_port_buffers(this, port);
|
||||||
|
|
||||||
port_set_io(this, this->input, NULL, 0, p);
|
port_set_io(this, this->input, NULL, 0, mix);
|
||||||
pw_port_release_mix(port, mix);
|
pw_port_release_mix(port, mix);
|
||||||
this->input = NULL;
|
this->input = NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -960,7 +960,6 @@ static void output_remove(struct pw_link *this, struct pw_port *port)
|
||||||
{
|
{
|
||||||
struct impl *impl = (struct impl *) this;
|
struct impl *impl = (struct impl *) this;
|
||||||
struct pw_port_mix *mix = &this->rt.mix[SPA_DIRECTION_OUTPUT];
|
struct pw_port_mix *mix = &this->rt.mix[SPA_DIRECTION_OUTPUT];
|
||||||
struct spa_graph_port *p = &mix->port;
|
|
||||||
|
|
||||||
pw_log_debug("link %p: remove output port %p", this, port);
|
pw_log_debug("link %p: remove output port %p", this, port);
|
||||||
spa_hook_remove(&impl->output_port_listener);
|
spa_hook_remove(&impl->output_port_listener);
|
||||||
|
|
@ -971,7 +970,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port)
|
||||||
|
|
||||||
clear_port_buffers(this, port);
|
clear_port_buffers(this, port);
|
||||||
|
|
||||||
port_set_io(this, this->output, NULL, 0, p);
|
port_set_io(this, this->output, NULL, 0, mix);
|
||||||
pw_port_release_mix(port, mix);
|
pw_port_release_mix(port, mix);
|
||||||
this->output = NULL;
|
this->output = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,26 +49,27 @@ static void port_update_state(struct pw_port *port, enum pw_port_state state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int schedule_tee_input(struct spa_node *data)
|
static int tee_process(struct spa_node *data)
|
||||||
{
|
{
|
||||||
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
||||||
struct spa_graph_node *node = &this->rt.mix_node;
|
struct spa_graph_node *node = &this->rt.mix_node;
|
||||||
struct spa_graph_port *p;
|
struct spa_graph_port *p;
|
||||||
struct spa_io_buffers *io = this->rt.mix_port.io;
|
struct spa_io_buffers *io = &this->rt.io;
|
||||||
|
|
||||||
if (!spa_list_is_empty(&node->ports[SPA_DIRECTION_OUTPUT])) {
|
if (!spa_list_is_empty(&node->ports[SPA_DIRECTION_OUTPUT])) {
|
||||||
pw_log_trace("port %p: tee input %d %d", this, io->status, io->buffer_id);
|
pw_log_trace("port %p: tee input %d %d", this, io->status, io->buffer_id);
|
||||||
spa_list_for_each(p, &node->ports[SPA_DIRECTION_OUTPUT], link) {
|
spa_list_for_each(p, &node->ports[SPA_DIRECTION_OUTPUT], link) {
|
||||||
|
struct pw_port_mix *mix = SPA_CONTAINER_OF(p, struct pw_port_mix, port);
|
||||||
pw_log_trace("port %p: port %d %d %p->%p", this,
|
pw_log_trace("port %p: port %d %d %p->%p", this,
|
||||||
p->port_id, p->flags, io, p->io);
|
p->port_id, p->flags, io, mix->io);
|
||||||
*p->io = *io;
|
*mix->io = *io;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
io->status = SPA_STATUS_NEED_BUFFER;
|
io->status = SPA_STATUS_NEED_BUFFER;
|
||||||
return SPA_STATUS_HAVE_BUFFER;
|
return SPA_STATUS_HAVE_BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int schedule_tee_reuse_buffer(struct spa_node *data, uint32_t port_id, uint32_t buffer_id)
|
static int tee_reuse_buffer(struct spa_node *data, uint32_t port_id, uint32_t buffer_id)
|
||||||
{
|
{
|
||||||
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
||||||
struct spa_graph_port *p = &this->rt.mix_port, *pp;
|
struct spa_graph_port *p = &this->rt.mix_port, *pp;
|
||||||
|
|
@ -83,8 +84,8 @@ static int schedule_tee_reuse_buffer(struct spa_node *data, uint32_t port_id, ui
|
||||||
static const struct spa_node schedule_tee_node = {
|
static const struct spa_node schedule_tee_node = {
|
||||||
SPA_VERSION_NODE,
|
SPA_VERSION_NODE,
|
||||||
NULL,
|
NULL,
|
||||||
.process = schedule_tee_input,
|
.process = tee_process,
|
||||||
.port_reuse_buffer = schedule_tee_reuse_buffer,
|
.port_reuse_buffer = tee_reuse_buffer,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int schedule_mix_input(struct spa_node *data)
|
static int schedule_mix_input(struct spa_node *data)
|
||||||
|
|
@ -92,12 +93,13 @@ static int schedule_mix_input(struct spa_node *data)
|
||||||
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
struct pw_port *this = SPA_CONTAINER_OF(data, struct pw_port, mix_node);
|
||||||
struct spa_graph_node *node = &this->rt.mix_node;
|
struct spa_graph_node *node = &this->rt.mix_node;
|
||||||
struct spa_graph_port *p;
|
struct spa_graph_port *p;
|
||||||
struct spa_io_buffers *io = this->rt.mix_port.io;
|
struct spa_io_buffers *io = &this->rt.io;
|
||||||
|
|
||||||
spa_list_for_each(p, &node->ports[SPA_DIRECTION_INPUT], link) {
|
spa_list_for_each(p, &node->ports[SPA_DIRECTION_INPUT], link) {
|
||||||
|
struct pw_port_mix *mix = SPA_CONTAINER_OF(p, struct pw_port_mix, port);
|
||||||
pw_log_trace("port %p: mix input %d %p->%p %d %d", this,
|
pw_log_trace("port %p: mix input %d %p->%p %d %d", this,
|
||||||
p->port_id, p->io, io, p->io->status, p->io->buffer_id);
|
p->port_id, mix->io, io, mix->io->status, mix->io->buffer_id);
|
||||||
*io = *p->io;
|
*io = *mix->io;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return io->status;
|
return io->status;
|
||||||
|
|
@ -135,14 +137,13 @@ int pw_port_init_mix(struct pw_port *port, struct pw_port_mix *mix)
|
||||||
|
|
||||||
spa_graph_port_init(&mix->port,
|
spa_graph_port_init(&mix->port,
|
||||||
port->direction, id,
|
port->direction, id,
|
||||||
0,
|
0);
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (pi && pi->init_mix)
|
if (pi && pi->init_mix)
|
||||||
res = pi->init_mix(port->implementation_data, mix);
|
res = pi->init_mix(port->implementation_data, mix);
|
||||||
|
|
||||||
pw_log_debug("port %p: init mix %d.%d io %p", port,
|
pw_log_debug("port %p: init mix %d.%d io %p", port,
|
||||||
port->port_id, mix->port.port_id, mix->port.io);
|
port->port_id, mix->port.port_id, mix->io);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
@ -205,8 +206,7 @@ struct pw_port *pw_port_new(enum pw_direction direction,
|
||||||
spa_graph_port_init(&this->rt.port,
|
spa_graph_port_init(&this->rt.port,
|
||||||
this->direction,
|
this->direction,
|
||||||
this->port_id,
|
this->port_id,
|
||||||
0,
|
0);
|
||||||
&this->rt.io);
|
|
||||||
spa_graph_node_init(&this->rt.mix_node, &this->rt.mix_state);
|
spa_graph_node_init(&this->rt.mix_node, &this->rt.mix_state);
|
||||||
this->rt.mix_state.status = SPA_STATUS_NEED_BUFFER;
|
this->rt.mix_state.status = SPA_STATUS_NEED_BUFFER;
|
||||||
|
|
||||||
|
|
@ -219,9 +219,7 @@ struct pw_port *pw_port_new(enum pw_direction direction,
|
||||||
|
|
||||||
spa_graph_port_init(&this->rt.mix_port,
|
spa_graph_port_init(&this->rt.mix_port,
|
||||||
pw_direction_reverse(this->direction),
|
pw_direction_reverse(this->direction),
|
||||||
0,
|
0, 0);
|
||||||
0,
|
|
||||||
&this->rt.io);
|
|
||||||
this->rt.io.status = SPA_STATUS_NEED_BUFFER;
|
this->rt.io.status = SPA_STATUS_NEED_BUFFER;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -478,7 +476,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node)
|
||||||
spa_node_port_set_io(node->node,
|
spa_node_port_set_io(node->node,
|
||||||
port->direction, port_id,
|
port->direction, port_id,
|
||||||
t->io.Buffers,
|
t->io.Buffers,
|
||||||
port->rt.port.io, sizeof(*port->rt.port.io));
|
&port->rt.io, sizeof(port->rt.io));
|
||||||
|
|
||||||
if (node->global)
|
if (node->global)
|
||||||
pw_port_register(port, node->global->owner, node->global,
|
pw_port_register(port, node->global->owner, node->global,
|
||||||
|
|
|
||||||
|
|
@ -1178,13 +1178,13 @@ client_node_port_set_io(void *object,
|
||||||
spa_type_map_get_type(core->type.map, id), ptr);
|
spa_type_map_get_type(core->type.map, id), ptr);
|
||||||
|
|
||||||
if (id == t->io.Buffers) {
|
if (id == t->io.Buffers) {
|
||||||
if (ptr == NULL && mix->mix.port.io) {
|
if (ptr == NULL && mix->mix.io) {
|
||||||
deactivate_mix(data, mix);
|
deactivate_mix(data, mix);
|
||||||
m = find_mem_ptr(data, mix->mix.port.io);
|
m = find_mem_ptr(data, mix->mix.io);
|
||||||
if (m && --m->ref == 0)
|
if (m && --m->ref == 0)
|
||||||
clear_mem(data, m);
|
clear_mem(data, m);
|
||||||
}
|
}
|
||||||
mix->mix.port.io = ptr;
|
mix->mix.io = ptr;
|
||||||
if (ptr)
|
if (ptr)
|
||||||
activate_mix(data, mix);
|
activate_mix(data, mix);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue