diff --git a/spa/include/spa/node/node.h b/spa/include/spa/node/node.h index 5592ae491..017e3fb9c 100644 --- a/spa/include/spa/node/node.h +++ b/spa/include/spa/node/node.h @@ -41,6 +41,21 @@ struct spa_node; #include #include +/** + * Node information structure + * + * Contains the basic node information. + */ +struct spa_node_info { +#define SPA_VERSION_NODE_INFO 0 + uint32_t version; +#define SPA_NODE_CHANGE_MASK_PROPS (1<<0) + uint64_t change_mask; + struct spa_dict *props; +}; + +#define SPA_NODE_INFO_INIT() (struct spa_node_info) { SPA_VERSION_NODE_INFO, } + /** * Port information structure * @@ -72,7 +87,7 @@ struct spa_node_callbacks { uint32_t version; /**< version of this structure */ /** Emited when info changes */ - void (*info) (void *data, const struct spa_dict *info); + void (*info) (void *data, const struct spa_node_info *info); /** Emited when an async operation completed. * diff --git a/spa/plugins/alsa/alsa-sink.c b/spa/plugins/alsa/alsa-sink.c index 63b285490..7d4aa65f2 100644 --- a/spa/plugins/alsa/alsa-sink.c +++ b/spa/plugins/alsa/alsa-sink.c @@ -257,8 +257,15 @@ impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(node_info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(node_info_items); + + callbacks->info(data, &info); + } } return 0; diff --git a/spa/plugins/alsa/alsa-source.c b/spa/plugins/alsa/alsa-source.c index 9bc3417ef..4366e57c5 100644 --- a/spa/plugins/alsa/alsa-source.c +++ b/spa/plugins/alsa/alsa-source.c @@ -258,8 +258,15 @@ impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(node_info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(node_info_items); + + callbacks->info(data, &info); + } } return 0; } diff --git a/spa/plugins/audiotestsrc/audiotestsrc.c b/spa/plugins/audiotestsrc/audiotestsrc.c index f3448aaf1..a2eb9b52e 100644 --- a/spa/plugins/audiotestsrc/audiotestsrc.c +++ b/spa/plugins/audiotestsrc/audiotestsrc.c @@ -463,8 +463,15 @@ impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(node_info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(node_info_items); + + callbacks->info(data, &info); + } } return 0; diff --git a/spa/plugins/bluez5/a2dp-sink.c b/spa/plugins/bluez5/a2dp-sink.c index 2facad218..c694c80e6 100644 --- a/spa/plugins/bluez5/a2dp-sink.c +++ b/spa/plugins/bluez5/a2dp-sink.c @@ -861,8 +861,15 @@ impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(node_info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(node_info_items); + + callbacks->info(data, &info); + } } return 0; diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c index ac801f65b..df073930e 100644 --- a/spa/plugins/v4l2/v4l2-source.c +++ b/spa/plugins/v4l2/v4l2-source.c @@ -346,8 +346,15 @@ static int impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(info_items); + + callbacks->info(data, &info); + } } return 0; } diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index c209a4fef..093080700 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -407,8 +407,15 @@ impl_node_set_callbacks(struct spa_node *node, this->callbacks_data = data; if (callbacks) { - if (callbacks->info) - callbacks->info(data, &SPA_DICT_INIT_ARRAY(node_info_items)); + if (callbacks->info) { + struct spa_node_info info; + + info = SPA_NODE_INFO_INIT(); + info.change_mask = SPA_NODE_CHANGE_MASK_PROPS; + info.props = &SPA_DICT_INIT_ARRAY(node_info_items); + + callbacks->info(data, &info); + } } return 0; } diff --git a/spa/tools/spa-inspect.c b/spa/tools/spa-inspect.c index 9d5007591..3705459c0 100644 --- a/spa/tools/spa-inspect.c +++ b/spa/tools/spa-inspect.c @@ -135,10 +135,12 @@ inspect_port_params(struct data *data, struct spa_node *node, } } -static void node_info(void *data, const struct spa_dict *info) +static void node_info(void *data, const struct spa_node_info *info) { - printf("node properties:\n"); - spa_debug_dict(2, info); + if (info->change_mask & SPA_NODE_CHANGE_MASK_PROPS) { + printf("node properties:\n"); + spa_debug_dict(2, info->props); + } } static const struct spa_node_callbacks node_callbacks = diff --git a/src/pipewire/node.c b/src/pipewire/node.c index d75758924..3bf7c22f8 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -874,10 +874,11 @@ int pw_node_update_properties(struct pw_node *node, const struct spa_dict *dict) return changed; } -static void node_info(void *data, const struct spa_dict *info) +static void node_info(void *data, const struct spa_node_info *info) { struct pw_node *node = data; - pw_node_update_properties(node, info); + if (info->change_mask & SPA_NODE_CHANGE_MASK_PROPS) + pw_node_update_properties(node, info->props); } static void node_done(void *data, int seq, int res)