hooks: enforce version on hook emission

Pass the minimum required version to the hook emission and only call
events when the handler is recent enough.
Add some macros to make event emission easier to read.
This commit is contained in:
Wim Taymans 2018-08-01 21:41:25 +02:00
parent a72e3cefd7
commit a63523650d
27 changed files with 250 additions and 155 deletions

View file

@ -113,6 +113,9 @@ struct spa_loop_control_hooks {
void (*after) (void *data);
};
#define spa_loop_control_hook_before(l) spa_hook_list_call(l, struct spa_loop_control_hooks, before, 0)
#define spa_loop_control_hook_after(l) spa_hook_list_call(l, struct spa_loop_control_hooks, after, 0)
/**
* Control an event loop
*/

View file

@ -43,7 +43,9 @@ struct spa_hook {
struct spa_list link;
const void *funcs;
void *data;
void *priv[2]; /**< private data for the hook list */
void *priv; /**< private data for the hook list */
void (*removed) (struct spa_hook *hook);
};
/** Initialize a hook list */
@ -76,12 +78,14 @@ static inline void spa_hook_list_prepend(struct spa_hook_list *list,
static inline void spa_hook_remove(struct spa_hook *hook)
{
spa_list_remove(&hook->link);
if (hook->removed)
hook->removed(hook);
}
/** Call all hooks in a list, starting from the given one and optionally stopping
* after calling the first non-NULL function, returns the number of methods
* called */
#define spa_hook_list_do_call(l,start,type,method,once,...) \
#define spa_hook_list_do_call(l,start,type,method,vers,once,...) \
({ \
struct spa_hook_list *list = l; \
struct spa_list *s = start ? (struct spa_list *)start : &list->list; \
@ -95,7 +99,7 @@ static inline void spa_hook_remove(struct spa_hook *hook)
const type *cb = ci->funcs; \
spa_list_remove(&ci->link); \
spa_list_append(&cursor.link, &ci->link); \
if (cb && cb->method) { \
if (cb && cb->version >= vers && cb->method) { \
cb->method(ci->data, ## __VA_ARGS__); \
count++; \
if (once) \
@ -106,11 +110,11 @@ static inline void spa_hook_remove(struct spa_hook *hook)
count; \
})
#define spa_hook_list_call(l,t,m,...) spa_hook_list_do_call(l,NULL,t,m,false,##__VA_ARGS__)
#define spa_hook_list_call_once(l,t,m,...) spa_hook_list_do_call(l,NULL,t,m,true,##__VA_ARGS__)
#define spa_hook_list_call(l,t,m,v,...) spa_hook_list_do_call(l,NULL,t,m,v,false,##__VA_ARGS__)
#define spa_hook_list_call_once(l,t,m,v,...) spa_hook_list_do_call(l,NULL,t,m,v,true,##__VA_ARGS__)
#define spa_hook_list_call_start(l,s,t,m,...) spa_hook_list_do_call(l,s,t,m,false,##__VA_ARGS__)
#define spa_hook_list_call_once_start(l,s,t,m,...) spa_hook_list_do_call(l,s,t,m,true,##__VA_ARGS__)
#define spa_hook_list_call_start(l,s,t,m,v,...) spa_hook_list_do_call(l,s,t,m,v,false,##__VA_ARGS__)
#define spa_hook_list_call_once_start(l,s,t,m,v,...) spa_hook_list_do_call(l,s,t,m,v,true,##__VA_ARGS__)
#ifdef __cplusplus
}

View file

@ -250,13 +250,13 @@ loop_invoke(struct spa_loop *loop,
if (block) {
uint64_t count = 1;
spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, before);
spa_loop_control_hook_before(&impl->hooks_list);
if (read(impl->ack_fd, &count, sizeof(uint64_t)) != sizeof(uint64_t))
spa_log_warn(impl->log, NAME " %p: failed to read event fd: %s",
impl, strerror(errno));
spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, after);
spa_loop_control_hook_after(&impl->hooks_list);
res = item->res;
}
@ -340,12 +340,12 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout)
struct epoll_event ep[32];
int i, nfds, save_errno = 0;
spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, before);
spa_loop_control_hook_before(&impl->hooks_list);
if (SPA_UNLIKELY((nfds = epoll_wait(impl->epoll_fd, ep, SPA_N_ELEMENTS(ep), timeout)) < 0))
save_errno = errno;
spa_hook_list_call(&impl->hooks_list, struct spa_loop_control_hooks, after);
spa_loop_control_hook_after(&impl->hooks_list);
if (SPA_UNLIKELY(nfds < 0))
return save_errno;

View file

