diff --git a/spa/include/spa/node/node.h b/spa/include/spa/node/node.h index 7107664cf..ea0161a91 100644 --- a/spa/include/spa/node/node.h +++ b/spa/include/spa/node/node.h @@ -179,6 +179,27 @@ struct spa_node { uint32_t id, uint32_t flags, const struct spa_pod *param); + /** + * Configure the given memory area with \a id on \a node. This + * structure is allocated by the host and is used to exchange + * data and parameters with the node. + * + * Setting an \a io of NULL will disable the node io. + * + * This function must be called from the main thread. + * + * \param id the id of the io area, the available ids can be + * enumerated with the node parameters. + * \param data a io area memory + * \param size the size of \a data + * \return 0 on success + * -EINVAL when invalid input is given + * -ENOENT when \a id is unknown + * -ENOSPC when \a size is too small + */ + int (*set_io) (struct spa_node *node, + uint32_t id, void *data, size_t size); + /** * Send a command to a node. * @@ -482,6 +503,7 @@ struct spa_node { #define spa_node_enum_params(n,...) (n)->enum_params((n),__VA_ARGS__) #define spa_node_set_param(n,...) (n)->set_param((n),__VA_ARGS__) +#define spa_node_set_io(n,...) (n)->set_io((n),__VA_ARGS__) #define spa_node_send_command(n,...) (n)->send_command((n),__VA_ARGS__) #define spa_node_set_callbacks(n,...) (n)->set_callbacks((n),__VA_ARGS__) #define spa_node_get_n_ports(n,...) (n)->get_n_ports((n),__VA_ARGS__) diff --git a/spa/plugins/alsa/alsa-sink.c b/spa/plugins/alsa/alsa-sink.c index dccdce9be..ab1d6cd77 100644 --- a/spa/plugins/alsa/alsa-sink.c +++ b/spa/plugins/alsa/alsa-sink.c @@ -159,6 +159,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -668,6 +673,7 @@ static const struct spa_node impl_node = { &node_info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/alsa/alsa-source.c b/spa/plugins/alsa/alsa-source.c index dd699b3bf..b1c2b6594 100644 --- a/spa/plugins/alsa/alsa-source.c +++ b/spa/plugins/alsa/alsa-source.c @@ -157,6 +157,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -678,6 +683,7 @@ static const struct spa_node impl_node = { &node_info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/audioconvert.c b/spa/plugins/audioconvert/audioconvert.c index ddf6ec0df..1098e11a2 100644 --- a/spa/plugins/audioconvert/audioconvert.c +++ b/spa/plugins/audioconvert/audioconvert.c @@ -442,6 +442,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -835,6 +840,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index 4955866d3..95a448b31 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -519,6 +519,11 @@ static int apply_props(struct impl *this, const struct spa_pod *param) return 0; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -1152,6 +1157,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/fmtconvert.c b/spa/plugins/audioconvert/fmtconvert.c index 8c02222d6..ec6b49cdb 100644 --- a/spa/plugins/audioconvert/fmtconvert.c +++ b/spa/plugins/audioconvert/fmtconvert.c @@ -195,6 +195,11 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return -ENOTSUP; } +static int impl_node_set_io(struct spa_node *node, 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) { struct impl *this; @@ -883,6 +888,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/merger.c b/spa/plugins/audioconvert/merger.c index 08097a6bb..8f55a5c1a 100644 --- a/spa/plugins/audioconvert/merger.c +++ b/spa/plugins/audioconvert/merger.c @@ -155,6 +155,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -889,6 +894,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/resample.c b/spa/plugins/audioconvert/resample.c index 442c37701..b53103cb1 100644 --- a/spa/plugins/audioconvert/resample.c +++ b/spa/plugins/audioconvert/resample.c @@ -156,6 +156,11 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return -ENOTSUP; } +static int impl_node_set_io(struct spa_node *node, 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) { struct impl *this; @@ -775,6 +780,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audioconvert/splitter.c b/spa/plugins/audioconvert/splitter.c index 92c91fce8..fa6caaa49 100644 --- a/spa/plugins/audioconvert/splitter.c +++ b/spa/plugins/audioconvert/splitter.c @@ -159,6 +159,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -912,6 +917,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audiomixer/audiomixer.c b/spa/plugins/audiomixer/audiomixer.c index 40309242a..cdf1f5492 100644 --- a/spa/plugins/audiomixer/audiomixer.c +++ b/spa/plugins/audiomixer/audiomixer.c @@ -134,6 +134,11 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return -ENOTSUP; } +static int impl_node_set_io(struct spa_node *node, 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) { struct impl *this; @@ -910,6 +915,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/audiotestsrc/audiotestsrc.c b/spa/plugins/audiotestsrc/audiotestsrc.c index 29a029950..dc9c1d5ff 100644 --- a/spa/plugins/audiotestsrc/audiotestsrc.c +++ b/spa/plugins/audiotestsrc/audiotestsrc.c @@ -269,6 +269,11 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return 0; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + #include "render.c" static void set_timer(struct impl *this, bool enabled) @@ -970,6 +975,7 @@ static const struct spa_node impl_node = { &node_info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/bluez5/a2dp-sink.c b/spa/plugins/bluez5/a2dp-sink.c index 080830707..4454a2f60 100644 --- a/spa/plugins/bluez5/a2dp-sink.c +++ b/spa/plugins/bluez5/a2dp-sink.c @@ -229,6 +229,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -1273,6 +1278,7 @@ static const struct spa_node impl_node = { &node_info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/ffmpeg/ffmpeg-dec.c b/spa/plugins/ffmpeg/ffmpeg-dec.c index aad3f1e9b..bd49f2219 100644 --- a/spa/plugins/ffmpeg/ffmpeg-dec.c +++ b/spa/plugins/ffmpeg/ffmpeg-dec.c @@ -83,6 +83,11 @@ static int spa_ffmpeg_dec_node_set_param(struct spa_node *node, return -ENOTSUP; } +static int spa_ffmpeg_dec_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int spa_ffmpeg_dec_node_send_command(struct spa_node *node, const struct spa_command *command) { struct impl *this; @@ -469,6 +474,7 @@ static const struct spa_node ffmpeg_dec_node = { NULL, spa_ffmpeg_dec_node_enum_params, spa_ffmpeg_dec_node_set_param, + spa_ffmpeg_dec_node_set_io, spa_ffmpeg_dec_node_send_command, spa_ffmpeg_dec_node_set_callbacks, spa_ffmpeg_dec_node_get_n_ports, diff --git a/spa/plugins/ffmpeg/ffmpeg-enc.c b/spa/plugins/ffmpeg/ffmpeg-enc.c index 66b99a497..5f313704c 100644 --- a/spa/plugins/ffmpeg/ffmpeg-enc.c +++ b/spa/plugins/ffmpeg/ffmpeg-enc.c @@ -85,6 +85,11 @@ static int spa_ffmpeg_enc_node_set_param(struct spa_node *node, uint32_t id, uin return -ENOTSUP; } +static int spa_ffmpeg_enc_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int spa_ffmpeg_enc_node_send_command(struct spa_node *node, const struct spa_command *command) { struct impl *this; @@ -446,6 +451,7 @@ static const struct spa_node ffmpeg_enc_node = { NULL, spa_ffmpeg_enc_node_enum_params, spa_ffmpeg_enc_node_set_param, + spa_ffmpeg_enc_node_set_io, spa_ffmpeg_enc_node_send_command, spa_ffmpeg_enc_node_set_callbacks, spa_ffmpeg_enc_node_get_n_ports, diff --git a/spa/plugins/test/fakesink.c b/spa/plugins/test/fakesink.c index 9600b4fe3..1181d7549 100644 --- a/spa/plugins/test/fakesink.c +++ b/spa/plugins/test/fakesink.c @@ -141,6 +141,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -706,6 +711,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/test/fakesrc.c b/spa/plugins/test/fakesrc.c index a19633375..3d9ba2663 100644 --- a/spa/plugins/test/fakesrc.c +++ b/spa/plugins/test/fakesrc.c @@ -152,6 +152,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -741,6 +746,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c index adfa3919a..4d5f8623a 100644 --- a/spa/plugins/v4l2/v4l2-source.c +++ b/spa/plugins/v4l2/v4l2-source.c @@ -265,6 +265,11 @@ static int impl_node_set_param(struct spa_node *node, return 0; } +static int impl_node_set_io(struct spa_node *node, 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) { struct impl *this; @@ -910,6 +915,7 @@ static const struct spa_node impl_node = { &info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index cf24f5886..bfe9dc294 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -201,6 +201,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -839,6 +844,7 @@ static const struct spa_node impl_node = { &node_info, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/spa/plugins/volume/volume.c b/spa/plugins/volume/volume.c index b8255d707..891b0977c 100644 --- a/spa/plugins/volume/volume.c +++ b/spa/plugins/volume/volume.c @@ -180,6 +180,11 @@ static int impl_node_enum_params(struct spa_node *node, return 1; } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + return -ENOTSUP; +} + static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flags, const struct spa_pod *param) { @@ -794,6 +799,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/src/modules/module-audio-dsp/floatmix.c b/src/modules/module-audio-dsp/floatmix.c index 979911440..106129c72 100644 --- a/src/modules/module-audio-dsp/floatmix.c +++ b/src/modules/module-audio-dsp/floatmix.c @@ -131,6 +131,11 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return -ENOTSUP; } +static int impl_node_set_io(struct spa_node *node, 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) { struct impl *this; @@ -856,6 +861,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports, diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index 3031ffa00..20a5ba8f8 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -396,6 +396,20 @@ static int impl_node_set_param(struct spa_node *node, uint32_t id, uint32_t flag return SPA_RESULT_RETURN_ASYNC(this->seq++); } +static int impl_node_set_io(struct spa_node *node, uint32_t id, void *data, size_t size) +{ + struct node *this; + + spa_return_val_if_fail(node != NULL, -EINVAL); + + this = SPA_CONTAINER_OF(node, struct node, node); + + if (this->resource == NULL) + return 0; + + return -ENOTSUP; +} + static int impl_node_send_command(struct spa_node *node, const struct spa_command *command) { struct node *this; @@ -1129,6 +1143,7 @@ static const struct spa_node impl_node = { NULL, .enum_params = impl_node_enum_params, .set_param = impl_node_set_param, + .set_io = impl_node_set_io, .send_command = impl_node_send_command, .set_callbacks = impl_node_set_callbacks, .get_n_ports = impl_node_get_n_ports, diff --git a/src/modules/module-client-node/client-stream.c b/src/modules/module-client-node/client-stream.c index cc87961aa..86e1c4ff8 100644 --- a/src/modules/module-client-node/client-stream.c +++ b/src/modules/module-client-node/client-stream.c @@ -239,6 +239,11 @@ 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) +{ + return -ENOTSUP; +} + static int impl_node_send_command(struct spa_node *node, const struct spa_command *command) { struct node *this; @@ -890,6 +895,7 @@ static const struct spa_node impl_node = { NULL, impl_node_enum_params, impl_node_set_param, + impl_node_set_io, impl_node_send_command, impl_node_set_callbacks, impl_node_get_n_ports,