diff options
-rw-r--r-- | src/modules/module-audio-dsp/audio-dsp.c | 3 | ||||
-rw-r--r-- | src/modules/module-client-node/client-node.c | 4 | ||||
-rw-r--r-- | src/pipewire/factory.c | 11 | ||||
-rw-r--r-- | src/pipewire/port.c | 25 | ||||
-rw-r--r-- | src/pipewire/private.h | 6 |
5 files changed, 23 insertions, 26 deletions
diff --git a/src/modules/module-audio-dsp/audio-dsp.c b/src/modules/module-audio-dsp/audio-dsp.c index cb7330a2..53a3dc33 100644 --- a/src/modules/module-audio-dsp/audio-dsp.c +++ b/src/modules/module-audio-dsp/audio-dsp.c @@ -245,8 +245,7 @@ static void node_port_init(void *data, struct pw_port *port) if (direction == PW_DIRECTION_INPUT) { pw_log_debug("mix node %p", p->spa_node); pw_port_set_mix(port, p->spa_node, PW_PORT_MIX_FLAG_MULTI); - port->implementation = &port_implementation; - port->implementation_data = p; + port->impl = SPA_HOOK_INIT(&port_implementation, p); } spa_list_append(&n->ports, &p->link); } diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index aac084fc..7a4548bb 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -1532,9 +1532,7 @@ static void node_port_added(void *data, struct pw_port *port) PW_PORT_MIX_FLAG_MULTI | PW_PORT_MIX_FLAG_MIX_ONLY); - port->implementation = &port_impl; - port->implementation_data = p; - + port->impl = SPA_HOOK_INIT(&port_impl, p); port->owner_data = impl; } diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index 9fb6f189..a162a769 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -201,8 +201,7 @@ void pw_factory_set_implementation(struct pw_factory *factory, const struct pw_factory_implementation *implementation, void *data) { - factory->implementation = implementation; - factory->implementation_data = data; + factory->impl = SPA_HOOK_INIT(implementation, data); } SPA_EXPORT @@ -213,6 +212,10 @@ void *pw_factory_create_object(struct pw_factory *factory, struct pw_properties *properties, uint32_t new_id) { - return factory->implementation->create_object(factory->implementation_data, - resource, type, version, properties, new_id); + void *res = NULL; + spa_hook_call_res(&factory->impl, + struct pw_factory_implementation, + res, create_object, 0, + resource, type, version, properties, new_id); + return res; } diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 1f94a294..d020d3d4 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -162,7 +162,6 @@ int pw_port_init_mix(struct pw_port *port, struct pw_port_mix *mix) { uint32_t port_id; int res = 0; - const struct pw_port_implementation *pi = port->implementation; port_id = pw_map_insert_new(&port->mix_port_map, mix); @@ -176,8 +175,8 @@ int pw_port_init_mix(struct pw_port *port, struct pw_port_mix *mix) if (port->mix->add_port) port->mix->add_port(port->mix, port->direction, port_id, NULL); - if (pi && pi->init_mix) - res = pi->init_mix(port->implementation_data, mix); + spa_hook_call_res(&port->impl, struct pw_port_implementation, + res, init_mix, 0, mix); /* set the same format on the mixer as on the port if any */ if (port->mix->enum_params && port->mix->set_param) { @@ -207,14 +206,13 @@ int pw_port_release_mix(struct pw_port *port, struct pw_port_mix *mix) { int res = 0; uint32_t port_id = mix->port.port_id; - const struct pw_port_implementation *pi = port->implementation; pw_map_remove(&port->mix_port_map, port_id); spa_list_remove(&mix->link); port->n_mix--; - if (pi && pi->release_mix) - res = pi->release_mix(port->implementation_data, mix); + spa_hook_call_res(&port->impl, struct pw_port_implementation, + res, release_mix, 0, mix); if (port->mix->remove_port) { port->mix->remove_port(port->mix, port->direction, port_id); @@ -1000,7 +998,6 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, int res = 0; struct pw_node *node = port->node; struct pw_port_mix *mix = NULL; - const struct pw_port_implementation *pi = port->implementation; pw_log_debug("port %p: %d:%d.%d: %d buffers %d", port, port->direction, port->port_id, mix_id, n_buffers, port->state); @@ -1035,8 +1032,9 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, } port->allocated = false; free_allocation(&port->allocation); - if (pi && pi->use_buffers) - res = pi->use_buffers(port->implementation_data, buffers, n_buffers); + + spa_hook_call_res(&port->impl, struct pw_port_implementation, + res, use_buffers, 0, buffers, n_buffers); } if (n_buffers > 0 && !SPA_RESULT_IS_ASYNC(res)) { @@ -1052,7 +1050,6 @@ int pw_port_alloc_buffers(struct pw_port *port, { int res; struct pw_node *node = port->node; - const struct pw_port_implementation *pi = port->implementation; if (port->state < PW_PORT_STATE_READY) return -EIO; @@ -1064,9 +1061,11 @@ int pw_port_alloc_buffers(struct pw_port *port, res, spa_strerror(res)); } - if (res >= 0 && pi && pi->alloc_buffers) { - if ((res = pi->alloc_buffers(port->implementation_data, - params, n_params, buffers, n_buffers)) < 0) { + if (res >= 0) { + spa_hook_call_res(&port->impl, struct pw_port_implementation, + res, alloc_buffers, 0, + params, n_params, buffers, n_buffers); + if (res < 0) { pw_log_error("port %p: %d implementation alloc failed: %d (%s)", port, port->port_id, res, spa_strerror(res)); } diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 1e81064f..a0075f5a 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -497,8 +497,7 @@ struct pw_port { struct spa_hook_list listener_list; - const struct pw_port_implementation *implementation; - void *implementation_data; + struct spa_hook impl; struct spa_node *mix; /**< port buffer mix/split */ #define PW_PORT_MIX_FLAG_MULTI (1<<0) /**< multi input or output */ @@ -701,8 +700,7 @@ struct pw_factory { struct spa_hook_list listener_list; /**< event listeners */ - const struct pw_factory_implementation *implementation; - void *implementation_data; + struct spa_hook impl; void *user_data; |