@ -183,7 +183,7 @@ static int client_node_demarshal_add_mem(void *object, void *data, size_t size)
memfd = pw_protocol_native_get_proxy_fd(proxy, memfd_idx);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_mem,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_mem, 0,
mem_id,
type,
memfd, flags);
@ -211,7 +211,7 @@ static int client_node_demarshal_transport(void *object, void *data, size_t size
if (readfd == -1 || writefd == -1)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, transport, node_id,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, transport, 0, node_id,
readfd, writefd);
return 0;
}
@ -232,7 +232,7 @@ static int client_node_demarshal_set_param(void *object, void *data, size_t size
"O", &param, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_param, seq, id, flags, param);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_param, 0, seq, id, flags, param);
return 0;
}
@ -246,7 +246,7 @@ static int client_node_demarshal_event_event(void *object, void *data, size_t si
if (spa_pod_parser_get(&prs, "[ O", &event, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, event, event);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, event, 0, event);
return 0;
}
@ -264,7 +264,7 @@ static int client_node_demarshal_command(void *object, void *data, size_t size)
"O", &command, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, command, seq, command);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, command, 0, seq, command);
return 0;
}
@ -282,7 +282,7 @@ static int client_node_demarshal_add_port(void *object, void *data, size_t size)
"i", &port_id, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, seq, direction, port_id);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, add_port, 0, seq, direction, port_id);
return 0;
}
@ -300,7 +300,7 @@ static int client_node_demarshal_remove_port(void *object, void *data, size_t si
"i", &port_id, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, remove_port, seq, direction, port_id);
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, remove_port, 0, seq, direction, port_id);
return 0;
}
@ -322,7 +322,7 @@ static int client_node_demarshal_port_set_param(void *object, void *data, size_t
"O", &param, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_param,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_param, 0,
seq, direction, port_id, id, flags, param);
return 0;
}
@ -384,7 +384,7 @@ static int client_node_demarshal_port_use_buffers(void *object, void *data, size
d->data = SPA_UINT32_TO_PTR(data_id);
}
}
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_use_buffers, seq,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_use_buffers, 0, seq,
direction,
port_id,
mix_id,
@ -407,7 +407,7 @@ static int client_node_demarshal_port_command(void *object, void *data, size_t s
"O", &command, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_command, direction,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_command, 0, direction,
port_id,
command);
return 0;
@ -432,7 +432,7 @@ static int client_node_demarshal_port_set_io(void *object, void *data, size_t si
"i", &sz, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_io,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, port_set_io, 0,
seq,
direction, port_id, mix_id,
id, memid,
@ -455,7 +455,7 @@ static int client_node_demarshal_set_io(void *object, void *data, size_t size)
"i", &sz, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_io,
pw_proxy_notify(proxy, struct pw_client_node_proxy_events, set_io, 0,
id, memid, off, sz);
return 0;
}
@ -731,7 +731,7 @@ static int client_node_demarshal_done(void *object, void *data, size_t size)
"i", &res, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_client_node_proxy_methods, done, seq, res);
pw_resource_do(resource, struct pw_client_node_proxy_methods, done, 0, seq, res);
return 0;
}
@ -771,7 +771,7 @@ static int client_node_demarshal_update(void *object, void *data, size_t size)
return -EINVAL;
}
pw_resource_do(resource, struct pw_client_node_proxy_methods, update, change_mask,
pw_resource_do(resource, struct pw_client_node_proxy_methods, update, 0, change_mask,
max_input_ports,
max_output_ports,
n_params,
@ -834,7 +834,7 @@ static int client_node_demarshal_port_update(void *object, void *data, size_t si
}
}
pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, direction,
pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, 0, direction,
port_id,
change_mask,
n_params,
@ -854,7 +854,7 @@ static int client_node_demarshal_set_active(void *object, void *data, size_t siz
"b", &active, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_client_node_proxy_methods, set_active, active);
pw_resource_do(resource, struct pw_client_node_proxy_methods, set_active, 0, active);
return 0;
}
@ -870,7 +870,7 @@ static int client_node_demarshal_event_method(void *object, void *data, size_t s
"O", &event, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_client_node_proxy_methods, event, event);
pw_resource_do(resource, struct pw_client_node_proxy_methods, event, 0, event);
return 0;
}
@ -883,7 +883,7 @@ static int client_node_demarshal_destroy(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[", NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_client_node_proxy_methods, destroy);
pw_resource_do(resource, struct pw_client_node_proxy_methods, destroy, 0);
return 0;
}

View file

@ -118,7 +118,7 @@ static void *connection_ensure_size(struct pw_protocol_native_connection *conn,
buf->buffer_data = realloc(buf->buffer_data, buf->buffer_maxsize);
if (buf->buffer_data == NULL) {
buf->buffer_maxsize = 0;
spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, error, -ENOMEM);
spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, error, 0, -ENOMEM);
return NULL;
}
pw_log_warn("connection %p: resize buffer to %zd %zd %zd",
@ -241,7 +241,7 @@ void pw_protocol_native_connection_destroy(struct pw_protocol_native_connection
pw_log_debug("connection %p: destroy", conn);
spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy);
spa_hook_list_call(&conn->listener_list, struct pw_protocol_native_connection_events, destroy, 0);
free(impl->out.buffer_data);
free(impl->in.buffer_data);
@ -435,7 +435,7 @@ pw_protocol_native_connection_end(struct pw_protocol_native_connection *conn,
spa_debug_pod((struct spa_pod *)p, 0);
}
spa_hook_list_call(&conn->listener_list,
struct pw_protocol_native_connection_events, need_flush);
struct pw_protocol_native_connection_events, need_flush, 0);
}
/** Flush the connection object

View file

@ -29,6 +29,8 @@ extern "C" {
struct pw_protocol_native_connection_events {
#define PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS 0
uint32_t version;
void (*destroy) (void *data);
void (*error) (void *data, int error);

View file

@ -210,7 +210,7 @@ static int core_demarshal_info(void *object, void *data, size_t size)
NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_core_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_core_proxy_events, info, 0, &info);
return 0;
}
@ -224,7 +224,7 @@ static int core_demarshal_done(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[ i", &seq, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_core_proxy_events, done, seq);
pw_proxy_notify(proxy, struct pw_core_proxy_events, done, 0, seq);
return 0;
}
@ -242,7 +242,7 @@ static int core_demarshal_error(void *object, void *data, size_t size)
"s", &error, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_core_proxy_events, error, id, res, error);
pw_proxy_notify(proxy, struct pw_core_proxy_events, error, 0, id, res, error);
return 0;
}
@ -256,7 +256,7 @@ static int core_demarshal_remove_id(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[ i", &id, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_core_proxy_events, remove_id, id);
pw_proxy_notify(proxy, struct pw_core_proxy_events, remove_id, 0, id);
return 0;
}
@ -280,7 +280,7 @@ static int core_demarshal_update_types_client(void *object, void *data, size_t s
if (spa_pod_parser_get(&prs, "s", &types[i], NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_core_proxy_events, update_types, first_id, types, n_types);
pw_proxy_notify(proxy, struct pw_core_proxy_events, update_types, 0, first_id, types, n_types);
return 0;
}
@ -401,7 +401,7 @@ static int core_demarshal_client_update(void *object, void *data, size_t size)
NULL) < 0)
return -EINVAL;
}
pw_resource_do(resource, struct pw_core_proxy_methods, client_update, &props);
pw_resource_do(resource, struct pw_core_proxy_methods, client_update, 0, &props);
return 0;
}
@ -424,7 +424,7 @@ static int core_demarshal_permissions(void *object, void *data, size_t size)
NULL) < 0)
return -EINVAL;
}
pw_resource_do(resource, struct pw_core_proxy_methods, permissions, &props);
pw_resource_do(resource, struct pw_core_proxy_methods, permissions, 0, &props);
return 0;
}
@ -438,7 +438,7 @@ static int core_demarshal_hello(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[P]", &ptr, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_core_proxy_methods, hello);
pw_resource_do(resource, struct pw_core_proxy_methods, hello, 0);
return 0;
}
@ -452,7 +452,7 @@ static int core_demarshal_sync(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[i]", &seq, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_core_proxy_methods, sync, seq);
pw_resource_do(resource, struct pw_core_proxy_methods, sync, 0, seq);
return 0;
}
@ -466,7 +466,7 @@ static int core_demarshal_get_registry(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[ii]", &version, &new_id, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_core_proxy_methods, get_registry, version, new_id);
pw_resource_do(resource, struct pw_core_proxy_methods, get_registry, 0, version, new_id);
return 0;
}
@ -496,7 +496,7 @@ static int core_demarshal_create_object(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "i", &new_id, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_core_proxy_methods, create_object, factory_name,
pw_resource_do(resource, struct pw_core_proxy_methods, create_object, 0, factory_name,
type, version,
&props, new_id);
return 0;
@ -512,7 +512,7 @@ static int core_demarshal_destroy(void *object, void *data, size_t size)
if (spa_pod_parser_get(&prs, "[i]", &id, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_core_proxy_methods, destroy, id);
pw_resource_do(resource, struct pw_core_proxy_methods, destroy, 0, id);
return 0;
}
@ -536,7 +536,7 @@ static int core_demarshal_update_types_server(void *object, void *data, size_t s
if (spa_pod_parser_get(&prs, "s", &types[i], NULL) < 0)
return -EINVAL;
}
pw_resource_do(resource, struct pw_core_proxy_methods, update_types, first_id, types, n_types);
pw_resource_do(resource, struct pw_core_proxy_methods, update_types, 0, first_id, types, n_types);
return 0;
}
@ -597,7 +597,7 @@ static int registry_demarshal_bind(void *object, void *data, size_t size)
"i", &new_id, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_registry_proxy_methods, bind, id, type, version, new_id);
pw_resource_do(resource, struct pw_registry_proxy_methods, bind, 0, id, type, version, new_id);
return 0;
}
@ -656,7 +656,7 @@ static int module_demarshal_info(void *object, void *data, size_t size)
&props.items[i].key, &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_module_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_module_proxy_events, info, 0, &info);
return 0;
}
@ -716,7 +716,7 @@ static int factory_demarshal_info(void *object, void *data, size_t size)
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_factory_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_factory_proxy_events, info, 0, &info);
return 0;
}
@ -784,7 +784,7 @@ static int node_demarshal_info(void *object, void *data, size_t size)
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_node_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_node_proxy_events, info, 0, &info);
return 0;
}
@ -816,7 +816,7 @@ static int node_demarshal_param(void *object, void *data, size_t size)
"P", &param, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_node_proxy_events, param, id, index, next, param);
pw_proxy_notify(proxy, struct pw_node_proxy_events, param, 0, id, index, next, param);
return 0;
}
@ -852,7 +852,7 @@ static int node_demarshal_enum_params(void *object, void *data, size_t size)
"P", &filter, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_node_proxy_methods, enum_params, id, index, num, filter);
pw_resource_do(resource, struct pw_node_proxy_methods, enum_params, 0, id, index, num, filter);
return 0;
}
@ -908,7 +908,7 @@ static int port_demarshal_info(void *object, void *data, size_t size)
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_port_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_port_proxy_events, info, 0, &info);
return 0;
}
@ -940,7 +940,7 @@ static int port_demarshal_param(void *object, void *data, size_t size)
"P", &param, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_port_proxy_events, param, id, index, next, param);
pw_proxy_notify(proxy, struct pw_port_proxy_events, param, 0, id, index, next, param);
return 0;
}
@ -976,7 +976,7 @@ static int port_demarshal_enum_params(void *object, void *data, size_t size)
"P", &filter, NULL) < 0)
return -EINVAL;
pw_resource_do(resource, struct pw_port_proxy_methods, enum_params, id, index, num, filter);
pw_resource_do(resource, struct pw_port_proxy_methods, enum_params, 0, id, index, num, filter);
return 0;
}
@ -1030,7 +1030,7 @@ static int client_demarshal_info(void *object, void *data, size_t size)
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_client_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_client_proxy_events, info, 0, &info);
return 0;
}
@ -1094,7 +1094,7 @@ static int link_demarshal_info(void *object, void *data, size_t size)
"s", &props.items[i].value, NULL) < 0)
return -EINVAL;
}
pw_proxy_notify(proxy, struct pw_link_proxy_events, info, &info);
pw_proxy_notify(proxy, struct pw_link_proxy_events, info, 0, &info);
return 0;
}
@ -1125,7 +1125,7 @@ static int registry_demarshal_global(void *object, void *data, size_t size)
}
pw_proxy_notify(proxy, struct pw_registry_proxy_events,
global, id, parent_id, permissions, type, version,
global, 0, id, parent_id, permissions, type, version,
props.n_items > 0 ? &props : NULL);
return 0;
}
@ -1140,7 +1140,7 @@ static int registry_demarshal_global_remove(void *object, void *data, size_t siz
if (spa_pod_parser_get(&prs, "[ i", &id, NULL) < 0)
return -EINVAL;
pw_proxy_notify(proxy, struct pw_registry_proxy_events, global_remove, id);
pw_proxy_notify(proxy, struct pw_registry_proxy_events, global_remove, 0, id);
return 0;
}

View file

@ -285,6 +285,7 @@ static void destroy_resource(void *object, void *data)
pw_resource_destroy(object);
}
/** Destroy a client object
*
* \param client the client to destroy
@ -297,7 +298,7 @@ void pw_client_destroy(struct pw_client *client)
struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
pw_log_debug("client %p: destroy", client);
spa_hook_list_call(&client->listener_list, struct pw_client_events, destroy);
pw_client_events_destroy(client);
spa_hook_remove(&impl->core_listener);
@ -314,7 +315,7 @@ void pw_client_destroy(struct pw_client *client)
pw_map_for_each(&client->objects, destroy_resource, client);
spa_hook_list_call(&client->listener_list, struct pw_client_events, free);
pw_client_events_free(client);
pw_log_debug("client %p: free", impl);
pw_map_clear(&client->objects);
@ -369,8 +370,7 @@ int pw_client_update_properties(struct pw_client *client, const struct spa_dict
client->info.change_mask |= PW_CLIENT_CHANGE_MASK_PROPS;
client->info.props = client->properties ? &client->properties->dict : NULL;
spa_hook_list_call(&client->listener_list, struct pw_client_events,
info_changed, &client->info);
pw_client_events_info_changed(client, &client->info);
spa_list_for_each(resource, &client->resource_list, link)
pw_client_resource_info(resource, &client->info);
@ -504,6 +504,6 @@ void pw_client_set_busy(struct pw_client *client, bool busy)
if (client->busy != busy) {
pw_log_debug("client %p: busy %d", client, busy);
client->busy = busy;
spa_hook_list_call(&client->listener_list, struct pw_client_events, busy_changed, busy);
pw_client_events_busy_changed(client, busy);
}
}

View file

@ -72,7 +72,7 @@ pw_control_new(struct pw_core *core,
spa_list_append(&core->control_list[direction], &this->link);
if (port) {
spa_list_append(&port->control_list[direction], &this->port_link);
spa_hook_list_call(&port->listener_list, struct pw_port_events, control_added, this);
pw_port_events_control_added(port, this);
}
return this;
@ -90,7 +90,7 @@ void pw_control_destroy(struct pw_control *control)
pw_log_debug("control %p: destroy", control);
spa_hook_list_call(&control->listener_list, struct pw_control_events, destroy);
pw_control_events_destroy(control);
if (control->direction == SPA_DIRECTION_OUTPUT) {
spa_list_for_each_safe(other, tmp, &control->inputs, inputs_link)
@ -105,12 +105,11 @@ void pw_control_destroy(struct pw_control *control)
if (control->port) {
spa_list_remove(&control->port_link);
spa_hook_list_call(&control->port->listener_list,
struct pw_port_events, control_removed, control);
pw_port_events_control_removed(control->port, control);
}
pw_log_debug("control %p: free", control);
spa_hook_list_call(&control->listener_list, struct pw_control_events, free);
pw_control_events_free(control);
if (control->direction == SPA_DIRECTION_OUTPUT) {
if (impl->mem)
@ -203,8 +202,8 @@ int pw_control_link(struct pw_control *control, struct pw_control *other)
other->output = control;
spa_list_append(&control->inputs, &other->inputs_link);
spa_hook_list_call(&control->listener_list, struct pw_control_events, linked, other);
spa_hook_list_call(&other->listener_list, struct pw_control_events, linked, control);
pw_control_events_linked(control, other);
pw_control_events_linked(other, control);
exit:
return res;
@ -249,8 +248,8 @@ int pw_control_unlink(struct pw_control *control, struct pw_control *other)
}
}
spa_hook_list_call(&control->listener_list, struct pw_control_events, unlinked, other);
spa_hook_list_call(&other->listener_list, struct pw_control_events, unlinked, control);
pw_control_events_unlinked(control, other);
pw_control_events_unlinked(other, control);
return res;
}

View file

@ -475,7 +475,7 @@ void pw_core_destroy(struct pw_core *core)
struct pw_node *node, *tn;
pw_log_debug("core %p: destroy", core);
spa_hook_list_call(&core->listener_list, struct pw_core_events, destroy);
pw_core_events_destroy(core);
spa_hook_remove(&core->global_listener);
@ -491,7 +491,7 @@ void pw_core_destroy(struct pw_core *core)
spa_list_for_each_safe(global, t, &core->global_list, link)
pw_global_destroy(global);
spa_hook_list_call(&core->listener_list, struct pw_core_events, free);
pw_core_events_free(core);
pw_data_loop_destroy(core->data_loop_impl);
@ -562,8 +562,7 @@ int pw_core_update_properties(struct pw_core *core, const struct spa_dict *dict)
core->info.change_mask = PW_CORE_CHANGE_MASK_PROPS;
core->info.props = &core->properties->dict;
spa_hook_list_call(&core->listener_list, struct pw_core_events,
info_changed, &core->info);
pw_core_events_info_changed(core, &core->info);
spa_list_for_each(resource, &core->resource_list, link)
pw_core_resource_info(resource, &core->info);

View file

@ -89,7 +89,7 @@ void pw_data_loop_destroy(struct pw_data_loop *loop)
{
pw_log_debug("data-loop %p: destroy", loop);
spa_hook_list_call(&loop->listener_list, struct pw_data_loop_events, destroy);
pw_data_loop_events_destroy(loop);
pw_data_loop_stop(loop);

View file

@ -58,7 +58,7 @@ struct pw_factory *pw_factory_new(struct pw_core *core,
void pw_factory_destroy(struct pw_factory *factory)
{
pw_log_debug("factory %p: destroy", factory);
spa_hook_list_call(&factory->listener_list, struct pw_factory_events, destroy);
pw_factory_events_destroy(factory);
if (factory->registered)
spa_list_remove(&factory->link);

View file

@ -134,10 +134,10 @@ pw_global_register(struct pw_global *global,
&global->properties->dict : NULL);
}
spa_hook_list_call(&global->listener_list, struct pw_global_events, registering);
pw_global_events_registering(global);
pw_log_debug("global %p: add %u owner %p parent %p", global, global->id, owner, parent);
spa_hook_list_call(&core->listener_list, struct pw_core_events, global_added, global);
pw_core_events_global_added(core, global);
return 0;
}
@ -159,8 +159,7 @@ static int global_unregister(struct pw_global *global)
}
spa_list_remove(&global->link);
spa_hook_list_call(&core->listener_list, struct pw_core_events,
global_removed, global);
pw_core_events_global_removed(core, global);
impl->registered = false;
@ -237,8 +236,7 @@ pw_global_bind(struct pw_global *global, struct pw_client *client, uint32_t perm
if (global->version < version)
goto wrong_version;
spa_hook_list_call(&global->listener_list, struct pw_global_events, bind,
client, permissions, version, id);
pw_global_events_bind(global, client, permissions, version, id);
return 0;
@ -264,12 +262,12 @@ void pw_global_destroy(struct pw_global *global)
global_unregister(global);
pw_log_debug("global %p: destroy %u", global, global->id);
spa_hook_list_call(&global->listener_list, struct pw_global_events, destroy);
pw_global_events_destroy(global);
pw_map_remove(&core->globals, global->id);
pw_log_debug("global %p: free", global);
spa_hook_list_call(&global->listener_list, struct pw_global_events, free);
pw_global_events_free(global);
if (global->properties)
pw_properties_free(global->properties);

View file

@ -83,8 +83,7 @@ static void pw_link_update_state(struct pw_link *link, enum pw_link_state state,
free(link->error);
link->error = error;
spa_hook_list_call(&link->listener_list, struct pw_link_events,
state_changed, old, state, error);
pw_link_events_state_changed(link, old, state, error);
pw_log_debug("link %p: %d %d %d %d", link,
out->n_ready_output_links, out->n_used_output_links,
@ -262,8 +261,7 @@ static int do_negotiate(struct pw_link *this, uint32_t in_state, uint32_t out_st
if (changed) {
this->info.change_mask |= PW_LINK_CHANGE_MASK_FORMAT;
spa_hook_list_call(&this->listener_list, struct pw_link_events,
info_changed, &this->info);
pw_link_events_info_changed(this, &this->info);
spa_list_for_each(resource, &this->resource_list, link)
pw_link_resource_info(resource, &this->info);
@ -942,7 +940,7 @@ static void input_remove(struct pw_link *this, struct pw_port *port)
spa_hook_remove(&impl->input_node_listener);
spa_list_remove(&this->input_link);
spa_hook_list_call(&this->input->listener_list, struct pw_port_events, link_removed, this);
pw_port_events_link_removed(this->input, this);
clear_port_buffers(this, port);
@ -961,7 +959,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port)
spa_hook_remove(&impl->output_node_listener);
spa_list_remove(&this->output_link);
spa_hook_list_call(&this->output->listener_list, struct pw_port_events, link_removed, this);
pw_port_events_link_removed(this->output, this);
clear_port_buffers(this, port);
@ -972,7 +970,7 @@ static void output_remove(struct pw_link *this, struct pw_port *port)
static void on_port_destroy(struct pw_link *this, struct pw_port *port)
{
spa_hook_list_call(&this->listener_list, struct pw_link_events, port_unlinked, port);
pw_link_events_port_unlinked(this, port);
pw_link_update_state(this, PW_LINK_STATE_UNLINKED, NULL);
pw_link_destroy(this);
@ -1263,8 +1261,8 @@ struct pw_link *pw_link_new(struct pw_core *core,
find_driver(this);
spa_hook_list_call(&output->listener_list, struct pw_port_events, link_added, this);
spa_hook_list_call(&input->listener_list, struct pw_port_events, link_added, this);
spa_hook_list_call(&output->listener_list, struct pw_port_events, link_added, 0, this);
spa_hook_list_call(&input->listener_list, struct pw_port_events, link_added, 0, this);
return this;
@ -1360,7 +1358,7 @@ void pw_link_destroy(struct pw_link *link)
struct pw_resource *resource, *tmp;
pw_log_debug("link %p: destroy", impl);
spa_hook_list_call(&link->listener_list, struct pw_link_events, destroy);
pw_link_events_destroy(link);
pw_link_deactivate(link);
@ -1379,7 +1377,7 @@ void pw_link_destroy(struct pw_link *link)
pw_resource_destroy(resource);
pw_log_debug("link %p: free", impl);
spa_hook_list_call(&link->listener_list, struct pw_link_events, free);
pw_link_events_free(link);
pw_work_queue_destroy(impl->work);

View file

@ -66,7 +66,7 @@ struct pw_main_loop *pw_main_loop_new(struct pw_properties *properties)
void pw_main_loop_destroy(struct pw_main_loop *loop)
{
pw_log_debug("main-loop %p: destroy", loop);
spa_hook_list_call(&loop->listener_list, struct pw_main_loop_events, destroy);
pw_main_loop_events_destroy(loop);
pw_loop_destroy(loop->loop);

View file

@ -302,7 +302,7 @@ void pw_module_destroy(struct pw_module *module)
struct pw_resource *resource, *tmp;
pw_log_debug("module %p: destroy", module);
spa_hook_list_call(&module->listener_list, struct pw_module_events, destroy);
pw_module_events_destroy(module);
spa_list_remove(&module->link);

View file

@ -371,7 +371,7 @@ int pw_node_register(struct pw_node *this,
int pw_node_initialized(struct pw_node *this)
{
pw_log_debug("node %p initialized", this);
spa_hook_list_call(&this->listener_list, struct pw_node_events, initialized);
pw_node_events_initialized(this);
pw_node_update_state(this, PW_NODE_STATE_SUSPENDED, NULL);
return 0;
}
@ -415,15 +415,14 @@ int pw_node_set_driver(struct pw_node *node, struct pw_node *driver)
spa_list_remove(&n->driver_link);
spa_list_append(&driver->driver_list, &n->driver_link);
n->driver_node = driver;
spa_hook_list_call(&n->listener_list, struct pw_node_events,
driver_changed, driver);
pw_node_events_driver_changed(n, driver);
pw_log_debug("node %p: add %p", driver, n);
}
pw_loop_invoke(node->data_loop,
do_move_nodes, SPA_ID_INVALID, &driver, sizeof(struct pw_node *),
true, impl);
spa_hook_list_call(&node->listener_list, struct pw_node_events, driver_changed, driver);
pw_node_events_driver_changed(node, driver);
return 0;
}
@ -454,7 +453,7 @@ static inline int driver_impl_finish(void *data)
struct pw_node *this = &impl->this;
pw_log_trace("graph %p finish %p", d->graph, impl);
spa_hook_list_call(&this->listener_list, struct pw_node_events, finish);
pw_node_events_finish(this);
return 0;
}
@ -585,8 +584,7 @@ int pw_node_update_properties(struct pw_node *node, const struct spa_dict *dict)
node->info.props = &node->properties->dict;
node->info.change_mask |= PW_NODE_CHANGE_MASK_PROPS;
spa_hook_list_call(&node->listener_list, struct pw_node_events,
info_changed, &node->info);
pw_node_events_info_changed(node, &node->info);
spa_list_for_each(resource, &node->resource_list, link)
pw_node_resource_info(resource, &node->info);
@ -603,7 +601,7 @@ static void node_done(void *data, int seq, int res)
pw_log_debug("node %p: async complete event %d %d %s", node, seq, res, spa_strerror(res));
pw_work_queue_complete(impl->work, node, seq, res);
spa_hook_list_call(&node->listener_list, struct pw_node_events, async_complete, seq, res);
pw_node_events_async_complete(node, seq, res);
}
static void node_event(void *data, struct spa_event *event)
@ -611,7 +609,7 @@ static void node_event(void *data, struct spa_event *event)
struct pw_node *node = data;
pw_log_trace("node %p: event %d", node, SPA_EVENT_TYPE(event));
spa_hook_list_call(&node->listener_list, struct pw_node_events, event, event);
pw_node_events_event(node, event);
}
static void node_process(void *data, int status)
@ -622,7 +620,7 @@ static void node_process(void *data, int status)
pw_log_trace("node %p: process driver:%d exported:%d", node,
node->driver, node->exported);
spa_hook_list_call(&node->listener_list, struct pw_node_events, process);
pw_node_events_process(node);
if (node->driver) {
if (node->rt.driver->state->pending == 0 || !node->remote) {
@ -727,7 +725,7 @@ void pw_node_destroy(struct pw_node *node)
struct pw_port *port, *tmpp;
pw_log_debug("node %p: destroy", impl);
spa_hook_list_call(&node->listener_list, struct pw_node_events, destroy);
pw_node_events_destroy(node);
pause_node(node);
@ -768,7 +766,7 @@ void pw_node_destroy(struct pw_node *node)
pw_resource_destroy(resource);
pw_log_debug("node %p: free", node);
spa_hook_list_call(&node->listener_list, struct pw_node_events, free);
pw_node_events_free(node);
pw_work_queue_destroy(impl->work);
@ -973,7 +971,7 @@ int pw_node_set_state(struct pw_node *node, enum pw_node_state state)
if (old == state)
return 0;
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state);
pw_node_events_state_request(node, state);
switch (state) {
case PW_NODE_STATE_CREATING:
@ -1046,12 +1044,10 @@ void pw_node_update_state(struct pw_node *node, enum pw_node_state state, char *
node_deactivate(node);
}
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_changed,
old, state, error);
pw_node_events_state_changed(node, old, state, error);
node->info.change_mask |= PW_NODE_CHANGE_MASK_STATE;
spa_hook_list_call(&node->listener_list, struct pw_node_events,
info_changed, &node->info);
pw_node_events_info_changed(node, &node->info);
spa_list_for_each(resource, &node->resource_list, link)
pw_node_resource_info(resource, &node->info);
@ -1066,7 +1062,7 @@ int pw_node_set_active(struct pw_node *node, bool active)
if (old != active) {
pw_log_debug("node %p: %s", node, active ? "activate" : "deactivate");
node->active = active;
spa_hook_list_call(&node->listener_list, struct pw_node_events, active_changed, active);
pw_node_events_active_changed(node, active);
if (active) {
if (node->enabled)
node_activate(node);
@ -1089,7 +1085,7 @@ int pw_node_set_enabled(struct pw_node *node, bool enabled)
if (old != enabled) {
pw_log_debug("node %p: %s", node, enabled ? "enable" : "disable");
node->enabled = enabled;
spa_hook_list_call(&node->listener_list, struct pw_node_events, enabled_changed, enabled);
pw_node_events_enabled_changed(node, enabled);
if (enabled) {
if (node->active)

View file

@ -50,7 +50,7 @@ static void port_update_state(struct pw_port *port, struct pw_port_mix *mix, enu
SPA_LOG_LEVEL_ERROR : SPA_LOG_LEVEL_DEBUG,
"port %p: state %d -> %d", port, port->state, state);
port->state = state;
spa_hook_list_call(&port->listener_list, struct pw_port_events, state_changed, state);
pw_port_events_state_changed(port, state);
}
}
@ -286,8 +286,7 @@ int pw_port_update_properties(struct pw_port *port, const struct spa_dict *dict)
port->info.props = &port->properties->dict;
port->info.change_mask |= PW_PORT_CHANGE_MASK_PROPS;
spa_hook_list_call(&port->listener_list, struct pw_port_events,
info_changed, &port->info);
pw_port_events_info_changed(port, &port->info);
spa_list_for_each(resource, &port->resource_list, link)
pw_port_resource_info(resource, &port->info);
@ -478,7 +477,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node)
if (find != NULL)
return -EEXIST;
spa_hook_list_call(&node->listener_list, struct pw_node_events, port_init, port);
pw_node_events_port_init(node, port);
if ((res = spa_node_port_get_info(node->node,
port->direction, port_id,
@ -559,7 +558,7 @@ int pw_port_add(struct pw_port *port, struct pw_node *node)
if (port->state <= PW_PORT_STATE_INIT)
port_update_state(port, NULL, PW_PORT_STATE_CONFIGURE);
spa_hook_list_call(&node->listener_list, struct pw_node_events, port_added, port);
pw_node_events_port_added(node, port);
return 0;
@ -624,7 +623,7 @@ static void pw_port_remove(struct pw_port *port)
node->info.n_output_ports--;
}
spa_list_remove(&port->link);
spa_hook_list_call(&node->listener_list, struct pw_node_events, port_removed, port);
pw_node_events_port_removed(node, port);
}
void pw_port_destroy(struct pw_port *port)
@ -634,7 +633,7 @@ void pw_port_destroy(struct pw_port *port)
pw_log_debug("port %p: destroy", port);
spa_hook_list_call(&port->listener_list, struct pw_port_events, destroy);
pw_port_events_destroy(port);
pw_log_debug("port %p: control destroy", port);
spa_list_for_each_safe(control, ctemp, &port->control_list[0], port_link)
@ -652,7 +651,7 @@ void pw_port_destroy(struct pw_port *port)
pw_resource_destroy(resource);
pw_log_debug("port %p: free", port);
spa_hook_list_call(&port->listener_list, struct pw_port_events, free);
pw_port_events_free(port);
free_allocation(&port->allocation);

View file

@ -51,6 +51,8 @@ struct pw_command {
int n_args;
};
#define pw_protocol_events_destroy(p) spa_hook_list_call(&p->listener_list, struct pw_protocol_events, destroy, 0)
struct pw_protocol {
struct spa_list link; /**< link in core protocol_list */
struct pw_core *core; /**< core for this protocol */
@ -74,6 +76,16 @@ struct pw_protocol {
typedef uint32_t (*pw_permission_func_t) (struct pw_global *global,
struct pw_client *client, void *data);
#define pw_client_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_client_events, m, v, ##__VA_ARGS__)
#define pw_client_events_destroy(o) pw_client_events_emit(o, destroy, 0)
#define pw_client_events_free(o) pw_client_events_emit(o, free, 0)
#define pw_client_events_info_changed(o,i) pw_client_events_emit(o, info_changed, 0, i)
#define pw_client_events_resource_added(o,r) pw_client_events_emit(o, resource_added, 0, r)
#define pw_client_events_resource_impl(o,r) pw_client_events_emit(o, resource_impl, 0, r)
#define pw_client_events_resource_removed(o,r) pw_client_events_emit(o, resource_removed, 0, r)
#define pw_client_events_busy_changed(o,b) pw_client_events_emit(o, busy_changed, 0, b)
struct pw_client {
struct pw_core *core; /**< core object */
struct spa_list link; /**< link in core object client list */
@ -108,6 +120,13 @@ struct pw_client {
void *user_data; /**< extra user data */
};
#define pw_global_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_global_events, m, v, ##__VA_ARGS__)
#define pw_global_events_registering(g) pw_global_events_emit(g, registering, 0)
#define pw_global_events_destroy(g) pw_global_events_emit(g, destroy, 0)
#define pw_global_events_free(g) pw_global_events_emit(g, free, 0)
#define pw_global_events_bind(g,...) pw_global_events_emit(g, bind, 0, __VA_ARGS__)
struct pw_global {
struct pw_core *core; /**< the core */
struct pw_client *owner; /**< the owner of this object, NULL when the
@ -127,6 +146,13 @@ struct pw_global {
void *object; /**< object associated with the interface */
};
#define pw_core_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_core_events, m, v, ##__VA_ARGS__)
#define pw_core_events_destroy(c) pw_core_events_emit(c, destroy, 0)
#define pw_core_events_free(c) pw_core_events_emit(c, free, 0)
#define pw_core_events_info_changed(c,i) pw_core_events_emit(c, info_changed, 0, i)
#define pw_core_events_global_added(c,g) pw_core_events_emit(c, global_added, 0, g)
#define pw_core_events_global_removed(c,g) pw_core_events_emit(c, global_removed, 0, g)
struct pw_core {
struct pw_global *global; /**< the global of the core */
struct spa_hook global_listener;
@ -165,6 +191,9 @@ struct pw_core {
long sc_pagesize;
};
#define pw_data_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_data_loop_events, m, v, ##__VA_ARGS__)
#define pw_data_loop_events_destroy(o) pw_data_loop_events_emit(o, destroy, 0)
struct pw_data_loop {
struct pw_loop *loop;
@ -176,6 +205,9 @@ struct pw_data_loop {
pthread_t thread;
};
#define pw_main_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_main_loop_events, m, v, ##__VA_ARGS__)
#define pw_main_loop_events_destroy(o) pw_main_loop_events_emit(o, destroy, 0)
struct pw_main_loop {
struct pw_loop *loop;
@ -208,6 +240,9 @@ static inline void free_allocation(struct allocation *alloc)
alloc->n_buffers = 0;
}
#define pw_module_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_module_events, m, v, ##__VA_ARGS__)
#define pw_module_events_destroy(m) pw_module_events_emit(m, destroy, 0)
struct pw_module {
struct pw_core *core; /**< the core object */
struct spa_list link; /**< link in the core module_list */
@ -246,6 +281,25 @@ struct pw_node_activation {
struct spa_graph_state state;
};
#define pw_node_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_node_events, m, v, ##__VA_ARGS__)
#define pw_node_events_destroy(n) pw_node_events_emit(n, destroy, 0)
#define pw_node_events_free(n) pw_node_events_emit(n, free, 0)
#define pw_node_events_initialized(n) pw_node_events_emit(n, initialized, 0)
#define pw_node_events_port_init(n,p) pw_node_events_emit(n, port_init, 0, p)
#define pw_node_events_port_added(n,p) pw_node_events_emit(n, port_added, 0, p)
#define pw_node_events_port_removed(n,p) pw_node_events_emit(n, port_removed, 0, p)
#define pw_node_events_info_changed(n,i) pw_node_events_emit(n, info_changed, 0, i)
#define pw_node_events_active_changed(n,a) pw_node_events_emit(n, active_changed, 0, a)
#define pw_node_events_enabled_changed(n,e) pw_node_events_emit(n, enabled_changed, 0, e)
#define pw_node_events_state_request(n,s) pw_node_events_emit(n, state_request, 0, s)
#define pw_node_events_state_changed(n,o,s,e) pw_node_events_emit(n, state_changed, 0, o, s, e)
#define pw_node_events_async_complete(n,s,r) pw_node_events_emit(n, async_complete, 0, s, r)
#define pw_node_events_event(n,e) pw_node_events_emit(n, event, 0, e)
#define pw_node_events_driver_changed(n,d) pw_node_events_emit(n, driver_changed, 0, d)
#define pw_node_events_process(n) pw_node_events_emit(n, process, 0)
#define pw_node_events_reuse_buffer(n,p,b) pw_node_events_emit(n, reuse_buffer, 0, p, b)
#define pw_node_events_finish(n) pw_node_events_emit(n, finish, 0)
struct pw_node {
struct pw_core *core; /**< core object */
struct spa_list link; /**< link in core node_list */
@ -324,6 +378,16 @@ struct pw_port_implementation {
struct spa_buffer **buffers, uint32_t *n_buffers);
};
#define pw_port_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_port_events, m, v, ##__VA_ARGS__)
#define pw_port_events_destroy(p) pw_port_events_emit(p, destroy, 0)
#define pw_port_events_free(p) pw_port_events_emit(p, free, 0)
#define pw_port_events_info_changed(p,i) pw_port_events_emit(p, info_changed, 0, i)
#define pw_port_events_link_added(p,l) pw_port_events_emit(p, link_added, 0, l)
#define pw_port_events_link_removed(p,l) pw_port_events_emit(p, link_removed, 0, l)
#define pw_port_events_state_changed(p,s) pw_port_events_emit(p, state_changed, 0, s)
#define pw_port_events_control_added(p,c) pw_port_events_emit(p, control_added, 0, c)
#define pw_port_events_control_removed(p,c) pw_port_events_emit(p, control_removed, 0, c)
struct pw_port {
struct spa_list link; /**< link in node port_list */
@ -377,6 +441,13 @@ struct pw_port {
void *user_data; /**< extra user data */
};
#define pw_link_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_link_events, m, v, ##__VA_ARGS__)
#define pw_link_events_destroy(l) pw_link_events_emit(l, destroy, 0)
#define pw_link_events_free(l) pw_link_events_emit(l, free, 0)
#define pw_link_events_info_changed(l,i) pw_link_events_emit(l, info_changed, 0, i)
#define pw_link_events_state_changed(l,...) pw_link_events_emit(l, state_changed, 0, __VA_ARGS__)
#define pw_link_events_port_unlinked(l,p) pw_link_events_emit(l, port_unlinked, 0, p)
struct pw_link {
struct pw_core *core; /**< core object */
struct spa_list link; /**< link in core link_list */
@ -410,6 +481,10 @@ struct pw_link {
void *user_data;
};
#define pw_resource_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_resource_events, m, v, ##__VA_ARGS__)
#define pw_resource_events_destroy(o) pw_resource_events_emit(o, destroy, 0)
struct pw_resource {
struct pw_core *core; /**< the core object */
struct spa_list link; /**< link in object resource_list */
@ -431,6 +506,8 @@ struct pw_resource {
void *user_data; /**< extra user data */
};
#define pw_proxy_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_proxy_events, m, v, ##__VA_ARGS__)
#define pw_proxy_events_destroy(p) pw_proxy_events_emit(p, destroy, 0)
struct pw_proxy {
struct pw_remote *remote; /**< the owner remote of this proxy */
@ -447,6 +524,12 @@ struct pw_proxy {
void *user_data; /**< extra user data */
};
#define pw_remote_events_emit(r,m,v,...) spa_hook_list_call(&r->listener_list, struct pw_remote_events, m, v, ##__VA_ARGS__)
#define pw_remote_events_destroy(r) pw_remote_events_emit(r, destroy, 0)
#define pw_remote_events_info_changed(r,i) pw_remote_events_emit(r, info_changed, 0, i)
#define pw_remote_events_sync_reply(r,s) pw_remote_events_emit(r, sync_reply, 0, s)
#define pw_remote_events_state_changed(r,o,s,e) pw_remote_events_emit(r, state_changed, 0, o, s, e)
struct pw_remote {
struct pw_core *core; /**< core */
struct spa_list link; /**< link in core remote_list */
@ -474,6 +557,15 @@ struct pw_remote {
void *user_data; /**< extra user data */
};
#define pw_stream_events_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct pw_stream_events, m, v, ##__VA_ARGS__)
#define pw_stream_events_destroy(s) pw_stream_events_emit(s, destroy, 0)
#define pw_stream_events_state_changed(s,o,n,e) pw_stream_events_emit(s, state_changed,0,o,n,e)
#define pw_stream_events_format_changed(s,f) pw_stream_events_emit(s, format_changed,0,f)
#define pw_stream_events_add_buffer(s,b) pw_stream_events_emit(s, add_buffer, 0, b)
#define pw_stream_events_remove_buffer(s,b) pw_stream_events_emit(s, remove_buffer, 0, b)
#define pw_stream_events_process(s) pw_stream_events_emit(s, process, 0)
#define pw_stream_events_drained(s) pw_stream_events_emit(s, drained, 1)
struct pw_stream {
struct pw_remote *remote; /**< the owner remote */
@ -491,6 +583,10 @@ struct pw_stream {
struct pw_proxy *proxy;
};
#define pw_factory_events_emit(s,m,v,...) spa_hook_list_call(&s->listener_list, struct pw_factory_events, m, v, ##__VA_ARGS__)
#define pw_factory_events_destroy(s) pw_factory_events_emit(s, destroy, 0)
struct pw_factory {
struct pw_core *core; /**< the core */
struct spa_list link; /**< link in core node_factory_list */
@ -511,6 +607,12 @@ struct pw_factory {
void *user_data;
};
#define pw_control_events_emit(c,m,v,...) spa_hook_list_call(&c->listener_list, struct pw_control_events, m, v, ##__VA_ARGS__)
#define pw_control_events_destroy(c) pw_control_events_emit(c, destroy, 0)
#define pw_control_events_free(c) pw_control_events_emit(c, free, 0)
#define pw_control_events_linked(c,o) pw_control_events_emit(c, linked, 0, o)
#define pw_control_events_unlinked(c,o) pw_control_events_emit(c, unlinked, 0, o)
struct pw_control {
struct spa_list link; /**< link in core control_list */
struct pw_core *core; /**< the core */

View file

@ -87,7 +87,7 @@ void pw_protocol_destroy(struct pw_protocol *protocol)
struct pw_protocol_client *client, *t3;
pw_log_debug("protocol %p: destroy", protocol);
spa_hook_list_call(&protocol->listener_list, struct pw_protocol_events, destroy);
pw_protocol_events_destroy(protocol);
spa_list_remove(&protocol->link);

View file

@ -120,7 +120,7 @@ void pw_proxy_destroy(struct pw_proxy *proxy)
struct proxy *impl = SPA_CONTAINER_OF(proxy, struct proxy, this);
pw_log_debug("proxy %p: destroy %u", proxy, proxy->id);
spa_hook_list_call(&proxy->listener_list, struct pw_proxy_events, destroy);
pw_proxy_events_destroy(proxy);
pw_map_insert_at(&proxy->remote->objects, proxy->id, NULL);
spa_list_remove(&proxy->link);

View file

@ -145,7 +145,7 @@ struct spa_hook_list *pw_proxy_get_proxy_listeners(struct pw_proxy *proxy);
/** Get the marshal functions for the proxy */
const struct pw_protocol_marshal *pw_proxy_get_marshal(struct pw_proxy *proxy);
#define pw_proxy_notify(p,type,event,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,## __VA_ARGS__)
#define pw_proxy_notify(p,type,event,ver,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,ver,## __VA_ARGS__)
#define pw_proxy_do(p,type,method,...) ((type*) pw_proxy_get_marshal(p)->method_marshal)->method(p, ## __VA_ARGS__)
#ifdef __cplusplus

View file

@ -168,8 +168,7 @@ pw_remote_update_state(struct pw_remote *remote, enum pw_remote_state state, con
}
remote->state = state;
spa_hook_list_call(&remote->listener_list, struct pw_remote_events, state_changed,
old, state, remote->error);
pw_remote_events_state_changed(remote, old, state, remote->error);
}
return 0;
}
@ -180,8 +179,7 @@ static void core_event_info(void *data, struct pw_core_info *info)
pw_log_debug("remote %p: got core info", this);
this->info = pw_core_info_update(this->info, info);
spa_hook_list_call(&this->listener_list, struct pw_remote_events,
info_changed, this->info);
pw_remote_events_info_changed(this, this->info);
}
static void core_event_done(void *data, uint32_t seq)
@ -192,7 +190,7 @@ static void core_event_done(void *data, uint32_t seq)
if (seq == 0)
pw_remote_update_state(this, PW_REMOTE_STATE_CONNECTED, NULL);
spa_hook_list_call(&this->listener_list, struct pw_remote_events, sync_reply, seq);
pw_remote_events_sync_reply(this, seq);
}
static void core_event_error(void *data, uint32_t id, int res, const char *error, ...)
@ -321,7 +319,7 @@ void pw_remote_destroy(struct pw_remote *remote)
struct pw_stream *stream, *s2;
pw_log_debug("remote %p: destroy", remote);
spa_hook_list_call(&remote->listener_list, struct pw_remote_events, destroy);
pw_remote_events_destroy(remote);
if (remote->state != PW_REMOTE_STATE_UNCONNECTED)
pw_remote_disconnect(remote);

View file

@ -68,7 +68,7 @@ struct pw_resource *pw_resource_new(struct pw_client *client,
this->marshal = pw_protocol_get_marshal(client->protocol, type);
pw_log_debug("resource %p: new for client %p id %u", this, client, id);
spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_added, this);
pw_client_events_resource_added(client, this);
return this;
@ -125,7 +125,7 @@ void pw_resource_set_implementation(struct pw_resource *resource,
resource->implementation.funcs = implementation;
resource->implementation.data = data;
spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_impl, resource);
pw_client_events_resource_impl(client, resource);
}
void pw_resource_add_override(struct pw_resource *resource,
@ -157,10 +157,10 @@ void pw_resource_destroy(struct pw_resource *resource)
struct pw_client *client = resource->client;
pw_log_debug("resource %p: destroy %u", resource, resource->id);
spa_hook_list_call(&resource->listener_list, struct pw_resource_events, destroy);
pw_resource_events_destroy(resource);
pw_map_insert_at(&client->objects, resource->id, NULL);
spa_hook_list_call(&client->listener_list, struct pw_client_events, resource_removed, resource);
pw_client_events_resource_removed(client, resource);
if (client->core_resource)
pw_core_resource_remove_id(client->core_resource, resource->id);

View file

@ -123,11 +123,11 @@ struct spa_hook_list *pw_resource_get_implementation(struct pw_resource *resourc
/** Get the marshal functions for the resource */
const struct pw_protocol_marshal *pw_resource_get_marshal(struct pw_resource *resource);
#define pw_resource_do(r,type,method,...) \
spa_hook_list_call_once(pw_resource_get_implementation(r),type,method,## __VA_ARGS__)
#define pw_resource_do(r,type,method,v,...) \
spa_hook_list_call_once(pw_resource_get_implementation(r),type,method,v,## __VA_ARGS__)
#define pw_resource_do_parent(r,l,type,method,...) \
spa_hook_list_call_once_start(pw_resource_get_implementation(r),l,type,method,## __VA_ARGS__)
spa_hook_list_call_once_start(pw_resource_get_implementation(r),l,type,method,v,## __VA_ARGS__)
#define pw_resource_notify(r,type,event,...) \
((type*) pw_resource_get_marshal(r)->event_marshal)->event(r, ## __VA_ARGS__)

View file

@ -231,8 +231,7 @@ static bool stream_set_state(struct pw_stream *stream, enum pw_stream_state stat
pw_stream_state_as_string(state), stream->error);
stream->state = state;
spa_hook_list_call(&stream->listener_list, struct pw_stream_events, state_changed,
old, state, error);
pw_stream_events_state_changed(stream, old, state, error);
}
return res;
}
@ -252,7 +251,7 @@ do_call_process(struct spa_loop *loop,
struct stream *impl = user_data;
struct pw_stream *stream = &impl->this;
pw_log_trace("do process");
spa_hook_list_call(&stream->listener_list, struct pw_stream_events, process);
pw_stream_events_process(stream);
return 0;
}
@ -461,10 +460,7 @@ static int port_set_format(struct spa_node *node,
else
p = NULL;
count = spa_hook_list_call(&stream->listener_list,
struct pw_stream_events,
format_changed,
p ? p->param : NULL);
count = pw_stream_events_format_changed(stream, p ? p->param : NULL);
if (count == 0)
pw_stream_finish_format(stream, 0, NULL, 0);
@ -539,8 +535,7 @@ static void clear_buffers(struct pw_stream *stream)
for (i = 0; i < impl->n_buffers; i++) {
struct buffer *b = &impl->buffers[i];
spa_hook_list_call(&stream->listener_list, struct pw_stream_events,
remove_buffer, &b->this);
pw_stream_events_remove_buffer(stream, &b->this);
if (SPA_FLAG_CHECK(b->flags, BUFFER_FLAG_MAPPED)) {
for (j = 0; j < b->this.buffer->n_datas; j++) {
@ -615,8 +610,7 @@ static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direc
push_queue(impl, &impl->dequeued, b);
}
spa_hook_list_call(&stream->listener_list, struct pw_stream_events,
add_buffer, &b->this);
pw_stream_events_add_buffer(stream, &b->this);
}
impl->n_buffers = n_buffers;
@ -932,7 +926,7 @@ void pw_stream_destroy(struct pw_stream *stream)
pw_log_debug("stream %p: destroy", stream);
spa_hook_list_call(&stream->listener_list, struct pw_stream_events, destroy);
pw_stream_events_destroy(stream);
pw_stream_disconnect(stream);

View file

@ -23,6 +23,9 @@
#include "pipewire.h"
#include "thread-loop.h"
#define pw_thread_loop_events_emit(o,m,v,...) spa_hook_list_call(&o->listener_list, struct pw_thread_loop_events, m, v, ##__VA_ARGS__)
#define pw_thread_loop_events_destroy(o) pw_thread_loop_events_emit(o, destroy, 0)
/** \cond */
struct pw_thread_loop {
struct pw_loop *loop;
@ -120,7 +123,7 @@ struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop,
/** Destroy a threaded loop \memberof pw_thread_loop */
void pw_thread_loop_destroy(struct pw_thread_loop *loop)
{
spa_hook_list_call(&loop->listener_list, struct pw_thread_loop_events, destroy);
pw_thread_loop_events_destroy(loop);
pw_thread_loop_stop(loop);