From c678cbed2c41b407193c40f41b99eb44ebf0fa9a Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Mon, 18 Jan 2021 17:33:16 +0200 Subject: [PATCH] impl-node: derive from WpProxy --- lib/wp/node.c | 85 ++++++++++++------- lib/wp/node.h | 5 +- .../module-config-static-objects/context.c | 16 ++-- modules/module-monitor.c | 15 ++-- 4 files changed, 65 insertions(+), 56 deletions(-) diff --git a/lib/wp/node.c b/lib/wp/node.c index 309643e3..d5971245 100644 --- a/lib/wp/node.c +++ b/lib/wp/node.c @@ -517,13 +517,12 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command) enum { PROP_0, - PROP_CORE, PROP_PW_IMPL_NODE, }; struct _WpImplNode { - GObject parent; + WpProxy parent; GWeakRef core; struct pw_impl_node *pw_impl_node; struct pw_proxy *proxy; @@ -535,15 +534,13 @@ struct _WpImplNode * A #WpImplNode allows running a node implementation (`struct pw_impl_node`) * locally, loading the implementation from factory or wrapping a manually * constructed `pw_impl_node`. This object can then be exported to PipeWire - * by requesting %WP_PROXY_FEATURE_BOUND and be used as if it was a #WpNode - * proxy to a remote object. + * by requesting %WP_PROXY_FEATURE_BOUND. */ -G_DEFINE_TYPE (WpImplNode, wp_impl_node, G_TYPE_OBJECT) +G_DEFINE_TYPE (WpImplNode, wp_impl_node, WP_TYPE_PROXY) static void wp_impl_node_init (WpImplNode * self) { - g_weak_ref_init (&self->core, NULL); } static void @@ -551,9 +548,7 @@ wp_impl_node_finalize (GObject * object) { WpImplNode *self = WP_IMPL_NODE (object); - g_clear_pointer (&self->proxy, pw_proxy_destroy); g_clear_pointer (&self->pw_impl_node, pw_impl_node_destroy); - g_weak_ref_clear (&self->core); G_OBJECT_CLASS (wp_impl_node_parent_class)->finalize (object); } @@ -565,9 +560,6 @@ wp_impl_node_set_property (GObject * object, guint property_id, WpImplNode *self = WP_IMPL_NODE (object); switch (property_id) { - case PROP_CORE: - g_weak_ref_set (&self->core, g_value_get_object (value)); - break; case PROP_PW_IMPL_NODE: self->pw_impl_node = g_value_get_pointer (value); break; @@ -584,9 +576,6 @@ wp_impl_node_get_property (GObject * object, guint property_id, GValue * value, WpImplNode *self = WP_IMPL_NODE (object); switch (property_id) { - case PROP_CORE: - g_value_take_object (value, g_weak_ref_get (&self->core)); - break; case PROP_PW_IMPL_NODE: g_value_set_pointer (value, self->pw_impl_node); break; @@ -596,18 +585,65 @@ wp_impl_node_get_property (GObject * object, guint property_id, GValue * value, } } +static WpObjectFeatures +wp_impl_node_get_supported_features (WpObject * object) +{ + return WP_PROXY_FEATURE_BOUND; +} + +enum { + STEP_EXPORT = WP_TRANSITION_STEP_CUSTOM_START, +}; + +static guint +wp_impl_node_activate_get_next_step (WpObject * object, + WpFeatureActivationTransition * transition, guint step, + WpObjectFeatures missing) +{ + /* we only support BOUND, so this is the only + feature that can be in @missing */ + g_return_val_if_fail (missing == WP_PROXY_FEATURE_BOUND, + WP_TRANSITION_STEP_ERROR); + + return STEP_EXPORT; +} + +static void +wp_impl_node_activate_execute_step (WpObject * object, + WpFeatureActivationTransition * transition, guint step, + WpObjectFeatures missing) +{ + WpImplNode *self = WP_IMPL_NODE (object); + + switch (step) { + case STEP_EXPORT: { + g_autoptr (WpCore) core = wp_object_get_core (object); + struct pw_core *pw_core = wp_core_get_pw_core (core); + g_return_if_fail (pw_core); + + wp_proxy_set_pw_proxy (WP_PROXY (self), + pw_core_export (pw_core, PW_TYPE_INTERFACE_Node, NULL, + self->pw_impl_node, 0)); + break; + } + default: + g_assert_not_reached (); + } +} + static void wp_impl_node_class_init (WpImplNodeClass * klass) { GObjectClass *object_class = (GObjectClass *) klass; + WpObjectClass *wpobject_class = (WpObjectClass *) klass; object_class->finalize = wp_impl_node_finalize; object_class->set_property = wp_impl_node_set_property; object_class->get_property = wp_impl_node_get_property; - g_object_class_install_property (object_class, PROP_CORE, - g_param_spec_object ("core", "core", "The WpCore", WP_TYPE_CORE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + wpobject_class->get_supported_features = wp_impl_node_get_supported_features; + wpobject_class->activate_get_next_step = wp_impl_node_activate_get_next_step; + wpobject_class->activate_execute_step = wp_impl_node_activate_execute_step; g_object_class_install_property (object_class, PROP_PW_IMPL_NODE, g_param_spec_pointer ("pw-impl-node", "pw-impl-node", @@ -676,18 +712,3 @@ wp_impl_node_new_from_pw_factory (WpCore * core, return wp_impl_node_new_wrap (core, node); } - -/** - * wp_impl_node_export: - */ -void -wp_impl_node_export (WpImplNode * self) -{ - g_autoptr (WpCore) core = g_weak_ref_get (&self->core); - struct pw_core *pw_core = wp_core_get_pw_core (core); - - g_return_if_fail (pw_core); - - self->proxy = pw_core_export (pw_core, - PW_TYPE_INTERFACE_Node, NULL, self->pw_impl_node, 0); -} diff --git a/lib/wp/node.h b/lib/wp/node.h index 55d2dcb5..e2efae4a 100644 --- a/lib/wp/node.h +++ b/lib/wp/node.h @@ -114,7 +114,7 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command); */ #define WP_TYPE_IMPL_NODE (wp_impl_node_get_type ()) WP_API -G_DECLARE_FINAL_TYPE (WpImplNode, wp_impl_node, WP, IMPL_NODE, GObject) +G_DECLARE_FINAL_TYPE (WpImplNode, wp_impl_node, WP, IMPL_NODE, WpProxy) WP_API WpImplNode * wp_impl_node_new_wrap (WpCore * core, struct pw_impl_node * node); @@ -123,9 +123,6 @@ WP_API WpImplNode * wp_impl_node_new_from_pw_factory (WpCore * core, const gchar * factory_name, WpProperties * properties); -WP_API -void wp_impl_node_export (WpImplNode * self); - G_END_DECLS #endif diff --git a/modules/module-config-static-objects/context.c b/modules/module-config-static-objects/context.c index 537c095b..41d18c0e 100644 --- a/modules/module-config-static-objects/context.c +++ b/modules/module-config-static-objects/context.c @@ -53,14 +53,14 @@ static void wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self, const struct WpParserNodeData *node_data) { - g_autoptr (GObject) node = NULL; + g_autoptr (WpObject) node = NULL; g_return_if_fail (self->local_core); /* Create the node */ node = node_data->n.local ? - (GObject *) wp_impl_node_new_from_pw_factory (self->local_core, + (WpObject *) wp_impl_node_new_from_pw_factory (self->local_core, node_data->n.factory, wp_properties_ref (node_data->n.props)) : - (GObject *) wp_node_new_from_factory (self->local_core, + (WpObject *) wp_node_new_from_factory (self->local_core, node_data->n.factory, wp_properties_ref (node_data->n.props)); if (!node) { wp_warning_object (self, "failed to create node"); @@ -68,14 +68,8 @@ wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self } /* export */ - if (WP_IS_IMPL_NODE (node)) { - wp_impl_node_export (WP_IMPL_NODE (node)); - g_ptr_array_add (self->static_objects, g_object_ref (node)); - g_signal_emit (self, signals[SIGNAL_OBJECT_CREATED], 0, node); - } else { - wp_object_activate (WP_OBJECT (node), WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL, - NULL, on_object_created, self); - } + wp_object_activate (node, WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL, + NULL, on_object_created, self); } static void diff --git a/modules/module-monitor.c b/modules/module-monitor.c index 6438c775..8a89d48b 100644 --- a/modules/module-monitor.c +++ b/modules/module-monitor.c @@ -257,7 +257,7 @@ static void create_node (WpMonitor * self, WpSpaDevice * parent, guint id, const gchar * spa_factory, WpProperties * props, WpProperties * dev_props) { - GObject *node = NULL; + WpObject *node = NULL; const gchar *pw_factory_name; wp_debug_object (self, WP_OBJECT_FORMAT " new node %u (%s)", @@ -280,21 +280,18 @@ create_node (WpMonitor * self, WpSpaDevice * parent, guint id, /* create the node using the local core */ node = (self->flags & FLAG_LOCAL_NODES) ? - (GObject *) wp_impl_node_new_from_pw_factory (self->local_core, + (WpObject *) wp_impl_node_new_from_pw_factory (self->local_core, pw_factory_name, props) : - (GObject *) wp_node_new_from_factory (self->local_core, pw_factory_name, + (WpObject *) wp_node_new_from_factory (self->local_core, pw_factory_name, props); if (!node) return; /* export to pipewire */ - if (WP_IS_IMPL_NODE (node)) - wp_impl_node_export (WP_IMPL_NODE (node)); - else - wp_object_activate (WP_OBJECT (node), WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL, - NULL, (GAsyncReadyCallback) activate_done, self); + wp_object_activate (node, WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL, + NULL, (GAsyncReadyCallback) activate_done, self); - wp_spa_device_store_managed_object (parent, id, node); + wp_spa_device_store_managed_object (parent, id, G_OBJECT (node)); } static void