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)