diff --git a/spa/include/spa/support/loop.h b/spa/include/spa/support/loop.h index c33e67cde..8e43454e2 100644 --- a/spa/include/spa/support/loop.h +++ b/spa/include/spa/support/loop.h @@ -113,6 +113,9 @@ struct spa_loop_control_hooks { void (*after) (void *data); }; +#define spa_loop_control_hook_before(l) spa_hook_list_call(l, struct spa_loop_control_hooks, before, 0) +#define spa_loop_control_hook_after(l) spa_hook_list_call(l, struct spa_loop_control_hooks, after, 0) + /** * Control an event loop */ diff --git a/spa/include/spa/utils/hook.h b/spa/include/spa/utils/hook.h index e23200dac..938d4c8f6 100644 --- a/spa/include/spa/utils/hook.h +++ b/spa/include/spa/utils/hook.h @@ -43,7 +43,9 @@ struct spa_hook { struct spa_list link; const void *funcs; void *data; - void *priv[2]; /**< private data for the hook list */ + void *priv; /**< private data for the hook list */ + void (*removed) (struct spa_hook *hook); + }; /** Initialize a hook list */ @@ -76,12 +78,14 @@ static inline void spa_hook_list_prepend(struct spa_hook_list *list, static inline void spa_hook_remove(struct spa_hook *hook) { spa_list_remove(&hook->link); + if (hook->removed) + hook->removed(hook); } /** Call all hooks in a list, starting from the given one and optionally stopping * after calling the first non-NULL function, returns the number of methods * called */ -#define spa_hook_list_do_call(l,start,type,method,once,...) \ +#define spa_hook_list_do_call(l,start,type,method,vers,once,...) \ ({ \ struct spa_hook_list *list = l; \ struct spa_list *s = start ? (struct spa_list *)start : &list->list; \ @@ -95,7 +99,7 @@ static inline void spa_hook_remove(struct spa_hook *hook) const type *cb = ci->funcs; \ spa_list_remove(&ci->link); \ spa_list_append(&cursor.link, &ci->link); \ - if (cb && cb->method) { \ + if (cb && cb->version >= vers && cb->method) { \ cb->method(ci->data, ## __VA_ARGS__); \ count++; \ if (once) \ @@ -106,11 +110,11 @@ static inline void spa_hook_remove(struct spa_hook *hook) count; \ }) -#define spa_hook_list_call(l,t,m,...) spa_hook_list_do_call(l,NULL,t,m,false,##__VA_ARGS__) -#define spa_hook_list_call_once(l,t,m,...) spa_hook_list_do_call(l,NULL,t,m,true,##__VA_ARGS__) +#define spa_hook_list_call(l,t,m,v,...) spa_hook_list_do_call(l,NULL,t,m,v,false,##__VA_ARGS__) +#define spa_hook_list_call_once(l,t,m,v,...) spa_hook_list_do_call(l,NULL,t,m,v,true,##__VA_ARGS__) -#define spa_hook_list_call_start(l,s,t,m,...) spa_hook_list_do_call(l,s,t,m,false,##__VA_ARGS__) -#define spa_hook_list_call_once_start(l,s,t,m,...) spa_hook_list_do_call(l,s,t,m,true,##__VA_ARGS__) +#define spa_hook_list_call_start(l,s,t,m,v,...) spa_hook_list_do_call(l,s,t,m,v,false,##__VA_ARGS__) +#define spa_hook_list_call_once_start(l,s,t,m,v,...) spa_hook_list_do_call(l,s,t,m,v,true,##__VA_ARGS__) #ifdef __cplusplus } diff --git a/spa/plugins/support/loop.c b/spa/plugins/support/loop.c index 2b6d0313c..2c158240b 100644 --- a/spa/plugins/support/loop.c +++ b/spa/plugins/support/loop.c @@ -250,13 +250,13 @@ loop_invoke(struct spa_loop *loop, if (block) { uint64_t count = 1; - spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, before); + spa_loop_control_hook_before(&impl->hooks_list); if (read(impl->ack_fd, &count, sizeof(uint64_t)) != sizeof(uint64_t)) spa_log_warn(impl->log, NAME " %p: failed to read event fd: %s", impl, strerror(errno)); - spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, after); + spa_loop_control_hook_after(&impl->hooks_list); res = item->res; } @@ -340,12 +340,12 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout) struct epoll_event ep[32]; int i, nfds, save_errno = 0; - spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, before); + spa_loop_control_hook_before(&impl->hooks_list); if (SPA_UNLIKELY((nfds = epoll_wait(impl->epoll_fd, ep, SPA_N_ELEMENTS(ep), timeout)) < 0)) save_errno = errno; - spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, after); + spa_loop_control_hook_after(&impl->hooks_list); if (SPA_UNLIKELY(nfds < 0)) return save_errno; diff --git a/src/modules/module-client-node/protocol-native.c b/src/modules/module-client-node/protocol-native.c index 13cd32c42..bcdb2e3a7 100644 --- a/src/modules/module-client-node/protocol-native.c +++ b/src/modules/module-client-node/protocol-native.c @@ -183,7 +183,7 @@ static int client_node_demarshal_add_mem(void *object, void *data, size_t size) memfd = pw_protocol_native_get_proxy_fd(proxy, memfd_idx); - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_mem, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_mem, 0, mem_id, type, memfd, flags); @@ -211,7 +211,7 @@ static int client_node_demarshal_transport(void *object, void *data, size_t size if (readfd == -1 || writefd == -1) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, transport, node_id, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, transport, 0, node_id, readfd, writefd); return 0; } @@ -232,7 +232,7 @@ static int client_node_demarshal_set_param(void *object, void *data, size_t size "O", ¶m, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_param, seq, id, flags, param); + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_param, 0, seq, id, flags, param); return 0; } @@ -246,7 +246,7 @@ static int client_node_demarshal_event_event(void *object, void *data, size_t si if (spa_pod_parser_get(&prs, "[ O", &event, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, event, event); + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, event, 0, event); return 0; } @@ -264,7 +264,7 @@ static int client_node_demarshal_command(void *object, void *data, size_t size) "O", &command, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, command, seq, command); + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, command, 0, seq, command); return 0; } @@ -282,7 +282,7 @@ static int client_node_demarshal_add_port(void *object, void *data, size_t size) "i", &port_id, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, seq, direction, port_id); + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, 0, seq, direction, port_id); return 0; } @@ -300,7 +300,7 @@ static int client_node_demarshal_remove_port(void *object, void *data, size_t si "i", &port_id, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, remove_port, seq, direction, port_id); + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, remove_port, 0, seq, direction, port_id); return 0; } @@ -322,7 +322,7 @@ static int client_node_demarshal_port_set_param(void *object, void *data, size_t "O", ¶m, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_param, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_param, 0, seq, direction, port_id, id, flags, param); return 0; } @@ -384,7 +384,7 @@ static int client_node_demarshal_port_use_buffers(void *object, void *data, size d->data = SPA_UINT32_TO_PTR(data_id); } } - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_use_buffers, seq, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_use_buffers, 0, seq, direction, port_id, mix_id, @@ -407,7 +407,7 @@ static int client_node_demarshal_port_command(void *object, void *data, size_t s "O", &command, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_command, direction, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_command, 0, direction, port_id, command); return 0; @@ -432,7 +432,7 @@ static int client_node_demarshal_port_set_io(void *object, void *data, size_t si "i", &sz, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_io, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_io, 0, seq, direction, port_id, mix_id, id, memid, @@ -455,7 +455,7 @@ static int client_node_demarshal_set_io(void *object, void *data, size_t size) "i", &sz, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_io, + pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_io, 0, id, memid, off, sz); return 0; } @@ -731,7 +731,7 @@ static int client_node_demarshal_done(void *object, void *data, size_t size) "i", &res, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_client_node_proxy_methods, done, seq, res); + pw_resource_do(resource, struct pw_client_node_proxy_methods, done, 0, seq, res); return 0; } @@ -771,7 +771,7 @@ static int client_node_demarshal_update(void *object, void *data, size_t size) return -EINVAL; } - pw_resource_do(resource, struct pw_client_node_proxy_methods, update, change_mask, + pw_resource_do(resource, struct pw_client_node_proxy_methods, update, 0, change_mask, max_input_ports, max_output_ports, n_params, @@ -834,7 +834,7 @@ static int client_node_demarshal_port_update(void *object, void *data, size_t si } } - pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, direction, + pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, 0, direction, port_id, change_mask, n_params, @@ -854,7 +854,7 @@ static int client_node_demarshal_set_active(void *object, void *data, size_t siz "b", &active, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_client_node_proxy_methods, set_active, active); + pw_resource_do(resource, struct pw_client_node_proxy_methods, set_active, 0, active); return 0; } @@ -870,7 +870,7 @@ static int client_node_demarshal_event_method(void *object, void *data, size_t s "O", &event, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_client_node_proxy_methods, event, event); + pw_resource_do(resource, struct pw_client_node_proxy_methods, event, 0, event); return 0; } @@ -883,7 +883,7 @@ static int client_node_demarshal_destroy(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[", NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_client_node_proxy_methods, destroy); + pw_resource_do(resource, struct pw_client_node_proxy_methods, destroy, 0); return 0; } diff --git a/src/modules/module-protocol-native/connection.c b/src/modules/module-protocol-native/connection.c index e8df08274..b0f721b8f 100644 --- a/src/modules/module-protocol-native/connection.c +++ b/src/modules/module-protocol-native/connection.c @@ -118,7 +118,7 @@ static void *connection_ensure_size(struct pw_protocol_native_connection *conn, buf->buffer_data = realloc(buf->buffer_data, buf->buffer_maxsize); if (buf->buffer_data == NULL) { buf->buffer_maxsize = 0; - spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, error, -ENOMEM); + spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, error, 0, -ENOMEM); return NULL; } pw_log_warn("connection %p: resize buffer to %zd %zd %zd", @@ -241,7 +241,7 @@ void pw_protocol_native_connection_destroy(struct pw_protocol_native_connection pw_log_debug("connection %p: destroy", conn); - spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy); + spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy, 0); free(impl->out.buffer_data); free(impl->in.buffer_data); @@ -435,7 +435,7 @@ pw_protocol_native_connection_end(struct pw_protocol_native_connection *conn, spa_debug_pod((struct spa_pod *)p, 0); } spa_hook_list_call(&conn->listener_list, - struct pw_protocol_native_connection_events, need_flush); + struct pw_protocol_native_connection_events, need_flush, 0); } /** Flush the connection object diff --git a/src/modules/module-protocol-native/connection.h b/src/modules/module-protocol-native/connection.h index fe9a78368..57f3bff70 100644 --- a/src/modules/module-protocol-native/connection.h +++ b/src/modules/module-protocol-native/connection.h @@ -29,6 +29,8 @@ extern "C" { struct pw_protocol_native_connection_events { #define PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS 0 + uint32_t version; + void (*destroy) (void *data); void (*error) (void *data, int error); diff --git a/src/modules/module-protocol-native/protocol-native.c b/src/modules/module-protocol-native/protocol-native.c index 7567f9fe8..b81f6d52f 100644 --- a/src/modules/module-protocol-native/protocol-native.c +++ b/src/modules/module-protocol-native/protocol-native.c @@ -210,7 +210,7 @@ static int core_demarshal_info(void *object, void *data, size_t size) NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_core_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_core_proxy_events, info, 0, &info); return 0; } @@ -224,7 +224,7 @@ static int core_demarshal_done(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[ i", &seq, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_core_proxy_events, done, seq); + pw_proxy_notify(proxy, struct pw_core_proxy_events, done, 0, seq); return 0; } @@ -242,7 +242,7 @@ static int core_demarshal_error(void *object, void *data, size_t size) "s", &error, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_core_proxy_events, error, id, res, error); + pw_proxy_notify(proxy, struct pw_core_proxy_events, error, 0, id, res, error); return 0; } @@ -256,7 +256,7 @@ static int core_demarshal_remove_id(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[ i", &id, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_core_proxy_events, remove_id, id); + pw_proxy_notify(proxy, struct pw_core_proxy_events, remove_id, 0, id); return 0; } @@ -280,7 +280,7 @@ static int core_demarshal_update_types_client(void *object, void *data, size_t s if (spa_pod_parser_get(&prs, "s", &types[i], NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_core_proxy_events, update_types, first_id, types, n_types); + pw_proxy_notify(proxy, struct pw_core_proxy_events, update_types, 0, first_id, types, n_types); return 0; } @@ -401,7 +401,7 @@ static int core_demarshal_client_update(void *object, void *data, size_t size) NULL) < 0) return -EINVAL; } - pw_resource_do(resource, struct pw_core_proxy_methods, client_update, &props); + pw_resource_do(resource, struct pw_core_proxy_methods, client_update, 0, &props); return 0; } @@ -424,7 +424,7 @@ static int core_demarshal_permissions(void *object, void *data, size_t size) NULL) < 0) return -EINVAL; } - pw_resource_do(resource, struct pw_core_proxy_methods, permissions, &props); + pw_resource_do(resource, struct pw_core_proxy_methods, permissions, 0, &props); return 0; } @@ -438,7 +438,7 @@ static int core_demarshal_hello(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[P]", &ptr, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_core_proxy_methods, hello); + pw_resource_do(resource, struct pw_core_proxy_methods, hello, 0); return 0; } @@ -452,7 +452,7 @@ static int core_demarshal_sync(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[i]", &seq, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_core_proxy_methods, sync, seq); + pw_resource_do(resource, struct pw_core_proxy_methods, sync, 0, seq); return 0; } @@ -466,7 +466,7 @@ static int core_demarshal_get_registry(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[ii]", &version, &new_id, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_core_proxy_methods, get_registry, version, new_id); + pw_resource_do(resource, struct pw_core_proxy_methods, get_registry, 0, version, new_id); return 0; } @@ -496,7 +496,7 @@ static int core_demarshal_create_object(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "i", &new_id, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_core_proxy_methods, create_object, factory_name, + pw_resource_do(resource, struct pw_core_proxy_methods, create_object, 0, factory_name, type, version, &props, new_id); return 0; @@ -512,7 +512,7 @@ static int core_demarshal_destroy(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "[i]", &id, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_core_proxy_methods, destroy, id); + pw_resource_do(resource, struct pw_core_proxy_methods, destroy, 0, id); return 0; } @@ -536,7 +536,7 @@ static int core_demarshal_update_types_server(void *object, void *data, size_t s if (spa_pod_parser_get(&prs, "s", &types[i], NULL) < 0) return -EINVAL; } - pw_resource_do(resource, struct pw_core_proxy_methods, update_types, first_id, types, n_types); + pw_resource_do(resource, struct pw_core_proxy_methods, update_types, 0, first_id, types, n_types); return 0; } @@ -597,7 +597,7 @@ static int registry_demarshal_bind(void *object, void *data, size_t size) "i", &new_id, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_registry_proxy_methods, bind, id, type, version, new_id); + pw_resource_do(resource, struct pw_registry_proxy_methods, bind, 0, id, type, version, new_id); return 0; } @@ -656,7 +656,7 @@ static int module_demarshal_info(void *object, void *data, size_t size) &props.items[i].key, &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_module_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_module_proxy_events, info, 0, &info); return 0; } @@ -716,7 +716,7 @@ static int factory_demarshal_info(void *object, void *data, size_t size) "s", &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_factory_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_factory_proxy_events, info, 0, &info); return 0; } @@ -784,7 +784,7 @@ static int node_demarshal_info(void *object, void *data, size_t size) "s", &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_node_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_node_proxy_events, info, 0, &info); return 0; } @@ -816,7 +816,7 @@ static int node_demarshal_param(void *object, void *data, size_t size) "P", ¶m, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_node_proxy_events, param, id, index, next, param); + pw_proxy_notify(proxy, struct pw_node_proxy_events, param, 0, id, index, next, param); return 0; } @@ -852,7 +852,7 @@ static int node_demarshal_enum_params(void *object, void *data, size_t size) "P", &filter, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_node_proxy_methods, enum_params, id, index, num, filter); + pw_resource_do(resource, struct pw_node_proxy_methods, enum_params, 0, id, index, num, filter); return 0; } @@ -908,7 +908,7 @@ static int port_demarshal_info(void *object, void *data, size_t size) "s", &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_port_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_port_proxy_events, info, 0, &info); return 0; } @@ -940,7 +940,7 @@ static int port_demarshal_param(void *object, void *data, size_t size) "P", ¶m, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_port_proxy_events, param, id, index, next, param); + pw_proxy_notify(proxy, struct pw_port_proxy_events, param, 0, id, index, next, param); return 0; } @@ -976,7 +976,7 @@ static int port_demarshal_enum_params(void *object, void *data, size_t size) "P", &filter, NULL) < 0) return -EINVAL; - pw_resource_do(resource, struct pw_port_proxy_methods, enum_params, id, index, num, filter); + pw_resource_do(resource, struct pw_port_proxy_methods, enum_params, 0, id, index, num, filter); return 0; } @@ -1030,7 +1030,7 @@ static int client_demarshal_info(void *object, void *data, size_t size) "s", &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_client_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_client_proxy_events, info, 0, &info); return 0; } @@ -1094,7 +1094,7 @@ static int link_demarshal_info(void *object, void *data, size_t size) "s", &props.items[i].value, NULL) < 0) return -EINVAL; } - pw_proxy_notify(proxy, struct pw_link_proxy_events, info, &info); + pw_proxy_notify(proxy, struct pw_link_proxy_events, info, 0, &info); return 0; } @@ -1125,7 +1125,7 @@ static int registry_demarshal_global(void *object, void *data, size_t size) } pw_proxy_notify(proxy, struct pw_registry_proxy_events, - global, id, parent_id, permissions, type, version, + global, 0, id, parent_id, permissions, type, version, props.n_items > 0 ? &props : NULL); return 0; } @@ -1140,7 +1140,7 @@ static int registry_demarshal_global_remove(void *object, void *data, size_t siz if (spa_pod_parser_get(&prs, "[ i", &id, NULL) < 0) return -EINVAL; - pw_proxy_notify(proxy, struct pw_registry_proxy_events, global_remove, id); + pw_proxy_notify(proxy, struct pw_registry_proxy_events, global_remove, 0, id); return 0; } diff --git a/src/pipewire/client.c b/src/pipewire/client.c index 711f1d86f..51b6d94e5 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -285,6 +285,7 @@ static void destroy_resource(void *object, void *data) pw_resource_destroy(object); } + /** Destroy a client object * * \param client the client to destroy @@ -297,7 +298,7 @@ void pw_client_destroy(struct pw_client *client) struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this); pw_log_debug("client %p: destroy", client); - spa_hook_list_call(&client->listener_list, struct pw_client_events, destroy); + pw_client_events_destroy(client); spa_hook_remove(&impl->core_listener); @@ -314,7 +315,7 @@ void pw_client_destroy(struct pw_client *client) pw_map_for_each(&client->objects, destroy_resource, client); - spa_hook_list_call(&client->listener_list, struct pw_client_events, free); + pw_client_events_free(client); pw_log_debug("client %p: free", impl); pw_map_clear(&client->objects); @@ -369,8 +370,7 @@ int pw_client_update_properties(struct pw_client *client, const struct spa_dict client->info.change_mask |= PW_CLIENT_CHANGE_MASK_PROPS; client->info.props = client->properties ? &client->properties->dict : NULL; - spa_hook_list_call(&client->listener_list, struct pw_client_events, - info_changed, &client->info); + pw_client_events_info_changed(client, &client->info); spa_list_for_each(resource, &client->resource_list, link) pw_client_resource_info(resource, &client->info); @@ -504,6 +504,6 @@ void pw_client_set_busy(struct pw_client *client, bool busy) if (client->busy != busy) { pw_log_debug("client %p: busy %d", client, busy); client->busy = busy; - spa_hook_list_call(&client->listener_list, struct pw_client_events, busy_changed, busy); + pw_client_events_busy_changed(client, busy); } } diff --git a/src/pipewire/control.c b/src/pipewire/control.c index dbb9fabef..6456b654d 100644 --- a/src/pipewire/control.c +++ b/src/pipewire/control.c @@ -72,7 +72,7 @@ pw_control_new(struct pw_core *core, spa_list_append(&core->control_list[direction], &this->link); if (port) { spa_list_append(&port->control_list[direction], &this->port_link); - spa_hook_list_call(&port->listener_list, struct pw_port_events, control_added, this); + pw_port_events_control_added(port, this); } return this; @@ -90,7 +90,7 @@ void pw_control_destroy(struct pw_control *control) pw_log_debug("control %p: destroy", control); - spa_hook_list_call(&control->listener_list, struct pw_control_events, destroy); + pw_control_events_destroy(control); if (control->direction == SPA_DIRECTION_OUTPUT) { spa_list_for_each_safe(other, tmp, &control->inputs, inputs_link) @@ -105,12 +105,11 @@ void pw_control_destroy(struct pw_control *control) if (control->port) { spa_list_remove(&control->port_link); - spa_hook_list_call(&control->port->listener_list, - struct pw_port_events, control_removed, control); + pw_port_events_control_removed(control->port, control); } pw_log_debug("control %p: free", control); - spa_hook_list_call(&control->listener_list, struct pw_control_events, free); + pw_control_events_free(control); if (control->direction == SPA_DIRECTION_OUTPUT) { if (impl->mem) @@ -203,8 +202,8 @@ int pw_control_link(struct pw_control *control, struct pw_control *other) other->output = control; spa_list_append(&control->inputs, &other->inputs_link); - spa_hook_list_call(&control->listener_list, struct pw_control_events, linked, other); - spa_hook_list_call(&other->listener_list, struct pw_control_events, linked, control); + pw_control_events_linked(control, other); + pw_control_events_linked(other, control); exit: return res; @@ -249,8 +248,8 @@ int pw_control_unlink(struct pw_control *control, struct pw_control *other) } } - spa_hook_list_call(&control->listener_list, struct pw_control_events, unlinked, other); - spa_hook_list_call(&other->listener_list, struct pw_control_events, unlinked, control); + pw_control_events_unlinked(control, other); + pw_control_events_unlinked(other, control); return res; } diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 743e316e9..c95b0bc81 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -475,7 +475,7 @@ void pw_core_destroy(struct pw_core *core) struct pw_node *node, *tn; pw_log_debug("core %p: destroy", core); - spa_hook_list_call(&core->listener_list, struct pw_core_events, destroy); + pw_core_events_destroy(core); spa_hook_remove(&core->global_listener); @@ -491,7 +491,7 @@ void pw_core_destroy(struct pw_core *core) spa_list_for_each_safe(global, t, &core->global_list, link) pw_global_destroy(global); - spa_hook_list_call(&core->listener_list, struct pw_core_events, free); + pw_core_events_free(core); pw_data_loop_destroy(core->data_loop_impl); @@ -562,8 +562,7 @@ int pw_core_update_properties(struct pw_core *core, const struct spa_dict *dict) core->info.change_mask = PW_CORE_CHANGE_MASK_PROPS; core->info.props = &core->properties->dict; - spa_hook_list_call(&core->listener_list, struct pw_core_events, - info_changed, &core->info); + pw_core_events_info_changed(core, &core->info); spa_list_for_each(resource, &core->resource_list, link) pw_core_resource_info(resource, &core->info); diff --git a/src/pipewire/data-loop.c b/src/pipewire/data-loop.c index 05eeeac51..75f59d499 100644 --- a/src/pipewire/data-loop.c +++ b/src/pipewire/data-loop.c @@ -89,7 +89,7 @@ void pw_data_loop_destroy(struct pw_data_loop *loop) { pw_log_debug("data-loop %p: destroy", loop); - spa_hook_list_call(&loop->listener_list, struct pw_data_loop_events, destroy); + pw_data_loop_events_destroy(loop); pw_data_loop_stop(loop); diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index e60e7363a..cda3267e9 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -58,7 +58,7 @@ struct pw_factory *pw_factory_new(struct pw_core *core, void pw_factory_destroy(struct pw_factory *factory) { pw_log_debug("factory %p: destroy", factory); - spa_hook_list_call(&factory->listener_list, struct pw_factory_events, destroy); + pw_factory_events_destroy(factory); if (factory->registered) spa_list_remove(&factory->link); diff --git a/src/pipewire/global.c b/src/pipewire/global.c index 86fbb3ba8..f4dcc174a 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -134,10 +134,10 @@ pw_global_register(struct pw_global *global, &global->properties->dict : NULL); } - spa_hook_list_call(&global->listener_list, struct pw_global_events, registering); + pw_global_events_registering(global); pw_log_debug("global %p: add %u owner %p parent %p", global, global->id, owner, parent); - spa_hook_list_call(&core->listener_list, struct pw_core_events, global_added, global); + pw_core_events_global_added(core, global); return 0; } @@ -159,8 +159,7 @@ static int global_unregister(struct pw_global *global) } spa_list_remove(&global->link); - spa_hook_list_call(&core->listener_list, struct pw_core_events, - global_removed, global); + pw_core_events_global_removed(core, global); impl->registered = false; @@ -237,8 +236,7 @@ pw_global_bind(struct pw_global *global, struct pw_client *client, uint32_t perm if (global->version < version) goto wrong_version; - spa_hook_list_call(&global->listener_list, struct pw_global_events, bind, - client, permissions, version, id); + pw_global_events_bind(global, client, permissions, version, id); return 0; @@ -264,12 +262,12 @@ void pw_global_destroy(struct pw_global *global) global_unregister(global); pw_log_debug("global %p: destroy %u", global, global->id); - spa_hook_list_call(&global->listener_list, struct pw_global_events, destroy); + pw_global_events_destroy(global); pw_map_remove(&core->globals, global->id); pw_log_debug("global %p: free", global); - spa_hook_list_call(&global->listener_list, struct pw_global_events, free); + pw_global_events_free(global); if (global->properties) pw_properties_free(global->properties); diff --git a/src/pipewire/link.c b/src/pipewire/link.c index cdaef7cf1..13971cfe0 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -83,8 +83,7 @@ static void pw_link_update_state(struct pw_link *link, enum pw_link_state state, free(link->error); link->error = error; - spa_hook_list_call(&link->listener_list, struct pw_link_events, - state_changed, old, state, error); + pw_link_events_state_changed(link, old, state, error); pw_log_debug("link %p: %d %d %d %d", link, out->n_ready_output_links, out->n_used_output_links, @@ -262,8 +261,7 @@ static int do_negotiate(struct pw_link *this, uint32_t in_state, uint32_t out_st if (changed) { this->info.change_mask |= PW_LINK_CHANGE_MASK_FORMAT; - spa_hook_list_call(&this->listener_list, struct pw_link_events, - info_changed, &this->info); + pw_link_events_info_changed(this, &this->info); spa_list_for_each(resource, &this->resource_list, link) pw_link_resource_info(resource, &this->info); @@ -942,7 +940,7 @@ static void input_remove(struct pw_link *this, struct pw_port *port) spa_hook_remove(&impl->input_node_listener); spa_list_remove(&this->input_link); - spa_hook_list_call(&this->input->listener_list, struct pw_port_events, link_removed, this); + pw_port_events_link_removed(this->input, this); clear_port_buffers(this, port); @@ -961,7 +959,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port) spa_hook_remove(&impl->output_node_listener); spa_list_remove(&this->output_link); - spa_hook_list_call(&this->output->listener_list, struct pw_port_events, link_removed, this); + pw_port_events_link_removed(this->output, this); clear_port_buffers(this, port); @@ -972,7 +970,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port) static void on_port_destroy(struct pw_link *this, struct pw_port *port) { - spa_hook_list_call(&this->listener_list, struct pw_link_events, port_unlinked, port); + pw_link_events_port_unlinked(this, port); pw_link_update_state(this, PW_LINK_STATE_UNLINKED, NULL); pw_link_destroy(this); @@ -1263,8 +1261,8 @@ struct pw_link *pw_link_new(struct pw_core *core, find_driver(this); - spa_hook_list_call(&output->listener_list, struct pw_port_events, link_added, this); - spa_hook_list_call(&input->listener_list, struct pw_port_events, link_added, this); + spa_hook_list_call(&output->listener_list, struct pw_port_events, link_added, 0, this); + spa_hook_list_call(&input->listener_list, struct pw_port_events, link_added, 0, this); return this; @@ -1360,7 +1358,7 @@ void pw_link_destroy(struct pw_link *link) struct pw_resource *resource, *tmp; pw_log_debug("link %p: destroy", impl); - spa_hook_list_call(&link->listener_list, struct pw_link_events, destroy); + pw_link_events_destroy(link); pw_link_deactivate(link); @@ -1379,7 +1377,7 @@ void pw_link_destroy(struct pw_link *link) pw_resource_destroy(resource); pw_log_debug("link %p: free", impl); - spa_hook_list_call(&link->listener_list, struct pw_link_events, free); + pw_link_events_free(link); pw_work_queue_destroy(impl->work); diff --git a/src/pipewire/main-loop.c b/src/pipewire/main-loop.c index b2497d7e0..a36b1ebbb 100644 --- a/src/pipewire/main-loop.c +++ b/src/pipewire/main-loop.c @@ -66,7 +66,7 @@ struct pw_main_loop *pw_main_loop_new(struct pw_properties *properties) void pw_main_loop_destroy(struct pw_main_loop *loop) { pw_log_debug("main-loop %p: destroy", loop); - spa_hook_list_call(&loop->listener_list, struct pw_main_loop_events, destroy); + pw_main_loop_events_destroy(loop); pw_loop_destroy(loop->loop); diff --git a/src/pipewire/module.c b/src/pipewire/module.c index 55cd91535..940002ecf 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -302,7 +302,7 @@ void pw_module_destroy(struct pw_module *module) struct pw_resource *resource, *tmp; pw_log_debug("module %p: destroy", module); - spa_hook_list_call(&module->listener_list, struct pw_module_events, destroy); + pw_module_events_destroy(module); spa_list_remove(&module->link); diff --git a/src/pipewire/node.c b/src/pipewire/node.c index a53918452..bf53e8a41 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -371,7 +371,7 @@ int pw_node_register(struct pw_node *this, int pw_node_initialized(struct pw_node *this) { pw_log_debug("node %p initialized", this); - spa_hook_list_call(&this->listener_list, struct pw_node_events, initialized); + pw_node_events_initialized(this); pw_node_update_state(this, PW_NODE_STATE_SUSPENDED, NULL); return 0; } @@ -415,15 +415,14 @@ int pw_node_set_driver(struct pw_node *node, struct pw_node *driver) spa_list_remove(&n->driver_link); spa_list_append(&driver->driver_list, &n->driver_link); n->driver_node = driver; - spa_hook_list_call(&n->listener_list, struct pw_node_events, - driver_changed, driver); + pw_node_events_driver_changed(n, driver); pw_log_debug("node %p: add %p", driver, n); } pw_loop_invoke(node->data_loop, do_move_nodes, SPA_ID_INVALID, &driver, sizeof(struct pw_node *), true, impl); - spa_hook_list_call(&node->listener_list, struct pw_node_events, driver_changed, driver); + pw_node_events_driver_changed(node, driver); return 0; } @@ -454,7 +453,7 @@ static inline int driver_impl_finish(void *data) struct pw_node *this = &impl->this; pw_log_trace("graph %p finish %p", d->graph, impl); - spa_hook_list_call(&this->listener_list, struct pw_node_events, finish); + pw_node_events_finish(this); return 0; } @@ -585,8 +584,7 @@ int pw_node_update_properties(struct pw_node *node, const struct spa_dict *dict) node->info.props = &node->properties->dict; node->info.change_mask |= PW_NODE_CHANGE_MASK_PROPS; - spa_hook_list_call(&node->listener_list, struct pw_node_events, - info_changed, &node->info); + pw_node_events_info_changed(node, &node->info); spa_list_for_each(resource, &node->resource_list, link) pw_node_resource_info(resource, &node->info); @@ -603,7 +601,7 @@ static void node_done(void *data, int seq, int res) pw_log_debug("node %p: async complete event %d %d %s", node, seq, res, spa_strerror(res)); pw_work_queue_complete(impl->work, node, seq, res); - spa_hook_list_call(&node->listener_list, struct pw_node_events, async_complete, seq, res); + pw_node_events_async_complete(node, seq, res); } static void node_event(void *data, struct spa_event *event) @@ -611,7 +609,7 @@ static void node_event(void *data, struct spa_event *event) struct pw_node *node = data; pw_log_trace("node %p: event %d", node, SPA_EVENT_TYPE(event)); - spa_hook_list_call(&node->listener_list, struct pw_node_events, event, event); + pw_node_events_event(node, event); } static void node_process(void *data, int status) @@ -622,7 +620,7 @@ static void node_process(void *data, int status) pw_log_trace("node %p: process driver:%d exported:%d", node, node->driver, node->exported); - spa_hook_list_call(&node->listener_list, struct pw_node_events, process); + pw_node_events_process(node); if (node->driver) { if (node->rt.driver->state->pending == 0 || !node->remote) { @@ -727,7 +725,7 @@ void pw_node_destroy(struct pw_node *node) struct pw_port *port, *tmpp; pw_log_debug("node %p: destroy", impl); - spa_hook_list_call(&node->listener_list, struct pw_node_events, destroy); + pw_node_events_destroy(node); pause_node(node); @@ -768,7 +766,7 @@ void pw_node_destroy(struct pw_node *node) pw_resource_destroy(resource); pw_log_debug("node %p: free", node); - spa_hook_list_call(&node->listener_list, struct pw_node_events, free); + pw_node_events_free(node); pw_work_queue_destroy(impl->work); @@ -973,7 +971,7 @@ int pw_node_set_state(struct pw_node *node, enum pw_node_state state) if (old == state) return 0; - spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state); + pw_node_events_state_request(node, state); switch (state) { case PW_NODE_STATE_CREATING: @@ -1046,12 +1044,10 @@ void pw_node_update_state(struct pw_node *node, enum pw_node_state state, char * node_deactivate(node); } - spa_hook_list_call(&node->listener_list, struct pw_node_events, state_changed, - old, state, error); + pw_node_events_state_changed(node, old, state, error); node->info.change_mask |= PW_NODE_CHANGE_MASK_STATE; - spa_hook_list_call(&node->listener_list, struct pw_node_events, - info_changed, &node->info); + pw_node_events_info_changed(node, &node->info); spa_list_for_each(resource, &node->resource_list, link) pw_node_resource_info(resource, &node->info); @@ -1066,7 +1062,7 @@ int pw_node_set_active(struct pw_node *node, bool active) if (old != active) { pw_log_debug("node %p: %s", node, active ? "activate" : "deactivate"); node->active = active; - spa_hook_list_call(&node->listener_list, struct pw_node_events, active_changed, active); + pw_node_events_active_changed(node, active); if (active) { if (node->enabled) node_activate(node); @@ -1089,7 +1085,7 @@ int pw_node_set_enabled(struct pw_node *node, bool enabled) if (old != enabled) { pw_log_debug("node %p: %s", node, enabled ? "enable" : "disable"); node->enabled = enabled; - spa_hook_list_call(&node->listener_list, struct pw_node_events, enabled_changed, enabled); + pw_node_events_enabled_changed(node, enabled); if (enabled) { if (node->active) diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 53ac53193..d86513720 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -50,7 +50,7 @@ static void port_update_state(struct pw_port *port, struct pw_port_mix *mix, enu SPA_LOG_LEVEL_ERROR : SPA_LOG_LEVEL_DEBUG, "port %p: state %d -> %d", port, port->state, state); port->state = state; - spa_hook_list_call(&port->listener_list, struct pw_port_events, state_changed, state); + pw_port_events_state_changed(port, state); } } @@ -286,8 +286,7 @@ int pw_port_update_properties(struct pw_port *port, const struct spa_dict *dict) port->info.props = &port->properties->dict; port->info.change_mask |= PW_PORT_CHANGE_MASK_PROPS; - spa_hook_list_call(&port->listener_list, struct pw_port_events, - info_changed, &port->info); + pw_port_events_info_changed(port, &port->info); spa_list_for_each(resource, &port->resource_list, link) pw_port_resource_info(resource, &port->info); @@ -478,7 +477,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node) if (find != NULL) return -EEXIST; - spa_hook_list_call(&node->listener_list, struct pw_node_events, port_init, port); + pw_node_events_port_init(node, port); if ((res = spa_node_port_get_info(node->node, port->direction, port_id, @@ -559,7 +558,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node) if (port->state <= PW_PORT_STATE_INIT) port_update_state(port, NULL, PW_PORT_STATE_CONFIGURE); - spa_hook_list_call(&node->listener_list, struct pw_node_events, port_added, port); + pw_node_events_port_added(node, port); return 0; @@ -624,7 +623,7 @@ static void pw_port_remove(struct pw_port *port) node->info.n_output_ports--; } spa_list_remove(&port->link); - spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); + pw_node_events_port_removed(node, port); } void pw_port_destroy(struct pw_port *port) @@ -634,7 +633,7 @@ void pw_port_destroy(struct pw_port *port) pw_log_debug("port %p: destroy", port); - spa_hook_list_call(&port->listener_list, struct pw_port_events, destroy); + pw_port_events_destroy(port); pw_log_debug("port %p: control destroy", port); spa_list_for_each_safe(control, ctemp, &port->control_list[0], port_link) @@ -652,7 +651,7 @@ void pw_port_destroy(struct pw_port *port) pw_resource_destroy(resource); pw_log_debug("port %p: free", port); - spa_hook_list_call(&port->listener_list, struct pw_port_events, free); + pw_port_events_free(port); free_allocation(&port->allocation); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 73313b9d4..790bdb961 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -51,6 +51,8 @@ struct pw_command { int n_args; }; +#define pw_protocol_events_destroy(p) spa_hook_list_call(&p->listener_list, struct pw_protocol_events, destroy, 0) + struct pw_protocol { struct spa_list link; /**< link in core protocol_list */ struct pw_core *core; /**< core for this protocol */ @@ -74,6 +76,16 @@ struct pw_protocol { typedef uint32_t (*pw_permission_func_t) (struct pw_global *global, struct pw_client *client, void *data); +#define pw_client_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_client_events, m, v, ##__VA_ARGS__) + +#define pw_client_events_destroy(o) pw_client_events_emit(o, destroy, 0) +#define pw_client_events_free(o) pw_client_events_emit(o, free, 0) +#define pw_client_events_info_changed(o,i) pw_client_events_emit(o, info_changed, 0, i) +#define pw_client_events_resource_added(o,r) pw_client_events_emit(o, resource_added, 0, r) +#define pw_client_events_resource_impl(o,r) pw_client_events_emit(o, resource_impl, 0, r) +#define pw_client_events_resource_removed(o,r) pw_client_events_emit(o, resource_removed, 0, r) +#define pw_client_events_busy_changed(o,b) pw_client_events_emit(o, busy_changed, 0, b) + struct pw_client { struct pw_core *core; /**< core object */ struct spa_list link; /**< link in core object client list */ @@ -108,6 +120,13 @@ struct pw_client { void *user_data; /**< extra user data */ }; +#define pw_global_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_global_events, m, v, ##__VA_ARGS__) + +#define pw_global_events_registering(g) pw_global_events_emit(g, registering, 0) +#define pw_global_events_destroy(g) pw_global_events_emit(g, destroy, 0) +#define pw_global_events_free(g) pw_global_events_emit(g, free, 0) +#define pw_global_events_bind(g,...) pw_global_events_emit(g, bind, 0, __VA_ARGS__) + struct pw_global { struct pw_core *core; /**< the core */ struct pw_client *owner; /**< the owner of this object, NULL when the @@ -127,6 +146,13 @@ struct pw_global { void *object; /**< object associated with the interface */ }; +#define pw_core_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_core_events, m, v, ##__VA_ARGS__) +#define pw_core_events_destroy(c) pw_core_events_emit(c, destroy, 0) +#define pw_core_events_free(c) pw_core_events_emit(c, free, 0) +#define pw_core_events_info_changed(c,i) pw_core_events_emit(c, info_changed, 0, i) +#define pw_core_events_global_added(c,g) pw_core_events_emit(c, global_added, 0, g) +#define pw_core_events_global_removed(c,g) pw_core_events_emit(c, global_removed, 0, g) + struct pw_core { struct pw_global *global; /**< the global of the core */ struct spa_hook global_listener; @@ -165,6 +191,9 @@ struct pw_core { long sc_pagesize; }; +#define pw_data_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_data_loop_events, m, v, ##__VA_ARGS__) +#define pw_data_loop_events_destroy(o) pw_data_loop_events_emit(o, destroy, 0) + struct pw_data_loop { struct pw_loop *loop; @@ -176,6 +205,9 @@ struct pw_data_loop { pthread_t thread; }; +#define pw_main_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_main_loop_events, m, v, ##__VA_ARGS__) +#define pw_main_loop_events_destroy(o) pw_main_loop_events_emit(o, destroy, 0) + struct pw_main_loop { struct pw_loop *loop; @@ -208,6 +240,9 @@ static inline void free_allocation(struct allocation *alloc) alloc->n_buffers = 0; } +#define pw_module_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_module_events, m, v, ##__VA_ARGS__) +#define pw_module_events_destroy(m) pw_module_events_emit(m, destroy, 0) + struct pw_module { struct pw_core *core; /**< the core object */ struct spa_list link; /**< link in the core module_list */ @@ -246,6 +281,25 @@ struct pw_node_activation { struct spa_graph_state state; }; +#define pw_node_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_node_events, m, v, ##__VA_ARGS__) +#define pw_node_events_destroy(n) pw_node_events_emit(n, destroy, 0) +#define pw_node_events_free(n) pw_node_events_emit(n, free, 0) +#define pw_node_events_initialized(n) pw_node_events_emit(n, initialized, 0) +#define pw_node_events_port_init(n,p) pw_node_events_emit(n, port_init, 0, p) +#define pw_node_events_port_added(n,p) pw_node_events_emit(n, port_added, 0, p) +#define pw_node_events_port_removed(n,p) pw_node_events_emit(n, port_removed, 0, p) +#define pw_node_events_info_changed(n,i) pw_node_events_emit(n, info_changed, 0, i) +#define pw_node_events_active_changed(n,a) pw_node_events_emit(n, active_changed, 0, a) +#define pw_node_events_enabled_changed(n,e) pw_node_events_emit(n, enabled_changed, 0, e) +#define pw_node_events_state_request(n,s) pw_node_events_emit(n, state_request, 0, s) +#define pw_node_events_state_changed(n,o,s,e) pw_node_events_emit(n, state_changed, 0, o, s, e) +#define pw_node_events_async_complete(n,s,r) pw_node_events_emit(n, async_complete, 0, s, r) +#define pw_node_events_event(n,e) pw_node_events_emit(n, event, 0, e) +#define pw_node_events_driver_changed(n,d) pw_node_events_emit(n, driver_changed, 0, d) +#define pw_node_events_process(n) pw_node_events_emit(n, process, 0) +#define pw_node_events_reuse_buffer(n,p,b) pw_node_events_emit(n, reuse_buffer, 0, p, b) +#define pw_node_events_finish(n) pw_node_events_emit(n, finish, 0) + struct pw_node { struct pw_core *core; /**< core object */ struct spa_list link; /**< link in core node_list */ @@ -324,6 +378,16 @@ struct pw_port_implementation { struct spa_buffer **buffers, uint32_t *n_buffers); }; +#define pw_port_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_port_events, m, v, ##__VA_ARGS__) +#define pw_port_events_destroy(p) pw_port_events_emit(p, destroy, 0) +#define pw_port_events_free(p) pw_port_events_emit(p, free, 0) +#define pw_port_events_info_changed(p,i) pw_port_events_emit(p, info_changed, 0, i) +#define pw_port_events_link_added(p,l) pw_port_events_emit(p, link_added, 0, l) +#define pw_port_events_link_removed(p,l) pw_port_events_emit(p, link_removed, 0, l) +#define pw_port_events_state_changed(p,s) pw_port_events_emit(p, state_changed, 0, s) +#define pw_port_events_control_added(p,c) pw_port_events_emit(p, control_added, 0, c) +#define pw_port_events_control_removed(p,c) pw_port_events_emit(p, control_removed, 0, c) + struct pw_port { struct spa_list link; /**< link in node port_list */ @@ -377,6 +441,13 @@ struct pw_port { void *user_data; /**< extra user data */ }; +#define pw_link_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_link_events, m, v, ##__VA_ARGS__) +#define pw_link_events_destroy(l) pw_link_events_emit(l, destroy, 0) +#define pw_link_events_free(l) pw_link_events_emit(l, free, 0) +#define pw_link_events_info_changed(l,i) pw_link_events_emit(l, info_changed, 0, i) +#define pw_link_events_state_changed(l,...) pw_link_events_emit(l, state_changed, 0, __VA_ARGS__) +#define pw_link_events_port_unlinked(l,p) pw_link_events_emit(l, port_unlinked, 0, p) + struct pw_link { struct pw_core *core; /**< core object */ struct spa_list link; /**< link in core link_list */ @@ -410,6 +481,10 @@ struct pw_link { void *user_data; }; +#define pw_resource_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_resource_events, m, v, ##__VA_ARGS__) + +#define pw_resource_events_destroy(o) pw_resource_events_emit(o, destroy, 0) + struct pw_resource { struct pw_core *core; /**< the core object */ struct spa_list link; /**< link in object resource_list */ @@ -431,6 +506,8 @@ struct pw_resource { void *user_data; /**< extra user data */ }; +#define pw_proxy_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_proxy_events, m, v, ##__VA_ARGS__) +#define pw_proxy_events_destroy(p) pw_proxy_events_emit(p, destroy, 0) struct pw_proxy { struct pw_remote *remote; /**< the owner remote of this proxy */ @@ -447,6 +524,12 @@ struct pw_proxy { void *user_data; /**< extra user data */ }; +#define pw_remote_events_emit(r,m,v,...) spa_hook_list_call(&r->listener_list, struct pw_remote_events, m, v, ##__VA_ARGS__) +#define pw_remote_events_destroy(r) pw_remote_events_emit(r, destroy, 0) +#define pw_remote_events_info_changed(r,i) pw_remote_events_emit(r, info_changed, 0, i) +#define pw_remote_events_sync_reply(r,s) pw_remote_events_emit(r, sync_reply, 0, s) +#define pw_remote_events_state_changed(r,o,s,e) pw_remote_events_emit(r, state_changed, 0, o, s, e) + struct pw_remote { struct pw_core *core; /**< core */ struct spa_list link; /**< link in core remote_list */ @@ -474,6 +557,15 @@ struct pw_remote { void *user_data; /**< extra user data */ }; +#define pw_stream_events_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct pw_stream_events, m, v, ##__VA_ARGS__) +#define pw_stream_events_destroy(s) pw_stream_events_emit(s, destroy, 0) +#define pw_stream_events_state_changed(s,o,n,e) pw_stream_events_emit(s, state_changed,0,o,n,e) +#define pw_stream_events_format_changed(s,f) pw_stream_events_emit(s, format_changed,0,f) +#define pw_stream_events_add_buffer(s,b) pw_stream_events_emit(s, add_buffer, 0, b) +#define pw_stream_events_remove_buffer(s,b) pw_stream_events_emit(s, remove_buffer, 0, b) +#define pw_stream_events_process(s) pw_stream_events_emit(s, process, 0) +#define pw_stream_events_drained(s) pw_stream_events_emit(s, drained, 1) + struct pw_stream { struct pw_remote *remote; /**< the owner remote */ @@ -491,6 +583,10 @@ struct pw_stream { struct pw_proxy *proxy; }; +#define pw_factory_events_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct pw_factory_events, m, v, ##__VA_ARGS__) + +#define pw_factory_events_destroy(s) pw_factory_events_emit(s, destroy, 0) + struct pw_factory { struct pw_core *core; /**< the core */ struct spa_list link; /**< link in core node_factory_list */ @@ -511,6 +607,12 @@ struct pw_factory { void *user_data; }; +#define pw_control_events_emit(c,m,v,...) spa_hook_list_call(&c->listener_list, struct pw_control_events, m, v, ##__VA_ARGS__) +#define pw_control_events_destroy(c) pw_control_events_emit(c, destroy, 0) +#define pw_control_events_free(c) pw_control_events_emit(c, free, 0) +#define pw_control_events_linked(c,o) pw_control_events_emit(c, linked, 0, o) +#define pw_control_events_unlinked(c,o) pw_control_events_emit(c, unlinked, 0, o) + struct pw_control { struct spa_list link; /**< link in core control_list */ struct pw_core *core; /**< the core */ diff --git a/src/pipewire/protocol.c b/src/pipewire/protocol.c index 12ac5743a..39f594099 100644 --- a/src/pipewire/protocol.c +++ b/src/pipewire/protocol.c @@ -87,7 +87,7 @@ void pw_protocol_destroy(struct pw_protocol *protocol) struct pw_protocol_client *client, *t3; pw_log_debug("protocol %p: destroy", protocol); - spa_hook_list_call(&protocol->listener_list, struct pw_protocol_events, destroy); + pw_protocol_events_destroy(protocol); spa_list_remove(&protocol->link); diff --git a/src/pipewire/proxy.c b/src/pipewire/proxy.c index 7a3987b1d..dcd9aa9f4 100644 --- a/src/pipewire/proxy.c +++ b/src/pipewire/proxy.c @@ -120,7 +120,7 @@ void pw_proxy_destroy(struct pw_proxy *proxy) struct proxy *impl = SPA_CONTAINER_OF(proxy, struct proxy, this); pw_log_debug("proxy %p: destroy %u", proxy, proxy->id); - spa_hook_list_call(&proxy->listener_list, struct pw_proxy_events, destroy); + pw_proxy_events_destroy(proxy); pw_map_insert_at(&proxy->remote->objects, proxy->id, NULL); spa_list_remove(&proxy->link); diff --git a/src/pipewire/proxy.h b/src/pipewire/proxy.h index 5bb9b7181..572851654 100644 --- a/src/pipewire/proxy.h +++ b/src/pipewire/proxy.h @@ -145,7 +145,7 @@ struct spa_hook_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy); /** Get the marshal functions for the proxy */ const struct pw_protocol_marshal *pw_proxy_get_marshal(struct pw_proxy *proxy); -#define pw_proxy_notify(p,type,event,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,## __VA_ARGS__) +#define pw_proxy_notify(p,type,event,ver,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,ver,## __VA_ARGS__) #define pw_proxy_do(p,type,method,...) ((type*) pw_proxy_get_marshal(p)->method_marshal)->method(p, ## __VA_ARGS__) #ifdef __cplusplus diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index 87acb9df6..6267d90bc 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -168,8 +168,7 @@ pw_remote_update_state(struct pw_remote *remote, enum pw_remote_state state, con } remote->state = state; - spa_hook_list_call(&remote->listener_list, struct pw_remote_events, state_changed, - old, state, remote->error); + pw_remote_events_state_changed(remote, old, state, remote->error); } return 0; } @@ -180,8 +179,7 @@ static void core_event_info(void *data, struct pw_core_info *info) pw_log_debug("remote %p: got core info", this); this->info = pw_core_info_update(this->info, info); - spa_hook_list_call(&this->listener_list, struct pw_remote_events, - info_changed, this->info); + pw_remote_events_info_changed(this, this->info); } static void core_event_done(void *data, uint32_t seq) @@ -192,7 +190,7 @@ static void core_event_done(void *data, uint32_t seq) if (seq == 0) pw_remote_update_state(this, PW_REMOTE_STATE_CONNECTED, NULL); - spa_hook_list_call(&this->listener_list, struct pw_remote_events, sync_reply, seq); + pw_remote_events_sync_reply(this, seq); } static void core_event_error(void *data, uint32_t id, int res, const char *error, ...) @@ -321,7 +319,7 @@ void pw_remote_destroy(struct pw_remote *remote) struct pw_stream *stream, *s2; pw_log_debug("remote %p: destroy", remote); - spa_hook_list_call(&remote->listener_list, struct pw_remote_events, destroy); + pw_remote_events_destroy(remote); if (remote->state != PW_REMOTE_STATE_UNCONNECTED) pw_remote_disconnect(remote); diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index ed4c6af7d..2299b6e5e 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -68,7 +68,7 @@ struct pw_resource *pw_resource_new(struct pw_client *client, this->marshal = pw_protocol_get_marshal(client->protocol, type); pw_log_debug("resource %p: new for client %p id %u", this, client, id); - spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_added, this); + pw_client_events_resource_added(client, this); return this; @@ -125,7 +125,7 @@ void pw_resource_set_implementation(struct pw_resource *resource, resource->implementation.funcs = implementation; resource->implementation.data = data; - spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_impl, resource); + pw_client_events_resource_impl(client, resource); } void pw_resource_add_override(struct pw_resource *resource, @@ -157,10 +157,10 @@ void pw_resource_destroy(struct pw_resource *resource) struct pw_client *client = resource->client; pw_log_debug("resource %p: destroy %u", resource, resource->id); - spa_hook_list_call(&resource->listener_list, struct pw_resource_events, destroy); + pw_resource_events_destroy(resource); pw_map_insert_at(&client->objects, resource->id, NULL); - spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_removed, resource); + pw_client_events_resource_removed(client, resource); if (client->core_resource) pw_core_resource_remove_id(client->core_resource, resource->id); diff --git a/src/pipewire/resource.h b/src/pipewire/resource.h index bd1dd2b02..8d2ed2a2d 100644 --- a/src/pipewire/resource.h +++ b/src/pipewire/resource.h @@ -123,11 +123,11 @@ struct spa_hook_list *pw_resource_get_implementation(struct pw_resource *resourc /** Get the marshal functions for the resource */ const struct pw_protocol_marshal *pw_resource_get_marshal(struct pw_resource *resource); -#define pw_resource_do(r,type,method,...) \ - spa_hook_list_call_once(pw_resource_get_implementation(r),type,method,## __VA_ARGS__) +#define pw_resource_do(r,type,method,v,...) \ + spa_hook_list_call_once(pw_resource_get_implementation(r),type,method,v,## __VA_ARGS__) #define pw_resource_do_parent(r,l,type,method,...) \ - spa_hook_list_call_once_start(pw_resource_get_implementation(r),l,type,method,## __VA_ARGS__) + spa_hook_list_call_once_start(pw_resource_get_implementation(r),l,type,method,v,## __VA_ARGS__) #define pw_resource_notify(r,type,event,...) \ ((type*) pw_resource_get_marshal(r)->event_marshal)->event(r, ## __VA_ARGS__) diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 88ace06b8..ca7b7aced 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -231,8 +231,7 @@ static bool stream_set_state(struct pw_stream *stream, enum pw_stream_state stat pw_stream_state_as_string(state), stream->error); stream->state = state; - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, state_changed, - old, state, error); + pw_stream_events_state_changed(stream, old, state, error); } return res; } @@ -252,7 +251,7 @@ do_call_process(struct spa_loop *loop, struct stream *impl = user_data; struct pw_stream *stream = &impl->this; pw_log_trace("do process"); - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, process); + pw_stream_events_process(stream); return 0; } @@ -461,10 +460,7 @@ static int port_set_format(struct spa_node *node, else p = NULL; - count = spa_hook_list_call(&stream->listener_list, - struct pw_stream_events, - format_changed, - p ? p->param : NULL); + count = pw_stream_events_format_changed(stream, p ? p->param : NULL); if (count == 0) pw_stream_finish_format(stream, 0, NULL, 0); @@ -539,8 +535,7 @@ static void clear_buffers(struct pw_stream *stream) for (i = 0; i < impl->n_buffers; i++) { struct buffer *b = &impl->buffers[i]; - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, - remove_buffer, &b->this); + pw_stream_events_remove_buffer(stream, &b->this); if (SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_MAPPED)) { for (j = 0; j < b->this.buffer->n_datas; j++) { @@ -615,8 +610,7 @@ static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direc push_queue(impl, &impl->dequeued, b); } - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, - add_buffer, &b->this); + pw_stream_events_add_buffer(stream, &b->this); } impl->n_buffers = n_buffers; @@ -932,7 +926,7 @@ void pw_stream_destroy(struct pw_stream *stream) pw_log_debug("stream %p: destroy", stream); - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, destroy); + pw_stream_events_destroy(stream); pw_stream_disconnect(stream); diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index 613c8b1df..40f4ac45e 100644 --- a/src/pipewire/thread-loop.c +++ b/src/pipewire/thread-loop.c @@ -23,6 +23,9 @@ #include "pipewire.h" #include "thread-loop.h" +#define pw_thread_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_thread_loop_events, m, v, ##__VA_ARGS__) +#define pw_thread_loop_events_destroy(o) pw_thread_loop_events_emit(o, destroy, 0) + /** \cond */ struct pw_thread_loop { struct pw_loop *loop; @@ -120,7 +123,7 @@ struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop, /** Destroy a threaded loop \memberof pw_thread_loop */ void pw_thread_loop_destroy(struct pw_thread_loop *loop) { - spa_hook_list_call(&loop->listener_list, struct pw_thread_loop_events, destroy); + pw_thread_loop_events_destroy(loop); pw_thread_loop_stop(loop);