summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/examples/export-sink.c43
-rw-r--r--src/examples/export-source.c47
-rw-r--r--src/examples/export-spa.c2
-rw-r--r--src/examples/local-v4l2.c46
-rw-r--r--src/examples/media-session.c16
-rw-r--r--src/extensions/client-node.h238
-rw-r--r--src/gst/gstpipewiredeviceprovider.c11
-rw-r--r--src/modules/module-audio-dsp.c5
-rw-r--r--src/modules/module-audio-dsp/floatmix.c117
-rw-r--r--src/modules/module-client-node/client-node.c222
-rw-r--r--src/modules/module-client-node/client-stream.c118
-rw-r--r--src/modules/module-client-node/protocol-native.c104
-rw-r--r--src/modules/module-client-node/remote-node.c2
-rw-r--r--src/modules/module-link-factory.c4
-rw-r--r--src/modules/module-protocol-native.c4
-rw-r--r--src/modules/module-protocol-native/protocol-native.c443
-rw-r--r--src/modules/spa/module-node-factory.c2
-rw-r--r--src/pipewire/client.c7
-rw-r--r--src/pipewire/control.c2
-rw-r--r--src/pipewire/core.c44
-rw-r--r--src/pipewire/device.c6
-rw-r--r--src/pipewire/factory.c5
-rw-r--r--src/pipewire/global.c3
-rw-r--r--src/pipewire/interfaces.h974
-rw-r--r--src/pipewire/link.c17
-rw-r--r--src/pipewire/log.c8
-rw-r--r--src/pipewire/module.c5
-rw-r--r--src/pipewire/node.c7
-rw-r--r--src/pipewire/port.c74
-rw-r--r--src/pipewire/private.h35
-rw-r--r--src/pipewire/proxy.c5
-rw-r--r--src/pipewire/proxy.h1
-rw-r--r--src/pipewire/remote.c2
-rw-r--r--src/pipewire/resource.c5
-rw-r--r--src/pipewire/resource.h13
-rw-r--r--src/pipewire/stream.c64
-rw-r--r--src/tests/test-core.c2
-rw-r--r--src/tests/test-interfaces.c58
-rw-r--r--src/tools/pipewire-cli.c23
-rw-r--r--src/tools/pipewire-monitor.c16
40 files changed, 1516 insertions, 1284 deletions
diff --git a/src/examples/export-sink.c b/src/examples/export-sink.c
index 43369131..59c33710 100644
--- a/src/examples/export-sink.c
+++ b/src/examples/export-sink.c
@@ -129,17 +129,17 @@ static void update_param(struct data *data)
data->param_accum -= M_PI_M2;
}
-static int impl_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_send_command(void *object, const struct spa_command *command)
{
return 0;
}
-static int impl_add_listener(struct spa_node *node,
+static int impl_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_hook_list save;
spa_hook_list_isolate(&d->hooks, &save, listener, events, data);
@@ -154,23 +154,23 @@ static int impl_add_listener(struct spa_node *node,
return 0;
}
-static int impl_set_callbacks(struct spa_node *node,
+static int impl_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks, void *data)
{
return 0;
}
-static int impl_set_io(struct spa_node *node,
+static int impl_set_io(void *object,
uint32_t id, void *data, size_t size)
{
return 0;
}
-static int impl_port_set_io(struct spa_node *node,
+static int impl_port_set_io(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, void *data, size_t size)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
switch (id) {
case SPA_IO_Buffers:
@@ -186,12 +186,12 @@ static int impl_port_set_io(struct spa_node *node,
return 0;
}
-static int impl_port_enum_params(struct spa_node *node, int seq,
+static int impl_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_pod *param;
struct spa_pod_builder b = { 0 };
uint8_t buffer[1024];
@@ -288,11 +288,11 @@ static int impl_port_enum_params(struct spa_node *node, int seq,
return 0;
}
-static int port_set_format(struct spa_node *node,
+static int port_set_format(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t flags, const struct spa_pod *format)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
Uint32 sdl_format;
void *dest;
@@ -327,22 +327,22 @@ static int port_set_format(struct spa_node *node,
return 0;
}
-static int impl_port_set_param(struct spa_node *node,
+static int impl_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
if (id == SPA_PARAM_Format) {
- return port_set_format(node, direction, port_id, flags, param);
+ return port_set_format(object, direction, port_id, flags, param);
}
else
return -ENOENT;
}
-static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id,
struct spa_buffer **buffers, uint32_t n_buffers)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
uint32_t i;
for (i = 0; i < n_buffers; i++)
@@ -417,9 +417,9 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
return 0;
}
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_buffer *buf;
int res;
@@ -441,8 +441,8 @@ static int impl_node_process(struct spa_node *node)
return d->io->status = SPA_STATUS_NEED_BUFFER;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_add_listener,
.set_callbacks = impl_set_callbacks,
.set_io = impl_set_io,
@@ -465,7 +465,10 @@ static void make_node(struct data *data)
pw_properties_set(props, PW_NODE_PROP_CATEGORY, "Capture");
pw_properties_set(props, PW_NODE_PROP_ROLE, "Camera");
- data->impl_node = impl_node;
+ data->impl_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, data);
pw_remote_export(data->remote, SPA_TYPE_INTERFACE_Node, props, &data->impl_node);
}
diff --git a/src/examples/export-source.c b/src/examples/export-source.c
index d01b6b3f..98f8450b 100644
--- a/src/examples/export-source.c
+++ b/src/examples/export-source.c
@@ -102,17 +102,17 @@ static void update_volume(struct data *data)
data->volume_accum -= M_PI_M2;
}
-static int impl_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_send_command(void *object, const struct spa_command *command)
{
return 0;
}
-static int impl_add_listener(struct spa_node *node,
+static int impl_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_hook_list save;
spa_hook_list_isolate(&d->hooks, &save, listener, events, data);
@@ -125,22 +125,22 @@ static int impl_add_listener(struct spa_node *node,
return 0;
}
-static int impl_set_callbacks(struct spa_node *node,
+static int impl_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks, void *data)
{
return 0;
}
-static int impl_set_io(struct spa_node *node,
+static int impl_set_io(void *object,
uint32_t id, void *data, size_t size)
{
return 0;
}
-static int impl_port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_set_io(void *object, enum spa_direction direction, uint32_t port_id,
uint32_t id, void *data, size_t size)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
switch (id) {
case SPA_IO_Buffers:
@@ -156,12 +156,12 @@ static int impl_port_set_io(struct spa_node *node, enum spa_direction direction,
return 0;
}
-static int impl_port_enum_params(struct spa_node *node, int seq,
+static int impl_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_pod *param;
struct spa_pod_builder b = { 0 };
uint8_t buffer[1024];
@@ -260,11 +260,11 @@ static int impl_port_enum_params(struct spa_node *node, int seq,
return 0;
}
-static int port_set_format(struct spa_node *node,
+static int port_set_format(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t flags, const struct spa_pod *format)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
d->info.change_mask = SPA_PORT_CHANGE_MASK_PARAMS;
if (format == NULL) {
@@ -291,22 +291,22 @@ static int port_set_format(struct spa_node *node,
return 0;
}
-static int impl_port_set_param(struct spa_node *node,
+static int impl_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
if (id == SPA_PARAM_Format) {
- return port_set_format(node, direction, port_id, flags, param);
+ return port_set_format(object, direction, port_id, flags, param);
}
else
return -ENOENT;
}
-static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id,
struct spa_buffer **buffers, uint32_t n_buffers)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
uint32_t i;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &d->buffers[i];
@@ -347,9 +347,9 @@ static inline void reuse_buffer(struct data *d, uint32_t id)
spa_list_append(&d->empty, &d->buffers[id].link);
}
-static int impl_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+static int impl_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
reuse_buffer(d, buffer_id);
return 0;
}
@@ -396,9 +396,9 @@ static void fill_s16(struct data *d, void *dest, int avail)
}
}
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct buffer *b;
int avail;
struct spa_io_buffers *io = d->io;
@@ -446,8 +446,8 @@ static int impl_node_process(struct spa_node *node)
return SPA_STATUS_HAVE_BUFFER;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_add_listener,
.set_callbacks = impl_set_callbacks,
.set_io = impl_set_io,
@@ -473,7 +473,10 @@ static void make_node(struct data *data)
if (data->path)
pw_properties_set(props, PW_NODE_PROP_TARGET_NODE, data->path);
- data->impl_node = impl_node;
+ data->impl_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, data);
pw_remote_export(data->remote, SPA_TYPE_INTERFACE_Node, props, &data->impl_node);
}
diff --git a/src/examples/export-spa.c b/src/examples/export-spa.c
index b93496cc..b86d956d 100644
--- a/src/examples/export-spa.c
+++ b/src/examples/export-spa.c
@@ -65,7 +65,7 @@ static int make_node(struct data *data)
data->node = pw_factory_create_object(factory,
NULL,
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
props, SPA_ID_INVALID);
pw_node_set_active(data->node, true);
diff --git a/src/examples/local-v4l2.c b/src/examples/local-v4l2.c
index c9ab820d..f20b2b70 100644
--- a/src/examples/local-v4l2.c
+++ b/src/examples/local-v4l2.c
@@ -80,22 +80,22 @@ static void handle_events(struct data *data)
}
}
-static int impl_set_io(struct spa_node *node, uint32_t id, void *data, size_t size)
+static int impl_set_io(void *object, uint32_t id, void *data, size_t size)
{
return 0;
}
-static int impl_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_send_command(void *object, const struct spa_command *command)
{
return 0;
}
-static int impl_add_listener(struct spa_node *node,
+static int impl_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_port_info info;
struct spa_hook_list save;
@@ -112,16 +112,16 @@ static int impl_add_listener(struct spa_node *node,
return 0;
}
-static int impl_set_callbacks(struct spa_node *node,
+static int impl_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks, void *data)
{
return 0;
}
-static int impl_port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_set_io(void *object, enum spa_direction direction, uint32_t port_id,
uint32_t id, void *data, size_t size)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
if (id == SPA_IO_Buffers)
d->io = data;
@@ -131,12 +131,12 @@ static int impl_port_set_io(struct spa_node *node, enum spa_direction direction,
return 0;
}
-static int impl_port_enum_params(struct spa_node *node, int seq,
+static int impl_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
struct spa_pod *param;
struct spa_pod_builder b = { 0 };
uint8_t buffer[1024];
@@ -200,10 +200,10 @@ static int impl_port_enum_params(struct spa_node *node, int seq,
return 0;
}
-static int port_set_format(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int port_set_format(void *object, enum spa_direction direction, uint32_t port_id,
uint32_t flags, const struct spa_pod *format)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
Uint32 sdl_format;
void *dest;
@@ -229,22 +229,22 @@ static int port_set_format(struct spa_node *node, enum spa_direction direction,
return 0;
}
-static int impl_port_set_param(struct spa_node *node,
+static int impl_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
if (id == SPA_PARAM_Format) {
- return port_set_format(node, direction, port_id, flags, param);
+ return port_set_format(object, direction, port_id, flags, param);
}
else
return -ENOENT;
}
-static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id,
struct spa_buffer **buffers, uint32_t n_buffers)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
uint32_t i;
for (i = 0; i < n_buffers; i++)
@@ -303,9 +303,9 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
return 0;
}
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
+ struct data *d = object;
int res;
if ((res = pw_loop_invoke(pw_main_loop_get_loop(d->loop), do_render,
@@ -319,9 +319,8 @@ static int impl_node_process(struct spa_node *node)
return SPA_STATUS_NEED_BUFFER;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
- NULL,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_add_listener,
.set_callbacks = impl_set_callbacks,
.set_io = impl_set_io,
@@ -339,7 +338,10 @@ static void make_nodes(struct data *data)
struct pw_properties *props;
data->node = pw_node_new(data->core, "SDL-sink", NULL, 0);
- data->impl_node = impl_node;
+ data->impl_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, data);
pw_node_set_implementation(data->node, &data->impl_node);
pw_node_register(data->node, NULL, NULL, NULL);
@@ -350,7 +352,7 @@ static void make_nodes(struct data *data)
data->v4l2 = pw_factory_create_object(factory,
NULL,
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
props,
SPA_ID_INVALID);
data->link = pw_link_new(data->core,
diff --git a/src/examples/media-session.c b/src/examples/media-session.c
index b2229c7a..f9e56d41 100644
--- a/src/examples/media-session.c
+++ b/src/examples/media-session.c
@@ -308,7 +308,7 @@ static int link_session_dsp(struct impl *impl, struct session *session)
session->link_proxy = pw_core_proxy_create_object(impl->core_proxy,
"link-factory",
PW_TYPE_INTERFACE_Link,
- PW_VERSION_LINK,
+ PW_VERSION_LINK_PROXY,
&props->dict,
0);
pw_proxy_add_listener(session->link_proxy, &session->link_listener, &link_proxy_events, session);
@@ -481,7 +481,7 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id,
media_class = props ? spa_dict_lookup(props, "media.class") : NULL;
p = pw_registry_proxy_bind(impl->registry_proxy,
- id, type, PW_VERSION_NODE,
+ id, type, PW_VERSION_NODE_PROXY,
sizeof(struct node));
node = pw_proxy_get_user_data(p);
@@ -657,7 +657,7 @@ handle_port(struct impl *impl, uint32_t id, uint32_t parent_id, uint32_t type,
return -EINVAL;
p = pw_registry_proxy_bind(impl->registry_proxy,
- id, type, PW_VERSION_PORT,
+ id, type, PW_VERSION_PORT_PROXY,
sizeof(struct port));
port = pw_proxy_get_user_data(p);
@@ -737,7 +737,7 @@ handle_client(struct impl *impl, uint32_t id, uint32_t parent_id,
const char *str;
p = pw_registry_proxy_bind(impl->registry_proxy,
- id, type, PW_VERSION_CLIENT,
+ id, type, PW_VERSION_CLIENT_PROXY,
sizeof(struct client));
client = pw_proxy_get_user_data(p);
@@ -932,7 +932,7 @@ static int link_nodes(struct node *peer, enum pw_direction direction, struct nod
pw_core_proxy_create_object(impl->core_proxy,
"link-factory",
PW_TYPE_INTERFACE_Link,
- PW_VERSION_LINK,
+ PW_VERSION_LINK_PROXY,
&props->dict,
0);
@@ -1259,7 +1259,7 @@ static void rescan_session(struct impl *impl, struct session *sess)
sess->dsp_proxy = pw_core_proxy_create_object(impl->core_proxy,
"audio-dsp",
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
&props->dict,
0);
pw_properties_free(props);
@@ -1299,7 +1299,7 @@ static void do_rescan(struct impl *impl)
static void core_done(void *data, uint32_t id, int seq)
{
struct impl *impl = data;
- pw_log_debug("media-session %p: sync %d %d/%d", impl, id, seq, impl->seq);
+ pw_log_debug("media-session %p: sync %u %d/%d", impl, id, seq, impl->seq);
if (impl->seq == seq)
do_rescan(impl);
}
@@ -1326,7 +1326,7 @@ static void on_state_changed(void *_data, enum pw_remote_state old, enum pw_remo
&impl->core_listener,
&core_events, impl);
impl->registry_proxy = pw_core_proxy_get_registry(impl->core_proxy,
- PW_VERSION_REGISTRY, 0);
+ PW_VERSION_REGISTRY_PROXY, 0);
pw_registry_proxy_add_listener(impl->registry_proxy,
&impl->registry_listener,
&registry_events, impl);
diff --git a/src/extensions/client-node.h b/src/extensions/client-node.h
index eaa80e6d..b8f2c3c6 100644
--- a/src/extensions/client-node.h
+++ b/src/extensions/client-node.h
@@ -32,9 +32,7 @@ extern "C" {
#include <spa/utils/defs.h>
#include <spa/param/param.h>
-#include <pipewire/proxy.h>
-
-struct pw_client_node_proxy;
+struct pw_client_node_proxy { struct spa_interface iface; };
#define PW_VERSION_CLIENT_NODE 0
@@ -48,117 +46,6 @@ struct pw_client_node_buffer {
struct spa_buffer *buffer; /**< buffer describing metadata and buffer memory */
};
-#define PW_CLIENT_NODE_PROXY_METHOD_GET_NODE 0
-#define PW_CLIENT_NODE_PROXY_METHOD_UPDATE 1
-#define PW_CLIENT_NODE_PROXY_METHOD_PORT_UPDATE 2
-#define PW_CLIENT_NODE_PROXY_METHOD_SET_ACTIVE 3
-#define PW_CLIENT_NODE_PROXY_METHOD_EVENT 4
-#define PW_CLIENT_NODE_PROXY_METHOD_NUM 5
-
-/** \ref pw_client_node methods */
-struct pw_client_node_proxy_methods {
-#define PW_VERSION_CLIENT_NODE_PROXY_METHODS 0
- uint32_t version;
-
- /** get the node object
- */
- int (*get_node) (void *object, uint32_t version, uint32_t new_id);
- /**
- * Update the node ports and properties
- *
- * Update the maximum number of ports and the params of the
- * client node.
- * \param change_mask bitfield with changed parameters
- * \param max_input_ports new max input ports
- * \param max_output_ports new max output ports
- * \param params new params
- */
- int (*update) (void *object,
-#define PW_CLIENT_NODE_UPDATE_PARAMS (1 << 0)
-#define PW_CLIENT_NODE_UPDATE_INFO (1 << 1)
- uint32_t change_mask,
- uint32_t n_params,
- const struct spa_pod **params,
- const struct spa_node_info *info);
-
- /**
- * Update a node port
- *
- * Update the information of one port of a node.
- * \param direction the direction of the port
- * \param port_id the port id to update
- * \param change_mask a bitfield of changed items
- * \param n_params number of port parameters
- * \param params array of port parameters
- * \param info port information
- */
- int (*port_update) (void *object,
- enum spa_direction direction,
- uint32_t port_id,
-#define PW_CLIENT_NODE_PORT_UPDATE_PARAMS (1 << 0)
-#define PW_CLIENT_NODE_PORT_UPDATE_INFO (1 << 1)
- uint32_t change_mask,
- uint32_t n_params,
- const struct spa_pod **params,
- const struct spa_port_info *info);
- /**
- * Activate or deactivate the node
- */
- int (*set_active) (void *object, bool active);
- /**
- * Send an event to the node
- * \param event the event to send
- */
- int (*event) (void *object, struct spa_event *event);
-};
-
-static inline struct pw_node_proxy *
-pw_client_node_proxy_get_node(struct pw_client_node_proxy *p, uint32_t version, size_t user_data_size)
-{
- struct pw_proxy *np = pw_proxy_new((struct pw_proxy*)p, PW_TYPE_INTERFACE_Node, user_data_size);
- pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods,
- get_node, version, pw_proxy_get_id(np));
- return (struct pw_node_proxy *) np;
-}
-
-static inline int
-pw_client_node_proxy_update(struct pw_client_node_proxy *p,
- uint32_t change_mask,
- uint32_t n_params,
- const struct spa_pod **params,
- const struct spa_node_info *info)
-{
- return pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods,
- update,
- change_mask, n_params, params, info);
-}
-
-static inline int
-pw_client_node_proxy_port_update(struct pw_client_node_proxy *p,
- enum spa_direction direction,
- uint32_t port_id,
- uint32_t change_mask,
- uint32_t n_params,
- const struct spa_pod **params,
- const struct spa_port_info *info)
-{
- return pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods,
- port_update, direction, port_id, change_mask,
- n_params, params, info);
-}
-
-static inline int
-pw_client_node_proxy_set_active(struct pw_client_node_proxy *p, bool active)
-{
- return pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods, set_active, active);
-}
-
-static inline int
-pw_client_node_proxy_event(struct pw_client_node_proxy *p, struct spa_event *event)
-{
- return pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods, event, event);
-}
-
#define PW_CLIENT_NODE_PROXY_EVENT_ADD_MEM 0
#define PW_CLIENT_NODE_PROXY_EVENT_TRANSPORT 1
#define PW_CLIENT_NODE_PROXY_EVENT_SET_PARAM 2
@@ -331,39 +218,102 @@ struct pw_client_node_proxy_events {
uint32_t size);
};
-static inline void
-pw_client_node_proxy_add_listener(struct pw_client_node_proxy *p,
- struct spa_hook *listener,
- const struct pw_client_node_proxy_events *events,
- void *data)
+#define PW_CLIENT_NODE_PROXY_METHOD_ADD_LISTENER 0
+#define PW_CLIENT_NODE_PROXY_METHOD_GET_NODE 1
+#define PW_CLIENT_NODE_PROXY_METHOD_UPDATE 2
+#define PW_CLIENT_NODE_PROXY_METHOD_PORT_UPDATE 3
+#define PW_CLIENT_NODE_PROXY_METHOD_SET_ACTIVE 4
+#define PW_CLIENT_NODE_PROXY_METHOD_EVENT 5
+#define PW_CLIENT_NODE_PROXY_METHOD_NUM 6
+
+/** \ref pw_client_node methods */
+struct pw_client_node_proxy_methods {
+#define PW_VERSION_CLIENT_NODE_PROXY_METHODS 0
+ uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_client_node_proxy_events *events,
+ void *data);
+ /** get the node object
+ */
+ struct pw_node_proxy * (*get_node) (void *object, uint32_t version, size_t user_data_size);
+ /**
+ * Update the node ports and properties
+ *
+ * Update the maximum number of ports and the params of the
+ * client node.
+ * \param change_mask bitfield with changed parameters
+ * \param max_input_ports new max input ports
+ * \param max_output_ports new max output ports
+ * \param params new params
+ */
+ int (*update) (void *object,
+#define PW_CLIENT_NODE_UPDATE_PARAMS (1 << 0)
+#define PW_CLIENT_NODE_UPDATE_INFO (1 << 1)
+ uint32_t change_mask,
+ uint32_t n_params,
+ const struct spa_pod **params,
+ const struct spa_node_info *info);
+
+ /**
+ * Update a node port
+ *
+ * Update the information of one port of a node.
+ * \param direction the direction of the port
+ * \param port_id the port id to update
+ * \param change_mask a bitfield of changed items
+ * \param n_params number of port parameters
+ * \param params array of port parameters
+ * \param info port information
+ */
+ int (*port_update) (void *object,
+ enum spa_direction direction,
+ uint32_t port_id,
+#define PW_CLIENT_NODE_PORT_UPDATE_PARAMS (1 << 0)
+#define PW_CLIENT_NODE_PORT_UPDATE_INFO (1 << 1)
+ uint32_t change_mask,
+ uint32_t n_params,
+ const struct spa_pod **params,
+ const struct spa_port_info *info);
+ /**
+ * Activate or deactivate the node
+ */
+ int (*set_active) (void *object, bool active);
+ /**
+ * Send an event to the node
+ * \param event the event to send
+ */
+ int (*event) (void *object, struct spa_event *event);
+};
+
+
+#define pw_client_node_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_client_node_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_client_node_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
+
+#define pw_client_node_proxy_add_listener(c,...) pw_client_node_proxy_method(c,add_listener,0,__VA_ARGS__)
+
+static inline struct pw_node_proxy *
+pw_client_node_proxy_get_node(struct pw_client_node_proxy *p, uint32_t version, size_t user_data_size)
{
- pw_proxy_add_proxy_listener((struct pw_proxy*)p, listener, events, data);
+ struct pw_node_proxy *res = NULL;
+ spa_interface_call_res(&p->iface,
+ struct pw_client_node_proxy_methods, res,
+ get_node, 0, version, user_data_size);
+ return res;
}
-#define pw_client_node_resource_add_mem(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,add_mem,__VA_ARGS__)
-#define pw_client_node_resource_transport(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,transport,__VA_ARGS__)
-#define pw_client_node_resource_set_param(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,set_param,__VA_ARGS__)
-#define pw_client_node_resource_set_io(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,set_io,__VA_ARGS__)
-#define pw_client_node_resource_event(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,event,__VA_ARGS__)
-#define pw_client_node_resource_command(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,command,__VA_ARGS__)
-#define pw_client_node_resource_add_port(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,add_port,__VA_ARGS__)
-#define pw_client_node_resource_remove_port(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,remove_port,__VA_ARGS__)
-#define pw_client_node_resource_port_set_param(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,port_set_param,__VA_ARGS__)
-#define pw_client_node_resource_port_use_buffers(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,port_use_buffers,__VA_ARGS__)
-#define pw_client_node_resource_port_set_io(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,port_set_io,__VA_ARGS__)
-#define pw_client_node_resource_set_activation(r,...) \
- pw_resource_notify(r,struct pw_client_node_proxy_events,set_activation,__VA_ARGS__)
+#define pw_client_node_proxy_update(c,...) pw_client_node_proxy_method(c,update,0,__VA_ARGS__)
+#define pw_client_node_proxy_port_update(c,...) pw_client_node_proxy_method(c,port_update,0,__VA_ARGS__)
+#define pw_client_node_proxy_set_active(c,...) pw_client_node_proxy_method(c,set_active,0,__VA_ARGS__)
+#define pw_client_node_proxy_event(c,...) pw_client_node_proxy_method(c,event,0,__VA_ARGS__)
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c
index 8dad8f6b..513eeea5 100644
--- a/src/gst/gstpipewiredeviceprovider.c
+++ b/src/gst/gstpipewiredeviceprovider.c
@@ -462,7 +462,7 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, u
node = pw_registry_proxy_bind(rd->registry,
id, PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE, sizeof(*nd));
+ PW_VERSION_NODE_PROXY, sizeof(*nd));
if (node == NULL)
goto no_mem;
@@ -486,7 +486,7 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id, u
port = pw_registry_proxy_bind(rd->registry,
id, PW_TYPE_INTERFACE_Port,
- PW_VERSION_PORT, sizeof(*pd));
+ PW_VERSION_PORT_PROXY, sizeof(*pd));
if (port == NULL)
goto no_mem;
@@ -580,8 +580,7 @@ gst_pipewire_device_provider_probe (GstDeviceProvider * provider)
self->list_only = TRUE;
self->devices = NULL;
- data->registry = pw_core_proxy_get_registry(self->core_proxy,
- PW_VERSION_REGISTRY, 0);
+ data->registry = pw_core_proxy_get_registry(self->core_proxy, PW_VERSION_REGISTRY_PROXY, 0);
pw_registry_proxy_add_listener(data->registry, &data->registry_listener, &registry_events, data);
pw_core_proxy_sync(self->core_proxy, 0, self->seq++);
@@ -666,8 +665,8 @@ gst_pipewire_device_provider_start (GstDeviceProvider * provider)
}
GST_DEBUG_OBJECT (self, "connected");
- self->registry = pw_core_proxy_get_registry(self->core_proxy,
- PW_VERSION_REGISTRY, 0);
+ self->registry = pw_core_proxy_get_registry(self->core_proxy, PW_VERSION_REGISTRY_PROXY, 0);
+
data->registry = self->registry;
pw_registry_proxy_add_listener(self->registry, &data->registry_listener, &registry_events, data);
diff --git a/src/modules/module-audio-dsp.c b/src/modules/module-audio-dsp.c
index 758a28d2..2fea4084 100644
--- a/src/modules/module-audio-dsp.c
+++ b/src/modules/module-audio-dsp.c
@@ -136,7 +136,8 @@ static void *create_object(void *_data,
pw_node_register(dsp, client, pw_module_get_global(d->module), NULL);
pw_node_add_listener(dsp, &nd->dsp_listener, &node_events, nd);
- res = pw_global_bind(pw_node_get_global(dsp), client, PW_PERM_RWX, PW_VERSION_NODE, new_id);
+ res = pw_global_bind(pw_node_get_global(dsp), client,
+ PW_PERM_RWX, PW_VERSION_NODE_PROXY, new_id);
if (res < 0)
goto no_bind;
@@ -208,7 +209,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
factory = pw_factory_new(core,
"audio-dsp",
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
NULL,
sizeof(*data));
if (factory == NULL)
diff --git a/src/modules/module-audio-dsp/floatmix.c b/src/modules/module-audio-dsp/floatmix.c
index 3039cde9..1e1fa9e1 100644
--- a/src/modules/module-audio-dsp/floatmix.c
+++ b/src/modules/module-audio-dsp/floatmix.c
@@ -124,33 +124,31 @@ struct impl {
#define GET_OUT_PORT(this,p) (&this->out_ports[p])
#define GET_PORT(this,d,p) (d == SPA_DIRECTION_INPUT ? GET_IN_PORT(this,p) : GET_OUT_PORT(this,p))
-static int impl_node_enum_params(struct spa_node *node, int seq,
+static int impl_node_enum_params(void *object, int seq,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
return -ENOTSUP;
}
-static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags,
+static int impl_node_set_param(void *object, uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
return -ENOTSUP;
}
-static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size)
+static int impl_node_set_io(void *object, uint32_t id, void *data, size_t size)
{
return -ENOTSUP;
}
-static int impl_node_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_node_send_command(void *object, const struct spa_command *command)
{
- struct impl *this;
+ struct impl *this = object;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(command != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
switch (SPA_NODE_COMMAND_ID(command)) {
case SPA_NODE_COMMAND_Start:
this->started = true;
@@ -185,18 +183,17 @@ static void emit_port_info(struct impl *this, struct port *port, bool full)
}
}
-static int impl_node_add_listener(struct spa_node *node,
+static int impl_node_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct impl *this;
+ struct impl *this = object;
struct spa_hook_list save;
uint32_t i;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct impl, node);
spa_hook_list_isolate(&this->hooks, &save, listener, events, data);
emit_node_info(this, true);
@@ -212,23 +209,20 @@ static int impl_node_add_listener(struct spa_node *node,
}
static int
-impl_node_set_callbacks(struct spa_node *node,
+impl_node_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks,
void *user_data)
{
return 0;
}
-static int impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_node_add_port(void *object, enum spa_direction direction, uint32_t port_id,
const struct spa_dict *props)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_FREE_IN_PORT(this, direction, port_id), -EINVAL);
port = GET_IN_PORT (this, port_id);
@@ -266,15 +260,12 @@ static int impl_node_add_port(struct spa_node *node, enum spa_direction directio
}
static int
-impl_node_remove_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id)
+impl_node_remove_port(void *object, enum spa_direction direction, uint32_t port_id)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_IN_PORT(this, direction, port_id), -EINVAL);
port = GET_IN_PORT (this, port_id);
@@ -303,13 +294,13 @@ impl_node_remove_port(struct spa_node *node, enum spa_direction direction, uint3
return 0;
}
-static int port_enum_formats(struct spa_node *node,
+static int port_enum_formats(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t index,
struct spa_pod **param,
struct spa_pod_builder *builder)
{
- struct impl *this = SPA_CONTAINER_OF(node, struct impl, node);
+ struct impl *this = object;
switch (index) {
case 0:
@@ -333,12 +324,12 @@ static int port_enum_formats(struct spa_node *node,
}
static int
-impl_node_port_enum_params(struct spa_node *node, int seq,
+impl_node_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
struct spa_pod *param;
struct spa_pod_builder b = { 0 };
@@ -347,11 +338,8 @@ impl_node_port_enum_params(struct spa_node *node, int seq,
uint32_t count = 0;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = GET_PORT(this, direction, port_id);
@@ -365,7 +353,7 @@ impl_node_port_enum_params(struct spa_node *node, int seq,
switch (id) {
case SPA_PARAM_EnumFormat:
- if ((res = port_enum_formats(node, direction, port_id, result.index, &param, &b)) <= 0)
+ if ((res = port_enum_formats(this, direction, port_id, result.index, &param, &b)) <= 0)
return res;
break;
@@ -471,13 +459,13 @@ static struct buffer *dequeue_buffer(struct impl *this, struct port *port)
return b;
}
-static int port_set_format(struct spa_node *node,
+static int port_set_format(void *object,
enum spa_direction direction,
uint32_t port_id,
uint32_t flags,
const struct spa_pod *format)
{
- struct impl *this = SPA_CONTAINER_OF(node, struct impl, node);
+ struct impl *this = object;
struct port *port;
int res;
@@ -538,41 +526,35 @@ static int port_set_format(struct spa_node *node,
static int
-impl_node_port_set_param(struct spa_node *node,
+impl_node_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
- struct impl *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
+ struct impl *this = object;
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
if (id == SPA_PARAM_Format) {
- return port_set_format(node, direction, port_id, flags, param);
+ return port_set_format(this, direction, port_id, flags, param);
}
else
return -ENOENT;
}
static int
-impl_node_port_use_buffers(struct spa_node *node,
+impl_node_port_use_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_buffer **buffers,
uint32_t n_buffers)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
uint32_t i;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = GET_PORT(this, direction, port_id);
@@ -612,7 +594,7 @@ impl_node_port_use_buffers(struct spa_node *node,
}
static int
-impl_node_port_alloc_buffers(struct spa_node *node,
+impl_node_port_alloc_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_pod **params,
@@ -624,17 +606,14 @@ impl_node_port_alloc_buffers(struct spa_node *node,
}
static int
-impl_node_port_set_io(struct spa_node *node,
+impl_node_port_set_io(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, void *data, size_t size)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = GET_PORT(this, direction, port_id);
@@ -649,15 +628,12 @@ impl_node_port_set_io(struct spa_node *node,
return 0;
}
-static int impl_node_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+static int impl_node_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct impl *this;
+ struct impl *this = object;
struct port *port;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
-
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, SPA_DIRECTION_OUTPUT, port_id), -EINVAL);
port = GET_OUT_PORT(this, 0);
@@ -721,18 +697,16 @@ static void mix_2(float * dst, const float * SPA_RESTRICT src1,
#endif
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct impl *this;
+ struct impl *this = object;
struct port *outport;
struct spa_io_buffers *outio;
uint32_t n_samples, n_buffers, i, maxsize;
struct buffer **buffers;
struct buffer *outb;
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct impl, node);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
outport = GET_OUT_PORT(this, 0);
outio = outport->io;
@@ -825,8 +799,8 @@ static int impl_node_process(struct spa_node *node)
return SPA_STATUS_HAVE_BUFFER | SPA_STATUS_NEED_BUFFER;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_node_add_listener,
.set_callbacks = impl_node_set_callbacks,
.enum_params = impl_node_enum_params,
@@ -899,7 +873,10 @@ impl_init(const struct spa_handle_factory *factory,
spa_hook_list_init(&this->hooks);
- this->node = impl_node;
+ this->node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, this);
this->info = SPA_NODE_INFO_INIT();
this->info.max_input_ports = MAX_PORTS;
this->info.max_output_ports = 1;
diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c
index 30430f42..e538d911 100644
--- a/src/modules/module-client-node/client-node.c
+++ b/src/modules/module-client-node/client-node.c
@@ -173,6 +173,33 @@ struct impl {
int other_fds[2];
};
+#define pw_client_node_resource(r,m,v,...) \
+ pw_resource_notify_res(r,struct pw_client_node_proxy_events,m,v,__VA_ARGS__)
+
+#define pw_client_node_resource_add_mem(r,...) \
+ pw_client_node_resource(r,add_mem,0,__VA_ARGS__)
+#define pw_client_node_resource_transport(r,...) \
+ pw_client_node_resource(r,transport,0,__VA_ARGS__)
+#define pw_client_node_resource_set_param(r,...) \
+ pw_client_node_resource(r,set_param,0,__VA_ARGS__)
+#define pw_client_node_resource_set_io(r,...) \
+ pw_client_node_resource(r,set_io,0,__VA_ARGS__)
+#define pw_client_node_resource_event(r,...) \
+ pw_client_node_resource(r,event,0,__VA_ARGS__)
+#define pw_client_node_resource_command(r,...) \
+ pw_client_node_resource(r,command,0,__VA_ARGS__)
+#define pw_client_node_resource_add_port(r,...) \
+ pw_client_node_resource(r,add_port,0,__VA_ARGS__)
+#define pw_client_node_resource_remove_port(r,...) \
+ pw_client_node_resource(r,remove_port,0,__VA_ARGS__)
+#define pw_client_node_resource_port_set_param(r,...) \
+ pw_client_node_resource(r,port_set_param,0,__VA_ARGS__)
+#define pw_client_node_resource_port_use_buffers(r,...) \
+ pw_client_node_resource(r,port_use_buffers,0,__VA_ARGS__)
+#define pw_client_node_resource_port_set_io(r,...) \
+ pw_client_node_resource(r,port_set_io,0,__VA_ARGS__)
+#define pw_client_node_resource_set_activation(r,...) \
+ pw_client_node_resource(r,set_activation,0,__VA_ARGS__)
static int
do_port_use_buffers(struct impl *impl,
enum spa_direction direction,
@@ -356,21 +383,19 @@ static void mix_clear(struct node *this, struct mix *mix)
mix->valid = false;
}
-static int impl_node_enum_params(struct spa_node *node, int seq,
+static int impl_node_enum_params(void *object, int seq,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct node *this;
+ struct node *this = object;
uint8_t buffer[1024];
struct spa_pod_builder b = { 0 };
struct spa_result_node_params result;
uint32_t count = 0;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
-
result.id = id;
result.next = start;
@@ -399,14 +424,12 @@ static int impl_node_enum_params(struct spa_node *node, int seq,
return 0;
}
-static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags,
+static int impl_node_set_param(void *object, uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
- struct node *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ struct node *this = object;
- this = SPA_CONTAINER_OF(node, struct node, node);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
if (this->resource == NULL)
return -EIO;
@@ -414,17 +437,16 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag
return pw_client_node_resource_set_param(this->resource, id, flags, param);
}
-static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size)
+static int impl_node_set_io(void *object, uint32_t id, void *data, size_t size)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
struct pw_memblock *mem;
struct mem *m;
uint32_t memid, mem_offset, mem_size;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (impl->this.flags & 1)
@@ -461,19 +483,17 @@ static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size
return 0;
}
-static int impl_node_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_node_send_command(void *object, const struct spa_command *command)
{
- struct node *this;
+ struct node *this = object;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(command != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
-
if (this->resource == NULL)
return -EIO;
- pw_log_debug("client-node %p: send command %d", node, SPA_COMMAND_TYPE(command));
+ pw_log_debug("client-node %p: send command %d", this, SPA_COMMAND_TYPE(command));
return pw_client_node_resource_command(this->resource, command);
}
@@ -484,18 +504,17 @@ static void emit_port_info(struct node *this, struct port *port)
port->direction, port->id, &port->info);
}
-static int impl_node_add_listener(struct spa_node *node,
+static int impl_node_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct node *this;
+ struct node *this = object;
struct spa_hook_list save;
uint32_t i;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
spa_hook_list_isolate(&this->hooks, &save, listener, events, data);
for (i = 0; i < MAX_INPUTS; i++) {
@@ -512,29 +531,30 @@ static int impl_node_add_listener(struct spa_node *node,
}
static int
-impl_node_set_callbacks(struct spa_node *node,
+impl_node_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks,
void *data)
{
- struct node *this;
+ struct node *this = object;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
this->callbacks = SPA_CALLBACKS_INIT(callbacks, data);
return 0;
}
static int
-impl_node_sync(struct spa_node *node, int seq)
+impl_node_sync(void *object, int seq)
{
- struct node *this;
- spa_return_val_if_fail(node != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
- pw_log_debug("client-node %p: sync", node);
+ struct node *this = object;
+
+ spa_return_val_if_fail(this != NULL, -EINVAL);
+
+ pw_log_debug("client-node %p: sync", this);
if (this->resource == NULL)
return -EIO;
+
return pw_resource_ping(this->resource, seq);
}
@@ -622,50 +642,43 @@ clear_port(struct node *this, struct port *port)
}
static int
-impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+impl_node_add_port(void *object, enum spa_direction direction, uint32_t port_id,
const struct spa_dict *props)
{
- struct node *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_FREE_PORT(this, direction, port_id), -EINVAL);
return pw_client_node_resource_add_port(this->resource, direction, port_id, props);
}
static int
-impl_node_remove_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id)
+impl_node_remove_port(void *object, enum spa_direction direction, uint32_t port_id)
{
- struct node *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
return pw_client_node_resource_remove_port(this->resource, direction, port_id);
}
static int
-impl_node_port_enum_params(struct spa_node *node, int seq,
+impl_node_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct node *this;
+ struct node *this = object;
struct port *port;
uint8_t buffer[1024];
struct spa_pod_builder b = { 0 };
struct spa_result_node_params result;
uint32_t count = 0;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct node, node);
-
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = GET_PORT(this, direction, port_id);
@@ -702,17 +715,14 @@ impl_node_port_enum_params(struct spa_node *node, int seq,
}
static int
-impl_node_port_set_param(struct spa_node *node,
+impl_node_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
- struct node *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
if (this->resource == NULL)
@@ -783,7 +793,7 @@ static int do_port_set_io(struct impl *impl,
}
static int
-impl_node_port_set_io(struct spa_node *node,
+impl_node_port_set_io(void *object,
enum spa_direction direction,
uint32_t port_id,
uint32_t id,
@@ -907,18 +917,17 @@ do_port_use_buffers(struct impl *impl,
}
static int
-impl_node_port_use_buffers(struct spa_node *node,
+impl_node_port_use_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_buffer **buffers,
uint32_t n_buffers)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
return do_port_use_buffers(impl, direction, port_id,
@@ -926,7 +935,7 @@ impl_node_port_use_buffers(struct spa_node *node,
}
static int
-impl_node_port_alloc_buffers(struct spa_node *node,
+impl_node_port_alloc_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_pod **params,
@@ -934,14 +943,11 @@ impl_node_port_alloc_buffers(struct spa_node *node,
struct spa_buffer **buffers,
uint32_t *n_buffers)
{
- struct node *this;
+ struct node *this = object;
struct port *port;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(buffers != NULL, -EINVAL);
-
- this = SPA_CONTAINER_OF(node, struct node, node);
-
spa_return_val_if_fail(CHECK_PORT(this, direction, port_id), -EINVAL);
port = GET_PORT(this, direction, port_id);
@@ -954,13 +960,11 @@ impl_node_port_alloc_buffers(struct spa_node *node,
}
static int
-impl_node_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+impl_node_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct node *this;
-
- spa_return_val_if_fail(node != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(CHECK_OUT_PORT(this, SPA_DIRECTION_OUTPUT, port_id), -EINVAL);
spa_log_trace_fp(this->log, "reuse buffer %d", buffer_id);
@@ -968,9 +972,9 @@ impl_node_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t bu
return -ENOTSUP;
}
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct node *this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
struct impl *impl = this->impl;
struct pw_node *n = impl->this.node;
struct timespec ts;
@@ -988,18 +992,22 @@ static int impl_node_process(struct spa_node *node)
return SPA_STATUS_OK;
}
-static int
+static struct pw_node_proxy *
client_node_get_node(void *data,
uint32_t version,
- uint32_t new_id)
+ size_t user_data_size)
{
struct impl *impl = data;
struct node *this = &impl->node;
+ uint32_t new_id = user_data_size;
+
pw_log_debug("node %p: bind %u/%u", this, new_id, version);
+
impl->bind_node_version = version;
impl->bind_node_id = new_id;
pw_map_insert_at(&this->resource->client->objects, new_id, NULL);
- return 0;
+
+ return NULL;
}
static int
@@ -1118,9 +1126,8 @@ static void node_on_data_fd_events(struct spa_source *source)
}
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
- NULL,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_node_add_listener,
.set_callbacks = impl_node_set_callbacks,
.sync = impl_node_sync,
@@ -1164,7 +1171,10 @@ node_init(struct node *this,
return -EINVAL;
}
- this->node = impl_node;
+ this->node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, this);
spa_hook_list_init(&this->hooks);
spa_list_init(&this->pending_list);
@@ -1380,59 +1390,59 @@ static const struct pw_port_implementation port_impl = {
};
static int
-impl_mix_port_enum_params(struct spa_node *node, int seq,
+impl_mix_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node);
+ struct port *port = object;
return impl_node_port_enum_params(&port->node->node, seq, direction, port->id,
id, start, num, filter);
}
static int
-impl_mix_port_set_param(struct spa_node *node,
+impl_mix_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
- struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node);
+ struct port *port = object;
return impl_node_port_set_param(&port->node->node, direction, port->id,
id, flags, param);
}
static int
-impl_mix_add_port(struct spa_node *node, enum spa_direction direction, uint32_t mix_id,
+impl_mix_add_port(void *object, enum spa_direction direction, uint32_t mix_id,
const struct spa_dict *props)
{
- struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node);
- pw_log_debug("client-node %p: add port %d:%d.%d", node, direction, port->id, mix_id);
+ struct port *port = object;
+ pw_log_debug("client-node %p: add port %d:%d.%d", object, direction, port->id, mix_id);
return 0;
}
static int
-impl_mix_remove_port(struct spa_node *node, enum spa_direction direction, uint32_t mix_id)
+impl_mix_remove_port(void *object, enum spa_direction direction, uint32_t mix_id)
{
- struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node);
- pw_log_debug("client-node %p: remove port %d:%d.%d", node, direction, port->id, mix_id);
+ struct port *port = object;
+ pw_log_debug("client-node %p: remove port %d:%d.%d", object, direction, port->id, mix_id);
return 0;
}
static int
-impl_mix_port_use_buffers(struct spa_node *node,
+impl_mix_port_use_buffers(void *object,
enum spa_direction direction,
uint32_t mix_id,
struct spa_buffer **buffers,
uint32_t n_buffers)
{
- struct port *port = SPA_CONTAINER_OF(node, struct port, mix_node);
+ struct port *port = object;
struct impl *impl = port->impl;
return do_port_use_buffers(impl, direction, port->id, mix_id, buffers, n_buffers);
}
static int
-impl_mix_port_alloc_buffers(struct spa_node *node,
+impl_mix_port_alloc_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_pod **params,
@@ -1443,11 +1453,11 @@ impl_mix_port_alloc_buffers(struct spa_node *node,
return -ENOTSUP;
}
-static int impl_mix_port_set_io(struct spa_node *node,
+static int impl_mix_port_set_io(void *object,
enum spa_direction direction, uint32_t mix_id,
uint32_t id, void *data, size_t size)
{
- struct port *p = SPA_CONTAINER_OF(node, struct port, mix_node);
+ struct port *p = object;
struct pw_port *port = p->port;
struct impl *impl = port->owner_data;
struct pw_port_mix *mix;
@@ -1469,20 +1479,19 @@ static int impl_mix_port_set_io(struct spa_node *node,
}
static int
-impl_mix_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+impl_mix_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct port *p = SPA_CONTAINER_OF(node, struct port, mix_node);
+ struct port *p = object;
return impl_node_port_reuse_buffer(&p->node->node, p->id, buffer_id);
}
-static int impl_mix_process(struct spa_node *data)
+static int impl_mix_process(void *object)
{
return SPA_STATUS_HAVE_BUFFER;
}
-static const struct spa_node impl_port_mix = {
- SPA_VERSION_NODE,
- NULL,
+static const struct spa_node_methods impl_port_mix = {
+ SPA_VERSION_NODE_METHODS,
.port_enum_params = impl_mix_port_enum_params,
.port_set_param = impl_mix_port_set_param,
.add_port = impl_mix_add_port,
@@ -1508,7 +1517,10 @@ static void node_port_init(void *data, struct pw_port *port)
p->direction = port->direction;
p->id = port->port_id;
p->impl = impl;
- p->mix_node = impl_port_mix;
+ p->mix_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_port_mix, p);
mix_init(&p->mix[MAX_MIX], p, SPA_ID_INVALID);
if (p->direction == SPA_DIRECTION_INPUT) {
@@ -1526,7 +1538,7 @@ static void node_port_added(void *data, struct pw_port *port)
struct impl *impl = data;
struct port *p = pw_port_get_user_data(port);
- pw_port_set_mix(port, &p->mix_node,
+ pw_port_set_mix(port, (struct spa_node *)&p->mix_node,
PW_PORT_MIX_FLAG_MULTI |
PW_PORT_MIX_FLAG_MIX_ONLY);
@@ -1613,7 +1625,7 @@ static int process_node(void *data)
{
struct impl *impl = data;
pw_log_trace_fp("client-node %p: process", impl);
- return spa_node_process(&impl->node.node);
+ return spa_node_process((struct spa_node*)&impl->node.node);
}
/** Create a new client node
@@ -1670,7 +1682,7 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
name,
PW_SPA_NODE_FLAG_ASYNC |
(do_register ? 0 : PW_SPA_NODE_FLAG_NO_REGISTER),
- &impl->node.node,
+ (struct spa_node *)&impl->node.node,
NULL,
properties, 0);
if (this->node == NULL)
diff --git a/src/modules/module-client-node/client-stream.c b/src/modules/module-client-node/client-stream.c
index 23fa3a06..8516517b 100644
--- a/src/modules/module-client-node/client-stream.c
+++ b/src/modules/module-client-node/client-stream.c
@@ -116,11 +116,11 @@ struct impl {
/** \endcond */
-static int impl_node_enum_params(struct spa_node *node, int seq,
+static int impl_node_enum_params(void *object, int seq,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
struct spa_pod *param;
struct spa_pod_builder b = { 0 };
@@ -129,10 +129,9 @@ static int impl_node_enum_params(struct spa_node *node, int seq,
uint32_t count = 0;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
result.id = id;
@@ -224,14 +223,13 @@ static void emit_node_info(struct node *this, bool full)
}
}
-static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags,
+static int impl_node_set_param(void *object, uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
int res = 0;
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
switch (id) {
@@ -263,15 +261,14 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag
return res;
}
-static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size)
+static int impl_node_set_io(void *object, uint32_t id, void *data, size_t size)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res = 0;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (impl->adapter)
@@ -283,15 +280,14 @@ static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size
return res;
}
-static int impl_node_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_node_send_command(void *object, const struct spa_command *command)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
switch (SPA_NODE_COMMAND_ID(command)) {
@@ -343,19 +339,18 @@ static const struct spa_node_events adapter_node_events = {
.result = adapter_result,
};
-static int impl_node_add_listener(struct spa_node *node,
+static int impl_node_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
struct spa_hook l;
struct spa_hook_list save;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
pw_log_debug("%p: add listener %p", this, listener);
@@ -375,15 +370,14 @@ static int impl_node_add_listener(struct spa_node *node,
}
static int
-impl_node_set_callbacks(struct spa_node *node,
+impl_node_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks,
void *data)
{
- struct node *this;
+ struct node *this = object;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
this->callbacks = SPA_CALLBACKS_INIT(callbacks, data);
@@ -391,30 +385,28 @@ impl_node_set_callbacks(struct spa_node *node,
}
static int
-impl_node_sync(struct spa_node *node, int seq)
+impl_node_sync(void *object, int seq)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
return spa_node_sync(impl->cnode, seq);
}
static int
-impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+impl_node_add_port(void *object, enum spa_direction direction, uint32_t port_id,
const struct spa_dict *props)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != impl->direction)
@@ -427,14 +419,13 @@ impl_node_add_port(struct spa_node *node, enum spa_direction direction, uint32_t
}
static int
-impl_node_remove_port(struct spa_node *node, enum spa_direction direction, uint32_t port_id)
+impl_node_remove_port(void *object, enum spa_direction direction, uint32_t port_id)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != this->impl->direction)
@@ -444,18 +435,17 @@ impl_node_remove_port(struct spa_node *node, enum spa_direction direction, uint3
}
static int
-impl_node_port_enum_params(struct spa_node *node, int seq,
+impl_node_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != impl->direction)
@@ -698,18 +688,17 @@ static int negotiate_buffers(struct impl *impl)
}
static int
-impl_node_port_set_param(struct spa_node *node,
+impl_node_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != impl->direction)
@@ -737,19 +726,18 @@ impl_node_port_set_param(struct spa_node *node,
}
static int
-impl_node_port_set_io(struct spa_node *node,
+impl_node_port_set_io(void *object,
enum spa_direction direction,
uint32_t port_id,
uint32_t id,
void *data, size_t size)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res = 0;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
spa_log_debug(this->log, "set io %d %d %d %d", port_id, id, direction, impl->direction);
@@ -769,19 +757,18 @@ impl_node_port_set_io(struct spa_node *node,
}
static int
-impl_node_port_use_buffers(struct spa_node *node,
+impl_node_port_use_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_buffer **buffers,
uint32_t n_buffers)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
int res;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != impl->direction)
@@ -802,7 +789,7 @@ impl_node_port_use_buffers(struct spa_node *node,
}
static int
-impl_node_port_alloc_buffers(struct spa_node *node,
+impl_node_port_alloc_buffers(void *object,
enum spa_direction direction,
uint32_t port_id,
struct spa_pod **params,
@@ -810,12 +797,11 @@ impl_node_port_alloc_buffers(struct spa_node *node,
struct spa_buffer **buffers,
uint32_t *n_buffers)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
if (direction != impl->direction)
@@ -826,22 +812,21 @@ impl_node_port_alloc_buffers(struct spa_node *node,
}
static int
-impl_node_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+impl_node_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct node *this;
+ struct node *this = object;
struct impl *impl;
- spa_return_val_if_fail(node != NULL, -EINVAL);
+ spa_return_val_if_fail(this != NULL, -EINVAL);
- this = SPA_CONTAINER_OF(node, struct node, node);
impl = this->impl;
return spa_node_port_reuse_buffer(impl->adapter, port_id, buffer_id);
}
-static int impl_node_process(struct spa_node *node)
+static int impl_node_process(void *object)
{
- struct node *this = SPA_CONTAINER_OF(node, struct node, node);
+ struct node *this = object;
struct impl *impl = this->impl;
struct spa_io_position *q = impl->this.node->driver_node->rt.position;
int status, trigger;
@@ -890,8 +875,8 @@ static int impl_node_process(struct spa_node *node)
return status;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_node_add_listener,
.set_callbacks = impl_node_set_callbacks,
.sync = impl_node_sync,
@@ -922,7 +907,10 @@ node_init(struct node *this,
if (support[i].type == SPA_TYPE_INTERFACE_Log)
this->log = support[i].data;
}
- this->node = impl_node;
+ this->node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl_node, this);
spa_hook_list_init(&this->hooks);
this->info_all = SPA_NODE_CHANGE_MASK_PARAMS;
@@ -1301,7 +1289,7 @@ struct pw_client_stream *pw_client_stream_new(struct pw_resource *resource,
name,
PW_SPA_NODE_FLAG_ASYNC |
PW_SPA_NODE_FLAG_ACTIVATE,
- &impl->node.node,
+ (struct spa_node *)&impl->node.node,
NULL,
properties, 0);
if (this->node == NULL)
diff --git a/src/modules/module-client-node/protocol-native.c b/src/modules/module-client-node/protocol-native.c
index 81f238c6..8e55b118 100644
--- a/src/modules/module-client-node/protocol-native.c
+++ b/src/modules/module-client-node/protocol-native.c
@@ -47,11 +47,29 @@ static void push_dict(struct spa_pod_builder *b, const struct spa_dict *dict)
spa_pod_builder_pop(b, &f);
}
-static int
-client_node_marshal_get_node(void *object, uint32_t version, uint32_t new_id)
+static int client_node_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_client_node_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
+static struct pw_node_proxy *
+client_node_marshal_get_node(void *object, uint32_t version, size_t user_data_size)
{
struct pw_proxy *proxy = object;
struct spa_pod_builder *b;
+ struct pw_proxy *res;
+ uint32_t new_id;
+
+ res = pw_proxy_new(object, PW_TYPE_INTERFACE_Node, user_data_size);
+ if (res == NULL)
+ return NULL;
+
+ new_id = pw_proxy_get_id(res);
b = pw_protocol_native_begin_proxy(proxy, PW_CLIENT_NODE_PROXY_METHOD_GET_NODE, NULL);
@@ -59,7 +77,9 @@ client_node_marshal_get_node(void *object, uint32_t version, uint32_t new_id)
SPA_POD_Int(version),
SPA_POD_Int(new_id));
- return pw_protocol_native_end_proxy(proxy, b);
+ pw_protocol_native_end_proxy(proxy, b);
+
+ return (struct pw_node_proxy *) res;
}
static int
@@ -1000,50 +1020,56 @@ static int client_node_demarshal_event_method(void *object, const struct pw_prot
static const struct pw_client_node_proxy_methods pw_protocol_native_client_node_method_marshal = {
PW_VERSION_CLIENT_NODE_PROXY_METHODS,
- &client_node_marshal_get_node,
- &client_node_marshal_update,
- &client_node_marshal_port_update,
- &client_node_marshal_set_active,
- &client_node_marshal_event_method
+ .add_listener = &client_node_marshal_add_listener,
+ .get_node = &client_node_marshal_get_node,
+ .update = &client_node_marshal_update,
+ .port_update = &client_node_marshal_port_update,
+ .set_active = &client_node_marshal_set_active,
+ .event = &client_node_marshal_event_method
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_client_node_method_demarshal[] = {
- { &client_node_demarshal_get_node, 0 },
- { &client_node_demarshal_update, 0 },
- { &client_node_demarshal_port_update, 0 },
- { &client_node_demarshal_set_active, 0 },
- { &client_node_demarshal_event_method, 0 }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_client_node_method_demarshal[PW_CLIENT_NODE_PROXY_METHOD_NUM] =
+{
+ [PW_CLIENT_NODE_PROXY_METHOD_ADD_LISTENER] = { NULL, 0 },
+ [PW_CLIENT_NODE_PROXY_METHOD_GET_NODE] = { &client_node_demarshal_get_node, 0 },
+ [PW_CLIENT_NODE_PROXY_METHOD_UPDATE] = { &client_node_demarshal_update, 0 },
+ [PW_CLIENT_NODE_PROXY_METHOD_PORT_UPDATE] = { &client_node_demarshal_port_update, 0 },
+ [PW_CLIENT_NODE_PROXY_METHOD_SET_ACTIVE] = { &client_node_demarshal_set_active, 0 },
+ [PW_CLIENT_NODE_PROXY_METHOD_EVENT] = { &client_node_demarshal_event_method, 0 }
};
static const struct pw_client_node_proxy_events pw_protocol_native_client_node_event_marshal = {
PW_VERSION_CLIENT_NODE_PROXY_EVENTS,
- &client_node_marshal_add_mem,
- &client_node_marshal_transport,
- &client_node_marshal_set_param,
- &client_node_marshal_set_io,
- &client_node_marshal_event_event,
- &client_node_marshal_command,
- &client_node_marshal_add_port,
- &client_node_marshal_remove_port,
- &client_node_marshal_port_set_param,
- &client_node_marshal_port_use_buffers,
- &client_node_marshal_port_set_io,
- &client_node_marshal_set_activation,
+ .add_mem = &client_node_marshal_add_mem,
+ .transport = &client_node_marshal_transport,
+ .set_param = &client_node_marshal_set_param,
+ .set_io = &client_node_marshal_set_io,
+ .event = &client_node_marshal_event_event,
+ .command = &client_node_marshal_command,
+ .add_port = &client_node_marshal_add_port,
+ .remove_port = &client_node_marshal_remove_port,
+ .port_set_param = &client_node_marshal_port_set_param,
+ .port_use_buffers = &client_node_marshal_port_use_buffers,
+ .port_set_io = &client_node_marshal_port_set_io,
+ .set_activation = &client_node_marshal_set_activation,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_client_node_event_demarshal[] = {
- { &client_node_demarshal_add_mem, 0 },
- { &client_node_demarshal_transport, 0 },
- { &client_node_demarshal_set_param, 0 },
- { &client_node_demarshal_set_io, 0 },
- { &client_node_demarshal_event_event, 0 },
- { &client_node_demarshal_command, 0 },
- { &client_node_demarshal_add_port, 0 },
- { &client_node_demarshal_remove_port, 0 },
- { &client_node_demarshal_port_set_param, 0 },
- { &client_node_demarshal_port_use_buffers, 0 },
- { &client_node_demarshal_port_set_io, 0 },
- { &client_node_demarshal_set_activation, 0 }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_client_node_event_demarshal[PW_CLIENT_NODE_PROXY_EVENT_NUM] =
+{
+ [PW_CLIENT_NODE_PROXY_EVENT_ADD_MEM] = { &client_node_demarshal_add_mem, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_TRANSPORT] = { &client_node_demarshal_transport, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_SET_PARAM] = { &client_node_demarshal_set_param, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_SET_IO] = { &client_node_demarshal_set_io, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_EVENT] = { &client_node_demarshal_event_event, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_COMMAND] = { &client_node_demarshal_command, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_ADD_PORT] = { &client_node_demarshal_add_port, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_REMOVE_PORT] = { &client_node_demarshal_remove_port, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_PORT_SET_PARAM] = { &client_node_demarshal_port_set_param, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_PORT_USE_BUFFERS] = { &client_node_demarshal_port_use_buffers, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_PORT_SET_IO] = { &client_node_demarshal_port_set_io, 0 },
+ [PW_CLIENT_NODE_PROXY_EVENT_SET_ACTIVATION] = { &client_node_demarshal_set_activation, 0 }
};
static const struct pw_protocol_marshal pw_protocol_native_client_node_marshal = {
diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c
index 63834f8d..85906f19 100644
--- a/src/modules/module-client-node/remote-node.c
+++ b/src/modules/module-client-node/remote-node.c
@@ -1218,7 +1218,7 @@ static struct pw_proxy *node_export(struct pw_remote *remote, void *object, bool
do_node_init(proxy);
data->proxy = (struct pw_proxy*) pw_client_node_proxy_get_node(data->node_proxy,
- PW_VERSION_NODE, 0);
+ PW_VERSION_NODE_PROXY, 0);
return data->proxy;
}
diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c
index 1498fc8c..4992e232 100644
--- a/src/modules/module-link-factory.c
+++ b/src/modules/module-link-factory.c
@@ -229,7 +229,7 @@ static void *create_object(void *_data,
ld->global = pw_link_get_global(link);
pw_global_add_listener(ld->global, &ld->global_listener, &global_events, ld);
- res = pw_global_bind(ld->global, client, PW_PERM_RWX, PW_VERSION_LINK, new_id);
+ res = pw_global_bind(ld->global, client, PW_PERM_RWX, PW_VERSION_LINK_PROXY, new_id);
if (res < 0)
goto no_bind;
@@ -312,7 +312,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
factory = pw_factory_new(core,
"link-factory",
PW_TYPE_INTERFACE_Link,
- PW_VERSION_LINK,
+ PW_VERSION_LINK_PROXY,
NULL,
sizeof(*data));
if (factory == NULL)
diff --git a/src/modules/module-protocol-native.c b/src/modules/module-protocol-native.c
index 411bad6c..e23665b8 100644
--- a/src/modules/module-protocol-native.c
+++ b/src/modules/module-protocol-native.c
@@ -299,7 +299,7 @@ static struct pw_client *client_new(struct server *s, int fd)
pw_client_add_listener(client, &this->client_listener, &client_events, this);
if (pw_global_bind(pw_core_get_global(core), client,
- PW_PERM_RWX, PW_VERSION_CORE, 0) < 0)
+ PW_PERM_RWX, PW_VERSION_CORE_PROXY, 0) < 0)
goto cleanup_client;
props = pw_properties_copy(pw_client_get_properties(client));
@@ -307,7 +307,7 @@ static struct pw_client *client_new(struct server *s, int fd)
goto cleanup_client;
if (pw_global_bind(pw_client_get_global(client), client,
- PW_PERM_RWX, PW_VERSION_CLIENT, 1) < 0)
+ PW_PERM_RWX, PW_VERSION_CLIENT_PROXY, 1) < 0)
goto cleanup_client;
return client;
diff --git a/src/modules/module-protocol-native/protocol-native.c b/src/modules/module-protocol-native/protocol-native.c
index 59b4b3a3..da618d9d 100644
--- a/src/modules/module-protocol-native/protocol-native.c
+++ b/src/modules/module-protocol-native/protocol-native.c
@@ -32,6 +32,16 @@
#include "connection.h"
+static int core_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_core_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static int core_method_marshal_hello(void *object, uint32_t version)
{
struct pw_proxy *proxy = object;
@@ -90,10 +100,19 @@ static int core_method_marshal_error(void *object, uint32_t id, int seq, int res
return pw_protocol_native_end_proxy(proxy, b);
}
-static int core_method_marshal_get_registry(void *object, uint32_t version, uint32_t new_id)
+static struct pw_registry_proxy * core_method_marshal_get_registry(void *object,
+ uint32_t version, size_t user_data_size)
{
struct pw_proxy *proxy = object;
struct spa_pod_builder *b;
+ struct pw_proxy *res;
+ uint32_t new_id;
+
+ res = pw_proxy_new(object, PW_TYPE_INTERFACE_Registry, user_data_size);
+ if (res == NULL)
+ return NULL;
+
+ new_id = pw_proxy_get_id(res);
b = pw_protocol_native_begin_proxy(proxy, PW_CORE_PROXY_METHOD_GET_REGISTRY, NULL);
@@ -101,7 +120,9 @@ static int core_method_marshal_get_registry(void *object, uint32_t version, uint
SPA_POD_Int(version),
SPA_POD_Int(new_id));
- return pw_protocol_native_end_proxy(proxy, b);
+ pw_protocol_native_end_proxy(proxy, b);
+
+ return (struct pw_registry_proxy *) res;
}
static void push_dict(struct spa_pod_builder *b, const struct spa_dict *dict)
@@ -135,15 +156,23 @@ static void push_params(struct spa_pod_builder *b, uint32_t n_params,
spa_pod_builder_pop(b, &f);
}
-static int
+static void *
core_method_marshal_create_object(void *object,
const char *factory_name,
uint32_t type, uint32_t version,
- const struct spa_dict *props, uint32_t new_id)
+ const struct spa_dict *props, size_t user_data_size)
{
struct pw_proxy *proxy = object;
struct spa_pod_builder *b;
struct spa_pod_frame f;
+ struct pw_proxy *res;
+ uint32_t new_id;
+
+ res = pw_proxy_new(object, type, user_data_size);
+ if (res == NULL)
+ return NULL;
+
+ new_id = pw_proxy_get_id(res);
b = pw_protocol_native_begin_proxy(proxy, PW_CORE_PROXY_METHOD_CREATE_OBJECT, NULL);
@@ -157,14 +186,17 @@ core_method_marshal_create_object(void *object,
spa_pod_builder_int(b, new_id);
spa_pod_builder_pop(b, &f);
- return pw_protocol_native_end_proxy(proxy, b);
+ pw_protocol_native_end_proxy(proxy, b);
+
+ return (void *)res;
}
static int
-core_method_marshal_destroy(void *object, uint32_t id)
+core_method_marshal_destroy(void *object, void *p)
{
struct pw_proxy *proxy = object;
struct spa_pod_builder *b;
+ uint32_t id = pw_proxy_get_id(p);
b = pw_protocol_native_begin_proxy(proxy, PW_CORE_PROXY_METHOD_DESTROY, NULL);
@@ -480,6 +512,8 @@ static int core_method_demarshal_create_object(void *object, const struct pw_pro
static int core_method_demarshal_destroy(void *object, const struct pw_protocol_native_message *msg)
{
struct pw_resource *resource = object;
+ struct pw_client *client = pw_resource_get_client(resource);
+ struct pw_resource *r;
struct spa_pod_parser prs;
uint32_t id;
@@ -488,7 +522,27 @@ static int core_method_demarshal_destroy(void *object, const struct pw_protocol_
SPA_POD_Int(&id)) < 0)
return -EINVAL;
- return pw_resource_do(resource, struct pw_core_proxy_methods, destroy, 0, id);
+ pw_log_debug("client %p: destroy resource %d", client, id);
+
+ if ((r = pw_client_find_resource(client, id)) == NULL)
+ goto no_resource;
+
+ return pw_resource_do(resource, struct pw_core_proxy_methods, destroy, 0, r);
+
+ no_resource:
+ pw_log_error("client %p: can't find resouce %d", client, id);
+ pw_resource_error(resource, -EINVAL, "unknown resource %d", id);
+ return -EINVAL;
+}
+
+static int registry_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_registry_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
}
static void registry_marshal_global(void *object, uint32_t id, uint32_t parent_id, uint32_t permissions,
@@ -557,6 +611,16 @@ static int registry_demarshal_destroy(void *object, const struct pw_protocol_nat
return pw_resource_do(resource, struct pw_registry_proxy_methods, destroy, 0, id);
}
+static int module_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_module_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void module_marshal_info(void *object, const struct pw_module_info *info)
{
struct pw_resource *resource = object;
@@ -614,6 +678,16 @@ static int module_demarshal_info(void *object, const struct pw_protocol_native_m
return pw_proxy_notify(proxy, struct pw_module_proxy_events, info, 0, &info);
}
+static int device_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_device_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void device_marshal_info(void *object, const struct pw_device_info *info)
{
struct pw_resource *resource = object;
@@ -795,6 +869,16 @@ static int device_demarshal_set_param(void *object, const struct pw_protocol_nat
return pw_resource_do(resource, struct pw_device_proxy_methods, set_param, 0, id, flags, param);
}
+static int factory_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_factory_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void factory_marshal_info(void *object, const struct pw_factory_info *info)
{
struct pw_resource *resource = object;
@@ -852,6 +936,16 @@ static int factory_demarshal_info(void *object, const struct pw_protocol_native_
return pw_proxy_notify(proxy, struct pw_factory_proxy_events, info, 0, &info);
}
+static int node_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_node_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void node_marshal_info(void *object, const struct pw_node_info *info)
{
struct pw_resource *resource = object;
@@ -1102,6 +1196,16 @@ static int node_demarshal_send_command(void *object, const struct pw_protocol_na
return pw_resource_do(resource, struct pw_node_proxy_methods, send_command, 0, command);
}
+static int port_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_port_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void port_marshal_info(void *object, const struct pw_port_info *info)
{
struct pw_resource *resource = object;
@@ -1282,6 +1386,16 @@ static int port_demarshal_enum_params(void *object, const struct pw_protocol_nat
seq, id, index, num, filter);
}
+static int client_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_client_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void client_marshal_info(void *object, const struct pw_client_info *info)
{
struct pw_resource *resource = object;
@@ -1540,6 +1654,16 @@ static int client_demarshal_update_permissions(void *object, const struct pw_pro
n_permissions, permissions);
}
+static int link_method_marshal_add_listener(void *object,
+ struct spa_hook *listener,
+ const struct pw_link_proxy_events *events,
+ void *data)
+{
+ struct pw_proxy *proxy = object;
+ pw_proxy_add_proxy_listener(proxy, listener, events, data);
+ return 0;
+}
+
static void link_marshal_info(void *object, const struct pw_link_info *info)
{
struct pw_resource *resource = object;
@@ -1655,11 +1779,19 @@ static int registry_demarshal_global_remove(void *object, const struct pw_protoc
return pw_proxy_notify(proxy, struct pw_registry_proxy_events, global_remove, 0, id);
}
-static int registry_marshal_bind(void *object, uint32_t id,
- uint32_t type, uint32_t version, uint32_t new_id)
+static void * registry_marshal_bind(void *object, uint32_t id,
+ uint32_t type, uint32_t version, size_t user_data_size)
{
struct pw_proxy *proxy = object;
struct spa_pod_builder *b;
+ struct pw_proxy *res;
+ uint32_t new_id;
+
+ res = pw_proxy_new(object, type, user_data_size);
+ if (res == NULL)
+ return NULL;
+
+ new_id = pw_proxy_get_id(res);
b = pw_protocol_native_begin_proxy(proxy, PW_REGISTRY_PROXY_METHOD_BIND, NULL);
@@ -1669,7 +1801,9 @@ static int registry_marshal_bind(void *object, uint32_t id,
SPA_POD_Int(version),
SPA_POD_Int(new_id));
- return pw_protocol_native_end_proxy(proxy, b);
+ pw_protocol_native_end_proxy(proxy, b);
+
+ return (void *) res;
}
static int registry_marshal_destroy(void *object, uint32_t id)
@@ -1685,45 +1819,49 @@ static int registry_marshal_destroy(void *object, uint32_t id)
static const struct pw_core_proxy_methods pw_protocol_native_core_method_marshal = {
PW_VERSION_CORE_PROXY_METHODS,
- &core_method_marshal_hello,
- &core_method_marshal_sync,
- &core_method_marshal_pong,
- &core_method_marshal_error,
- &core_method_marshal_get_registry,
- &core_method_marshal_create_object,
- &core_method_marshal_destroy,
+ .add_listener = &core_method_marshal_add_listener,
+ .hello = &core_method_marshal_hello,
+ .sync = &core_method_marshal_sync,
+ .pong = &core_method_marshal_pong,
+ .error = &core_method_marshal_error,
+ .get_registry = &core_method_marshal_get_registry,
+ .create_object = &core_method_marshal_create_object,
+ .destroy = &core_method_marshal_destroy,
};
static const struct pw_protocol_native_demarshal pw_protocol_native_core_method_demarshal[PW_CORE_PROXY_METHOD_NUM] = {
- { &core_method_demarshal_hello, 0, },
- { &core_method_demarshal_sync, 0, },
- { &core_method_demarshal_pong, 0, },
- { &core_method_demarshal_error, 0, },
- { &core_method_demarshal_get_registry, 0, },
- { &core_method_demarshal_create_object, 0, },
- { &core_method_demarshal_destroy, 0, }
+ [PW_CORE_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_CORE_PROXY_METHOD_HELLO] = { &core_method_demarshal_hello, 0, },
+ [PW_CORE_PROXY_METHOD_SYNC] = { &core_method_demarshal_sync, 0, },
+ [PW_CORE_PROXY_METHOD_PONG] = { &core_method_demarshal_pong, 0, },
+ [PW_CORE_PROXY_METHOD_ERROR] = { &core_method_demarshal_error, 0, },
+ [PW_CORE_PROXY_METHOD_GET_REGISTRY] = { &core_method_demarshal_get_registry, 0, },
+ [PW_CORE_PROXY_METHOD_CREATE_OBJECT] = { &core_method_demarshal_create_object, 0, },
+ [PW_CORE_PROXY_METHOD_DESTROY] = { &core_method_demarshal_destroy, 0, }
};
static const struct pw_core_proxy_events pw_protocol_native_core_event_marshal = {
PW_VERSION_CORE_PROXY_EVENTS,
- &core_event_marshal_info,
- &core_event_marshal_done,
- &core_event_marshal_ping,
- &core_event_marshal_error,
- &core_event_marshal_remove_id,
+ .info = &core_event_marshal_info,
+ .done = &core_event_marshal_done,
+ .ping = &core_event_marshal_ping,
+ .error = &core_event_marshal_error,
+ .remove_id = &core_event_marshal_remove_id,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_core_event_demarshal[PW_CORE_PROXY_EVENT_NUM] = {
- { &core_event_demarshal_info, 0, },
- { &core_event_demarshal_done, 0, },
- { &core_event_demarshal_ping, 0, },
- { &core_event_demarshal_error, 0, },
- { &core_event_demarshal_remove_id, 0, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_core_event_demarshal[PW_CORE_PROXY_EVENT_NUM] =
+{
+ [PW_CORE_PROXY_EVENT_INFO] = { &core_event_demarshal_info, 0, },
+ [PW_CORE_PROXY_EVENT_DONE] = { &core_event_demarshal_done, 0, },
+ [PW_CORE_PROXY_EVENT_PING] = { &core_event_demarshal_ping, 0, },
+ [PW_CORE_PROXY_EVENT_ERROR] = { &core_event_demarshal_error, 0, },
+ [PW_CORE_PROXY_EVENT_REMOVE_ID] = { &core_event_demarshal_remove_id, 0, },
};
static const struct pw_protocol_marshal pw_protocol_native_core_marshal = {
PW_TYPE_INTERFACE_Core,
- PW_VERSION_CORE,
+ PW_VERSION_CORE_PROXY,
PW_CORE_PROXY_METHOD_NUM,
PW_CORE_PROXY_EVENT_NUM,
&pw_protocol_native_core_method_marshal,
@@ -1734,29 +1872,35 @@ static const struct pw_protocol_marshal pw_protocol_native_core_marshal = {
static const struct pw_registry_proxy_methods pw_protocol_native_registry_method_marshal = {
PW_VERSION_REGISTRY_PROXY_METHODS,
- &registry_marshal_bind,
- &registry_marshal_destroy,
+ .add_listener = &registry_method_marshal_add_listener,
+ .bind = &registry_marshal_bind,
+ .destroy = &registry_marshal_destroy,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_registry_method_demarshal[] = {
- { &registry_demarshal_bind, 0, },
- { &registry_demarshal_destroy, 0, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_registry_method_demarshal[PW_REGISTRY_PROXY_METHOD_NUM] =
+{
+ [PW_REGISTRY_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_REGISTRY_PROXY_METHOD_BIND] = { &registry_demarshal_bind, 0, },
+ [PW_REGISTRY_PROXY_METHOD_DESTROY] = { &registry_demarshal_destroy, 0, },
};
static const struct pw_registry_proxy_events pw_protocol_native_registry_event_marshal = {
PW_VERSION_REGISTRY_PROXY_EVENTS,
- &registry_marshal_global,
- &registry_marshal_global_remove,
+ .global = &registry_marshal_global,
+ .global_remove = &registry_marshal_global_remove,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_registry_event_demarshal[] = {
- { &registry_demarshal_global, 0, },
- { &registry_demarshal_global_remove, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_registry_event_demarshal[PW_REGISTRY_PROXY_EVENT_NUM] =
+{
+ [PW_REGISTRY_PROXY_EVENT_GLOBAL] = { &registry_demarshal_global, 0, },
+ [PW_REGISTRY_PROXY_EVENT_GLOBAL_REMOVE] = { &registry_demarshal_global_remove, 0, }
};
const struct pw_protocol_marshal pw_protocol_native_registry_marshal = {
PW_TYPE_INTERFACE_Registry,
- PW_VERSION_REGISTRY,
+ PW_VERSION_REGISTRY_PROXY,
PW_REGISTRY_PROXY_METHOD_NUM,
PW_REGISTRY_PROXY_EVENT_NUM,
&pw_protocol_native_registry_method_marshal,
@@ -1767,67 +1911,100 @@ const struct pw_protocol_marshal pw_protocol_native_registry_marshal = {
static const struct pw_module_proxy_events pw_protocol_native_module_event_marshal = {
PW_VERSION_MODULE_PROXY_EVENTS,
- &module_marshal_info,
+ .info = &module_marshal_info,
+};
+
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_module_event_demarshal[PW_MODULE_PROXY_EVENT_NUM] =
+{
+ [PW_MODULE_PROXY_EVENT_INFO] = { &module_demarshal_info, 0, },
+};
+
+
+static const struct pw_module_proxy_methods pw_protocol_native_module_method_marshal = {
+ PW_VERSION_MODULE_PROXY_METHODS,
+ .add_listener = &module_method_marshal_add_listener,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_module_event_demarshal[] = {
- { &module_demarshal_info, 0, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_module_method_demarshal[PW_MODULE_PROXY_METHOD_NUM] =
+{
+ [PW_MODULE_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
};
const struct pw_protocol_marshal pw_protocol_native_module_marshal = {
PW_TYPE_INTERFACE_Module,
- PW_VERSION_MODULE,
- 0,
+ PW_VERSION_MODULE_PROXY,
+ PW_MODULE_PROXY_METHOD_NUM,
PW_MODULE_PROXY_EVENT_NUM,
- NULL, NULL,
+ &pw_protocol_native_module_method_marshal,
+ pw_protocol_native_module_method_demarshal,
&pw_protocol_native_module_event_marshal,
pw_protocol_native_module_event_demarshal,
};
static const struct pw_factory_proxy_events pw_protocol_native_factory_event_marshal = {
PW_VERSION_FACTORY_PROXY_EVENTS,
- &factory_marshal_info,
+ .info = &factory_marshal_info,
+};
+
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_factory_event_demarshal[PW_FACTORY_PROXY_EVENT_NUM] =
+{
+ [PW_FACTORY_PROXY_EVENT_INFO] = { &factory_demarshal_info, 0, },
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_factory_event_demarshal[] = {
- { &factory_demarshal_info, 0, },
+static const struct pw_factory_proxy_methods pw_protocol_native_factory_method_marshal = {
+ PW_VERSION_FACTORY_PROXY_METHODS,
+ .add_listener = &factory_method_marshal_add_listener,
+};
+
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_factory_method_demarshal[PW_FACTORY_PROXY_METHOD_NUM] =
+{
+ [PW_FACTORY_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
};
const struct pw_protocol_marshal pw_protocol_native_factory_marshal = {
PW_TYPE_INTERFACE_Factory,
- PW_VERSION_FACTORY,
- 0,
+ PW_VERSION_FACTORY_PROXY,
+ PW_FACTORY_PROXY_METHOD_NUM,
PW_FACTORY_PROXY_EVENT_NUM,
- NULL, NULL,
+ &pw_protocol_native_factory_method_marshal,
+ pw_protocol_native_factory_method_demarshal,
&pw_protocol_native_factory_event_marshal,
pw_protocol_native_factory_event_demarshal,
};
static const struct pw_device_proxy_methods pw_protocol_native_device_method_marshal = {
PW_VERSION_DEVICE_PROXY_METHODS,
- &device_marshal_enum_params,
- &device_marshal_set_param,
+ .add_listener = &device_method_marshal_add_listener,
+ .enum_params = &device_marshal_enum_params,
+ .set_param = &device_marshal_set_param,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_device_method_demarshal[] = {
- { &device_demarshal_enum_params, 0, },
- { &device_demarshal_set_param, PW_PERM_W, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_device_method_demarshal[PW_DEVICE_PROXY_METHOD_NUM] = {
+ [PW_DEVICE_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_DEVICE_PROXY_METHOD_ENUM_PARAMS] = { &device_demarshal_enum_params, 0, },
+ [PW_DEVICE_PROXY_METHOD_SET_PARAM] = { &device_demarshal_set_param, PW_PERM_W, },
};
static const struct pw_device_proxy_events pw_protocol_native_device_event_marshal = {
PW_VERSION_DEVICE_PROXY_EVENTS,
- &device_marshal_info,
- &device_marshal_param,
+ .info = &device_marshal_info,
+ .param = &device_marshal_param,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_device_event_demarshal[] = {
- { &device_demarshal_info, 0, },
- { &device_demarshal_param, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_device_event_demarshal[PW_DEVICE_PROXY_EVENT_NUM] = {
+ [PW_DEVICE_PROXY_EVENT_INFO] = { &device_demarshal_info, 0, },
+ [PW_DEVICE_PROXY_EVENT_PARAM] = { &device_demarshal_param, 0, }
};
static const struct pw_protocol_marshal pw_protocol_native_device_marshal = {
PW_TYPE_INTERFACE_Device,
- PW_VERSION_DEVICE,
+ PW_VERSION_DEVICE_PROXY,
PW_DEVICE_PROXY_METHOD_NUM,
PW_DEVICE_PROXY_EVENT_NUM,
&pw_protocol_native_device_method_marshal,
@@ -1838,33 +2015,38 @@ static const struct pw_protocol_marshal pw_protocol_native_device_marshal = {
static const struct pw_node_proxy_methods pw_protocol_native_node_method_marshal = {
PW_VERSION_NODE_PROXY_METHODS,
- &node_marshal_subscribe_params,
- &node_marshal_enum_params,
- &node_marshal_set_param,
- &node_marshal_send_command,
+ .add_listener = &node_method_marshal_add_listener,
+ .subscribe_params = &node_marshal_subscribe_params,
+ .enum_params = &node_marshal_enum_params,
+ .set_param = &node_marshal_set_param,
+ .send_command = &node_marshal_send_command,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_node_method_demarshal[] = {
- { &node_demarshal_subscribe_params, 0, },
- { &node_demarshal_enum_params, 0, },
- { &node_demarshal_set_param, PW_PERM_W, },
- { &node_demarshal_send_command, PW_PERM_W, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_node_method_demarshal[PW_NODE_PROXY_METHOD_NUM] =
+{
+ [PW_NODE_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_NODE_PROXY_METHOD_SUBSCRIBE_PARAMS] = { &node_demarshal_subscribe_params, 0, },
+ [PW_NODE_PROXY_METHOD_ENUM_PARAMS] = { &node_demarshal_enum_params, 0, },
+ [PW_NODE_PROXY_METHOD_SET_PARAM] = { &node_demarshal_set_param, PW_PERM_W, },
+ [PW_NODE_PROXY_METHOD_SEND_COMMAND] = { &node_demarshal_send_command, PW_PERM_W, },
};
static const struct pw_node_proxy_events pw_protocol_native_node_event_marshal = {
PW_VERSION_NODE_PROXY_EVENTS,
- &node_marshal_info,
- &node_marshal_param,
+ .info = &node_marshal_info,
+ .param = &node_marshal_param,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_node_event_demarshal[] = {
- { &node_demarshal_info, 0, },
- { &node_demarshal_param, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_node_event_demarshal[PW_NODE_PROXY_EVENT_NUM] = {
+ [PW_NODE_PROXY_EVENT_INFO] = { &node_demarshal_info, 0, },
+ [PW_NODE_PROXY_EVENT_PARAM] = { &node_demarshal_param, 0, }
};
static const struct pw_protocol_marshal pw_protocol_native_node_marshal = {
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
PW_NODE_PROXY_METHOD_NUM,
PW_NODE_PROXY_EVENT_NUM,
&pw_protocol_native_node_method_marshal,
@@ -1876,29 +2058,35 @@ static const struct pw_protocol_marshal pw_protocol_native_node_marshal = {
static const struct pw_port_proxy_methods pw_protocol_native_port_method_marshal = {
PW_VERSION_PORT_PROXY_METHODS,
- &port_marshal_subscribe_params,
- &port_marshal_enum_params,
+ .add_listener = &port_method_marshal_add_listener,
+ .subscribe_params = &port_marshal_subscribe_params,
+ .enum_params = &port_marshal_enum_params,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_port_method_demarshal[] = {
- { &port_demarshal_subscribe_params, 0, },
- { &port_demarshal_enum_params, 0, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_port_method_demarshal[PW_PORT_PROXY_METHOD_NUM] =
+{
+ [PW_PORT_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_PORT_PROXY_METHOD_SUBSCRIBE_PARAMS] = { &port_demarshal_subscribe_params, 0, },
+ [PW_PORT_PROXY_METHOD_ENUM_PARAMS] = { &port_demarshal_enum_params, 0, },
};
static const struct pw_port_proxy_events pw_protocol_native_port_event_marshal = {
PW_VERSION_PORT_PROXY_EVENTS,
- &port_marshal_info,
- &port_marshal_param,
+ .info = &port_marshal_info,
+ .param = &port_marshal_param,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_port_event_demarshal[] = {
- { &port_demarshal_info, 0, },
- { &port_demarshal_param, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_port_event_demarshal[PW_PORT_PROXY_EVENT_NUM] =
+{
+ [PW_PORT_PROXY_EVENT_INFO] = { &port_demarshal_info, 0, },
+ [PW_PORT_PROXY_EVENT_PARAM] = { &port_demarshal_param, 0, }
};
static const struct pw_protocol_marshal pw_protocol_native_port_marshal = {
PW_TYPE_INTERFACE_Port,
- PW_VERSION_PORT,
+ PW_VERSION_PORT_PROXY,
PW_PORT_PROXY_METHOD_NUM,
PW_PORT_PROXY_EVENT_NUM,
&pw_protocol_native_port_method_marshal,
@@ -1909,33 +2097,39 @@ static const struct pw_protocol_marshal pw_protocol_native_port_marshal = {
static const struct pw_client_proxy_methods pw_protocol_native_client_method_marshal = {
PW_VERSION_CLIENT_PROXY_METHODS,
- &client_marshal_error,
- &client_marshal_update_properties,
- &client_marshal_get_permissions,
- &client_marshal_update_permissions,
+ .add_listener = &client_method_marshal_add_listener,
+ .error = &client_marshal_error,
+ .update_properties = &client_marshal_update_properties,
+ .get_permissions = &client_marshal_get_permissions,
+ .update_permissions = &client_marshal_update_permissions,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_client_method_demarshal[] = {
- { &client_demarshal_error, PW_PERM_W, },
- { &client_demarshal_update_properties, PW_PERM_W, },
- { &client_demarshal_get_permissions, 0, },
- { &client_demarshal_update_permissions, PW_PERM_W, },
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_client_method_demarshal[PW_CLIENT_PROXY_METHOD_NUM] =
+{
+ [PW_CLIENT_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+ [PW_CLIENT_PROXY_METHOD_ERROR] = { &client_demarshal_error, PW_PERM_W, },
+ [PW_CLIENT_PROXY_METHOD_UPDATE_PROPERTIES] = { &client_demarshal_update_properties, PW_PERM_W, },
+ [PW_CLIENT_PROXY_METHOD_GET_PERMISSIONS] = { &client_demarshal_get_permissions, 0, },
+ [PW_CLIENT_PROXY_METHOD_UPDATE_PERMISSIONS] = { &client_demarshal_update_permissions, PW_PERM_W, },
};
static const struct pw_client_proxy_events pw_protocol_native_client_event_marshal = {
PW_VERSION_CLIENT_PROXY_EVENTS,
- &client_marshal_info,
- &client_marshal_permissions,
+ .info = &client_marshal_info,
+ .permissions = &client_marshal_permissions,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_client_event_demarshal[] = {
- { &client_demarshal_info, 0, },
- { &client_demarshal_permissions, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_client_event_demarshal[PW_CLIENT_PROXY_EVENT_NUM] =
+{
+ [PW_CLIENT_PROXY_EVENT_INFO] = { &client_demarshal_info, 0, },
+ [PW_CLIENT_PROXY_EVENT_PERMISSIONS] = { &client_demarshal_permissions, 0, }
};
static const struct pw_protocol_marshal pw_protocol_native_client_marshal = {
PW_TYPE_INTERFACE_Client,
- PW_VERSION_CLIENT,
+ PW_VERSION_CLIENT_PROXY,
PW_CLIENT_PROXY_METHOD_NUM,
PW_CLIENT_PROXY_EVENT_NUM,
&pw_protocol_native_client_method_marshal,
@@ -1944,21 +2138,36 @@ static const struct pw_protocol_marshal pw_protocol_native_client_marshal = {
pw_protocol_native_client_event_demarshal,
};
+
+static const struct pw_link_proxy_methods pw_protocol_native_link_method_marshal = {
+ PW_VERSION_LINK_PROXY_METHODS,
+ .add_listener = &link_method_marshal_add_listener,
+};
+
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_link_method_demarshal[PW_LINK_PROXY_METHOD_NUM] =
+{
+ [PW_LINK_PROXY_METHOD_ADD_LISTENER] = { NULL, 0, },
+};
+
static const struct pw_link_proxy_events pw_protocol_native_link_event_marshal = {
PW_VERSION_LINK_PROXY_EVENTS,
- &link_marshal_info,
+ .info = &link_marshal_info,
};
-static const struct pw_protocol_native_demarshal pw_protocol_native_link_event_demarshal[] = {
- { &link_demarshal_info, 0, }
+static const struct pw_protocol_native_demarshal
+pw_protocol_native_link_event_demarshal[PW_LINK_PROXY_EVENT_NUM] =
+{
+ [PW_LINK_PROXY_EVENT_INFO] = { &link_demarshal_info, 0, }
};
static const struct pw_protocol_marshal pw_protocol_native_link_marshal = {
PW_TYPE_INTERFACE_Link,
- PW_VERSION_LINK,
- 0,
+ PW_VERSION_LINK_PROXY,
+ PW_LINK_PROXY_METHOD_NUM,
PW_LINK_PROXY_EVENT_NUM,
- NULL, NULL,
+ &pw_protocol_native_link_method_marshal,
+ pw_protocol_native_link_method_demarshal,
&pw_protocol_native_link_event_marshal,
pw_protocol_native_link_event_demarshal,
};
diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c
index 900a9e49..d4b98d14 100644
--- a/src/modules/spa/module-node-factory.c
+++ b/src/modules/spa/module-node-factory.c
@@ -180,7 +180,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
factory = pw_factory_new(core,
"spa-node-factory",
PW_TYPE_INTERFACE_Node,
- PW_VERSION_NODE,
+ PW_VERSION_NODE_PROXY,
NULL,
sizeof(*data));
if (factory == NULL)
diff --git a/src/pipewire/client.c b/src/pipewire/client.c
index ae17d14b..f9fb1207 100644
--- a/src/pipewire/client.c
+++ b/src/pipewire/client.c
@@ -38,6 +38,10 @@ struct impl {
struct pw_array permissions;
};
+#define pw_client_resource(r,m,v,...) pw_resource_notify(r,struct pw_client_proxy_events,m,v,__VA_ARGS__)
+#define pw_client_resource_info(r,...) pw_client_resource(r,info,0,__VA_ARGS__)
+#define pw_client_resource_permissions(r,...) pw_client_resource(r,permissions,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
struct pw_client *client;
@@ -320,7 +324,8 @@ int pw_client_register(struct pw_client *client,
client->registered = true;
client->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Client, PW_VERSION_CLIENT,
+ PW_TYPE_INTERFACE_Client,
+ PW_VERSION_CLIENT_PROXY,
properties,
global_bind,
client);
diff --git a/src/pipewire/control.c b/src/pipewire/control.c
index 6235ca39..e76250ac 100644
--- a/src/pipewire/control.c
+++ b/src/pipewire/control.c
@@ -145,7 +145,7 @@ static int port_set_io(struct pw_port *port, uint32_t mix, uint32_t id, void *da
uint32_t p;
int res;
- if (port->mix && port->mix->port_set_io) {
+ if (port->mix) {
n = port->mix;
p = mix;
} else {
diff --git a/src/pipewire/core.c b/src/pipewire/core.c
index 0d4b7159..cdf99c18 100644
--- a/src/pipewire/core.c
+++ b/src/pipewire/core.c
@@ -57,15 +57,14 @@ struct resource_data {
};
/** \endcond */
-
-static int registry_bind(void *object, uint32_t id,
- uint32_t type, uint32_t version, uint32_t new_id)
+static void * registry_bind(void *object, uint32_t id,
+ uint32_t type, uint32_t version, size_t user_data_size)
{
struct pw_resource *resource = object;
struct pw_client *client = resource->client;
struct pw_core *core = resource->core;
struct pw_global *global;
- uint32_t permissions;
+ uint32_t permissions, new_id = user_data_size;
if ((global = pw_core_find_global(core, id)) == NULL)
goto no_id;
@@ -84,7 +83,7 @@ static int registry_bind(void *object, uint32_t id,
if (pw_global_bind(global, client, permissions, version, new_id) < 0)
goto exit;
- return 0;
+ return NULL;
no_id:
pw_log_debug("registry %p: no global with id %u to bind to %u", resource, id, new_id);
@@ -100,7 +99,7 @@ static int registry_bind(void *object, uint32_t id,
* new_id as 'used and freed' */
pw_map_insert_at(&client->objects, new_id, NULL);
pw_core_resource_remove_id(client->core_resource, new_id);
- return -EFAULT;
+ return NULL;
}
static int registry_destroy(void *object, uint32_t id)
@@ -213,7 +212,7 @@ static int core_error(void *object, uint32_t id, int seq, int res, const char *m
return 0;
}
-static int core_get_registry(void *object, uint32_t version, uint32_t new_id)
+static struct pw_registry_proxy * core_get_registry(void *object, uint32_t version, size_t user_data_size)
{
struct pw_resource *resource = object;
struct pw_client *client = resource->client;
@@ -221,6 +220,7 @@ static int core_get_registry(void *object, uint32_t version, uint32_t new_id)
struct pw_global *global;
struct pw_resource *registry_resource;
struct resource_data *data;
+ uint32_t new_id = user_data_size;
registry_resource = pw_resource_new(client,
new_id,
@@ -257,7 +257,7 @@ static int core_get_registry(void *object, uint32_t version, uint32_t new_id)
}
}
- return 0;
+ return (struct pw_registry_proxy *)registry_resource;
no_mem:
pw_log_error("can't create registry resource");
@@ -265,22 +265,24 @@ static int core_get_registry(void *object, uint32_t version, uint32_t new_id)
client->recv_seq, -ENOMEM, "no memory");
pw_map_insert_at(&client->objects, new_id, NULL);
pw_core_resource_remove_id(client->core_resource, new_id);
- return -ENOMEM;
+ errno = ENOMEM;
+ return NULL;
}
-static int
+static void *
core_create_object(void *object,
const char *factory_name,
uint32_t type,
uint32_t version,
const struct spa_dict *props,
- uint32_t new_id)
+ size_t user_data_size)
{
struct pw_resource *resource = object;
struct pw_client *client = resource->client;
struct pw_factory *factory;
void *obj;
struct pw_properties *properties;
+ uint32_t new_id = user_data_size;
int res;
factory = pw_core_find_factory(client->core, factory_name);
@@ -330,27 +332,17 @@ core_create_object(void *object,
error:
pw_map_insert_at(&client->objects, new_id, NULL);
pw_core_resource_remove_id(client->core_resource, new_id);
- return res;
+ return NULL;
}
-static int core_destroy(void *object, uint32_t id)
+static int core_destroy(void *object, void *proxy)
{
struct pw_resource *resource = object;
struct pw_client *client = resource->client;
- struct pw_resource *r;
-
- pw_log_debug("core %p: destroy resource %d from client %p", resource->core, id, client);
-
- if ((r = pw_client_find_resource(client, id)) == NULL)
- goto no_resource;
-
+ struct pw_resource *r = proxy;
+ pw_log_debug("core %p: destroy resource %p from client %p", resource->core, r, client);
pw_resource_destroy(r);
return 0;
-
- no_resource:
- pw_log_error("can't find resouce %d", id);
- pw_resource_error(resource, -EINVAL, "unknown resource %d", id);
- return -EINVAL;
}
static const struct pw_core_proxy_methods core_methods = {
@@ -525,7 +517,7 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop,
this->global = pw_global_new(this,
PW_TYPE_INTERFACE_Core,
- PW_VERSION_CORE,
+ PW_VERSION_CORE_PROXY,
pw_properties_new(
PW_CORE_PROP_USER_NAME, this->info.user_name,
PW_CORE_PROP_HOST_NAME, this->info.host_name,
diff --git a/src/pipewire/device.c b/src/pipewire/device.c
index 11907d13..cc0f186c 100644
--- a/src/pipewire/device.c
+++ b/src/pipewire/device.c
@@ -36,6 +36,10 @@ struct impl {
struct pw_device this;
};
+#define pw_device_resource(r,m,v,...) pw_resource_notify(r,struct pw_device_proxy_events,m,v,__VA_ARGS__)
+#define pw_device_resource_info(r,...) pw_device_resource(r,info,0,__VA_ARGS__)
+#define pw_device_resource_param(r,...) pw_device_resource(r,param,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
struct pw_device *device;
@@ -291,7 +295,7 @@ int pw_device_register(struct pw_device *device,
device->registered = true;
device->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Device, PW_VERSION_DEVICE,
+ PW_TYPE_INTERFACE_Device, PW_VERSION_DEVICE_PROXY,
properties,
global_bind,
device);
diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c
index 8d678700..e5f1dc9c 100644
--- a/src/pipewire/factory.c
+++ b/src/pipewire/factory.c
@@ -31,6 +31,8 @@
#include "pipewire/type.h"
#include "pipewire/interfaces.h"
+#define pw_factory_resource_info(r,...) pw_resource_notify(r,struct pw_factory_proxy_events,info,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
};
@@ -163,7 +165,8 @@ int pw_factory_register(struct pw_factory *factory,
factory->registered = true;
factory->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Factory, PW_VERSION_FACTORY,
+ PW_TYPE_INTERFACE_Factory,
+ PW_VERSION_FACTORY_PROXY,
properties,
global_bind,
factory);
diff --git a/src/pipewire/global.c b/src/pipewire/global.c
index 8ac7ace3..7f794b78 100644
--- a/src/pipewire/global.c
+++ b/src/pipewire/global.c
@@ -272,8 +272,7 @@ void pw_global_add_listener(struct pw_global *global,
*
* \memberof pw_global
*/
-SPA_EXPORT
-int
+SPA_EXPORT int
pw_global_bind(struct pw_global *global, struct pw_client *client, uint32_t permissions,
uint32_t version, uint32_t id)
{
diff --git a/src/pipewire/interfaces.h b/src/pipewire/interfaces.h
index 8aa301d6..1a1a2934 100644
--- a/src/pipewire/interfaces.h
+++ b/src/pipewire/interfaces.h
@@ -30,25 +30,35 @@ extern "C" {
#endif
#include <stdarg.h>
+#include <errno.h>
#include <spa/utils/defs.h>
+#include <spa/utils/hook.h>
#include <spa/node/command.h>
#include <spa/param/param.h>
#include <pipewire/introspect.h>
-#include <pipewire/type.h>
#include <pipewire/proxy.h>
#include <pipewire/permission.h>
-struct pw_core_proxy;
-struct pw_registry_proxy;
-struct pw_module_proxy;
-struct pw_device_proxy;
-struct pw_node_proxy;
-struct pw_port_proxy;
-struct pw_factory_proxy;
-struct pw_client_proxy;
-struct pw_link_proxy;
+#define PW_VERSION_CORE_PROXY 0
+struct pw_core_proxy { struct spa_interface iface; };
+#define PW_VERSION_REGISTRY_PROXY 0
+struct pw_registry_proxy { struct spa_interface iface; };
+#define PW_VERSION_MODULE_PROXY 0
+struct pw_module_proxy { struct spa_interface iface; };
+#define PW_VERSION_DEVICE_PROXY 0
+struct pw_device_proxy { struct spa_interface iface; };
+#define PW_VERSION_NODE_PROXY 0
+struct pw_node_proxy { struct spa_interface iface; };
+#define PW_VERSION_PORT_PROXY 0
+struct pw_port_proxy { struct spa_interface iface; };
+#define PW_VERSION_FACTORY_PROXY 0
+struct pw_factory_proxy { struct spa_interface iface; };
+#define PW_VERSION_CLIENT_PROXY 0
+struct pw_client_proxy { struct spa_interface iface; };
+#define PW_VERSION_LINK_PROXY 0
+struct pw_link_proxy { struct spa_interface iface; };
/**
* \page page_pipewire_protocol The PipeWire protocol
@@ -68,16 +78,90 @@ struct pw_link_proxy;
/** Core */
-#define PW_VERSION_CORE 0
+#define PW_CORE_PROXY_EVENT_INFO 0
+#define PW_CORE_PROXY_EVENT_DONE 1
+#define PW_CORE_PROXY_EVENT_PING 2
+#define PW_CORE_PROXY_EVENT_ERROR 3
+#define PW_CORE_PROXY_EVENT_REMOVE_ID 4
+#define PW_CORE_PROXY_EVENT_NUM 5
-#define PW_CORE_PROXY_METHOD_HELLO 0
-#define PW_CORE_PROXY_METHOD_SYNC 1
-#define PW_CORE_PROXY_METHOD_PONG 2
-#define PW_CORE_PROXY_METHOD_ERROR 3
-#define PW_CORE_PROXY_METHOD_GET_REGISTRY 4
-#define PW_CORE_PROXY_METHOD_CREATE_OBJECT 5
-#define PW_CORE_PROXY_METHOD_DESTROY 6
-#define PW_CORE_PROXY_METHOD_NUM 7
+/** \struct pw_core_proxy_events
+ * \brief Core events
+ * \ingroup pw_core_interface The pw_core interface
+ */
+struct pw_core_proxy_events {
+#define PW_VERSION_CORE_PROXY_EVENTS 0
+ uint32_t version;
+
+ /**
+ * Notify new core info
+ *
+ * This event is emited when first bound to the core or when the
+ * hello method is called.
+ *
+ * \param info new core info
+ */
+ void (*info) (void *object, const struct pw_core_info *info);
+ /**
+ * Emit a done event
+ *
+ * The done event is emited as a result of a sync method with the
+ * same seq number.
+ *
+ * \param seq the seq number passed to the sync method call
+ */
+ void (*done) (void *object, uint32_t id, int seq);
+
+ /** Emit a ping event
+ *
+ * The client should reply with a pong reply with the same seq
+ * number.
+ */
+ void (*ping) (void *object, uint32_t id, int seq);
+
+ /**
+ * Fatal error event
+ *
+ * The error event is sent out when a fatal (non-recoverable)
+ * error has occurred. The id argument is the proxy object where
+ * the error occurred, most often in response to a request to that
+ * object. The message is a brief description of the error,
+ * for (debugging) convenience.
+ *
+ * This event is usually also emited on the proxy object with
+ * \a id.
+ *
+ * \param id object where the error occurred
+ * \param seq the sequence number that generated the error
+ * \param res error code
+ * \param message error description
+ */
+ void (*error) (void *object, uint32_t id, int seq, int res, const char *message);
+ /**
+ * Remove an object ID
+ *
+ * This event is used internally by the object ID management
+ * logic. When a client deletes an object, the server will send
+ * this event to acknowledge that it has seen the delete request.
+ * When the client receives this event, it will know that it can
+ * safely reuse the object ID.
+ *
+ * \param id deleted object ID
+ */
+ void (*remove_id) (void *object, uint32_t id);
+};
+
+
+
+#define PW_CORE_PROXY_METHOD_ADD_LISTENER 0
+#define PW_CORE_PROXY_METHOD_HELLO 1
+#define PW_CORE_PROXY_METHOD_SYNC 2
+#define PW_CORE_PROXY_METHOD_PONG 3
+#define PW_CORE_PROXY_METHOD_ERROR 4
+#define PW_CORE_PROXY_METHOD_GET_REGISTRY 5
+#define PW_CORE_PROXY_METHOD_CREATE_OBJECT 6
+#define PW_CORE_PROXY_METHOD_DESTROY 7
+#define PW_CORE_PROXY_METHOD_NUM 8
#define PW_LINK_OUTPUT_NODE_ID "link.output_node.id"
#define PW_LINK_OUTPUT_PORT_ID "link.output_port.id"
@@ -95,6 +179,11 @@ struct pw_link_proxy;
struct pw_core_proxy_methods {
#define PW_VERSION_CORE_PROXY_METHODS 0
uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_core_proxy_events *events,
+ void *data);
/**
* Start a conversation with the server. This will send
* the core info and will destroy all resources for the client
@@ -143,10 +232,12 @@ struct pw_core_proxy_methods {
*
* Create a registry object that allows the client to list and bind
* the global objects available from the PipeWire server
- * \param version the client proxy id
- * \param id the client proxy id
+ * \param version the client version
+ * \param user_data_size extra size
*/
- int (*get_registry) (void *object, uint32_t version, uint32_t new_id);
+ struct pw_registry_proxy * (*get_registry) (void *object, uint32_t version,
+ size_t user_data_size);
+
/**
* Create a new object on the PipeWire server from a factory.
*
@@ -154,49 +245,39 @@ struct pw_core_proxy_methods {
* \param type the interface to bind to
* \param version the version of the interface
* \param props extra properties
- * \param new_id the client proxy id
+ * \param user_data_size extra size
*/
- int (*create_object) (void *object,
+ void * (*create_object) (void *object,
const char *factory_name,
uint32_t type,
uint32_t version,
const struct spa_dict *props,
- uint32_t new_id);
+ size_t user_data_size);
/**
* Destroy an resource
*
- * Destroy the server resource with the given proxy id.
+ * Destroy the server resource for the given proxy.
*
- * \param id the client proxy id to destroy
+ * \param obj the proxy to destroy
*/
- int (*destroy) (void *object, uint32_t id);
+ int (*destroy) (void *object, void *proxy);
};
-static inline int
-pw_core_proxy_hello(struct pw_core_proxy *core, uint32_t version)
-{
- return pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, hello, version);
-}
-
-static inline int
-pw_core_proxy_sync(struct pw_core_proxy *core, uint32_t id, int seq)
-{
- return pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, sync, id, seq);
-}
-
-static inline int
-pw_core_proxy_pong(struct pw_core_proxy *core, uint32_t id, int seq)
-{
- return pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, pong, id, seq);
-}
-
-static inline int
-pw_core_proxy_error(struct pw_core_proxy *core, uint32_t id, int seq,
- int res, const char *message)
-{
- return pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, error,
- id, seq, res, message);
-}
+#define pw_core_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_core_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_core_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
+
+#define pw_core_proxy_add_listener(c,...) pw_core_proxy_method(c,add_listener,0,__VA_ARGS__)
+#define pw_core_proxy_hello(c,...) pw_core_proxy_method(c,hello,0,__VA_ARGS__)
+#define pw_core_proxy_sync(c,...) pw_core_proxy_method(c,sync,0,__VA_ARGS__)
+#define pw_core_proxy_pong(c,...) pw_core_proxy_method(c,pong,0,__VA_ARGS__)
+#define pw_core_proxy_error(c,...) pw_core_proxy_method(c,error,0,__VA_ARGS__)
static inline int
pw_core_proxy_errorv(struct pw_core_proxy *core, uint32_t id, int seq,
@@ -223,9 +304,11 @@ pw_core_proxy_errorf(struct pw_core_proxy *core, uint32_t id, int seq,
static inline struct pw_registry_proxy *
pw_core_proxy_get_registry(struct pw_core_proxy *core, uint32_t version, size_t user_data_size)
{
- struct pw_proxy *p = pw_proxy_new((struct pw_proxy*)core, PW_TYPE_INTERFACE_Registry, user_data_size);
- pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, get_registry, version, pw_proxy_get_id(p));
- return (struct pw_registry_proxy *) p;
+ struct pw_registry_proxy *res = NULL;
+ spa_interface_call_res(&core->iface,
+ struct pw_core_proxy_methods, res,
+ get_registry, 0, version, user_data_size);
+ return res;
}
static inline void *
@@ -236,128 +319,15 @@ pw_core_proxy_create_object(struct pw_core_proxy *core,
const struct spa_dict *props,
size_t user_data_size)
{
- struct pw_proxy *p = pw_proxy_new((struct pw_proxy*)core, type, user_data_size);
- pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, create_object, factory_name,
- type, version, props, pw_proxy_get_id(p));
- return p;
-}
-
-static inline int
-pw_core_proxy_destroy(struct pw_core_proxy *core, struct pw_proxy *proxy)
-{
- return pw_proxy_do((struct pw_proxy*)core, struct pw_core_proxy_methods, destroy, pw_proxy_get_id(proxy));
-}
-
-#define PW_CORE_PROXY_EVENT_INFO 0
-#define PW_CORE_PROXY_EVENT_DONE 1
-#define PW_CORE_PROXY_EVENT_PING 2
-#define PW_CORE_PROXY_EVENT_ERROR 3
-#define PW_CORE_PROXY_EVENT_REMOVE_ID 4
-#define PW_CORE_PROXY_EVENT_NUM 5
-
-/** \struct pw_core_proxy_events
- * \brief Core events
- * \ingroup pw_core_interface The pw_core interface
- */
-struct pw_core_proxy_events {
-#define PW_VERSION_CORE_PROXY_EVENTS 0
- uint32_t version;
-
- /**
- * Notify new core info
- *
- * This event is emited when first bound to the core or when the
- * hello method is called.
- *
- * \param info new core info
- */
- void (*info) (void *object, const struct pw_core_info *info);
- /**
- * Emit a done event
- *
- * The done event is emited as a result of a sync method with the
- * same seq number.
- *
- * \param seq the seq number passed to the sync method call
- */
- void (*done) (void *object, uint32_t id, int seq);
-
- /** Emit a ping event
- *
- * The client should reply with a pong reply with the same seq
- * number.
- */
- void (*ping) (void *object, uint32_t id, int seq);
-
- /**
- * Fatal error event
- *
- * The error event is sent out when a fatal (non-recoverable)
- * error has occurred. The id argument is the proxy object where
- * the error occurred, most often in response to a request to that
- * object. The message is a brief description of the error,
- * for (debugging) convenience.
- *
- * This event is usually also emited on the proxy object with
- * \a id.
- *
- * \param id object where the error occurred
- * \param seq the sequence number that generated the error
- * \param res error code
- * \param message error description
- */
- void (*error) (void *object, uint32_t id, int seq, int res, const char *message);
- /**
- * Remove an object ID
- *
- * This event is used internally by the object ID management
- * logic. When a client deletes an object, the server will send
- * this event to acknowledge that it has seen the delete request.
- * When the client receives this event, it will know that it can
- * safely reuse the object ID.
- *
- * \param id deleted object ID
- */
- void (*remove_id) (void *object, uint32_t id);
-};
-
-static inline void
-pw_core_proxy_add_listener(struct pw_core_proxy *core,
- struct spa_hook *listener,
- const struct pw_core_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)core, listener, events, data);
+ void *res = NULL;
+ spa_interface_call_res(&core->iface,
+ struct pw_core_proxy_methods, res,
+ create_object, 0, factory_name,
+ type, version, props, user_data_size);
+ return res;
}
-
-#define pw_core_resource_info(r,...) pw_resource_notify(r,struct pw_core_proxy_events,info,__VA_ARGS__)
-#define pw_core_resource_done(r,...) pw_resource_notify(r,struct pw_core_proxy_events,done,__VA_ARGS__)
-#define pw_core_resource_ping(r,...) pw_resource_notify(r,struct pw_core_proxy_events,ping,__VA_ARGS__)
-#define pw_core_resource_error(r,...) pw_resource_notify(r,struct pw_core_proxy_events,error,__VA_ARGS__)
-#define pw_core_resource_remove_id(r,...) pw_resource_notify(r,struct pw_core_proxy_events,remove_id,__VA_ARGS__)
-
-static inline void
-pw_core_resource_errorv(struct pw_resource *resource, uint32_t id, int seq,
- int res, const char *message, va_list args)
-{
- char buffer[1024];
- vsnprintf(buffer, sizeof(buffer), message, args);
- buffer[1023] = '\0';
- pw_core_resource_error(resource, id, seq, res, buffer);
-}
-
-static inline void
-pw_core_resource_errorf(struct pw_resource *resource, uint32_t id, int seq,
- int res, const char *message, ...)
-{
- va_list args;
- va_start(args, message);
- pw_core_resource_errorv(resource, id, seq, res, message, args);
- va_end(args);
-}
-
-#define PW_VERSION_REGISTRY 0
+#define pw_core_proxy_destroy(c,...) pw_core_proxy_method(c,destroy,0,__VA_ARGS__)
/** \page page_registry Registry
*
@@ -390,57 +360,6 @@ pw_core_resource_errorf(struct pw_resource *resource, uint32_t id, int seq,
* can, for example, hide certain existing or new objects or limit
* the access permissions on an object.
*/
-#define PW_REGISTRY_PROXY_METHOD_BIND 0
-#define PW_REGISTRY_PROXY_METHOD_DESTROY 1
-#define PW_REGISTRY_PROXY_METHOD_NUM 2
-
-/** Registry methods */
-struct pw_registry_proxy_methods {
-#define PW_VERSION_REGISTRY_PROXY_METHODS 0
- uint32_t version;
- /**
- * Bind to a global object
- *
- * Bind to the global object with \a id and use the client proxy
- * with new_id as the proxy. After this call, methods can be
- * send to the remote global object and events can be received
- *
- * \param id the global id to bind to
- * \param type the interface type to bind to
- * \param version the interface version to use
- * \param new_id the client proxy to use
- */
- int (*bind) (void *object, uint32_t id, uint32_t type, uint32_t version, uint32_t new_id);
-
- /**
- * Attempt to destroy a global object
- *
- * Try to destroy the global object.
- *
- * \param id the global id to destroy
- */
- int (*destroy) (void *object, uint32_t id);
-};
-
-/** Registry */
-static inline void *
-pw_registry_proxy_bind(struct pw_registry_proxy *registry,
- uint32_t id, uint32_t type, uint32_t version,
- size_t user_data_size)
-{
- struct pw_proxy *reg = (struct pw_proxy*)registry;
- struct pw_proxy *p = pw_proxy_new(reg, type, user_data_size);
- pw_proxy_do(reg, struct pw_registry_proxy_methods, bind,
- id, type, version, pw_proxy_get_id(p));
- return p;
-}
-
-static inline int
-pw_registry_proxy_destroy(struct pw_registry_proxy *registry, uint32_t id)
-{
- struct pw_proxy *reg = (struct pw_proxy*)registry;
- return pw_proxy_do(reg, struct pw_registry_proxy_methods, destroy, id);
-}
#define PW_REGISTRY_PROXY_EVENT_GLOBAL 0
#define PW_REGISTRY_PROXY_EVENT_GLOBAL_REMOVE 1
@@ -478,28 +397,72 @@ struct pw_registry_proxy_events {
void (*global_remove) (void *object, uint32_t id);
};
-static inline void
-pw_registry_proxy_add_listener(struct pw_registry_proxy *registry,
- struct spa_hook *listener,
- const struct pw_registry_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)registry, listener, events, data);
-}
+#define PW_REGISTRY_PROXY_METHOD_ADD_LISTENER 0
+#define PW_REGISTRY_PROXY_METHOD_BIND 1
+#define PW_REGISTRY_PROXY_METHOD_DESTROY 2
+#define PW_REGISTRY_PROXY_METHOD_NUM 3
+
+/** Registry methods */
+struct pw_registry_proxy_methods {
+#define PW_VERSION_REGISTRY_PROXY_METHODS 0
+ uint32_t version;
-#define pw_registry_resource_global(r,...) pw_resource_notify(r,struct pw_registry_proxy_events,global,__VA_ARGS__)
-#define pw_registry_resource_global_remove(r,...) pw_resource_notify(r,struct pw_registry_proxy_events,global_remove,__VA_ARGS__)
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_registry_proxy_events *events,
+ void *data);
+ /**
+ * Bind to a global object
+ *
+ * Bind to the global object with \a id and use the client proxy
+ * with new_id as the proxy. After this call, methods can be
+ * send to the remote global object and events can be received
+ *
+ * \param id the global id to bind to
+ * \param type the interface type to bind to
+ * \param version the interface version to use
+ * \returns the new object
+ */
+ void * (*bind) (void *object, uint32_t id, uint32_t type, uint32_t version,
+ size_t use_data_size);
+ /**
+ * Attempt to destroy a global object
+ *
+ * Try to destroy the global object.
+ *
+ * \param id the global id to destroy
+ */
+ int (*destroy) (void *object, uint32_t id);
+};
-#define PW_VERSION_MODULE 0
+#define pw_registry_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_registry_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_registry_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-#define PW_MODULE_PROXY_METHOD_NUM 0
+/** Registry */
+#define pw_registry_proxy_add_listener(p,...) pw_registry_proxy_method(p,add_listener,0,__VA_ARGS__)
+
+static inline void *
+pw_registry_proxy_bind(struct pw_registry_proxy *registry,
+ uint32_t id, uint32_t type, uint32_t version,
+ size_t user_data_size)
+{
+ void *res = NULL;
+ spa_interface_call_res(&registry->iface,
+ struct pw_registry_proxy_methods, res,
+ bind, 0, id, type, version, user_data_size);
+ return res;
+}
+
+#define pw_registry_proxy_destroy(p,...) pw_registry_proxy_method(p,destroy,0,__VA_ARGS__)
-/** Module methods */
-struct pw_module_proxy_methods {
-#define PW_VERSION_MODULE_PROXY_METHODS 0
- uint32_t version;
-};
#define PW_MODULE_PROXY_EVENT_INFO 0
#define PW_MODULE_PROXY_EVENT_NUM 1
@@ -516,28 +479,77 @@ struct pw_module_proxy_events {
void (*info) (void *object, const struct pw_module_info *info);
};
-static inline void
-pw_module_proxy_add_listener(struct pw_module_proxy *module,
- struct spa_hook *listener,
- const struct pw_module_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)module, listener, events, data);
-}
+#define PW_MODULE_PROXY_METHOD_ADD_LISTENER 0
+#define PW_MODULE_PROXY_METHOD_NUM 1
-#define pw_module_resource_info(r,...) pw_resource_notify(r,struct pw_module_proxy_events,info,__VA_ARGS__)
+/** Module methods */
+struct pw_module_proxy_methods {
+#define PW_VERSION_MODULE_PROXY_METHODS 0
+ uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_module_proxy_events *events,
+ void *data);
+};
-#define PW_VERSION_DEVICE 0
+#define pw_module_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_module_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_module_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-#define PW_DEVICE_PROXY_METHOD_ENUM_PARAMS 0
-#define PW_DEVICE_PROXY_METHOD_SET_PARAM 1
-#define PW_DEVICE_PROXY_METHOD_NUM 2
+#define pw_module_proxy_add_listener(c,...) pw_module_proxy_method(c,add_listener,0,__VA_ARGS__)
+
+#define PW_DEVICE_PROXY_EVENT_INFO 0
+#define PW_DEVICE_PROXY_EVENT_PARAM 1
+#define PW_DEVICE_PROXY_EVENT_NUM 2
+
+/** Device events */
+struct pw_device_proxy_events {
+#define PW_VERSION_DEVICE_PROXY_EVENTS 0
+ uint32_t version;
+ /**
+ * Notify device info
+ *
+ * \param info info about the device
+ */
+ void (*info) (void *object, const struct pw_device_info *info);
+ /**
+ * Notify a device param
+ *
+ * Event emited as a result of the enum_params method.
+ *
+ * \param seq the sequence number of the request
+ * \param id the param id
+ * \param index the param index
+ * \param next the param index of the next param
+ * \param param the parameter
+ */
+ void (*param) (void *object, int seq,
+ uint32_t id, uint32_t index, uint32_t next,
+ const struct spa_pod *param);
+};
+
+
+#define PW_DEVICE_PROXY_METHOD_ADD_LISTENER 0
+#define PW_DEVICE_PROXY_METHOD_ENUM_PARAMS 1
+#define PW_DEVICE_PROXY_METHOD_SET_PARAM 2
+#define PW_DEVICE_PROXY_METHOD_NUM 3
/** Device methods */
struct pw_device_proxy_methods {
#define PW_VERSION_DEVICE_PROXY_METHODS 0
uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_device_proxy_events *events,
+ void *data);
/**
* Enumerate device parameters
*
@@ -563,38 +575,37 @@ struct pw_device_proxy_methods {
const struct spa_pod *param);
};
-static inline int
-pw_device_proxy_enum_params(struct pw_device_proxy *device, int seq, uint32_t id, uint32_t index,
- uint32_t num, const struct spa_pod *filter)
-{
- return pw_proxy_do((struct pw_proxy*)device, struct pw_device_proxy_methods, enum_params,
- seq, id, index, num, filter);
-}
+#define pw_device_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_device_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_device_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-static inline int
-pw_device_proxy_set_param(struct pw_device_proxy *device, uint32_t id, uint32_t flags,
- const struct spa_pod *param)
-{
- return pw_proxy_do((struct pw_proxy*)device, struct pw_device_proxy_methods, set_param,
- id, flags, param);
-}
+#define pw_device_proxy_add_listener(c,...) pw_device_proxy_method(c,add_listener,0,__VA_ARGS__)
+#define pw_device_proxy_enum_params(c,...) pw_device_proxy_method(c,enum_params,0,__VA_ARGS__)
+#define pw_device_proxy_set_param(c,...) pw_device_proxy_method(c,set_param,0,__VA_ARGS__)
-#define PW_DEVICE_PROXY_EVENT_INFO 0
-#define PW_DEVICE_PROXY_EVENT_PARAM 1
-#define PW_DEVICE_PROXY_EVENT_NUM 2
-/** Device events */
-struct pw_device_proxy_events {
-#define PW_VERSION_DEVICE_PROXY_EVENTS 0
+#define PW_NODE_PROXY_EVENT_INFO 0
+#define PW_NODE_PROXY_EVENT_PARAM 1
+#define PW_NODE_PROXY_EVENT_NUM 2
+
+/** Node events */
+struct pw_node_proxy_events {
+#define PW_VERSION_NODE_PROXY_EVENTS 0
uint32_t version;
/**
- * Notify device info
+ * Notify node info
*
- * \param info info about the device
+ * \param info info about the node
*/
- void (*info) (void *object, const struct pw_device_info *info);
+ void (*info) (void *object, const struct pw_node_info *info);
/**
- * Notify a device param
+ * Notify a node param
*
* Event emited as a result of the enum_params method.
*
@@ -609,30 +620,22 @@ struct pw_device_proxy_events {
const struct spa_pod *param);
};
-static inline void
-pw_device_proxy_add_listener(struct pw_device_proxy *device,
- struct spa_hook *listener,
- const struct pw_device_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)device, listener, events, data);
-}
-
-#define pw_device_resource_info(r,...) pw_resource_notify(r,struct pw_device_proxy_events,info,__VA_ARGS__)
-#define pw_device_resource_param(r,...) pw_resource_notify(r,struct pw_device_proxy_events,param,__VA_ARGS__)
-
-#define PW_VERSION_NODE 0
-
-#define PW_NODE_PROXY_METHOD_SUBSCRIBE_PARAMS 0
-#define PW_NODE_PROXY_METHOD_ENUM_PARAMS 1
-#define PW_NODE_PROXY_METHOD_SET_PARAM 2
-#define PW_NODE_PROXY_METHOD_SEND_COMMAND 3
-#define PW_NODE_PROXY_METHOD_NUM 4
+#define PW_NODE_PROXY_METHOD_ADD_LISTENER 0
+#define PW_NODE_PROXY_METHOD_SUBSCRIBE_PARAMS 1
+#define PW_NODE_PROXY_METHOD_ENUM_PARAMS 2
+#define PW_NODE_PROXY_METHOD_SET_PARAM 3
+#define PW_NODE_PROXY_METHOD_SEND_COMMAND 4
+#define PW_NODE_PROXY_METHOD_NUM 5
/** Node methods */
struct pw_node_proxy_methods {
#define PW_VERSION_NODE_PROXY_METHODS 0
uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_node_proxy_events *events,
+ void *data);
/**
* Subscribe to parameter changes
*
@@ -678,53 +681,40 @@ struct pw_node_proxy_methods {
int (*send_command) (void *object, const struct spa_command *command);
};
-/** Node */
-static inline int
-pw_node_proxy_subscribe_params(struct pw_node_proxy *node, uint32_t *ids, uint32_t n_ids)
-{
- return pw_proxy_do((struct pw_proxy*)node, struct pw_node_proxy_methods, subscribe_params,
- ids, n_ids);
-}
-
-static inline int
-pw_node_proxy_enum_params(struct pw_node_proxy *node, int seq, uint32_t id, uint32_t index,
- uint32_t num, const struct spa_pod *filter)
-{
- return pw_proxy_do((struct pw_proxy*)node, struct pw_node_proxy_methods, enum_params,
- seq, id, index, num, filter);
-}
+#define pw_node_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_node_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_node_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-static inline int
-pw_node_proxy_set_param(struct pw_node_proxy *node, uint32_t id, uint32_t flags,
- const struct spa_pod *param)
-{
- return pw_proxy_do((struct pw_proxy*)node, struct pw_node_proxy_methods, set_param,
- id, flags, param);
-}
+/** Node */
+#define pw_node_proxy_add_listener(c,...) pw_node_proxy_method(c,add_listener,0,__VA_ARGS__)
+#define pw_node_proxy_subscribe_params(c,...) pw_node_proxy_method(c,subscribe_params,0,__VA_ARGS__)
+#define pw_node_proxy_enum_params(c,...) pw_node_proxy_method(c,enum_params,0,__VA_ARGS__)
+#define pw_node_proxy_set_param(c,...) pw_node_proxy_method(c,set_param,0,__VA_ARGS__)
+#define pw_node_proxy_send_command(c,...) pw_node_proxy_method(c,send_command,0,__VA_ARGS__)
-static inline int
-pw_node_proxy_send_command(struct pw_node_proxy *node, const struct spa_command *command)
-{
- return pw_proxy_do((struct pw_proxy*)node, struct pw_node_proxy_methods, send_command,
- command);
-}
-#define PW_NODE_PROXY_EVENT_INFO 0
-#define PW_NODE_PROXY_EVENT_PARAM 1
-#define PW_NODE_PROXY_EVENT_NUM 2
+#define PW_PORT_PROXY_EVENT_INFO 0
+#define PW_PORT_PROXY_EVENT_PARAM 1
+#define PW_PORT_PROXY_EVENT_NUM 2
-/** Node events */
-struct pw_node_proxy_events {
-#define PW_VERSION_NODE_PROXY_EVENTS 0
+/** Port events */
+struct pw_port_proxy_events {
+#define PW_VERSION_PORT_PROXY_EVENTS 0
uint32_t version;
/**
- * Notify node info
+ * Notify port info
*
- * \param info info about the node
+ * \param info info about the port
*/
- void (*info) (void *object, const struct pw_node_info *info);
+ void (*info) (void *object, const struct pw_port_info *info);
/**
- * Notify a node param
+ * Notify a port param
*
* Event emited as a result of the enum_params method.
*
@@ -735,33 +725,24 @@ struct pw_node_proxy_events {
* \param param the parameter
*/
void (*param) (void *object, int seq,
- uint32_t id, uint32_t index, uint32_t next,
- const struct spa_pod *param);
+ uint32_t id, uint32_t index, uint32_t next,
+ const struct spa_pod *param);
};
-static inline void
-pw_node_proxy_add_listener(struct pw_node_proxy *node,
- struct spa_hook *listener,
- const struct pw_node_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)node, listener, events, data);
-}
-
-#define pw_node_resource_info(r,...) pw_resource_notify(r,struct pw_node_proxy_events,info,__VA_ARGS__)
-#define pw_node_resource_param(r,...) pw_resource_notify(r,struct pw_node_proxy_events,param,__VA_ARGS__)
-
-
-#define PW_VERSION_PORT 0
-
-#define PW_PORT_PROXY_METHOD_SUBSCRIBE_PARAMS 0
-#define PW_PORT_PROXY_METHOD_ENUM_PARAMS 1
-#define PW_PORT_PROXY_METHOD_NUM 2
+#define PW_PORT_PROXY_METHOD_ADD_LISTENER 0
+#define PW_PORT_PROXY_METHOD_SUBSCRIBE_PARAMS 1
+#define PW_PORT_PROXY_METHOD_ENUM_PARAMS 2
+#define PW_PORT_PROXY_METHOD_NUM 3
/** Port methods */
struct pw_port_proxy_methods {
#define PW_VERSION_PORT_PROXY_METHODS 0
uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_port_proxy_events *events,
+ void *data);
/**
* Subscribe to parameter changes
*
@@ -790,114 +771,110 @@ struct pw_port_proxy_methods {
const struct spa_pod *filter);
};
-/** Port params */
-static inline int
-pw_port_proxy_subscribe_params(struct pw_port_proxy *port, uint32_t *ids, uint32_t n_ids)
-{
- return pw_proxy_do((struct pw_proxy*)port, struct pw_port_proxy_methods, subscribe_params,
- ids, n_ids);
-}
+#define pw_port_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_port_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_port_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-static inline int
-pw_port_proxy_enum_params(struct pw_port_proxy *port, int seq, uint32_t id, uint32_t index,
- uint32_t num, const struct spa_pod *filter)
-{
- return pw_proxy_do((struct pw_proxy*)port, struct pw_port_proxy_methods, enum_params,
- seq, id, index, num, filter);
-}
+#define pw_port_proxy_add_listener(c,...) pw_port_proxy_method(c,add_listener,0,__VA_ARGS__)
+#define pw_port_proxy_subscribe_params(c,...) pw_port_proxy_method(c,subscribe_params,0,__VA_ARGS__)
+#define pw_port_proxy_enum_params(c,...) pw_port_proxy_method(c,enum_params,0,__VA_ARGS__)
-#define PW_PORT_PROXY_EVENT_INFO 0
-#define PW_PORT_PROXY_EVENT_PARAM 1
-#define PW_PORT_PROXY_EVENT_NUM 2
-/** Port events */
-struct pw_port_proxy_events {
-#define PW_VERSION_PORT_PROXY_EVENTS 0
+#define PW_FACTORY_PROXY_EVENT_INFO 0
+#define PW_FACTORY_PROXY_EVENT_NUM 1
+
+/** Factory events */
+struct pw_factory_proxy_events {
+#define PW_VERSION_FACTORY_PROXY_EVENTS 0
uint32_t version;
/**
- * Notify port info
- *
- * \param info info about the port
- */
- void (*info) (void *object, const struct pw_port_info *info);
- /**
- * Notify a port param
- *
- * Event emited as a result of the enum_params method.
+ * Notify factory info
*
- * \param seq the sequence number of the request
- * \param id the param id
- * \param index the param index
- * \param next the param index of the next param
- * \param param the parameter
+ * \param info info about the factory
*/
- void (*param) (void *object, int seq,
- uint32_t id, uint32_t index, uint32_t next,
- const struct spa_pod *param);
+ void (*info) (void *object, const struct pw_factory_info *info);
};
-static inline void
-pw_port_proxy_add_listener(struct pw_port_proxy *port,
- struct spa_hook *listener,
- const struct pw_port_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)port, listener, events, data);
-}
-
-#define pw_port_resource_info(r,...) pw_resource_notify(r,struct pw_port_proxy_events,info,__VA_ARGS__)
-#define pw_port_resource_param(r,...) pw_resource_notify(r,struct pw_port_proxy_events,param,__VA_ARGS__)
-
-#define PW_VERSION_FACTORY 0
-
-#define PW_FACTORY_PROXY_METHOD_NUM 0
+#define PW_FACTORY_PROXY_METHOD_ADD_LISTENER 0
+#define PW_FACTORY_PROXY_METHOD_NUM 1
/** Factory methods */
struct pw_factory_proxy_methods {
#define PW_VERSION_FACTORY_PROXY_METHODS 0
uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_factory_proxy_events *events,
+ void *data);
};
-#define PW_FACTORY_PROXY_EVENT_INFO 0
-#define PW_FACTORY_PROXY_EVENT_NUM 1
+#define pw_factory_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_factory_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_factory_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-/** Factory events */
-struct pw_factory_proxy_events {
-#define PW_VERSION_FACTORY_PROXY_EVENTS 0
+#define pw_factory_proxy_add_listener(c,...) pw_factory_proxy_method(c,add_listener,0,__VA_ARGS__)
+
+
+#define PW_CLIENT_PROXY_EVENT_INFO 0
+#define PW_CLIENT_PROXY_EVENT_PERMISSIONS 1
+#define PW_CLIENT_PROXY_EVENT_NUM 2
+
+/** Client events */
+struct pw_client_proxy_events {
+#define PW_VERSION_CLIENT_PROXY_EVENTS 0
uint32_t version;
/**
- * Notify factory info
+ * Notify client info
*
- * \param info info about the factory
+ * \param info info about the client
*/
- void (*info) (void *object, const struct pw_factory_info *info);
+ void (*info) (void *object, const struct pw_client_info *info);
+ /**
+ * Notify a client permission
+ *
+ * Event emited as a result of the get_permissions method.
+ *
+ * \param default_permissions the default permissions
+ * \param index the index of the first permission entry
+ * \param n_permissions the number of permissions
+ * \param permissions the permissions
+ */
+ void (*permissions) (void *object,
+ uint32_t index,
+ uint32_t n_permissions,
+ const struct pw_permission *permissions);
};
-/** Factory */
-static inline void
-pw_factory_proxy_add_listener(struct pw_factory_proxy *factory,
- struct spa_hook *listener,
- const struct pw_factory_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)factory, listener, events, data);
-}
-#define pw_factory_resource_info(r,...) pw_resource_notify(r,struct pw_factory_proxy_events,info,__VA_ARGS__)
-
-#define PW_VERSION_CLIENT 0
-
-#define PW_CLIENT_PROXY_METHOD_ERROR 0
-#define PW_CLIENT_PROXY_METHOD_UPDATE_PROPERTIES 1
-#define PW_CLIENT_PROXY_METHOD_GET_PERMISSIONS 2
-#define PW_CLIENT_PROXY_METHOD_UPDATE_PERMISSIONS 3
-#define PW_CLIENT_PROXY_METHOD_NUM 4
+#define PW_CLIENT_PROXY_METHOD_ADD_LISTENER 0
+#define PW_CLIENT_PROXY_METHOD_ERROR 1
+#define PW_CLIENT_PROXY_METHOD_UPDATE_PROPERTIES 2
+#define PW_CLIENT_PROXY_METHOD_GET_PERMISSIONS 3
+#define PW_CLIENT_PROXY_METHOD_UPDATE_PERMISSIONS 4
+#define PW_CLIENT_PROXY_METHOD_NUM 5
/** Client methods */
struct pw_client_proxy_methods {
#define PW_VERSION_CLIENT_PROXY_METHODS 0
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_client_proxy_events *events,
+ void *data);
/**
* Send an error to a client
*
@@ -939,85 +916,22 @@ struct pw_client_proxy_methods {
const struct pw_permission *permissions);
};
-/** Client permissions */
-static inline int
-pw_client_proxy_error(struct pw_client_proxy *client, uint32_t id, int res, const char *message)
-{
- return pw_proxy_do((struct pw_proxy*)client, struct pw_client_proxy_methods, error, id, res, message);
-}
-
-static inline int
-pw_client_proxy_update_properties(struct pw_client_proxy *client, const struct spa_dict *props)
-{
- return pw_proxy_do((struct pw_proxy*)client, struct pw_client_proxy_methods, update_properties, props);
-}
-
-static inline int
-pw_client_proxy_get_permissions(struct pw_client_proxy *client, uint32_t index, uint32_t num)
-{
- return pw_proxy_do((struct pw_proxy*)client, struct pw_client_proxy_methods, get_permissions, index, num);
-}
-
-static inline int
-pw_client_proxy_update_permissions(struct pw_client_proxy *client, uint32_t n_permissions,
- const struct pw_permission *permissions)
-{
- return pw_proxy_do((struct pw_proxy*)client, struct pw_client_proxy_methods, update_permissions,
- n_permissions, permissions);
-}
-
-#define PW_CLIENT_PROXY_EVENT_INFO 0
-#define PW_CLIENT_PROXY_EVENT_PERMISSIONS 1
-#define PW_CLIENT_PROXY_EVENT_NUM 2
-
-/** Client events */
-struct pw_client_proxy_events {
-#define PW_VERSION_CLIENT_PROXY_EVENTS 0
- uint32_t version;
- /**
- * Notify client info
- *
- * \param info info about the client
- */
- void (*info) (void *object, const struct pw_client_info *info);
- /**
- * Notify a client permission
- *
- * Event emited as a result of the get_permissions method.
- *
- * \param default_permissions the default permissions
- * \param index the index of the first permission entry
- * \param n_permissions the number of permissions
- * \param permissions the permissions
- */
- void (*permissions) (void *object,
- uint32_t index,
- uint32_t n_permissions,
- const struct pw_permission *permissions);
-};
-
-/** Client */
-static inline void
-pw_client_proxy_add_listener(struct pw_client_proxy *client,
- struct spa_hook *listener,
- const struct pw_client_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)client, listener, events, data);
-}
+#define pw_client_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_client_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_client_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
-#define pw_client_resource_info(r,...) pw_resource_notify(r,struct pw_client_proxy_events,info,__VA_ARGS__)
-#define pw_client_resource_permissions(r,...) pw_resource_notify(r,struct pw_client_proxy_events,permissions,__VA_ARGS__)
+#define pw_client_proxy_add_listener(c,...) pw_client_proxy_method(c,add_listener,0,__VA_ARGS__)
+#define pw_client_proxy_error(c,...) pw_client_proxy_method(c,error,0,__VA_ARGS__)
+#define pw_client_proxy_update_properties(c,...) pw_client_proxy_method(c,update_properties,0,__VA_ARGS__)
+#define pw_client_proxy_get_permissions(c,...) pw_client_proxy_method(c,get_permissions,0,__VA_ARGS__)
+#define pw_client_proxy_update_permissions(c,...) pw_client_proxy_method(c,update_permissions,0,__VA_ARGS__)
-#define PW_VERSION_LINK 0
-
-#define PW_LINK_PROXY_METHOD_NUM 0
-
-/** Link methods */
-struct pw_link_proxy_methods {
-#define PW_VERSION_LINK_PROXY_METHODS 0
- uint32_t version;
-};
#define PW_LINK_PROXY_EVENT_INFO 0
#define PW_LINK_PROXY_EVENT_NUM 1
@@ -1034,17 +948,31 @@ struct pw_link_proxy_events {
void (*info) (void *object, const struct pw_link_info *info);
};
-/** Link */
-static inline void
-pw_link_proxy_add_listener(struct pw_link_proxy *link,
- struct spa_hook *listener,
- const struct pw_link_proxy_events *events,
- void *data)
-{
- pw_proxy_add_proxy_listener((struct pw_proxy*)link, listener, events, data);
-}
+#define PW_LINK_PROXY_METHOD_ADD_LISTENER 0
+#define PW_LINK_PROXY_METHOD_NUM 1
+
+/** Link methods */
+struct pw_link_proxy_methods {
+#define PW_VERSION_LINK_PROXY_METHODS 0
+ uint32_t version;
+
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_link_proxy_events *events,
+ void *data);
+};
-#define pw_link_resource_info(r,...) pw_resource_notify(r,struct pw_link_proxy_events,info,__VA_ARGS__)
+#define pw_link_proxy_method(o,method,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ struct pw_link_proxy *_p = o; \
+ spa_interface_call_res(&_p->iface, \
+ struct pw_link_proxy_methods, _res, \
+ method, version, ##__VA_ARGS__); \
+ _res; \
+})
+
+#define pw_link_proxy_add_listener(c,...) pw_link_proxy_method(c,add_listener,0,__VA_ARGS__)
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/pipewire/link.c b/src/pipewire/link.c
index 073c7605..aa27608c 100644
--- a/src/pipewire/link.c
+++ b/src/pipewire/link.c
@@ -47,6 +47,8 @@
#define MAX_BUFFERS 64
+#define pw_link_resource_info(r,...) pw_resource_notify(r,struct pw_link_proxy_events,info,0,__VA_ARGS__)
+
/** \cond */
struct impl {
struct pw_link this;
@@ -518,11 +520,13 @@ static int port_set_io(struct pw_link *this, struct pw_port *port, uint32_t id,
pw_direction_as_string(port->direction),
port, port->port_id, mix->port.port_id, id, data, size);
- if (port->mix->port_set_io) {
- if ((res = spa_node_port_set_io(port->mix,
- mix->port.direction,
- mix->port.port_id,
- id, data, size)) < 0)
+ if ((res = spa_node_port_set_io(port->mix,
+ mix->port.direction,
+ mix->port.port_id,
+ id, data, size)) < 0) {
+ if (res == -ENOTSUP)
+ res = 0;
+ else
pw_log_warn("port %p: can't set io: %s", port, spa_strerror(res));
}
return res;
@@ -1417,7 +1421,8 @@ int pw_link_register(struct pw_link *link,
link->registered = true;
link->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Link, PW_VERSION_LINK,
+ PW_TYPE_INTERFACE_Link,
+ PW_VERSION_LINK_PROXY,
properties,
global_bind,
link);
diff --git a/src/pipewire/log.c b/src/pipewire/log.c
index 43ec6fed..19c81c3a 100644
--- a/src/pipewire/log.c
+++ b/src/pipewire/log.c
@@ -86,7 +86,9 @@ pw_log_log(enum spa_log_level level,
if (SPA_UNLIKELY(pw_log_level_enabled(level) && global_log)) {
va_list args;
va_start(args, fmt);
- global_log->logv(global_log, level, file, line, func, fmt, args);
+ spa_interface_call(&global_log->iface,
+ struct spa_log_methods, logv, 0, level, file, line,
+ func, fmt, args);
va_end(args);
}
}
@@ -111,7 +113,9 @@ pw_log_logv(enum spa_log_level level,
va_list args)
{
if (SPA_UNLIKELY(pw_log_level_enabled(level) && global_log)) {
- global_log->logv(global_log, level, file, line, func, fmt, args);
+ spa_interface_call(&global_log->iface,
+ struct spa_log_methods, logv, 0, level, file, line,
+ func, fmt, args);
}
}
diff --git a/src/pipewire/module.c b/src/pipewire/module.c
index 409e07ea..933dd1eb 100644
--- a/src/pipewire/module.c
+++ b/src/pipewire/module.c
@@ -45,6 +45,8 @@ struct impl {
void *hnd;
};
+#define pw_module_resource_info(r,...) pw_resource_notify(r,struct pw_module_proxy_events,info,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
};
@@ -240,7 +242,8 @@ pw_module_load(struct pw_core *core,
spa_list_append(&core->module_list, &this->link);
this->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Module, PW_VERSION_MODULE,
+ PW_TYPE_INTERFACE_Module,
+ PW_VERSION_MODULE_PROXY,
pw_properties_new(
PW_MODULE_PROP_NAME, name,
NULL),
diff --git a/src/pipewire/node.c b/src/pipewire/node.c
index 88de2aa3..97a0ebe7 100644
--- a/src/pipewire/node.c
+++ b/src/pipewire/node.c
@@ -54,6 +54,10 @@ struct impl {
unsigned int pause_on_idle:1;
};
+#define pw_node_resource(r,m,v,...) pw_resource_notify(r,struct pw_node_proxy_events,m,v,__VA_ARGS__)
+#define pw_node_resource_info(r,...) pw_node_resource(r,info,0,__VA_ARGS__)
+#define pw_node_resource_param(r,...) pw_node_resource(r,param,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
struct pw_node *node;
@@ -497,7 +501,8 @@ int pw_node_register(struct pw_node *this,
this->registered = true;
this->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Node, PW_VERSION_NODE,
+ PW_TYPE_INTERFACE_Node,
+ PW_VERSION_NODE_PROXY,
properties,
global_bind,
this);
diff --git a/src/pipewire/port.c b/src/pipewire/port.c
index c1f676c5..782b6be4 100644
--- a/src/pipewire/port.c
+++ b/src/pipewire/port.c
@@ -42,6 +42,10 @@ struct impl {
struct spa_node mix_node; /**< mix node implementation */
};
+#define pw_port_resource(r,m,v,...) pw_resource_notify(r,struct pw_port_proxy_events,m,v,__VA_ARGS__)
+#define pw_port_resource_info(r,...) pw_port_resource(r,info,0,__VA_ARGS__)
+#define pw_port_resource_param(r,...) pw_port_resource(r,param,0,__VA_ARGS__)
+
struct resource_data {
struct spa_hook resource_listener;
struct pw_port *port;
@@ -81,9 +85,9 @@ void pw_port_update_state(struct pw_port *port, enum pw_port_state state)
}
}
-static int tee_process(struct spa_node *data)
+static int tee_process(void *object)
{
- struct impl *impl = SPA_CONTAINER_OF(data, struct impl, mix_node);
+ struct impl *impl = object;
struct pw_port *this = &impl->this;
struct pw_port_mix *mix;
struct spa_io_buffers *io = &this->rt.io;
@@ -99,9 +103,9 @@ static int tee_process(struct spa_node *data)
return SPA_STATUS_HAVE_BUFFER | SPA_STATUS_NEED_BUFFER;
}
-static int tee_reuse_buffer(struct spa_node *data, uint32_t port_id, uint32_t buffer_id)
+static int tee_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct impl *impl = SPA_CONTAINER_OF(data, struct impl, mix_node);
+ struct impl *impl = object;
struct pw_port *this = &impl->this;
pw_log_trace_fp("port %p: tee reuse buffer %d %d", this, port_id, buffer_id);
@@ -110,16 +114,15 @@ static int tee_reuse_buffer(struct spa_node *data, uint32_t port_id, uint32_t bu
return 0;
}
-static const struct spa_node schedule_tee_node = {
- SPA_VERSION_NODE,
- NULL,
+static const struct spa_node_methods schedule_tee_node = {
+ SPA_VERSION_NODE_METHODS,
.process = tee_process,
.port_reuse_buffer = tee_reuse_buffer,
};
-static int schedule_mix_input(struct spa_node *data)
+static int schedule_mix_input(void *object)
{
- struct impl *impl = SPA_CONTAINER_OF(data, struct impl, mix_node);
+ struct impl *impl = object;
struct pw_port *this = &impl->this;
struct spa_io_buffers *io = &this->rt.io;
struct pw_port_mix *mix;
@@ -137,9 +140,9 @@ static int schedule_mix_input(struct spa_node *data)
return SPA_STATUS_HAVE_BUFFER | SPA_STATUS_NEED_BUFFER;
}
-static int schedule_mix_reuse_buffer(struct spa_node *data, uint32_t port_id, uint32_t buffer_id)
+static int schedule_mix_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct impl *impl = SPA_CONTAINER_OF(data, struct impl, mix_node);
+ struct impl *impl = object;
struct pw_port *this = &impl->this;
struct pw_port_mix *mix;
@@ -150,9 +153,8 @@ static int schedule_mix_reuse_buffer(struct spa_node *data, uint32_t port_id, ui
return 0;
}
-static const struct spa_node schedule_mix_node = {
- SPA_VERSION_NODE,
- NULL,
+static const struct spa_node_methods schedule_mix_node = {
+ SPA_VERSION_NODE_METHODS,
.process = schedule_mix_input,
.port_reuse_buffer = schedule_mix_reuse_buffer,
};
@@ -172,13 +174,12 @@ int pw_port_init_mix(struct pw_port *port, struct pw_port_mix *mix)
port->n_mix++;
mix->p = port;
- if (port->mix->add_port)
- port->mix->add_port(port->mix, port->direction, port_id, NULL);
+ spa_node_add_port(port->mix, port->direction, port_id, NULL);
res = pw_port_call_init_mix(port, mix);
/* set the same format on the mixer as on the port if any */
- if (port->mix->enum_params && port->mix->set_param) {
+ if (1) {
uint32_t idx = 0;
uint8_t buffer[1024];
struct spa_pod_builder b;
@@ -212,9 +213,7 @@ int pw_port_release_mix(struct pw_port *port, struct pw_port_mix *mix)
res = pw_port_call_release_mix(port, mix);
- if (port->mix->remove_port) {
- port->mix->remove_port(port->mix, port->direction, port_id);
- }
+ spa_node_remove_port(port->mix, port->direction, port_id);
pw_log_debug("port %p: release mix %d.%d", port,
port->port_id, mix->port.port_id);
@@ -334,6 +333,7 @@ struct pw_port *pw_port_new(enum pw_direction direction,
struct impl *impl;
struct pw_port *this;
struct pw_properties *properties;
+ const struct spa_node_methods *mix_methods;
impl = calloc(1, sizeof(struct impl) + user_data_size);
if (impl == NULL)
@@ -379,10 +379,17 @@ struct pw_port *pw_port_new(enum pw_direction direction,
spa_hook_list_init(&this->listener_list);
- impl->mix_node = this->direction == PW_DIRECTION_INPUT ?
- schedule_mix_node :
- schedule_tee_node;
- pw_port_set_mix(this, &impl->mix_node, 0);
+ if (this->direction == PW_DIRECTION_INPUT)
+ mix_methods = &schedule_mix_node;
+ else
+ mix_methods = &schedule_tee_node;
+
+ impl->mix_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ mix_methods, impl);
+
+ pw_port_set_mix(this, NULL, 0);
pw_map_init(&this->mix_port_map, 64, 64);
@@ -405,7 +412,7 @@ int pw_port_set_mix(struct pw_port *port, struct spa_node *node, uint32_t flags)
struct impl *impl = SPA_CONTAINER_OF(port, struct impl, this);
if (node == NULL) {
- node = &impl->mix_node;
+ node = (struct spa_node *)&impl->mix_node;
flags = 0;
}
pw_log_debug("port %p: mix node %p->%p", port, port->mix, node);
@@ -631,7 +638,8 @@ int pw_port_register(struct pw_port *port,
struct pw_core *core = node->core;
port->global = pw_global_new(core,
- PW_TYPE_INTERFACE_Port, PW_VERSION_PORT,
+ PW_TYPE_INTERFACE_Port,
+ PW_VERSION_PORT_PROXY,
properties,
global_bind,
port);
@@ -702,12 +710,10 @@ int pw_port_add(struct pw_port *port, struct pw_node *node)
SPA_IO_Buffers,
&port->rt.io, sizeof(port->rt.io));
- if (port->mix->port_set_io) {
- spa_node_port_set_io(port->mix,
- pw_direction_reverse(port->direction), 0,
- SPA_IO_Buffers,
- &port->rt.io, sizeof(port->rt.io));
- }
+ spa_node_port_set_io(port->mix,
+ pw_direction_reverse(port->direction), 0,
+ SPA_IO_Buffers,
+ &port->rt.io, sizeof(port->rt.io));
}
pw_log_debug("port %p: %d add to node %p", port, port_id, node);
@@ -952,7 +958,7 @@ int pw_port_set_param(struct pw_port *port, uint32_t id, uint32_t flags,
pw_log_debug("port %p: %d set param %d %p", port, port->state, id, param);
/* set the parameters on all ports of the mixer node if possible */
- if (port->mix->port_set_param != NULL) {
+ if (1) {
struct pw_port_mix *mix;
spa_list_for_each(mix, &port->mix_list, link) {
@@ -1010,7 +1016,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
if ((mix = pw_map_lookup(&port->mix_port_map, mix_id)) == NULL)
return -EIO;
- if (port->mix->port_use_buffers != NULL) {
+ if (1) {
res = spa_node_port_use_buffers(port->mix,
mix->port.direction, mix->port.port_id,
buffers, n_buffers);
diff --git a/src/pipewire/private.h b/src/pipewire/private.h
index 12b161ef..2a4fb458 100644
--- a/src/pipewire/private.h
+++ b/src/pipewire/private.h
@@ -36,6 +36,7 @@ extern "C" {
#include "pipewire/remote.h"
#include "pipewire/mem.h"
#include "pipewire/introspect.h"
+#include "pipewire/interfaces.h"
#include "pipewire/stream.h"
#include "pipewire/log.h"
@@ -170,6 +171,38 @@ struct pw_global {
#define pw_core_emit_global_added(c,g) pw_core_emit(c, global_added, 0, g)
#define pw_core_emit_global_removed(c,g) pw_core_emit(c, global_removed, 0, g)
+#define pw_core_resource(r,m,v,...) pw_resource_notify(r, struct pw_core_proxy_events, m, v, ##__VA_ARGS__)
+#define pw_core_resource_info(r,...) pw_core_resource(r,info,0,__VA_ARGS__)
+#define pw_core_resource_done(r,...) pw_core_resource(r,done,0,__VA_ARGS__)
+#define pw_core_resource_ping(r,...) pw_core_resource(r,ping,0,__VA_ARGS__)
+#define pw_core_resource_error(r,...) pw_core_resource(r,error,0,__VA_ARGS__)
+#define pw_core_resource_remove_id(r,...) pw_core_resource(r,remove_id,0,__VA_ARGS__)
+
+static inline void
+pw_core_resource_errorv(struct pw_resource *resource, uint32_t id, int seq,
+ int res, const char *message, va_list args)
+{
+ char buffer[1024];
+ vsnprintf(buffer, sizeof(buffer), message, args);
+ buffer[1023] = '\0';
+ pw_core_resource_error(resource, id, seq, res, buffer);
+}
+
+static inline void
+pw_core_resource_errorf(struct pw_resource *resource, uint32_t id, int seq,
+ int res, const char *message, ...)
+{
+ va_list args;
+ va_start(args, message);
+ pw_core_resource_errorv(resource, id, seq, res, message, args);
+ va_end(args);
+}
+
+#define pw_registry_resource(r,m,v,...) pw_resource_notify(r, struct pw_registry_proxy_events,m,v,##__VA_ARGS__)
+#define pw_registry_resource_global(r,...) pw_registry_resource(r,global,0,__VA_ARGS__)
+#define pw_registry_resource_global_remove(r,...) pw_registry_resource(r,global_remove,0,__VA_ARGS__)
+
+
struct pw_core {
struct pw_global *global; /**< the global of the core */
struct spa_hook global_listener;
@@ -592,6 +625,7 @@ struct pw_link {
#define pw_resource_emit_error(o,s,r,m) pw_resource_emit(o, error, 0, s, r, m)
struct pw_resource {
+ struct spa_interface impl; /**< event implementation */
struct pw_core *core; /**< the core object */
struct spa_list link; /**< link in object resource_list */
@@ -620,6 +654,7 @@ struct pw_resource {
#define pw_proxy_emit_error(p,s,r,m) pw_proxy_emit(p, error, 0, s, r, m)
struct pw_proxy {
+ struct spa_interface impl; /**< method implementation */
struct pw_remote *remote; /**< the owner remote of this proxy */
struct spa_list link; /**< link in the remote */
diff --git a/src/pipewire/proxy.c b/src/pipewire/proxy.c
index a76c60e3..40962ca5 100644
--- a/src/pipewire/proxy.c
+++ b/src/pipewire/proxy.c
@@ -78,6 +78,11 @@ struct pw_proxy *pw_proxy_new(struct pw_proxy *factory,
this->marshal = pw_protocol_get_marshal(remote->conn->protocol, type);
+ this->impl = SPA_INTERFACE_INIT(
+ type,
+ this->marshal->version,
+ this->marshal->method_marshal, this);
+
spa_list_append(&this->remote->proxy_list, &this->link);
pw_log_debug("proxy %p: new %u %s remote %p, marshal %p",
diff --git a/src/pipewire/proxy.h b/src/pipewire/proxy.h
index 00952340..a43d860a 100644
--- a/src/pipewire/proxy.h
+++ b/src/pipewire/proxy.h
@@ -164,7 +164,6 @@ 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,ver,...) spa_hook_list_call(pw_proxy_get_proxy_listeners(p),type,event,ver,## __VA_ARGS__)
-#define pw_proxy_do(p,type,method,...) ((type*) pw_proxy_get_marshal(p)->method_marshal)->method(p, ## __VA_ARGS__)
#ifdef __cplusplus
}
diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c
index ad321920..da53a7fb 100644
--- a/src/pipewire/remote.c
+++ b/src/pipewire/remote.c
@@ -329,7 +329,7 @@ static int do_connect(struct pw_remote *remote)
pw_core_proxy_add_listener(remote->core_proxy, &impl->core_listener, &core_proxy_events, remote);
pw_client_proxy_update_properties(remote->client_proxy, &remote->properties->dict);
- pw_core_proxy_hello(remote->core_proxy, PW_VERSION_CORE);
+ pw_core_proxy_hello(remote->core_proxy, PW_VERSION_CORE_PROXY);
pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTED, NULL);
return 0;
diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c
index 46f17092..349553ad 100644
--- a/src/pipewire/resource.c
+++ b/src/pipewire/resource.c
@@ -76,6 +76,11 @@ struct pw_resource *pw_resource_new(struct pw_client *client,
this->marshal = pw_protocol_get_marshal(client->protocol, type);
+ this->impl = SPA_INTERFACE_INIT(
+ type,
+ this->marshal->version,
+ this->marshal->event_marshal, this);
+
pw_log_debug("resource %p: new %u %s/%d client %p marshal %p",
this, id,
spa_debug_type_find_name(pw_type_info(), type), version,
diff --git a/src/pipewire/resource.h b/src/pipewire/resource.h
index d3a7543e..243cab87 100644
--- a/src/pipewire/resource.h
+++ b/src/pipewire/resource.h
@@ -141,8 +141,17 @@ const struct pw_protocol_marshal *pw_resource_get_marshal(struct pw_resource *re
#define pw_resource_do_parent(r,l,type,method,...) \
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__)
+#define pw_resource_notify(r,type,event,version,...) \
+ spa_interface_call((struct spa_interface*)r, \
+ type, event, version, ##__VA_ARGS__);
+
+#define pw_resource_notify_res(r,type,event,version,...) \
+({ \
+ int _res = -ENOTSUP; \
+ spa_interface_call_res((struct spa_interface*)r, \
+ type, _res, event, version, ##__VA_ARGS__); \
+ _res; \
+})
#ifdef __cplusplus
}
diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c
index 14bc8223..84eb86d0 100644
--- a/src/pipewire/stream.c
+++ b/src/pipewire/stream.c
@@ -118,6 +118,7 @@ struct stream {
struct spa_port_info port_info;
struct spa_node impl_node;
+ struct spa_node_methods node_methods;
struct spa_hook_list hooks;
struct spa_callbacks callbacks;
struct spa_io_buffers *io;
@@ -304,9 +305,9 @@ static void call_process(struct stream *impl)
}
}
-static int impl_set_io(struct spa_node *node, uint32_t id, void *data, size_t size)
+static int impl_set_io(void *object, uint32_t id, void *data, size_t size)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
switch(id) {
case SPA_IO_Position:
if (data && size >= sizeof(struct spa_io_position))
@@ -320,9 +321,9 @@ static int impl_set_io(struct spa_node *node, uint32_t id, void *data, size_t si
return 0;
}
-static int impl_send_command(struct spa_node *node, const struct spa_command *command)
+static int impl_send_command(void *object, const struct spa_command *command)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
struct pw_stream *stream = &impl->this;
switch (SPA_NODE_COMMAND_ID(command)) {
@@ -383,12 +384,12 @@ static void emit_port_info(struct stream *d)
spa_node_emit_port_info(&d->hooks, d->direction, 0, &info);
}
-static int impl_add_listener(struct spa_node *node,
+static int impl_add_listener(void *object,
struct spa_hook *listener,
const struct spa_node_events *events,
void *data)
{
- struct stream *d = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *d = object;
struct spa_hook_list save;
spa_hook_list_isolate(&d->hooks, &save, listener, events, data);
@@ -401,20 +402,20 @@ static int impl_add_listener(struct spa_node *node,
return 0;
}
-static int impl_set_callbacks(struct spa_node *node,
+static int impl_set_callbacks(void *object,
const struct spa_node_callbacks *callbacks, void *data)
{
- struct stream *d = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *d = object;
d->callbacks = SPA_CALLBACKS_INIT(callbacks, data);
return 0;
}
-static int impl_port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_set_io(void *object, enum spa_direction direction, uint32_t port_id,
uint32_t id, void *data, size_t size)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
pw_log_debug("stream %p: set io %s %p %zd", impl,
spa_debug_type_find_name(spa_type_io, id), data, size);
@@ -432,12 +433,12 @@ static int impl_port_set_io(struct spa_node *node, enum spa_direction direction,
return 0;
}
-static int impl_port_enum_params(struct spa_node *node, int seq,
+static int impl_port_enum_params(void *object, int seq,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t start, uint32_t num,
const struct spa_pod *filter)
{
- struct stream *d = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *d = object;
struct spa_result_node_params result;
uint8_t buffer[1024];
struct spa_pod_builder b = { 0 };
@@ -473,11 +474,11 @@ static int impl_port_enum_params(struct spa_node *node, int seq,
return 0;
}
-static int port_set_format(struct spa_node *node,
+static int port_set_format(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t flags, const struct spa_pod *format)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
struct pw_stream *stream = &impl->this;
struct param *p;
int count;
@@ -520,13 +521,13 @@ static int port_set_format(struct spa_node *node,
return -ENOMEM;
}
-static int impl_port_set_param(struct spa_node *node,
+static int impl_port_set_param(void *object,
enum spa_direction direction, uint32_t port_id,
uint32_t id, uint32_t flags,
const struct spa_pod *param)
{
if (id == SPA_PARAM_Format) {
- return port_set_format(node, direction, port_id, flags, param);
+ return port_set_format(object, direction, port_id, flags, param);
}
else
return -ENOENT;
@@ -590,10 +591,10 @@ static void clear_buffers(struct pw_stream *stream)
clear_queue(impl, &impl->queued);
}
-static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
+static int impl_port_use_buffers(void *object, enum spa_direction direction, uint32_t port_id,
struct spa_buffer **buffers, uint32_t n_buffers)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
struct pw_stream *stream = &impl->this;
uint32_t i, j, flags = impl->flags;
int prot, res;
@@ -662,9 +663,9 @@ static int impl_port_use_buffers(struct spa_node *node, enum spa_direction direc
return 0;
}
-static int impl_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint32_t buffer_id)
+static int impl_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
{
- struct stream *d = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *d = object;
pw_log_trace("stream %p: recycle buffer %d", d, buffer_id);
if (buffer_id < d->n_buffers)
push_queue(d, &d->queued, &d->buffers[buffer_id]);
@@ -685,9 +686,9 @@ static inline void copy_position(struct stream *impl, int64_t queued)
}
}
-static int impl_node_process_input(struct spa_node *node)
+static int impl_node_process_input(void *object)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
struct pw_stream *stream = &impl->this;
struct spa_io_buffers *io = impl->io;
struct buffer *b;
@@ -724,9 +725,9 @@ static int impl_node_process_input(struct spa_node *node)
return SPA_STATUS_HAVE_BUFFER;
}
-static int impl_node_process_output(struct spa_node *node)
+static int impl_node_process_output(void *object)
{
- struct stream *impl = SPA_CONTAINER_OF(node, struct stream, impl_node);
+ struct stream *impl = object;
struct pw_stream *stream = &impl->this;
struct spa_io_buffers *io = impl->io;
struct buffer *b;
@@ -771,8 +772,8 @@ static int impl_node_process_output(struct spa_node *node)
return res;
}
-static const struct spa_node impl_node = {
- SPA_VERSION_NODE,
+static const struct spa_node_methods impl_node = {
+ SPA_VERSION_NODE_METHODS,
.add_listener = impl_add_listener,
.set_callbacks = impl_set_callbacks,
.set_io = impl_set_io,
@@ -961,12 +962,17 @@ static int handle_connect(struct pw_stream *stream)
if (impl->node == NULL)
goto no_node;
- impl->impl_node = impl_node;
+ impl->node_methods = impl_node;
if (impl->direction == SPA_DIRECTION_INPUT)
- impl->impl_node.process = impl_node_process_input;
+ impl->node_methods.process = impl_node_process_input;
else
- impl->impl_node.process = impl_node_process_output;
+ impl->node_methods.process = impl_node_process_output;
+
+ impl->impl_node.iface = SPA_INTERFACE_INIT(
+ SPA_TYPE_INTERFACE_Node,
+ SPA_VERSION_NODE,
+ &impl->node_methods, impl);
pw_node_set_implementation(impl->node, &impl->impl_node);
diff --git a/src/tests/test-core.c b/src/tests/test-core.c
index b5db02cb..cba7683c 100644
--- a/src/tests/test-core.c
+++ b/src/tests/test-core.c
@@ -150,7 +150,7 @@ static void test_create(void)
spa_assert(pw_global_get_owner(global) == NULL);
spa_assert(pw_global_get_parent(global) == global);
spa_assert(pw_global_get_type(global) == PW_TYPE_INTERFACE_Core);
- spa_assert(pw_global_get_version(global) == PW_VERSION_CORE);
+ spa_assert(pw_global_get_version(global) == PW_VERSION_CORE_PROXY);
spa_assert(pw_global_get_id(global) == 0);
spa_assert(pw_global_get_object(global) == (void*)core);
diff --git a/src/tests/test-interfaces.c b/src/tests/test-interfaces.c
index 14492a91..c9cfcebc 100644
--- a/src/tests/test-interfaces.c
+++ b/src/tests/test-interfaces.c
@@ -37,18 +37,23 @@ static void test_core_abi(void)
struct pw_core_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_core_proxy_events *events,
+ void *data);
int (*hello) (void *object, uint32_t version);
int (*sync) (void *object, uint32_t id, int seq);
int (*pong) (void *object, uint32_t id, int seq);
int (*error) (void *object, uint32_t id, int seq, int res, const char *error);
- int (*get_registry) (void *object, uint32_t version, uint32_t new_id);
- int (*create_object) (void *object,
+ struct pw_registry_proxy * (*get_registry) (void *object,
+ uint32_t version, size_t user_data_size);
+ void * (*create_object) (void *object,
const char *factory_name,
uint32_t type,
uint32_t version,
const struct spa_dict *props,
- uint32_t new_id);
- int (*destroy) (void *object, uint32_t id);
+ size_t user_data_size);
+ int (*destroy) (void *object, void *proxy);
} methods = { PW_VERSION_CORE_PROXY_METHODS, };
struct {
uint32_t version;
@@ -60,6 +65,7 @@ static void test_core_abi(void)
} events = { PW_VERSION_CORE_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
TEST_FUNC(m, methods, hello);
TEST_FUNC(m, methods, sync);
TEST_FUNC(m, methods, pong);
@@ -86,7 +92,12 @@ static void test_registry_abi(void)
struct pw_registry_proxy_events e;
struct {
uint32_t version;
- int (*bind) (void *object, uint32_t id, uint32_t type, uint32_t version, uint32_t new_id);
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_registry_proxy_events *events,
+ void *data);
+ void * (*bind) (void *object, uint32_t id, uint32_t type, uint32_t version,
+ size_t user_data_size);
int (*destroy) (void *object, uint32_t id);
} methods = { PW_VERSION_REGISTRY_PROXY_METHODS, };
struct {
@@ -98,6 +109,7 @@ static void test_registry_abi(void)
} events = { PW_VERSION_REGISTRY_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
TEST_FUNC(m, methods, bind);
TEST_FUNC(m, methods, destroy);
spa_assert(PW_VERSION_REGISTRY_PROXY_METHODS == 0);
@@ -116,6 +128,10 @@ static void test_module_abi(void)
struct pw_module_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_module_proxy_events *events,
+ void *data);
} methods = { PW_VERSION_MODULE_PROXY_METHODS, };
struct {
uint32_t version;
@@ -123,6 +139,7 @@ static void test_module_abi(void)
} events = { PW_VERSION_MODULE_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
spa_assert(PW_VERSION_MODULE_PROXY_METHODS == 0);
spa_assert(sizeof(m) == sizeof(methods));
@@ -138,6 +155,10 @@ static void test_device_abi(void)
struct pw_device_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_device_proxy_events *events,
+ void *data);
int (*enum_params) (void *object, int seq, uint32_t id,
uint32_t start, uint32_t num,
const struct spa_pod *filter);
@@ -153,6 +174,7 @@ static void test_device_abi(void)
} events = { PW_VERSION_DEVICE_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
TEST_FUNC(m, methods, enum_params);
TEST_FUNC(m, methods, set_param);
spa_assert(PW_VERSION_DEVICE_PROXY_METHODS == 0);
@@ -171,6 +193,10 @@ static void test_node_abi(void)
struct pw_node_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_node_proxy_events *events,
+ void *data);
int (*subscribe_params) (void *object, uint32_t *ids, uint32_t n_ids);
int (*enum_params) (void *object, int seq, uint32_t id,
uint32_t start, uint32_t num, const struct spa_pod *filter);
@@ -187,6 +213,7 @@ static void test_node_abi(void)
} events = { PW_VERSION_NODE_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
TEST_FUNC(m, methods, subscribe_params);
TEST_FUNC(m, methods, enum_params);
TEST_FUNC(m, methods, set_param);
@@ -207,6 +234,10 @@ static void test_port_abi(void)
struct pw_port_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_port_proxy_events *events,
+ void *data);
int (*subscribe_params) (void *object, uint32_t *ids, uint32_t n_ids);
int (*enum_params) (void *object, int seq, uint32_t id,
uint32_t start, uint32_t num, const struct spa_pod *filter);
@@ -220,6 +251,7 @@ static void test_port_abi(void)
} events = { PW_VERSION_PORT_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
TEST_FUNC(m, methods, enum_params);
spa_assert(PW_VERSION_PORT_PROXY_METHODS == 0);
spa_assert(sizeof(m) == sizeof(methods));
@@ -237,6 +269,10 @@ static void test_factory_abi(void)
struct pw_factory_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_factory_proxy_events *events,
+ void *data);
} methods = { PW_VERSION_FACTORY_PROXY_METHODS, };
struct {
uint32_t version;
@@ -244,6 +280,7 @@ static void test_factory_abi(void)
} events = { PW_VERSION_FACTORY_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
spa_assert(PW_VERSION_FACTORY_PROXY_METHODS == 0);
spa_assert(sizeof(m) == sizeof(methods));
@@ -259,6 +296,10 @@ static void test_client_abi(void)
struct pw_client_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_client_proxy_events *events,
+ void *data);
int (*error) (void *object, uint32_t id, int res, const char *error);
int (*update_properties) (void *object, const struct spa_dict *props);
int (*get_permissions) (void *object, uint32_t index, uint32_t num);
@@ -273,6 +314,8 @@ static void test_client_abi(void)
} events = { PW_VERSION_CLIENT_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
+ TEST_FUNC(m, methods, error);
TEST_FUNC(m, methods, update_properties);
TEST_FUNC(m, methods, get_permissions);
TEST_FUNC(m, methods, update_permissions);
@@ -292,6 +335,10 @@ static void test_link_abi(void)
struct pw_link_proxy_events e;
struct {
uint32_t version;
+ int (*add_listener) (void *object,
+ struct spa_hook *listener,
+ const struct pw_link_proxy_events *events,
+ void *data);
} methods = { PW_VERSION_LINK_PROXY_METHODS, };
struct {
uint32_t version;
@@ -299,6 +346,7 @@ static void test_link_abi(void)
} events = { PW_VERSION_LINK_PROXY_EVENTS, };
TEST_FUNC(m, methods, version);
+ TEST_FUNC(m, methods, add_listener);
spa_assert(PW_VERSION_LINK_PROXY_METHODS == 0);
spa_assert(sizeof(m) == sizeof(methods));
diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c
index a26aa469..46487b77 100644
--- a/src/tools/pipewire-cli.c
+++ b/src/tools/pipewire-cli.c
@@ -400,7 +400,7 @@ static void on_state_changed(void *_data, enum pw_remote_state old,
&rd->core_listener,
&remote_core_events, rd);
rd->registry_proxy = pw_core_proxy_get_registry(rd->core_proxy,
- PW_VERSION_REGISTRY, 0);
+ PW_VERSION_REGISTRY_PROXY, 0);
pw_registry_proxy_add_listener(rd->registry_proxy,
&rd->registry_listener,
&registry_events, rd);
@@ -881,49 +881,49 @@ static bool bind_global(struct remote_data *rd, struct global *global, char **er
switch (global->type) {
case PW_TYPE_INTERFACE_Core:
events = &core_events;
- client_version = PW_VERSION_CORE;
+ client_version = PW_VERSION_CORE_PROXY;
destroy = (pw_destroy_t) pw_core_info_free;
info_func = info_core;
break;
case PW_TYPE_INTERFACE_Module:
events = &module_events;
- client_version = PW_VERSION_MODULE;
+ client_version = PW_VERSION_MODULE_PROXY;
destroy = (pw_destroy_t) pw_module_info_free;
info_func = info_module;
break;
case PW_TYPE_INTERFACE_Device:
events = &device_events;
- client_version = PW_VERSION_DEVICE;
+ client_version = PW_VERSION_DEVICE_PROXY;
destroy = (pw_destroy_t) pw_device_info_free;
info_func = info_device;
break;
case PW_TYPE_INTERFACE_Node:
events = &node_events;
- client_version = PW_VERSION_NODE;
+ client_version = PW_VERSION_NODE_PROXY;
destroy = (pw_destroy_t) pw_node_info_free;
info_func = info_node;
break;
case PW_TYPE_INTERFACE_Port:
events = &port_events;
- client_version = PW_VERSION_PORT;
+ client_version = PW_VERSION_PORT_PROXY;
destroy = (pw_destroy_t) pw_port_info_free;
info_func = info_port;
break;
case PW_TYPE_INTERFACE_Factory:
events = &factory_events;
- client_version = PW_VERSION_FACTORY;
+ client_version = PW_VERSION_FACTORY_PROXY;
destroy = (pw_destroy_t) pw_factory_info_free;
info_func = info_factory;
break;
case PW_TYPE_INTERFACE_Client:
events = &client_events;
- client_version = PW_VERSION_CLIENT;
+ client_version = PW_VERSION_CLIENT_PROXY;
destroy = (pw_destroy_t) pw_client_info_free;
info_func = info_client;
break;
case PW_TYPE_INTERFACE_Link:
events = &link_events;
- client_version = PW_VERSION_LINK;
+ client_version = PW_VERSION_LINK_PROXY;
destroy = (pw_destroy_t) pw_link_info_free;
info_func = info_link;
break;
@@ -1030,7 +1030,8 @@ static bool do_create_node(struct data *data, const char *cmd, char *args, char
props = parse_props(a[1]);
proxy = pw_core_proxy_create_object(rd->core_proxy, a[0],
- PW_TYPE_INTERFACE_Node, PW_VERSION_NODE,
+ PW_TYPE_INTERFACE_Node,
+ PW_VERSION_NODE_PROXY,
props ? &props->dict : NULL,
sizeof(struct proxy_data));
@@ -1099,7 +1100,7 @@ static bool do_create_link(struct data *data, const char *cmd, char *args, char
proxy = (struct pw_proxy*)pw_core_proxy_create_object(rd->core_proxy,
"link-factory",
PW_TYPE_INTERFACE_Link,
- PW_VERSION_LINK,
+ PW_VERSION_LINK_PROXY,
props ? &props->dict : NULL,
sizeof(struct proxy_data));
diff --git a/src/tools/pipewire-monitor.c b/src/tools/pipewire-monitor.c
index deeec1fd..679e06d2 100644
--- a/src/tools/pipewire-monitor.c
+++ b/src/tools/pipewire-monitor.c
@@ -589,40 +589,40 @@ static void registry_event_global(void *data, uint32_t id, uint32_t parent_id,
switch (type) {
case PW_TYPE_INTERFACE_Node:
events = &node_events;
- client_version = PW_VERSION_NODE;
+ client_version = PW_VERSION_NODE_PROXY;
destroy = (pw_destroy_t) pw_node_info_free;
print_func = print_node;
break;
case PW_TYPE_INTERFACE_Port:
events = &port_events;
- client_version = PW_VERSION_PORT;
+ client_version = PW_VERSION_PORT_PROXY;
destroy = (pw_destroy_t) pw_port_info_free;
print_func = print_port;
break;
case PW_TYPE_INTERFACE_Module:
events = &module_events;
- client_version = PW_VERSION_MODULE;
+ client_version = PW_VERSION_MODULE_PROXY;
destroy = (pw_destroy_t) pw_module_info_free;
break;
case PW_TYPE_INTERFACE_Device:
events = &device_events;
- client_version = PW_VERSION_DEVICE;
+ client_version = PW_VERSION_DEVICE_PROXY;
destroy = (pw_destroy_t) pw_device_info_free;
print_func = print_device;
break;
case PW_TYPE_INTERFACE_Factory:
events = &factory_events;
- client_version = PW_VERSION_FACTORY;
+ client_version = PW_VERSION_FACTORY_PROXY;
destroy = (pw_destroy_t) pw_factory_info_free;
break;
case PW_TYPE_INTERFACE_Client:
events = &client_events;
- client_version = PW_VERSION_CLIENT;
+ client_version = PW_VERSION_CLIENT_PROXY;
destroy = (pw_destroy_t) pw_client_info_free;
break;
case PW_TYPE_INTERFACE_Link:
events = &link_events;
- client_version = PW_VERSION_LINK;
+ client_version = PW_VERSION_LINK_PROXY;
destroy = (pw_destroy_t) pw_link_info_free;
break;
default:
@@ -702,7 +702,7 @@ static void on_state_changed(void *_data, enum pw_remote_state old,
&data->core_listener,
&core_events, data);
data->registry_proxy = pw_core_proxy_get_registry(data->core_proxy,
- PW_VERSION_REGISTRY, 0);
+ PW_VERSION_REGISTRY_PROXY, 0);
pw_registry_proxy_add_listener(data->registry_proxy,
&data->registry_listener,
&registry_events, data);