diff --git a/spa/include/spa/support/loop.h b/spa/include/spa/support/loop.h index 73fda8002..d6fa85b26 100644 --- a/spa/include/spa/support/loop.h +++ b/spa/include/spa/support/loop.h @@ -111,6 +111,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 9fa44be13..bde20dc27 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; \ @@ -90,7 +94,7 @@ static inline void spa_hook_remove(struct spa_hook *hook) spa_list_cursor_start(cursor, s, link); \ spa_list_for_each_cursor(ci, cursor, &list->list, link) { \ const type *cb = ci->funcs; \ - if (cb && cb->method) { \ + if (cb && cb->version >= vers && cb->method) { \ cb->method(ci->data, ## __VA_ARGS__); \ count++; \ if (once) \ @@ -101,11 +105,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 a476868c2..8abf4bc28 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; } @@ -335,12 +335,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 a645e8009..30852a8c8 100644 --- a/src/modules/module-client-node/protocol-native.c +++ b/src/modules/module-client-node/protocol-native.c @@ -177,7 +177,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); @@ -213,7 +213,7 @@ static int client_node_demarshal_transport(void *object, void *data, size_t size transport = pw_client_node_transport_new_from_info(&info); - 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, transport); return 0; } @@ -234,7 +234,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; } @@ -248,7 +248,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; } @@ -266,7 +266,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; } @@ -284,7 +284,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; } @@ -302,7 +302,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; } @@ -324,7 +324,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; } @@ -385,7 +385,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, n_buffers, buffers); @@ -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; @@ -431,7 +431,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, id, memid, @@ -695,7 +695,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; } @@ -721,7 +721,7 @@ static int client_node_demarshal_update(void *object, void *data, size_t size) if (spa_pod_parser_get(&prs, "O", ¶ms[i], NULL) < 0) 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, @@ -782,7 +782,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, @@ -802,7 +802,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; } @@ -818,7 +818,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; } @@ -831,7 +831,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 b46de7428..7a6e63324 100644 --- a/src/modules/module-protocol-native/connection.c +++ b/src/modules/module-protocol-native/connection.c @@ -120,7 +120,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", @@ -244,7 +244,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); @@ -437,7 +437,8 @@ pw_protocol_native_connection_end(struct pw_protocol_native_connection *conn, printf(">>>>>>>>> out: %d %d %d\n", impl->dest_id, impl->opcode, size); spa_debug_pod(0, impl->core->type.map, (struct spa_pod *)p); } - spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, need_flush); + spa_hook_list_call(&conn->listener_list, + 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 0a6572881..bcd2915a8 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 df92e3a05..e25eb648e 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -286,6 +286,7 @@ static int destroy_resource(void *object, void *data) return 0; } + /** Destroy a client object * * \param client the client to destroy @@ -298,7 +299,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); @@ -315,7 +316,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); @@ -370,8 +371,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); @@ -505,6 +505,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 f1c096cc6..747fa1ac9 100644 --- a/src/pipewire/control.c +++ b/src/pipewire/control.c @@ -71,7 +71,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; @@ -89,7 +89,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) @@ -104,12 +104,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) @@ -192,8 +191,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; @@ -238,8 +237,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 290e91819..a844eb41e 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -474,7 +474,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); @@ -490,7 +490,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); @@ -561,8 +561,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 e349f67bf..32512bca4 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -117,7 +117,7 @@ pw_global_register(struct pw_global *global, spa_list_append(&core->global_list, &global->link); 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); spa_list_for_each(registry, &core->registry_resource_list, link) { uint32_t permissions = pw_global_get_permissions(global, registry->client); @@ -205,8 +205,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; @@ -231,7 +230,7 @@ void pw_global_destroy(struct pw_global *global) struct pw_resource *registry; 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); if (global->id != SPA_ID_INVALID) { spa_list_for_each(registry, &core->registry_resource_list, link) { @@ -244,11 +243,11 @@ void pw_global_destroy(struct pw_global *global) pw_map_remove(&core->globals, global->id); 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); } 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 24bc18623..1b6a0fa28 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -72,7 +72,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); } } @@ -221,8 +221,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); @@ -877,7 +876,7 @@ static void input_remove(struct pw_link *this, struct pw_port *port) pw_map_remove(&port->mix_port_map, this->rt.in_port.port_id); 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); this->input = NULL; @@ -906,7 +905,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port) pw_map_remove(&port->mix_port_map, this->rt.out_port.port_id); 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); this->output = NULL; @@ -914,7 +913,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); @@ -1192,8 +1191,8 @@ struct pw_link *pw_link_new(struct pw_core *core, pw_loop_invoke(input_node->data_loop, do_add_link, SPA_ID_INVALID, &input, sizeof(struct pw_port *), false, 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; @@ -1280,7 +1279,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); @@ -1300,7 +1299,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 36d8ce89a..25ee90ba3 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -298,7 +298,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 425c94d67..3523d9cfa 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -374,7 +374,7 @@ int pw_node_register(struct pw_node *this, pw_port_register(port, owner, this->global, pw_properties_copy(port->properties)); - 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); @@ -487,8 +487,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); @@ -505,7 +504,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) @@ -516,14 +515,14 @@ static void node_event(void *data, struct spa_event *event) if (SPA_EVENT_TYPE(event) == node->core->type.event_node.RequestClockUpdate) { send_clock_update(node); } - spa_hook_list_call(&node->listener_list, struct pw_node_events, event, event); + pw_node_events_event(node, event); } static void node_need_input(void *data) { struct pw_node *node = data; pw_log_trace("node %p: need input", node); - spa_hook_list_call(&node->listener_list, struct pw_node_events, need_input); + pw_node_events_need_input(node); spa_graph_need_input(node->rt.graph, &node->rt.node); } @@ -532,7 +531,7 @@ static void node_have_output(void *data) struct pw_node *node = data; pw_log_trace("node %p: have output", node); spa_graph_have_output(node->rt.graph, &node->rt.node); - spa_hook_list_call(&node->listener_list, struct pw_node_events, have_output); + pw_node_events_have_output(node); } static void node_reuse_buffer(void *data, uint32_t port_id, uint32_t buffer_id) @@ -613,7 +612,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); if (node->registered) { pw_loop_invoke(node->data_loop, do_node_remove, 1, NULL, 0, true, node); @@ -628,11 +627,11 @@ void pw_node_destroy(struct pw_node *node) pw_log_debug("node %p: destroy ports", node); spa_list_for_each_safe(port, tmpp, &node->input_ports, link) { - spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); + pw_node_events_port_removed(node, port); pw_port_destroy(port); } spa_list_for_each_safe(port, tmpp, &node->output_ports, link) { - spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); + pw_node_events_port_removed(node, port); pw_port_destroy(port); } @@ -644,7 +643,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); @@ -860,7 +859,7 @@ int pw_node_set_state(struct pw_node *node, enum pw_node_state state) int res = 0; struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this); - spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state); + pw_node_events_state_request(node, state); pw_log_debug("node %p: set state %s", node, pw_node_state_as_string(state)); @@ -930,12 +929,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); @@ -951,7 +948,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); @@ -974,7 +971,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 79badaa03..f6ea9b813 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -45,7 +45,7 @@ static void port_update_state(struct pw_port *port, enum pw_port_state state) if (port->state != state) { pw_log_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); } } @@ -255,8 +255,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); @@ -470,7 +469,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node) if (port->state <= PW_PORT_STATE_INIT) port_update_state(port, 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; } @@ -526,7 +525,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) @@ -537,7 +536,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); if (node) pw_port_remove(port); @@ -555,7 +554,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 f0e8ad22c..2b2682abb 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; @@ -169,6 +195,9 @@ struct pw_core { } rt; }; +#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; @@ -180,6 +209,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; @@ -212,6 +244,13 @@ static inline void free_allocation(struct allocation *alloc) alloc->n_buffers = 0; } +#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 */ @@ -244,6 +283,9 @@ struct pw_link { void *user_data; }; +#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 */ @@ -259,6 +301,26 @@ struct pw_module { void *user_data; /**< module user_data */ }; +#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_need_input(n) pw_node_events_emit(n, need_input, 0) +#define pw_node_events_have_output(n) pw_node_events_emit(n, have_output, 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 */ @@ -300,6 +362,16 @@ struct pw_node { void *user_data; /**< extra user data */ }; +#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 */ @@ -345,6 +417,10 @@ struct pw_port { }; +#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 */ @@ -366,6 +442,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 */ @@ -381,6 +459,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 */ @@ -408,6 +492,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 */ @@ -424,6 +517,10 @@ struct pw_stream { struct spa_hook_list listener_list; }; +#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 */ @@ -444,6 +541,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 4a87b07be..641522429 100644 --- a/src/pipewire/proxy.c +++ b/src/pipewire/proxy.c @@ -119,7 +119,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 2ae8052de..cc2a29ba0 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -144,8 +144,7 @@ pw_remote_update_state(struct pw_remote *remote, enum pw_remote_state state, con pw_remote_state_as_string(state), remote->error); 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; } @@ -156,8 +155,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) @@ -168,7 +166,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, ...) @@ -296,7 +294,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 b9ebbc9a8..a7effad65 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -236,8 +236,7 @@ static void clear_buffers(struct pw_stream *stream) for (i = 0; i < impl->n_buffers; i++) { b = &impl->buffers[i]; - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, - remove_buffer, &b->buffer); + pw_stream_events_remove_buffer(stream, &b->buffer); if (SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_MAPPED)) { for (j = 0; j < b->buffer.buffer->n_datas; j++) { @@ -316,8 +315,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; } @@ -337,7 +335,7 @@ do_call_process(struct spa_loop *loop, struct stream *impl = user_data; struct pw_stream *stream = &impl->this; impl->in_process = true; - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, process); + pw_stream_events_process(stream); impl->in_process = false; return 0; } @@ -536,7 +534,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); if (impl->node_proxy) spa_hook_remove(&impl->proxy_listener); @@ -978,9 +976,7 @@ client_node_port_set_param(void *data, impl->pending_seq = seq; - count = spa_hook_list_call(&stream->listener_list, - struct pw_stream_events, - format_changed, impl->format); + count = pw_stream_events_format_changed(stream, impl->format); if (count == 0) pw_stream_finish_format(stream, 0, NULL, 0); @@ -1136,8 +1132,7 @@ client_node_port_use_buffers(void *data, if (impl->direction == SPA_DIRECTION_OUTPUT) push_queue(impl, &impl->dequeue, bid); - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, - add_buffer, &bid->buffer); + pw_stream_events_add_buffer(stream, &bid->buffer); } add_async_complete(stream, seq, 0); diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index 38511e2ae..364fe4554 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);