mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
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
This commit is contained in:
parent
6b6b827a3b
commit
600055bd68
55 changed files with 428 additions and 383 deletions
93
spa/include/spa/hook.h
Normal file
93
spa/include/spa/hook.h
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/* SPA
|
||||
* Copyright (C) 2017 Wim Taymans <wim.taymans@gmail.com>
|
||||
*
|
||||
* 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 <spa/list.h>
|
||||
|
||||
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__ */
|
||||
|
|
@ -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); \
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ struct spa_loop_utils;
|
|||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/list.h>
|
||||
#include <spa/hook.h>
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <spa/defs.h>
|
||||
#include <pipewire/listener.h>
|
||||
#include <spa/hook.h>
|
||||
|
||||
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 *
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ struct pw_client;
|
|||
#include <pipewire/core.h>
|
||||
#include <pipewire/introspect.h>
|
||||
#include <pipewire/properties.h>
|
||||
#include <pipewire/listener.h>
|
||||
#include <pipewire/resource.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
#include <spa/format-utils.h>
|
||||
|
||||
#include <pipewire/pipewire.h>
|
||||
#include <pipewire/listener.h>
|
||||
#include <pipewire/private.h>
|
||||
#include <pipewire/interfaces.h>
|
||||
#include <pipewire/protocol.h>
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <spa/log.h>
|
||||
#include <spa/graph-scheduler3.h>
|
||||
#include <spa/hook.h>
|
||||
|
||||
struct pw_global;
|
||||
|
||||
|
|
@ -41,7 +41,6 @@ struct pw_global;
|
|||
struct pw_core;
|
||||
|
||||
#include <pipewire/type.h>
|
||||
#include <pipewire/listener.h>
|
||||
#include <pipewire/loop.h>
|
||||
#include <pipewire/client.h>
|
||||
#include <pipewire/port.h>
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ extern "C" {
|
|||
struct pw_data_loop;
|
||||
|
||||
#include <pipewire/loop.h>
|
||||
#include <pipewire/listener.h>
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,84 +0,0 @@
|
|||
/* PipeWire
|
||||
* Copyright (C) 2017 Wim Taymans <wim.taymans@gmail.com>
|
||||
*
|
||||
* 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 <spa/list.h>
|
||||
|
||||
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__ */
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -34,12 +34,12 @@ extern "C" {
|
|||
struct pw_main_loop;
|
||||
|
||||
#include <pipewire/loop.h>
|
||||
#include <pipewire/listener.h>
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ pipewire_headers = [
|
|||
'interfaces.h',
|
||||
'introspect.h',
|
||||
'link.h',
|
||||
'listener.h',
|
||||
'log.h',
|
||||
'loop.h',
|
||||
'main-loop.h',
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ extern "C" {
|
|||
#include <pipewire/proxy.h>
|
||||
#include <pipewire/remote.h>
|
||||
#include <pipewire/resource.h>
|
||||
#include <pipewire/listener.h>
|
||||
#include <pipewire/stream.h>
|
||||
#include <pipewire/thread-loop.h>
|
||||
#include <pipewire/type.h>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <spa/graph-scheduler3.h>
|
||||
|
||||
#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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue