From 600055bd684a3d7315a69e523df4af2d4ee67bfc Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 8 Aug 2017 16:56:29 +0200 Subject: [PATCH] Move listeners to spa and rename to hooks The listeners are generally useful in spa, move it there and rename to hooks. Implement loop hooks with it. Fix some cleanup issues in stream and remote --- spa/include/spa/hook.h | 93 +++++++++++++++++++ spa/include/spa/list.h | 6 ++ spa/include/spa/loop.h | 23 +++-- spa/plugins/support/loop.c | 44 +++++---- src/examples/export-sink.c | 2 +- src/examples/export-v4l2.c | 2 +- src/examples/video-play.c | 4 +- src/examples/video-src.c | 4 +- src/extensions/client-node.h | 2 +- src/gst/gstpipewiredeviceprovider.c | 6 +- src/gst/gstpipewiredeviceprovider.h | 2 +- src/gst/gstpipewiresink.h | 4 +- src/gst/gstpipewiresrc.h | 4 +- src/modules/module-autolink.c | 14 +-- src/modules/module-client-node/client-node.c | 6 +- src/modules/module-flatpak.c | 8 +- src/modules/module-jack.c | 2 +- src/modules/module-protocol-native.c | 40 ++++---- .../module-protocol-native/connection.c | 6 +- .../module-protocol-native/connection.h | 8 +- src/modules/module-suspend-on-idle.c | 6 +- src/modules/spa/spa-node.c | 10 +- src/pipewire/client.c | 16 ++-- src/pipewire/client.h | 3 +- src/pipewire/core.c | 17 ++-- src/pipewire/core.h | 5 +- src/pipewire/data-loop.c | 8 +- src/pipewire/data-loop.h | 3 +- src/pipewire/interfaces.h | 12 +-- src/pipewire/link.c | 30 +++--- src/pipewire/link.h | 2 +- src/pipewire/listener.h | 84 ----------------- src/pipewire/loop.h | 38 ++++---- src/pipewire/main-loop.c | 8 +- src/pipewire/main-loop.h | 4 +- src/pipewire/meson.build | 1 - src/pipewire/module.c | 10 +- src/pipewire/module.h | 2 +- src/pipewire/node.c | 26 +++--- src/pipewire/node.h | 2 +- src/pipewire/pipewire.h | 1 - src/pipewire/port.c | 14 +-- src/pipewire/port.h | 2 +- src/pipewire/private.h | 31 ++++--- src/pipewire/proxy.c | 16 ++-- src/pipewire/proxy.h | 8 +- src/pipewire/remote.c | 39 +++++--- src/pipewire/remote.h | 2 +- src/pipewire/resource.c | 28 +++--- src/pipewire/resource.h | 15 +-- src/pipewire/stream.c | 49 ++++++---- src/pipewire/stream.h | 2 +- src/pipewire/thread-loop.c | 27 +++--- src/pipewire/thread-loop.h | 2 +- src/tools/pipewire-monitor.c | 8 +- 55 files changed, 428 insertions(+), 383 deletions(-) create mode 100644 spa/include/spa/hook.h delete mode 100644 src/pipewire/listener.h diff --git a/spa/include/spa/hook.h b/spa/include/spa/hook.h new file mode 100644 index 000000000..177216525 --- /dev/null +++ b/spa/include/spa/hook.h @@ -0,0 +1,93 @@ +/* SPA + * Copyright (C) 2017 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __SPA_HOOK_H__ +#define __SPA_HOOK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct spa_hook_list { + struct spa_list list; +}; + +struct spa_hook { + struct spa_list link; + const void *funcs; + void *data; +}; + +static inline void spa_hook_list_init(struct spa_hook_list *list) +{ + spa_list_init(&list->list); +} + +/** Add a hook \memberof spa_hook */ +static inline void spa_hook_list_append(struct spa_hook_list *list, + struct spa_hook *hook, + const void *funcs, void *data) +{ + hook->funcs = funcs; + hook->data = data; + spa_list_append(&list->list, &hook->link); +} + +static inline void spa_hook_list_prepend(struct spa_hook_list *list, + struct spa_hook *hook, + const void *funcs, void *data) +{ + hook->funcs = funcs; + hook->data = data; + spa_list_prepend(&list->list, &hook->link); +} + +/** Remove a listener \memberof spa_hook */ +static inline void spa_hook_remove(struct spa_hook *hook) +{ + spa_list_remove(&hook->link); +} + +#define spa_hook_list_do_call(l,start,type,method,once,...) ({ \ + struct spa_hook_list *list = l; \ + struct spa_list *s = start ? (struct spa_list *)start : &list->list; \ + struct spa_hook *ci, *t; \ + spa_list_for_each_safe_next(ci, t, &list->list, s, link) { \ + const type *cb = ci->funcs; \ + if (cb->method) { \ + cb->method(ci->data, ## __VA_ARGS__); \ + if (once) \ + break; \ + } \ + } \ +}); + +#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_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__) + +#ifdef __cplusplus +} +#endif + +#endif /* __SPA_HOOK_H__ */ diff --git a/spa/include/spa/list.h b/spa/include/spa/list.h index e97fb30fa..7592e1580 100644 --- a/spa/include/spa/list.h +++ b/spa/include/spa/list.h @@ -67,6 +67,12 @@ static inline void spa_list_remove(struct spa_list *elem) #define spa_list_last(item, type, member) \ SPA_CONTAINER_OF((head)->prev, type, member) +#define spa_list_append(list, item) \ + spa_list_insert((list)->prev, item); + +#define spa_list_prepend(list, item) \ + spa_list_insert(list, item); + #define spa_list_for_each_next(pos, head, curr, member) \ for (pos = SPA_CONTAINER_OF((curr)->next, __typeof__(*pos), member); \ &pos->member != (head); \ diff --git a/spa/include/spa/loop.h b/spa/include/spa/loop.h index 82c19c043..235330a39 100644 --- a/spa/include/spa/loop.h +++ b/spa/include/spa/loop.h @@ -38,6 +38,7 @@ struct spa_loop_utils; #include #include +#include enum spa_io { SPA_IO_IN = (1 << 0), @@ -77,11 +78,14 @@ struct spa_loop { #define SPA_VERSION_LOOP 0 uint32_t version; + /** add a source to the loop */ int (*add_source) (struct spa_loop *loop, struct spa_source *source); + /** update the source io mask */ int (*update_source) (struct spa_source *source); + /** remove a source from the loop */ void (*remove_source) (struct spa_source *source); /** invoke a function in the context of this loop */ @@ -104,16 +108,12 @@ struct spa_loop { struct spa_loop_control_hooks { #define SPA_VERSION_LOOP_CONTROL_HOOKS 0 uint32_t version; - - struct spa_list link; - /** Executed right before waiting for events */ - void (*before) (const struct spa_loop_control_hooks *hooks); + void (*before) (void *data); /** Executed right after waiting for events */ - void (*after) (const struct spa_loop_control_hooks *hooks); + void (*after) (void *data); }; - /** * spa_loop_control: * @@ -130,8 +130,10 @@ struct spa_loop_control { /** Add a hook * \param ctrl the control to change * \param hooks the hooks to add */ - void (*add_hooks) (struct spa_loop_control *ctrl, - struct spa_loop_control_hooks *hooks); + void (*add_hook) (struct spa_loop_control *ctrl, + struct spa_hook *hook, + const struct spa_loop_control_hooks *hooks, + void *data); void (*enter) (struct spa_loop_control *ctrl); void (*leave) (struct spa_loop_control *ctrl); @@ -140,7 +142,7 @@ struct spa_loop_control { }; #define spa_loop_control_get_fd(l) (l)->get_fd(l) -#define spa_loop_control_add_hooks(l,...) (l)->add_hooks((l),__VA_ARGS__) +#define spa_loop_control_add_hook(l,...) (l)->add_hook((l),__VA_ARGS__) #define spa_loop_control_enter(l) (l)->enter(l) #define spa_loop_control_iterate(l,...) (l)->iterate((l),__VA_ARGS__) #define spa_loop_control_leave(l) (l)->leave(l) @@ -198,6 +200,9 @@ struct spa_loop_utils { int signal_number, spa_source_signal_func_t func, void *data); + /** destroy a source allocated with this interface. This function + * should only be called when the loop is not running or from the + * context of the running loop */ void (*destroy_source) (struct spa_source *source); }; diff --git a/spa/plugins/support/loop.c b/spa/plugins/support/loop.c index 387e5e3a6..11487dd76 100644 --- a/spa/plugins/support/loop.c +++ b/spa/plugins/support/loop.c @@ -79,7 +79,7 @@ struct impl { struct spa_list source_list; struct spa_list destroy_list; - struct spa_list hooks_list; + struct spa_hook_list hooks_list; int epoll_fd; pthread_t thread; @@ -293,11 +293,13 @@ static int loop_get_fd(struct spa_loop_control *ctrl) static void loop_add_hooks(struct spa_loop_control *ctrl, - struct spa_loop_control_hooks *hooks) + struct spa_hook *hook, + const struct spa_loop_control_hooks *hooks, + void *data) { struct impl *impl = SPA_CONTAINER_OF(ctrl, struct impl, control); - spa_list_insert(impl->hooks_list.prev, &hooks->link); + spa_hook_list_append(&impl->hooks_list, hook, hooks, data); } static void loop_enter(struct spa_loop_control *ctrl) @@ -318,18 +320,13 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout) struct epoll_event ep[32]; int i, nfds, save_errno = 0; struct source_impl *source, *tmp; - struct spa_loop_control_hooks *hooks, *th; - spa_list_for_each_safe(hooks, th, &impl->hooks_list, link) - if (hooks->before) - hooks->before(hooks); + spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, before); if (SPA_UNLIKELY((nfds = epoll_wait(impl->epoll_fd, ep, SPA_N_ELEMENTS(ep), timeout)) < 0)) save_errno = errno; - spa_list_for_each_safe(hooks, th, &impl->hooks_list, link) - if (hooks->after) - hooks->after(hooks); + spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, after); if (SPA_UNLIKELY(nfds < 0)) { errno = save_errno; @@ -345,7 +342,7 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout) } for (i = 0; i < nfds; i++) { struct spa_source *s = ep[i].data.ptr; - if (s->rmask) { + if (s->rmask && s->fd != -1) { s->func(s); } } @@ -441,11 +438,12 @@ static void loop_enable_idle(struct spa_source *source, bool enabled) if (enabled && !impl->enabled) { count = 1; if (write(source->fd, &count, sizeof(uint64_t)) != sizeof(uint64_t)) - spa_log_warn(impl->impl->log, NAME " %p: failed to write idle fd: %s", source, - strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to write idle fd %d: %s", + source, source->fd, strerror(errno)); } else if (!enabled && impl->enabled) { if (read(source->fd, &count, sizeof(uint64_t)) != sizeof(uint64_t)) - spa_log_warn(impl->impl->log, NAME " %p: failed to read idle fd: %s", source, strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to read idle fd %d: %s", + source, source->fd, strerror(errno)); } impl->enabled = enabled; } @@ -456,7 +454,8 @@ static void source_event_func(struct spa_source *source) uint64_t count; if (read(source->fd, &count, sizeof(uint64_t)) != sizeof(uint64_t)) - spa_log_warn(impl->impl->log, NAME " %p: failed to read event fd: %s", source, strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to read event fd %d: %s", + source, source->fd, strerror(errno)); impl->func.event(&impl->impl->utils, source, count, source->data); } @@ -493,7 +492,8 @@ static void loop_signal_event(struct spa_source *source) uint64_t count = 1; if (write(source->fd, &count, sizeof(uint64_t)) != sizeof(uint64_t)) - spa_log_warn(impl->impl->log, NAME " %p: failed to write event fd: %s", source, strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to write event fd %d: %s", + source, source->fd, strerror(errno)); } static void source_timer_func(struct spa_source *source) @@ -502,7 +502,8 @@ static void source_timer_func(struct spa_source *source) uint64_t expires; if (read(source->fd, &expires, sizeof(uint64_t)) != sizeof(uint64_t)) - spa_log_warn(impl->impl->log, NAME " %p: failed to read timer fd: %s", source, strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to read timer fd %d: %s", + source, source->fd, strerror(errno)); impl->func.timer(&impl->impl->utils, source, source->data); } @@ -564,7 +565,8 @@ static void source_signal_func(struct spa_source *source) struct signalfd_siginfo signal_info; if (read(source->fd, &signal_info, sizeof(signal_info)) != sizeof(signal_info)) - spa_log_warn(impl->impl->log, NAME " %p: failed to read signal fd: %s", source, strerror(errno)); + spa_log_warn(impl->impl->log, NAME " %p: failed to read signal fd %d: %s", + source, source->fd, strerror(errno)); impl->func.signal(&impl->impl->utils, source, impl->signal_number, source->data); } @@ -610,8 +612,10 @@ static void loop_destroy_source(struct spa_source *source) spa_loop_remove_source(source->loop, source); - if (source->fd != -1 && impl->close) + if (source->fd != -1 && impl->close) { close(source->fd); + source->fd = -1; + } spa_list_insert(&loop_impl->destroy_list, &impl->link); } @@ -726,7 +730,7 @@ impl_init(const struct spa_handle_factory *factory, spa_list_init(&impl->source_list); spa_list_init(&impl->destroy_list); - spa_list_init(&impl->hooks_list); + spa_hook_list_init(&impl->hooks_list); spa_ringbuffer_init(&impl->buffer, DATAS_SIZE); diff --git a/src/examples/export-sink.c b/src/examples/export-sink.c index 1bcd47a6e..befbd83a0 100644 --- a/src/examples/export-sink.c +++ b/src/examples/export-sink.c @@ -76,7 +76,7 @@ struct data { struct pw_type *t; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_node *node; struct pw_port *port; diff --git a/src/examples/export-v4l2.c b/src/examples/export-v4l2.c index 6625bb13c..27ec2114f 100644 --- a/src/examples/export-v4l2.c +++ b/src/examples/export-v4l2.c @@ -66,7 +66,7 @@ struct data { struct pw_type *t; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_node *node; }; diff --git a/src/examples/video-play.c b/src/examples/video-play.c index 844b6de9b..4e77632ba 100644 --- a/src/examples/video-play.c +++ b/src/examples/video-play.c @@ -73,10 +73,10 @@ struct data { struct pw_core *core; struct pw_type *t; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_stream *stream; - struct pw_listener stream_listener; + struct spa_hook stream_listener; struct spa_video_info_raw format; int32_t stride; diff --git a/src/examples/video-src.c b/src/examples/video-src.c index b7bdee4b4..78a471176 100644 --- a/src/examples/video-src.c +++ b/src/examples/video-src.c @@ -66,10 +66,10 @@ struct data { struct pw_core *core; struct pw_type *t; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_stream *stream; - struct pw_listener stream_listener; + struct spa_hook stream_listener; struct spa_video_info_raw format; int32_t stride; diff --git a/src/extensions/client-node.h b/src/extensions/client-node.h index a64c5da1b..dd0436e6d 100644 --- a/src/extensions/client-node.h +++ b/src/extensions/client-node.h @@ -445,7 +445,7 @@ struct pw_client_node_proxy_events { static inline void pw_client_node_proxy_add_listener(struct pw_client_node_proxy *p, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_client_node_proxy_events *events, void *data) { diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c index edf9afc5a..252d97a8f 100644 --- a/src/gst/gstpipewiredeviceprovider.c +++ b/src/gst/gstpipewiredeviceprovider.c @@ -327,13 +327,13 @@ struct node_data { struct pw_node_proxy *node; uint32_t id; uint32_t parent_id; - struct pw_listener node_listener; + struct spa_hook node_listener; }; struct registry_data { GstPipeWireDeviceProvider *self; struct pw_registry_proxy *registry; - struct pw_listener registry_listener; + struct spa_hook registry_listener; }; static void node_event_info(void *data, struct pw_node_info *info) @@ -422,7 +422,7 @@ gst_pipewire_device_provider_probe (GstDeviceProvider * provider) struct pw_remote *r = NULL; struct pw_registry_proxy *reg = NULL; struct registry_data *data; - struct pw_listener listener; + struct spa_hook listener; GST_DEBUG_OBJECT (self, "starting probe"); diff --git a/src/gst/gstpipewiredeviceprovider.h b/src/gst/gstpipewiredeviceprovider.h index a66ff1b83..dd675d49d 100644 --- a/src/gst/gstpipewiredeviceprovider.h +++ b/src/gst/gstpipewiredeviceprovider.h @@ -88,7 +88,7 @@ struct _GstPipeWireDeviceProvider { struct pw_type *type; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_core_proxy *core_proxy; struct pw_registry_proxy *registry; diff --git a/src/gst/gstpipewiresink.h b/src/gst/gstpipewiresink.h index 712115cde..5f9f91663 100644 --- a/src/gst/gstpipewiresink.h +++ b/src/gst/gstpipewiresink.h @@ -83,10 +83,10 @@ struct _GstPipeWireSink { struct pw_core *core; struct pw_type *type; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_stream *stream; - struct pw_listener stream_listener; + struct spa_hook stream_listener; GstAllocator *allocator; GstStructure *properties; diff --git a/src/gst/gstpipewiresrc.h b/src/gst/gstpipewiresrc.h index b46b71d1a..ad769ae2e 100644 --- a/src/gst/gstpipewiresrc.h +++ b/src/gst/gstpipewiresrc.h @@ -70,10 +70,10 @@ struct _GstPipeWireSrc { struct pw_core *core; struct pw_type *type; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_stream *stream; - struct pw_listener stream_listener; + struct spa_hook stream_listener; GstAllocator *fd_allocator; GstStructure *properties; diff --git a/src/modules/module-autolink.c b/src/modules/module-autolink.c index d3a7b5dd8..1a1faf962 100644 --- a/src/modules/module-autolink.c +++ b/src/modules/module-autolink.c @@ -33,7 +33,7 @@ struct impl { struct pw_module *module; struct pw_properties *properties; - struct pw_listener core_listener; + struct spa_hook core_listener; struct spa_list node_list; }; @@ -43,10 +43,10 @@ struct node_info { struct impl *impl; struct pw_node *node; - struct pw_listener node_listener; + struct spa_hook node_listener; struct pw_link *link; - struct pw_listener link_listener; + struct spa_hook link_listener; }; static struct node_info *find_node_info(struct impl *impl, struct pw_node *node) @@ -63,8 +63,8 @@ static struct node_info *find_node_info(struct impl *impl, struct pw_node *node) static void node_info_free(struct node_info *info) { spa_list_remove(&info->l); - pw_listener_remove(&info->node_listener); - pw_listener_remove(&info->link_listener); + spa_hook_remove(&info->node_listener); + spa_hook_remove(&info->link_listener); free(info); } @@ -117,7 +117,7 @@ link_destroy(void *data) struct impl *impl = info->impl; pw_log_debug("module %p: link %p destroyed", impl, link); - pw_listener_remove(&info->link_listener); + spa_hook_remove(&info->link_listener); spa_list_init(&info->link_listener.link); } @@ -310,7 +310,7 @@ static void module_destroy(struct impl *impl) { pw_log_debug("module %p: destroy", impl); - pw_listener_remove(&impl->core_listener); + spa_hook_remove(&impl->core_listener); free(impl); } #endif diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index 702885d21..83fbbc2d3 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -121,8 +121,8 @@ struct impl { struct pw_client_node_transport *transport; - struct pw_listener node_listener; - struct pw_listener resource_listener; + struct spa_hook node_listener; + struct spa_hook resource_listener; int fds[2]; int other_fds[2]; @@ -1098,7 +1098,7 @@ static void node_free(void *data) if (impl->transport) pw_client_node_transport_destroy(impl->transport); - pw_listener_remove(&impl->node_listener); + spa_hook_remove(&impl->node_listener); if (impl->fds[0] != -1) close(impl->fds[0]); diff --git a/src/modules/module-flatpak.c b/src/modules/module-flatpak.c index 944f190d2..467fd02a2 100644 --- a/src/modules/module-flatpak.c +++ b/src/modules/module-flatpak.c @@ -42,7 +42,7 @@ struct impl { DBusConnection *bus; - struct pw_listener core_listener; + struct spa_hook core_listener; struct spa_list client_list; @@ -55,9 +55,9 @@ struct client_info { struct pw_client *client; bool is_sandboxed; struct pw_resource *core_resource; - struct pw_listener core_override; + struct spa_hook core_override; struct spa_list async_pending; - struct pw_listener client_listener; + struct spa_hook client_listener; }; struct async_pending { @@ -138,7 +138,7 @@ static void client_info_free(struct client_info *cinfo) spa_list_for_each_safe(p, tmp, &cinfo->async_pending, link) free_pending(p); - pw_listener_remove(&cinfo->client_listener); + spa_hook_remove(&cinfo->client_listener); spa_list_remove(&cinfo->link); free(cinfo); } diff --git a/src/modules/module-jack.c b/src/modules/module-jack.c index 278173213..7650dba9a 100644 --- a/src/modules/module-jack.c +++ b/src/modules/module-jack.c @@ -96,7 +96,7 @@ struct client { struct impl *impl; struct spa_list link; struct pw_client *client; - struct pw_listener client_listener; + struct spa_hook client_listener; int fd; struct spa_source *source; }; diff --git a/src/modules/module-protocol-native.c b/src/modules/module-protocol-native.c index 5674012a5..d0076ab6e 100644 --- a/src/modules/module-protocol-native.c +++ b/src/modules/module-protocol-native.c @@ -67,7 +67,7 @@ struct connection { struct spa_source *source; struct pw_protocol_native_connection *connection; - struct pw_listener conn_listener; + struct spa_hook conn_listener; bool disconnecting; bool flush_signaled; @@ -84,12 +84,12 @@ struct listener { struct pw_loop *loop; struct spa_source *source; - struct spa_loop_control_hooks hooks; + struct spa_hook hook; }; struct client_data { struct pw_client *client; - struct pw_listener client_listener; + struct spa_hook client_listener; int fd; struct spa_source *source; struct pw_protocol_native_connection *connection; @@ -189,19 +189,6 @@ client_busy_changed(void *data, bool busy) } -static void on_before_hook(const struct spa_loop_control_hooks *hooks) -{ - struct listener *listener = SPA_CONTAINER_OF(hooks, struct listener, hooks); - struct pw_protocol_listener *this = &listener->this; - struct pw_client *client, *tmp; - struct client_data *data; - - spa_list_for_each_safe(client, tmp, &this->client_list, protocol_link) { - data = client->user_data; - pw_protocol_native_connection_flush(data->connection); - } -} - static void connection_data(struct spa_loop_utils *utils, struct spa_source *source, int fd, enum spa_io mask, void *data) @@ -664,6 +651,24 @@ static void destroy_listener(struct pw_protocol_listener *listener) free(l); } +static void on_before_hook(void *_data) +{ + struct listener *listener = _data; + struct pw_protocol_listener *this = &listener->this; + struct pw_client *client, *tmp; + struct client_data *data; + + spa_list_for_each_safe(client, tmp, &this->client_list, protocol_link) { + data = client->user_data; + pw_protocol_native_connection_flush(data->connection); + } +} + +static const struct spa_loop_control_hooks impl_hooks = { + SPA_VERSION_LOOP_CONTROL_HOOKS, + .before = on_before_hook, +}; + static struct pw_protocol_listener * impl_add_listener(struct pw_protocol *protocol, struct pw_core *core, @@ -697,8 +702,7 @@ impl_add_listener(struct pw_protocol *protocol, spa_list_insert(protocol->listener_list.prev, &this->link); - l->hooks.before = on_before_hook; - pw_loop_add_hooks(pw_core_get_main_loop(core), &l->hooks); + pw_loop_add_hook(pw_core_get_main_loop(core), &l->hook, &impl_hooks, l); pw_log_info("protocol-native %p: Added listener %p", protocol, this); diff --git a/src/modules/module-protocol-native/connection.c b/src/modules/module-protocol-native/connection.c index f624c07cb..ce9a89c57 100644 --- a/src/modules/module-protocol-native/connection.c +++ b/src/modules/module-protocol-native/connection.c @@ -203,7 +203,7 @@ struct pw_protocol_native_connection *pw_protocol_native_connection_new(int fd) pw_log_debug("connection %p: new", this); this->fd = fd; - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); impl->out.buffer_data = malloc(MAX_BUFFER_SIZE); impl->out.buffer_maxsize = MAX_BUFFER_SIZE; @@ -235,7 +235,7 @@ void pw_protocol_native_connection_destroy(struct pw_protocol_native_connection pw_log_debug("connection %p: destroy", conn); - pw_listener_list_emit(&conn->listener_list, struct pw_protocol_native_connection_events, destroy); + spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy); free(impl->out.buffer_data); free(impl->in.buffer_data); @@ -430,7 +430,7 @@ pw_protocol_native_connection_end(struct pw_protocol_native_connection *conn, printf(">>>>>>>>> out:\n"); spa_debug_pod((struct spa_pod *)p); } - pw_listener_list_emit(&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); } /** Flush the connection object diff --git a/src/modules/module-protocol-native/connection.h b/src/modules/module-protocol-native/connection.h index 9c244c65b..0474da09a 100644 --- a/src/modules/module-protocol-native/connection.h +++ b/src/modules/module-protocol-native/connection.h @@ -25,7 +25,7 @@ extern "C" { #endif #include -#include +#include struct pw_protocol_native_connection_events { #define PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS 0 @@ -44,16 +44,16 @@ struct pw_protocol_native_connection_events { struct pw_protocol_native_connection { int fd; /**< the socket */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; }; static inline void pw_protocol_native_connection_add_listener(struct pw_protocol_native_connection *conn, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_protocol_native_connection_events *events, void *data) { - pw_listener_list_add(&conn->listener_list, listener, events, data); + spa_hook_list_append(&conn->listener_list, listener, events, data); } struct pw_protocol_native_connection * diff --git a/src/modules/module-suspend-on-idle.c b/src/modules/module-suspend-on-idle.c index 809459a16..a035f04f2 100644 --- a/src/modules/module-suspend-on-idle.c +++ b/src/modules/module-suspend-on-idle.c @@ -31,7 +31,7 @@ struct impl { struct pw_type *t; struct pw_properties *properties; - struct pw_listener core_listener; + struct spa_hook core_listener; struct spa_list node_list; }; @@ -40,7 +40,7 @@ struct node_info { struct spa_list link; struct impl *impl; struct pw_node *node; - struct pw_listener node_listener; + struct spa_hook node_listener; struct spa_source *idle_timeout; }; @@ -67,7 +67,7 @@ static void node_info_free(struct node_info *info) { spa_list_remove(&info->link); remove_idle_timeout(info); - pw_listener_remove(&info->node_listener); + spa_hook_remove(&info->node_listener); free(info); } diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index ee37ab30e..b55979838 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -43,7 +43,7 @@ struct impl { char *lib; char *factory_name; - struct pw_listener node_listener; + struct spa_hook node_listener; }; struct port { @@ -337,7 +337,7 @@ static void on_node_done(void *data, int seq, int res) } pw_log_debug("spa-node %p: async complete event %d %d", this, seq, res); - pw_listener_list_emit(&this->listener_list, struct pw_node_events, async_complete, seq, res); + spa_hook_list_call(&this->listener_list, struct pw_node_events, async_complete, seq, res); } static void on_node_event(void *data, struct spa_event *event) @@ -345,21 +345,21 @@ static void on_node_event(void *data, struct spa_event *event) struct impl *impl = data; struct pw_node *this = impl->this; - pw_listener_list_emit(&this->listener_list, struct pw_node_events, event, event); + spa_hook_list_call(&this->listener_list, struct pw_node_events, event, event); } static void on_node_need_input(void *data) { struct impl *impl = data; struct pw_node *this = impl->this; - pw_listener_list_emit(&this->listener_list, struct pw_node_events, need_input); + spa_hook_list_call(&this->listener_list, struct pw_node_events, need_input); } static void on_node_have_output(void *data) { struct impl *impl = data; struct pw_node *this = impl->this; - pw_listener_list_emit(&this->listener_list, struct pw_node_events, have_output); + spa_hook_list_call(&this->listener_list, struct pw_node_events, have_output); } static void diff --git a/src/pipewire/client.c b/src/pipewire/client.c index 1ddf1d612..bbd649219 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -32,7 +32,7 @@ struct impl { }; struct resource_data { - struct pw_listener resource_listener; + struct spa_hook resource_listener; }; /** \endcond */ @@ -114,7 +114,7 @@ struct pw_client *pw_client_new(struct pw_core *core, this->user_data = SPA_MEMBER(impl, sizeof(struct impl), void); spa_list_init(&this->resource_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); pw_map_init(&this->objects, 0, 32); pw_map_init(&this->types, 0, 32); @@ -184,7 +184,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); - pw_listener_list_emit(&client->listener_list, struct pw_client_events, destroy); + spa_hook_list_call(&client->listener_list, struct pw_client_events, destroy); spa_list_remove(&client->link); pw_global_destroy(client->global); @@ -194,7 +194,7 @@ void pw_client_destroy(struct pw_client *client) pw_map_for_each(&client->objects, destroy_resource, client); - pw_listener_list_emit(&client->listener_list, struct pw_client_events, free); + spa_hook_list_call(&client->listener_list, struct pw_client_events, free); pw_log_debug("client %p: free", impl); pw_map_clear(&client->objects); @@ -207,11 +207,11 @@ void pw_client_destroy(struct pw_client *client) } void pw_client_add_listener(struct pw_client *client, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_client_events *events, void *data) { - pw_listener_list_add(&client->listener_list, listener, events, data); + spa_hook_list_append(&client->listener_list, listener, events, data); } const struct pw_client_info *pw_client_get_info(struct pw_client *client) @@ -248,7 +248,7 @@ void pw_client_update_properties(struct pw_client *client, const struct spa_dict client->info.change_mask |= 1 << 0; client->info.props = client->properties ? &client->properties->dict : NULL; - pw_listener_list_emit(&client->listener_list, struct pw_client_events, info_changed, &client->info); + spa_hook_list_call(&client->listener_list, struct pw_client_events, info_changed, &client->info); spa_list_for_each(resource, &client->resource_list, link) pw_client_resource_info(resource, &client->info); @@ -261,6 +261,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; - pw_listener_list_emit(&client->listener_list, struct pw_client_events, busy_changed, busy); + spa_hook_list_call(&client->listener_list, struct pw_client_events, busy_changed, busy); } } diff --git a/src/pipewire/client.h b/src/pipewire/client.h index aa9b205be..e5f7913d0 100644 --- a/src/pipewire/client.h +++ b/src/pipewire/client.h @@ -45,7 +45,6 @@ struct pw_client; #include #include #include -#include #include #define PW_TYPE__Client PW_TYPE_OBJECT_BASE "Client" @@ -140,7 +139,7 @@ const struct ucred *pw_client_get_ucred(struct pw_client *client); void *pw_client_get_user_data(struct pw_client *client); void pw_client_add_listener(struct pw_client *client, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_client_events *events, void *data); diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 532eb2e43..470458022 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -24,7 +24,6 @@ #include #include -#include #include #include #include @@ -37,7 +36,7 @@ struct global_impl { }; struct resource_data { - struct pw_listener resource_listener; + struct spa_hook resource_listener; }; /** \endcond */ @@ -381,7 +380,7 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, struct pw_properties *pro spa_list_init(&this->node_list); spa_list_init(&this->node_factory_list); spa_list_init(&this->link_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); this->info.change_mask = 0; this->info.user_name = pw_get_user_name(); @@ -420,7 +419,7 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop, struct pw_properties *pro void pw_core_destroy(struct pw_core *core) { pw_log_debug("core %p: destroy", core); - pw_listener_list_emit(&core->listener_list, struct pw_core_events, destroy, core); + spa_hook_list_call(&core->listener_list, struct pw_core_events, destroy, core); pw_data_loop_destroy(core->data_loop_impl); @@ -482,7 +481,7 @@ pw_core_add_global(struct pw_core *core, spa_list_insert(core->global_list.prev, &this->link); - pw_listener_list_emit(&core->listener_list, struct pw_core_events, global_added, this); + spa_hook_list_call(&core->listener_list, struct pw_core_events, global_added, this); pw_log_debug("global %p: new %u %s, owner %p", this, this->id, spa_type_map_get_type(core->type.map, this->type), owner); @@ -612,18 +611,18 @@ void pw_global_destroy(struct pw_global *global) pw_map_remove(&core->globals, global->id); spa_list_remove(&global->link); - pw_listener_list_emit(&core->listener_list, struct pw_core_events, global_removed, global); + spa_hook_list_call(&core->listener_list, struct pw_core_events, global_removed, global); pw_log_debug("global %p: free", global); free(global); } void pw_core_add_listener(struct pw_core *core, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_core_events *events, void *data) { - pw_listener_list_add(&core->listener_list, listener, events, data); + spa_hook_list_append(&core->listener_list, listener, events, data); } void pw_core_set_permission_callback(struct pw_core *core, @@ -682,7 +681,7 @@ void 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 ? &core->properties->dict : NULL; - pw_listener_list_emit(&core->listener_list, struct pw_core_events, info_changed, &core->info); + spa_hook_list_call(&core->listener_list, struct pw_core_events, info_changed, &core->info); spa_list_for_each(resource, &core->resource_list, link) { pw_core_resource_info(resource, &core->info); diff --git a/src/pipewire/core.h b/src/pipewire/core.h index f339256a0..fb6638f02 100644 --- a/src/pipewire/core.h +++ b/src/pipewire/core.h @@ -25,7 +25,7 @@ extern "C" { #endif #include -#include +#include struct pw_global; @@ -41,7 +41,6 @@ struct pw_global; struct pw_core; #include -#include #include #include #include @@ -158,7 +157,7 @@ pw_core_new(struct pw_loop *main_loop, struct pw_properties *props); void pw_core_destroy(struct pw_core *core); void pw_core_add_listener(struct pw_core *core, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_core_events *events, void *data); diff --git a/src/pipewire/data-loop.c b/src/pipewire/data-loop.c index b8a6b5b8b..480c87dd6 100644 --- a/src/pipewire/data-loop.c +++ b/src/pipewire/data-loop.c @@ -115,7 +115,7 @@ struct pw_data_loop *pw_data_loop_new(void) if (this->loop == NULL) goto no_loop; - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); this->event = pw_loop_add_event(this->loop, do_stop, this); @@ -134,7 +134,7 @@ void pw_data_loop_destroy(struct pw_data_loop *loop) { pw_log_debug("data-loop %p: destroy", loop); - pw_listener_list_emit(&loop->listener_list, struct pw_data_loop_events, destroy); + spa_hook_list_call(&loop->listener_list, struct pw_data_loop_events, destroy); pw_data_loop_stop(loop); @@ -144,11 +144,11 @@ void pw_data_loop_destroy(struct pw_data_loop *loop) } void pw_data_loop_add_listener(struct pw_data_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_data_loop_events *events, void *data) { - pw_listener_list_add(&loop->listener_list, listener, events, data); + spa_hook_list_append(&loop->listener_list, listener, events, data); } struct pw_loop * diff --git a/src/pipewire/data-loop.h b/src/pipewire/data-loop.h index 2e8954525..7a47d471e 100644 --- a/src/pipewire/data-loop.h +++ b/src/pipewire/data-loop.h @@ -31,7 +31,6 @@ extern "C" { struct pw_data_loop; #include -#include struct pw_data_loop_events { #define PW_VERSION_DATA_LOOP_EVENTS 0 @@ -44,7 +43,7 @@ struct pw_data_loop * pw_data_loop_new(void); void pw_data_loop_add_listener(struct pw_data_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_data_loop_events *events, void *data); diff --git a/src/pipewire/interfaces.h b/src/pipewire/interfaces.h index 3f65d1225..2f59524f6 100644 --- a/src/pipewire/interfaces.h +++ b/src/pipewire/interfaces.h @@ -294,7 +294,7 @@ struct pw_core_proxy_events { static inline void pw_core_proxy_add_listener(struct pw_core_proxy *core, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_core_proxy_events *events, void *data) { @@ -381,7 +381,7 @@ struct pw_registry_proxy_events { static inline void pw_registry_proxy_add_listener(struct pw_registry_proxy *registry, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_registry_proxy_events *events, void *data) { @@ -411,7 +411,7 @@ struct pw_module_proxy_events { static inline void pw_module_proxy_add_listener(struct pw_module_proxy *module, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_module_proxy_events *events, void *data) { @@ -439,7 +439,7 @@ struct pw_node_proxy_events { static inline void pw_node_proxy_add_listener(struct pw_node_proxy *node, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_node_proxy_events *events, void *data) { @@ -468,7 +468,7 @@ struct pw_client_proxy_events { /** Client */ static inline void pw_client_proxy_add_listener(struct pw_client_proxy *client, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_client_proxy_events *events, void *data) { @@ -498,7 +498,7 @@ struct pw_link_proxy_events { /** Link */ static inline void pw_link_proxy_add_listener(struct pw_link_proxy *link, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_link_proxy_events *events, void *data) { diff --git a/src/pipewire/link.c b/src/pipewire/link.c index 444b65a13..4b084ee69 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -46,10 +46,10 @@ struct impl { struct spa_format *format_filter; struct pw_properties *properties; - struct pw_listener input_port_listener; - struct pw_listener input_node_listener; - struct pw_listener output_port_listener; - struct pw_listener output_node_listener; + struct spa_hook input_port_listener; + struct spa_hook input_node_listener; + struct spa_hook output_port_listener; + struct spa_hook output_node_listener; void *buffer_owner; struct pw_memblock buffer_mem; @@ -58,7 +58,7 @@ struct impl { }; struct resource_data { - struct pw_listener resource_listener; + struct spa_hook resource_listener; }; /** \endcond */ @@ -76,7 +76,7 @@ static void pw_link_update_state(struct pw_link *link, enum pw_link_state state, free(link->error); link->error = error; - pw_listener_list_emit(&link->listener_list, struct pw_link_events, state_changed, old, state, error); + spa_hook_list_call(&link->listener_list, struct pw_link_events, state_changed, old, state, error); } } @@ -776,8 +776,8 @@ static void input_remove(struct pw_link *this, struct pw_port *port) struct impl *impl = (struct impl *) this; pw_log_debug("link %p: remove input port %p", this, port); - pw_listener_remove(&impl->input_port_listener); - pw_listener_remove(&impl->input_node_listener); + spa_hook_remove(&impl->input_port_listener); + spa_hook_remove(&impl->input_node_listener); pw_loop_invoke(port->node->data_loop, do_remove_input, 1, 0, NULL, true, this); @@ -799,8 +799,8 @@ static void output_remove(struct pw_link *this, struct pw_port *port) struct impl *impl = (struct impl *) this; pw_log_debug("link %p: remove output port %p", this, port); - pw_listener_remove(&impl->output_port_listener); - pw_listener_remove(&impl->output_node_listener); + spa_hook_remove(&impl->output_port_listener); + spa_hook_remove(&impl->output_node_listener); pw_loop_invoke(port->node->data_loop, do_remove_output, 1, 0, NULL, true, this); @@ -831,7 +831,7 @@ static void on_port_destroy(struct pw_link *this, struct pw_port *port) impl->buffer_owner = NULL; } - pw_listener_list_emit(&this->listener_list, struct pw_link_events, port_unlinked, port); + spa_hook_list_call(&this->listener_list, struct pw_link_events, port_unlinked, port); pw_link_update_state(this, PW_LINK_STATE_UNLINKED, NULL); pw_link_destroy(this); @@ -1053,7 +1053,7 @@ struct pw_link *pw_link_new(struct pw_core *core, output_node = output->node; spa_list_init(&this->resource_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); impl->format_filter = format_filter; @@ -1123,7 +1123,7 @@ void pw_link_destroy(struct pw_link *link) struct pw_resource *resource, *tmp; pw_log_debug("link %p: destroy", impl); - pw_listener_list_emit(&link->listener_list, struct pw_link_events, destroy); + spa_hook_list_call(&link->listener_list, struct pw_link_events, destroy); pw_link_deactivate(link); @@ -1153,11 +1153,11 @@ void pw_link_destroy(struct pw_link *link) } void pw_link_add_listener(struct pw_link *link, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_link_events *events, void *data) { - pw_listener_list_add(&link->listener_list, listener, events, data); + spa_hook_list_append(&link->listener_list, listener, events, data); } struct pw_link *pw_link_find(struct pw_port *output_port, struct pw_port *input_port) diff --git a/src/pipewire/link.h b/src/pipewire/link.h index 975f4752e..e0a2ece66 100644 --- a/src/pipewire/link.h +++ b/src/pipewire/link.h @@ -83,7 +83,7 @@ pw_link_new(struct pw_core *core, /**< the core object */ void pw_link_destroy(struct pw_link *link); void pw_link_add_listener(struct pw_link *link, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_link_events *events, void *data); diff --git a/src/pipewire/listener.h b/src/pipewire/listener.h deleted file mode 100644 index c402a6111..000000000 --- a/src/pipewire/listener.h +++ /dev/null @@ -1,84 +0,0 @@ -/* PipeWire - * Copyright (C) 2017 Wim Taymans - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PIPEWIRE_LISTENER_H__ -#define __PIPEWIRE_LISTENER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -struct pw_listener_list { - struct spa_list list; -}; - -struct pw_listener { - struct spa_list link; - const void *events; - void *data; -}; - -static inline void pw_listener_list_init(struct pw_listener_list *list) -{ - spa_list_init(&list->list); -} - -/** Add a listener \memberof pw_listener */ -static inline void pw_listener_list_add(struct pw_listener_list *list, - struct pw_listener *listener, - const void *events, void *data) -{ - listener->events = events; - listener->data = data; - spa_list_insert(list->list.prev, &listener->link); -} - -/** Remove a listener \memberof pw_listener */ -static inline void pw_listener_remove(struct pw_listener *listener) -{ - spa_list_remove(&listener->link); -} - -#define pw_listener_list_do_emit(l,start,type,method,once,...) ({ \ - struct pw_listener_list *list = l; \ - struct spa_list *s = start ? (struct spa_list *)start : &list->list; \ - struct pw_listener *ci, *t; \ - spa_list_for_each_safe_next(ci, t, &list->list, s, link) { \ - const type *cb = ci->events; \ - if (cb->method) { \ - cb->method(ci->data, ## __VA_ARGS__); \ - if (once) \ - break; \ - } \ - } \ -}); - -#define pw_listener_list_emit(l,t,m,...) pw_listener_list_do_emit(l,NULL,t,m,false,##__VA_ARGS__) -#define pw_listener_list_emit_once(l,t,m,...) pw_listener_list_do_emit(l,NULL,t,m,true,##__VA_ARGS__) - -#define pw_listener_list_emit_start(l,s,t,m,...) pw_listener_list_do_emit(l,s,t,m,false,##__VA_ARGS__) -#define pw_listener_list_emit_once_start(l,s,t,m,...) pw_listener_list_do_emit(l,s,t,m,true,##__VA_ARGS__) - -#ifdef __cplusplus -} -#endif - -#endif /* __PIPEWIRE_LISTENER_H__ */ diff --git a/src/pipewire/loop.h b/src/pipewire/loop.h index bb9c3c94c..9a4cd6ac0 100644 --- a/src/pipewire/loop.h +++ b/src/pipewire/loop.h @@ -45,27 +45,27 @@ pw_loop_new(void); void pw_loop_destroy(struct pw_loop *loop); -#define pw_loop_add_source(l,...) spa_loop_add_source((l)->loop,__VA_ARGS__) -#define pw_loop_update_source(l,...) spa_loop_update_source(__VA_ARGS__) -#define pw_loop_remove_source(l,...) spa_loop_remove_source(__VA_ARGS__) -#define pw_loop_invoke(l,...) spa_loop_invoke((l)->loop,__VA_ARGS__) +#define pw_loop_add_source(l,...) spa_loop_add_source((l)->loop,__VA_ARGS__) +#define pw_loop_update_source(l,...) spa_loop_update_source(__VA_ARGS__) +#define pw_loop_remove_source(l,...) spa_loop_remove_source(__VA_ARGS__) +#define pw_loop_invoke(l,...) spa_loop_invoke((l)->loop,__VA_ARGS__) -#define pw_loop_get_fd(l) spa_loop_control_get_fd((l)->control) -#define pw_loop_add_hooks(l,...) spa_loop_control_add_hooks((l)->control,__VA_ARGS__) -#define pw_loop_enter(l) spa_loop_control_enter((l)->control) -#define pw_loop_iterate(l,...) spa_loop_control_iterate((l)->control,__VA_ARGS__) -#define pw_loop_leave(l) spa_loop_control_leave((l)->control) +#define pw_loop_get_fd(l) spa_loop_control_get_fd((l)->control) +#define pw_loop_add_hook(l,...) spa_loop_control_add_hook((l)->control,__VA_ARGS__) +#define pw_loop_enter(l) spa_loop_control_enter((l)->control) +#define pw_loop_iterate(l,...) spa_loop_control_iterate((l)->control,__VA_ARGS__) +#define pw_loop_leave(l) spa_loop_control_leave((l)->control) -#define pw_loop_add_io(l,...) spa_loop_utils_add_io((l)->utils,__VA_ARGS__) -#define pw_loop_update_io(l,...) spa_loop_utils_update_io((l)->utils,__VA_ARGS__) -#define pw_loop_add_idle(l,...) spa_loop_utils_add_idle((l)->utils,__VA_ARGS__) -#define pw_loop_enable_idle(l,...) spa_loop_utils_enable_idle((l)->utils,__VA_ARGS__) -#define pw_loop_add_event(l,...) spa_loop_utils_add_event((l)->utils,__VA_ARGS__) -#define pw_loop_signal_event(l,...) spa_loop_utils_signal_event((l)->utils,__VA_ARGS__) -#define pw_loop_add_timer(l,...) spa_loop_utils_add_timer((l)->utils,__VA_ARGS__) -#define pw_loop_update_timer(l,...) spa_loop_utils_update_timer((l)->utils,__VA_ARGS__) -#define pw_loop_add_signal(l,...) spa_loop_utils_add_signal((l)->utils,__VA_ARGS__) -#define pw_loop_destroy_source(l,...) spa_loop_utils_destroy_source((l)->utils,__VA_ARGS__) +#define pw_loop_add_io(l,...) spa_loop_utils_add_io((l)->utils,__VA_ARGS__) +#define pw_loop_update_io(l,...) spa_loop_utils_update_io((l)->utils,__VA_ARGS__) +#define pw_loop_add_idle(l,...) spa_loop_utils_add_idle((l)->utils,__VA_ARGS__) +#define pw_loop_enable_idle(l,...) spa_loop_utils_enable_idle((l)->utils,__VA_ARGS__) +#define pw_loop_add_event(l,...) spa_loop_utils_add_event((l)->utils,__VA_ARGS__) +#define pw_loop_signal_event(l,...) spa_loop_utils_signal_event((l)->utils,__VA_ARGS__) +#define pw_loop_add_timer(l,...) spa_loop_utils_add_timer((l)->utils,__VA_ARGS__) +#define pw_loop_update_timer(l,...) spa_loop_utils_update_timer((l)->utils,__VA_ARGS__) +#define pw_loop_add_signal(l,...) spa_loop_utils_add_signal((l)->utils,__VA_ARGS__) +#define pw_loop_destroy_source(l,...) spa_loop_utils_destroy_source((l)->utils,__VA_ARGS__) #ifdef __cplusplus } diff --git a/src/pipewire/main-loop.c b/src/pipewire/main-loop.c index dad404716..65a35f8d7 100644 --- a/src/pipewire/main-loop.c +++ b/src/pipewire/main-loop.c @@ -40,7 +40,7 @@ struct pw_main_loop *pw_main_loop_new(void) if (this->loop == NULL) goto no_loop; - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); return this; @@ -57,7 +57,7 @@ struct pw_main_loop *pw_main_loop_new(void) void pw_main_loop_destroy(struct pw_main_loop *loop) { pw_log_debug("main-loop %p: destroy", loop); - pw_listener_list_emit(&loop->listener_list, struct pw_main_loop_events, destroy); + spa_hook_list_call(&loop->listener_list, struct pw_main_loop_events, destroy); pw_loop_destroy(loop->loop); @@ -65,11 +65,11 @@ void pw_main_loop_destroy(struct pw_main_loop *loop) } void pw_main_loop_add_listener(struct pw_main_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_main_loop_events *events, void *data) { - pw_listener_list_add(&loop->listener_list, listener, events, data); + spa_hook_list_append(&loop->listener_list, listener, events, data); } struct pw_loop * pw_main_loop_get_loop(struct pw_main_loop *loop) diff --git a/src/pipewire/main-loop.h b/src/pipewire/main-loop.h index 06484e7cc..9c1df7675 100644 --- a/src/pipewire/main-loop.h +++ b/src/pipewire/main-loop.h @@ -34,12 +34,12 @@ extern "C" { struct pw_main_loop; #include -#include struct pw_main_loop_events { #define PW_VERSION_MAIN_LOOP_EVENTS 0 uint32_t version; + /** Emited when the main loop is destroyed */ void (*destroy) (void *data); }; @@ -47,7 +47,7 @@ struct pw_main_loop * pw_main_loop_new(void); void pw_main_loop_add_listener(struct pw_main_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_main_loop_events *events, void *data); diff --git a/src/pipewire/meson.build b/src/pipewire/meson.build index 2b6a99009..30e4a4313 100644 --- a/src/pipewire/meson.build +++ b/src/pipewire/meson.build @@ -7,7 +7,6 @@ pipewire_headers = [ 'interfaces.h', 'introspect.h', 'link.h', - 'listener.h', 'log.h', 'loop.h', 'main-loop.h', diff --git a/src/pipewire/module.c b/src/pipewire/module.c index 22b07a4e0..ce9211096 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -41,7 +41,7 @@ struct impl { }; struct resource_data { - struct pw_listener resource_listener; + struct spa_hook resource_listener; }; @@ -210,7 +210,7 @@ struct pw_module *pw_module_load(struct pw_core *core, const char *name, const c this->core = core; spa_list_init(&this->resource_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); this->info.name = name ? strdup(name) : NULL; this->info.filename = filename; @@ -257,7 +257,7 @@ void pw_module_destroy(struct pw_module *module) struct impl *impl = SPA_CONTAINER_OF(module, struct impl, this); struct pw_resource *resource, *tmp; - pw_listener_list_emit(&module->listener_list, struct pw_module_events, destroy); + spa_hook_list_call(&module->listener_list, struct pw_module_events, destroy); spa_list_for_each_safe(resource, tmp, &module->resource_list, link) pw_resource_destroy(resource); @@ -293,9 +293,9 @@ pw_module_get_info(struct pw_module *module) } void pw_module_add_listener(struct pw_module *module, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_module_events *events, void *data) { - pw_listener_list_add(&module->listener_list, listener, events, data); + spa_hook_list_append(&module->listener_list, listener, events, data); } diff --git a/src/pipewire/module.h b/src/pipewire/module.h index 9664d1a27..8c1d8ee6c 100644 --- a/src/pipewire/module.h +++ b/src/pipewire/module.h @@ -68,7 +68,7 @@ struct pw_global * pw_module_get_global(struct pw_module *module); const struct pw_module_info *pw_module_get_info(struct pw_module *module); void pw_module_add_listener(struct pw_module *module, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_module_events *events, void *data); diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 605decde9..478801495 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -39,13 +39,13 @@ struct impl { struct pw_work_queue *work; - struct pw_listener node_listener; + struct spa_hook node_listener; bool registered; }; struct resource_data { - struct pw_listener resource_listener; + struct spa_hook resource_listener; }; /** \endcond */ @@ -315,7 +315,7 @@ void pw_node_register(struct pw_node *this) node_bind_func, this); impl->registered = true; - pw_listener_list_emit(&this->listener_list, struct pw_node_events, initialized); + spa_hook_list_call(&this->listener_list, struct pw_node_events, initialized); pw_node_update_state(this, PW_NODE_STATE_SUSPENDED, NULL); } @@ -397,7 +397,7 @@ struct pw_node *pw_node_new(struct pw_core *core, spa_list_init(&this->resource_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); pw_node_add_listener(this, &impl->node_listener, &node_events, impl); @@ -459,11 +459,11 @@ void pw_node_set_implementation(struct pw_node *node, } void pw_node_add_listener(struct pw_node *node, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_node_events *events, void *data) { - pw_listener_list_add(&node->listener_list, listener, events, data); + spa_hook_list_append(&node->listener_list, listener, events, data); } static int @@ -494,7 +494,7 @@ void pw_node_destroy(struct pw_node *node) struct pw_port *port, *tmpp; pw_log_debug("node %p: destroy", impl); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, destroy); + spa_hook_list_call(&node->listener_list, struct pw_node_events, destroy); pw_loop_invoke(node->data_loop, do_node_remove, 1, 0, NULL, true, node); @@ -509,17 +509,17 @@ 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) { - pw_listener_list_emit(&node->listener_list, struct pw_node_events, port_removed, port); + spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); pw_port_destroy(port); } spa_list_for_each_safe(port, tmpp, &node->output_ports, link) { - pw_listener_list_emit(&node->listener_list, struct pw_node_events, port_removed, port); + spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); pw_port_destroy(port); } pw_log_debug("node %p: free", node); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, free); + spa_hook_list_call(&node->listener_list, struct pw_node_events, free); pw_work_queue_destroy(impl->work); @@ -691,7 +691,7 @@ int pw_node_set_state(struct pw_node *node, enum pw_node_state state) int res = SPA_RESULT_OK; struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, state_request, state); + spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state); pw_log_debug("node %p: set state %s", node, pw_node_state_as_string(state)); @@ -754,11 +754,11 @@ void pw_node_update_state(struct pw_node *node, enum pw_node_state state, char * if (state == PW_NODE_STATE_IDLE) node_deactivate(node); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, state_changed, + spa_hook_list_call(&node->listener_list, struct pw_node_events, state_changed, old, state, error); node->info.change_mask |= 1 << 5; - pw_listener_list_emit(&node->listener_list, struct pw_node_events, info_changed, &node->info); + spa_hook_list_call(&node->listener_list, struct pw_node_events, info_changed, &node->info); spa_list_for_each(resource, &node->resource_list, link) pw_node_resource_info(resource, &node->info); diff --git a/src/pipewire/node.h b/src/pipewire/node.h index 26d3f34f7..7d0091c59 100644 --- a/src/pipewire/node.h +++ b/src/pipewire/node.h @@ -143,7 +143,7 @@ void pw_node_set_implementation(struct pw_node *node, void *data); void pw_node_add_listener(struct pw_node *node, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_node_events *events, void *data); diff --git a/src/pipewire/pipewire.h b/src/pipewire/pipewire.h index 8edd912d0..4c2678bc7 100644 --- a/src/pipewire/pipewire.h +++ b/src/pipewire/pipewire.h @@ -42,7 +42,6 @@ extern "C" { #include #include #include -#include #include #include #include diff --git a/src/pipewire/port.c b/src/pipewire/port.c index b6b73f64b..6a04a6b73 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -37,7 +37,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; - pw_listener_list_emit(&port->listener_list, struct pw_port_events, state_changed, state); + spa_hook_list_call(&port->listener_list, struct pw_port_events, state_changed, state); } } @@ -164,7 +164,7 @@ struct pw_port *pw_port_new(enum pw_direction direction, spa_list_init(&this->links); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); spa_graph_port_init(&this->rt.port, this->direction, @@ -214,11 +214,11 @@ void pw_port_set_implementation(struct pw_port *port, } void pw_port_add_listener(struct pw_port *port, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_port_events *events, void *data) { - pw_listener_list_add(&port->listener_list, listener, events, data); + spa_hook_list_append(&port->listener_list, listener, events, data); } void * pw_port_get_user_data(struct pw_port *port) @@ -265,7 +265,7 @@ void pw_port_add(struct pw_port *port, struct pw_node *node) port_update_state(port, PW_PORT_STATE_CONFIGURE); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, port_added, port); + spa_hook_list_call(&node->listener_list, struct pw_node_events, port_added, port); } static int do_remove_port(struct spa_loop *loop, @@ -292,7 +292,7 @@ void pw_port_destroy(struct pw_port *port) pw_log_debug("port %p: destroy", port); - pw_listener_list_emit(&port->listener_list, struct pw_port_events, destroy); + spa_hook_list_call(&port->listener_list, struct pw_port_events, destroy); if (node) { pw_loop_invoke(port->node->data_loop, do_remove_port, SPA_ID_INVALID, 0, NULL, true, port); @@ -306,7 +306,7 @@ void pw_port_destroy(struct pw_port *port) node->info.n_output_ports--; } spa_list_remove(&port->link); - pw_listener_list_emit(&node->listener_list, struct pw_node_events, port_removed, port); + spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port); } free(port); } diff --git a/src/pipewire/port.h b/src/pipewire/port.h index 82d7e6eef..814c682fd 100644 --- a/src/pipewire/port.h +++ b/src/pipewire/port.h @@ -122,7 +122,7 @@ void pw_port_set_implementation(struct pw_port *port, void *data); void pw_port_add_listener(struct pw_port *port, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_port_events *events, void *data); diff --git a/src/pipewire/private.h b/src/pipewire/private.h index e6cbe9c1a..cc21c4524 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -25,6 +25,7 @@ extern "C" { #endif #include +#include #include "pipewire/pipewire.h" #include "pipewire/introspect.h" @@ -55,7 +56,7 @@ struct pw_client { bool busy; - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; struct pw_protocol *protocol; /**< protocol in use */ struct spa_list protocol_link; /**< link in the protocol client_list */ @@ -104,7 +105,7 @@ struct pw_core { struct spa_list node_factory_list; /**< list of node factories */ struct spa_list link_list; /**< list of links */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; struct pw_loop *main_loop; /**< main loop for control */ struct pw_loop *data_loop; /**< data loop for data passing */ @@ -122,7 +123,7 @@ struct pw_core { struct pw_data_loop { struct pw_loop *loop; - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; struct spa_source *event; @@ -133,7 +134,7 @@ struct pw_data_loop { struct pw_main_loop { struct pw_loop *loop; - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; bool running; }; @@ -158,7 +159,7 @@ struct pw_link { struct pw_port *input; /**< input port */ struct spa_list input_link; /**< link in input port links */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; struct { struct spa_graph_port out_port; @@ -175,7 +176,7 @@ struct pw_module { struct spa_list resource_list; /**< list of resources for this module */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; void *user_data; /**< module user_data */ }; @@ -209,7 +210,7 @@ struct pw_node { uint32_t n_used_output_links; /**< number of active output links */ uint32_t idle_used_output_links; /**< number of active output to be idle */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; struct pw_loop *data_loop; /**< the data loop for this node */ @@ -243,7 +244,7 @@ struct pw_port { struct spa_list links; /**< list of \ref pw_link */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; void *mix; /**< optional port buffer mix/split */ @@ -269,9 +270,9 @@ struct pw_resource { uint32_t type; /**< type of the client interface */ uint32_t version; /**< version of the client interface */ - struct pw_listener implementation; - struct pw_listener_list implementation_list; - struct pw_listener_list listener_list; + struct spa_hook implementation; + struct spa_hook_list implementation_list; + struct spa_hook_list listener_list; const struct pw_protocol_marshal *marshal; @@ -286,8 +287,8 @@ struct pw_proxy { uint32_t id; /**< client side id */ - struct pw_listener_list listener_list; - struct pw_listener_list proxy_listener_list; + struct spa_hook_list listener_list; + struct spa_hook_list proxy_listener_list; const struct pw_protocol_marshal *marshal; /**< protocol specific marshal functions */ @@ -316,7 +317,7 @@ struct pw_remote { enum pw_remote_state state; char *error; - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; }; @@ -332,7 +333,7 @@ struct pw_stream { enum pw_stream_state state; /**< stream state */ char *error; /**< error reason when state is in error */ - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; }; struct pw_node_factory { diff --git a/src/pipewire/proxy.c b/src/pipewire/proxy.c index 3998f2788..bbfc48750 100644 --- a/src/pipewire/proxy.c +++ b/src/pipewire/proxy.c @@ -58,8 +58,8 @@ struct pw_proxy *pw_proxy_new(struct pw_proxy *factory, this = &impl->this; this->remote = remote; - pw_listener_list_init(&this->listener_list); - pw_listener_list_init(&this->proxy_listener_list); + spa_hook_list_init(&this->listener_list); + spa_hook_list_init(&this->proxy_listener_list); this->id = pw_map_insert_new(&remote->objects, this); @@ -91,19 +91,19 @@ struct pw_protocol *pw_proxy_get_protocol(struct pw_proxy *proxy) } void pw_proxy_add_listener(struct pw_proxy *proxy, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_proxy_events *events, void *data) { - pw_listener_list_add(&proxy->listener_list, listener, events, data); + spa_hook_list_append(&proxy->listener_list, listener, events, data); } void pw_proxy_add_proxy_listener(struct pw_proxy *proxy, - struct pw_listener *listener, + struct spa_hook *listener, const void *events, void *data) { - pw_listener_list_add(&proxy->proxy_listener_list, listener, events, data); + spa_hook_list_append(&proxy->proxy_listener_list, listener, events, data); } /** Destroy a proxy object @@ -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); - pw_listener_list_emit(&proxy->listener_list, struct pw_proxy_events, destroy); + spa_hook_list_call(&proxy->listener_list, struct pw_proxy_events, destroy); pw_map_remove(&proxy->remote->objects, proxy->id); spa_list_remove(&proxy->link); @@ -127,7 +127,7 @@ void pw_proxy_destroy(struct pw_proxy *proxy) free(impl); } -struct pw_listener_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy) +struct spa_hook_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy) { return &proxy->proxy_listener_list; } diff --git a/src/pipewire/proxy.h b/src/pipewire/proxy.h index f31a84aff..aff3bfd04 100644 --- a/src/pipewire/proxy.h +++ b/src/pipewire/proxy.h @@ -106,13 +106,13 @@ pw_proxy_new(struct pw_proxy *factory, /**< factory */ void pw_proxy_add_listener(struct pw_proxy *proxy, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_proxy_events *events, void *data); void pw_proxy_add_proxy_listener(struct pw_proxy *proxy, /**< the proxy */ - struct pw_listener *listener, /**< listener */ + struct spa_hook *listener, /**< listener */ const void *events, /**< proxied events */ void *data /**< data passed to events */); @@ -124,11 +124,11 @@ uint32_t pw_proxy_get_id(struct pw_proxy *proxy); struct pw_protocol *pw_proxy_get_protocol(struct pw_proxy *proxy); -struct pw_listener_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy); +struct spa_hook_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy); const struct pw_protocol_marshal *pw_proxy_get_marshal(struct pw_proxy *proxy); -#define pw_proxy_notify(p,type,event,...) pw_listener_list_emit(pw_proxy_get_proxy_listeners(p),type,event,## __VA_ARGS__) +#define pw_proxy_notify(p,type,event,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,## __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 62cd7f306..7007e9f1d 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -42,7 +42,7 @@ struct remote { struct pw_remote this; uint32_t type_client_node; - struct pw_listener core_listener; + struct spa_hook core_listener; }; struct mem_id { @@ -75,10 +75,10 @@ struct node_data { struct spa_graph_port *out_ports; struct pw_node *node; - struct pw_listener node_listener; + struct spa_hook node_listener; struct pw_client_node_proxy *node_proxy; - struct pw_listener proxy_listener; + struct spa_hook proxy_listener; struct pw_array mem_ids; struct pw_array buffer_ids; @@ -129,7 +129,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; - pw_listener_list_emit(&remote->listener_list, struct pw_remote_events, state_changed, + spa_hook_list_call(&remote->listener_list, struct pw_remote_events, state_changed, old, state, remote->error); } } @@ -140,7 +140,7 @@ static void core_event_info(void *data, struct pw_core_info *info) pw_log_debug("got core info"); this->info = pw_core_info_update(this->info, info); - pw_listener_list_emit(&this->listener_list, struct pw_remote_events, info_changed, info); + spa_hook_list_call(&this->listener_list, struct pw_remote_events, info_changed, info); } static void core_event_done(void *data, uint32_t seq) @@ -151,7 +151,7 @@ static void core_event_done(void *data, uint32_t seq) if (seq == 0) pw_remote_update_state(this, PW_REMOTE_STATE_CONNECTED, NULL); - pw_listener_list_emit(&this->listener_list, struct pw_remote_events, sync_reply, seq); + spa_hook_list_call(&this->listener_list, struct pw_remote_events, sync_reply, seq); } static void core_event_error(void *data, uint32_t id, int res, const char *error, ...) @@ -228,7 +228,7 @@ struct pw_remote *pw_remote_new(struct pw_core *core, spa_list_init(&this->proxy_list); spa_list_init(&this->stream_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); if ((protocol_name = pw_properties_get(properties, "pipewire.protocol")) == NULL) { if (!pw_module_load(core, "libpipewire-module-protocol-native", NULL)) @@ -265,7 +265,7 @@ void pw_remote_destroy(struct pw_remote *remote) struct pw_stream *stream, *s2; pw_log_debug("remote %p: destroy", remote); - pw_listener_list_emit(&remote->listener_list, struct pw_remote_events, destroy); + spa_hook_list_call(&remote->listener_list, struct pw_remote_events, destroy); if (remote->state != PW_REMOTE_STATE_UNCONNECTED) pw_remote_disconnect(remote); @@ -296,11 +296,11 @@ enum pw_remote_state pw_remote_get_state(struct pw_remote *remote, const char ** } void pw_remote_add_listener(struct pw_remote *remote, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_remote_events *events, void *data) { - pw_listener_list_add(&remote->listener_list, listener, events, data); + spa_hook_list_append(&remote->listener_list, listener, events, data); } static int do_connect(struct pw_remote *remote) @@ -396,15 +396,26 @@ void pw_remote_disconnect(struct pw_remote *remote) pw_remote_update_state(remote, PW_REMOTE_STATE_UNCONNECTED, NULL); } +static int +do_remove_source(struct spa_loop *loop, + bool async, uint32_t seq, size_t size, const void *data, void *user_data) +{ + struct node_data *d = user_data; + + if (d->rtsocket_source) { + pw_loop_destroy_source(d->core->data_loop, d->rtsocket_source); + d->rtsocket_source = NULL; + } + return SPA_RESULT_OK; +} + static void unhandle_socket(struct pw_proxy *proxy) { struct node_data *data = proxy->user_data; - if (data->rtsocket_source) { - pw_loop_destroy_source(proxy->remote->core->data_loop, data->rtsocket_source); - data->rtsocket_source = NULL; - } + pw_loop_invoke(data->core->data_loop, + do_remove_source, 1, 0, NULL, true, data); } static void handle_rtnode_message(struct pw_proxy *proxy, struct pw_client_node_message *message) diff --git a/src/pipewire/remote.h b/src/pipewire/remote.h index bb61f7b41..e346d1431 100644 --- a/src/pipewire/remote.h +++ b/src/pipewire/remote.h @@ -149,7 +149,7 @@ enum pw_remote_state pw_remote_get_state(struct pw_remote *remote, const char ** /** Add listener for events */ void pw_remote_add_listener(struct pw_remote *remote, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_remote_events *events, void *data); diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index bb556cac0..9940b9c0a 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -51,8 +51,9 @@ struct pw_resource *pw_resource_new(struct pw_client *client, this->type = type; this->version = version; - pw_listener_list_init(&this->implementation_list); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->implementation_list); + spa_hook_list_append(&this->implementation_list, &this->implementation, NULL, NULL); + spa_hook_list_init(&this->listener_list); if (id == SPA_ID_INVALID) { id = pw_map_insert_new(&client->objects, this); @@ -65,10 +66,9 @@ struct pw_resource *pw_resource_new(struct pw_client *client, this->user_data = SPA_MEMBER(impl, sizeof(struct impl), void); this->marshal = pw_protocol_get_marshal(client->protocol, type); - pw_listener_list_add(&this->implementation_list, &this->implementation, NULL, NULL); pw_log_debug("resource %p: new for client %p id %u", this, client, id); - pw_listener_list_emit(&client->listener_list, struct pw_client_events, resource_added, this); + spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_added, this); return this; @@ -109,11 +109,11 @@ void *pw_resource_get_user_data(struct pw_resource *resource) } void pw_resource_add_listener(struct pw_resource *resource, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_resource_events *events, void *data) { - pw_listener_list_add(&resource->listener_list, listener, events, data); + spa_hook_list_append(&resource->listener_list, listener, events, data); } void pw_resource_set_implementation(struct pw_resource *resource, @@ -122,23 +122,21 @@ void pw_resource_set_implementation(struct pw_resource *resource, { struct pw_client *client = resource->client; - resource->implementation.events = implementation; + resource->implementation.funcs = implementation; resource->implementation.data = data; - pw_listener_list_emit(&client->listener_list, struct pw_client_events, resource_impl, resource); + spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_impl, resource); } void pw_resource_add_override(struct pw_resource *resource, - struct pw_listener *listener, + struct spa_hook *listener, const void *implementation, void *data) { - listener->events = implementation; - listener->data = data; - spa_list_insert(&resource->implementation_list.list, &listener->link); + spa_hook_list_prepend(&resource->implementation_list, listener, implementation, data); } -struct pw_listener_list *pw_resource_get_implementation(struct pw_resource *resource) +struct spa_hook_list *pw_resource_get_implementation(struct pw_resource *resource) { return &resource->implementation_list; } @@ -159,10 +157,10 @@ void pw_resource_destroy(struct pw_resource *resource) struct pw_client *client = resource->client; pw_log_trace("resource %p: destroy %u", resource, resource->id); - pw_listener_list_emit(&resource->listener_list, struct pw_resource_events, destroy); + spa_hook_list_call(&resource->listener_list, struct pw_resource_events, destroy); pw_map_insert_at(&client->objects, resource->id, NULL); - pw_listener_list_emit(&client->listener_list, struct pw_client_events, resource_removed, resource); + spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_removed, 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 b6aa74e38..a672d2ac4 100644 --- a/src/pipewire/resource.h +++ b/src/pipewire/resource.h @@ -91,7 +91,7 @@ struct pw_protocol *pw_resource_get_protocol(struct pw_resource *resource); void *pw_resource_get_user_data(struct pw_resource *resource); void pw_resource_add_listener(struct pw_resource *resource, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_resource_events *events, void *data); @@ -100,21 +100,24 @@ void pw_resource_set_implementation(struct pw_resource *resource, void *data); void pw_resource_add_override(struct pw_resource *resource, - struct pw_listener *listener, + struct spa_hook *listener, const void *implementation, void *data); void pw_resource_error(struct pw_resource *resource, int result, const char *error); -struct pw_listener_list *pw_resource_get_implementation(struct pw_resource *resource); +struct spa_hook_list *pw_resource_get_implementation(struct pw_resource *resource); const struct pw_protocol_marshal *pw_resource_get_marshal(struct pw_resource *resource); -#define pw_resource_do(r,type,method,...) pw_listener_list_emit_once(pw_resource_get_implementation(r),type,method,## __VA_ARGS__) +#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_parent(r,l,type,method,...) pw_listener_list_emit_once_start(pw_resource_get_implementation(r),l,type,method,## __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__) -#define pw_resource_notify(r,type,event,...) ((type*) pw_resource_get_marshal(r)->event_marshal)->event(r, ## __VA_ARGS__) +#define pw_resource_notify(r,type,event,...) \ + ((type*) pw_resource_get_marshal(r)->event_marshal)->event(r, ## __VA_ARGS__) #ifdef __cplusplus } diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 7b6582fee..825d9d72d 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -84,8 +84,8 @@ struct stream { struct pw_client_node_proxy *node_proxy; bool disconnecting; - struct pw_listener node_listener; - struct pw_listener proxy_listener; + struct spa_hook node_listener; + struct spa_hook proxy_listener; struct pw_client_node_transport *trans; @@ -130,7 +130,7 @@ static void clear_buffers(struct pw_stream *stream) pw_log_debug("stream %p: clear buffers", stream); pw_array_for_each(bid, &impl->buffer_ids) { - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, remove_buffer, bid->id); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, remove_buffer, bid->id); free(bid->buf); bid->buf = NULL; bid->used = false; @@ -154,7 +154,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; - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, state_changed, + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, state_changed, old, state, error); } return res; @@ -208,7 +208,7 @@ struct pw_stream *pw_stream_new(struct pw_remote *remote, this->name = strdup(name); impl->type_client_node = spa_type_map_get_id(remote->core->type.map, PW_TYPE_INTERFACE__ClientNode); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); this->state = PW_STREAM_STATE_UNCONNECTED; @@ -246,17 +246,21 @@ const struct pw_properties *pw_stream_get_properties(struct pw_stream *stream) } void pw_stream_add_listener(struct pw_stream *stream, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_stream_events *events, void *data) { - pw_listener_list_add(&stream->listener_list, listener, events, data); + spa_hook_list_append(&stream->listener_list, listener, events, data); } -static void unhandle_socket(struct pw_stream *stream) +static int +do_remove_sources(struct spa_loop *loop, + bool async, uint32_t seq, size_t size, const void *data, void *user_data) { - struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); + struct stream *impl = user_data; + struct pw_stream *stream = &impl->this; + printf("removing sources\n"); if (impl->rtsocket_source) { pw_loop_destroy_source(stream->remote->core->data_loop, impl->rtsocket_source); impl->rtsocket_source = NULL; @@ -265,6 +269,15 @@ static void unhandle_socket(struct pw_stream *stream) pw_loop_destroy_source(stream->remote->core->data_loop, impl->timeout_source); impl->timeout_source = NULL; } + return SPA_RESULT_OK; +} + +static void unhandle_socket(struct pw_stream *stream) +{ + struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); + + pw_loop_invoke(stream->remote->core->data_loop, + do_remove_sources, 1, 0, NULL, true, impl); } static void @@ -313,14 +326,14 @@ void pw_stream_destroy(struct pw_stream *stream) pw_log_debug("stream %p: destroy", stream); - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, destroy); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, destroy); unhandle_socket(stream); spa_list_remove(&stream->link); if (impl->node_proxy) - pw_listener_remove(&impl->proxy_listener); + spa_hook_remove(&impl->proxy_listener); set_possible_formats(stream, 0, NULL); set_params(stream, 0, NULL); @@ -476,7 +489,7 @@ static inline void reuse_buffer(struct pw_stream *stream, uint32_t id) pw_log_trace("stream %p: reuse buffer %u", stream, id); bid->used = false; spa_list_insert(impl->free.prev, &bid->link); - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, new_buffer, id); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, new_buffer, id); } } @@ -495,7 +508,7 @@ static void handle_rtnode_message(struct pw_stream *stream, struct pw_client_nod if (input->buffer_id == SPA_ID_INVALID) continue; - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, new_buffer, input->buffer_id); input->buffer_id = SPA_ID_INVALID; } @@ -514,7 +527,7 @@ static void handle_rtnode_message(struct pw_stream *stream, struct pw_client_nod } pw_log_trace("stream %p: process output", stream); impl->in_need_buffer = true; - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, need_buffer); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, need_buffer); impl->in_need_buffer = false; } else if (PW_CLIENT_NODE_MESSAGE_TYPE(message) == PW_CLIENT_NODE_MESSAGE_REUSE_BUFFER) { struct pw_client_node_message_reuse_buffer *p = @@ -608,7 +621,7 @@ handle_node_command(struct pw_stream *stream, uint32_t seq, const struct spa_com send_need_input(stream); else { impl->in_need_buffer = true; - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, need_buffer); impl->in_need_buffer = false; } @@ -672,7 +685,7 @@ client_node_set_format(void *data, impl->format = format ? spa_format_copy(format) : NULL; impl->pending_seq = seq; - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, format_changed, impl->format); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, format_changed, impl->format); if (format) stream_set_state(stream, PW_STREAM_STATE_READY, NULL); @@ -821,7 +834,7 @@ client_node_use_buffers(void *data, pw_log_warn("unknown buffer data type %d", d->type); } } - pw_listener_list_emit(&stream->listener_list, struct pw_stream_events, add_buffer, bid->id); + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, add_buffer, bid->id); } add_async_complete(stream, seq, SPA_RESULT_OK); @@ -891,7 +904,7 @@ static void on_node_proxy_destroy(void *data) impl->disconnecting = false; impl->node_proxy = NULL; - pw_listener_remove(&impl->proxy_listener); + spa_hook_remove(&impl->proxy_listener); stream_set_state(this, PW_STREAM_STATE_UNCONNECTED, NULL); } diff --git a/src/pipewire/stream.h b/src/pipewire/stream.h index cd4467e70..8629f6f39 100644 --- a/src/pipewire/stream.h +++ b/src/pipewire/stream.h @@ -239,7 +239,7 @@ pw_stream_new(struct pw_remote *remote, /**< a \ref pw_remote */ void pw_stream_destroy(struct pw_stream *stream); void pw_stream_add_listener(struct pw_stream *stream, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_stream_events *events, void *data); diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index b3df5a7ff..b22c8fc2a 100644 --- a/src/pipewire/thread-loop.c +++ b/src/pipewire/thread-loop.c @@ -27,7 +27,7 @@ struct pw_thread_loop { struct pw_loop *loop; char *name; - struct pw_listener_list listener_list; + struct spa_hook_list listener_list; pthread_mutex_t lock; pthread_cond_t cond; @@ -36,8 +36,7 @@ struct pw_thread_loop { bool running; pthread_t thread; - struct spa_loop_control_hooks hooks; - const struct spa_loop_control_hooks *old; + struct spa_hook hook; struct spa_source *event; @@ -46,21 +45,20 @@ struct pw_thread_loop { }; /** \endcond */ -static void before(const struct spa_loop_control_hooks *hooks) +static void before(void *data) { - struct pw_thread_loop *this = SPA_CONTAINER_OF(hooks, struct pw_thread_loop, hooks); + struct pw_thread_loop *this = data; pthread_mutex_unlock(&this->lock); } -static void after(const struct spa_loop_control_hooks *hooks) +static void after(void *data) { - struct pw_thread_loop *this = SPA_CONTAINER_OF(hooks, struct pw_thread_loop, hooks); + struct pw_thread_loop *this = data; pthread_mutex_lock(&this->lock); } static const struct spa_loop_control_hooks impl_hooks = { SPA_VERSION_LOOP_CONTROL_HOOKS, - { NULL, }, before, after, }; @@ -99,10 +97,9 @@ struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop, const char *name this->loop = loop; this->name = name ? strdup(name) : NULL; - this->hooks = impl_hooks; - pw_loop_add_hooks(loop, &this->hooks); + pw_loop_add_hook(loop, &this->hook, &impl_hooks, this); - pw_listener_list_init(&this->listener_list); + spa_hook_list_init(&this->listener_list); pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); @@ -118,7 +115,7 @@ struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop, const char *name /** Destroy a threaded loop \memberof pw_thread_loop */ void pw_thread_loop_destroy(struct pw_thread_loop *loop) { - pw_listener_list_emit(&loop->listener_list, struct pw_thread_loop_events, destroy); + spa_hook_list_call(&loop->listener_list, struct pw_thread_loop_events, destroy); pw_thread_loop_stop(loop); @@ -128,17 +125,17 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop) pthread_cond_destroy(&loop->cond); pthread_cond_destroy(&loop->accept_cond); - spa_list_remove(&loop->hooks.link); + spa_hook_remove(&loop->hook); free(loop); } void pw_thread_loop_add_listener(struct pw_thread_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_thread_loop_events *events, void *data) { - pw_listener_list_add(&loop->listener_list, listener, events, data); + spa_hook_list_append(&loop->listener_list, listener, events, data); } struct pw_loop * diff --git a/src/pipewire/thread-loop.h b/src/pipewire/thread-loop.h index c1551b88c..d7c4a28e7 100644 --- a/src/pipewire/thread-loop.h +++ b/src/pipewire/thread-loop.h @@ -103,7 +103,7 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop); void pw_thread_loop_add_listener(struct pw_thread_loop *loop, - struct pw_listener *listener, + struct spa_hook *listener, const struct pw_thread_loop_events *events, void *data); struct pw_loop * diff --git a/src/tools/pipewire-monitor.c b/src/tools/pipewire-monitor.c index 7b6c772df..d8e0cc76e 100644 --- a/src/tools/pipewire-monitor.c +++ b/src/tools/pipewire-monitor.c @@ -31,12 +31,12 @@ struct data { struct pw_core *core; struct pw_remote *remote; - struct pw_listener remote_listener; + struct spa_hook remote_listener; struct pw_core_proxy *core_proxy; struct pw_registry_proxy *registry_proxy; - struct pw_listener registry_listener; + struct spa_hook registry_listener; }; struct proxy_data { @@ -48,8 +48,8 @@ struct proxy_data { uint32_t type; void *info; pw_destroy_t destroy; - struct pw_listener proxy_listener; - struct pw_listener proxy_proxy_listener; + struct spa_hook proxy_listener; + struct spa_hook proxy_proxy_listener; }; static void print_properties(struct spa_dict *props, char mark)