Skip to content
Snippets Groups Projects
Commit c678cbed authored by George Kiagiadakis's avatar George Kiagiadakis
Browse files

impl-node: derive from WpProxy

parent 18229e82
No related branches found
No related tags found
No related merge requests found
...@@ -517,13 +517,12 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command) ...@@ -517,13 +517,12 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command)
enum { enum {
PROP_0, PROP_0,
PROP_CORE,
PROP_PW_IMPL_NODE, PROP_PW_IMPL_NODE,
}; };
struct _WpImplNode struct _WpImplNode
{ {
GObject parent; WpProxy parent;
GWeakRef core; GWeakRef core;
struct pw_impl_node *pw_impl_node; struct pw_impl_node *pw_impl_node;
struct pw_proxy *proxy; struct pw_proxy *proxy;
...@@ -535,15 +534,13 @@ struct _WpImplNode ...@@ -535,15 +534,13 @@ struct _WpImplNode
* A #WpImplNode allows running a node implementation (`struct pw_impl_node`) * A #WpImplNode allows running a node implementation (`struct pw_impl_node`)
* locally, loading the implementation from factory or wrapping a manually * locally, loading the implementation from factory or wrapping a manually
* constructed `pw_impl_node`. This object can then be exported to PipeWire * 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 * by requesting %WP_PROXY_FEATURE_BOUND.
* proxy to a remote object.
*/ */
G_DEFINE_TYPE (WpImplNode, wp_impl_node, G_TYPE_OBJECT) G_DEFINE_TYPE (WpImplNode, wp_impl_node, WP_TYPE_PROXY)
static void static void
wp_impl_node_init (WpImplNode * self) wp_impl_node_init (WpImplNode * self)
{ {
g_weak_ref_init (&self->core, NULL);
} }
static void static void
...@@ -551,9 +548,7 @@ wp_impl_node_finalize (GObject * object) ...@@ -551,9 +548,7 @@ wp_impl_node_finalize (GObject * object)
{ {
WpImplNode *self = WP_IMPL_NODE (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_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); G_OBJECT_CLASS (wp_impl_node_parent_class)->finalize (object);
} }
...@@ -565,9 +560,6 @@ wp_impl_node_set_property (GObject * object, guint property_id, ...@@ -565,9 +560,6 @@ wp_impl_node_set_property (GObject * object, guint property_id,
WpImplNode *self = WP_IMPL_NODE (object); WpImplNode *self = WP_IMPL_NODE (object);
switch (property_id) { switch (property_id) {
case PROP_CORE:
g_weak_ref_set (&self->core, g_value_get_object (value));
break;
case PROP_PW_IMPL_NODE: case PROP_PW_IMPL_NODE:
self->pw_impl_node = g_value_get_pointer (value); self->pw_impl_node = g_value_get_pointer (value);
break; break;
...@@ -584,9 +576,6 @@ wp_impl_node_get_property (GObject * object, guint property_id, GValue * value, ...@@ -584,9 +576,6 @@ wp_impl_node_get_property (GObject * object, guint property_id, GValue * value,
WpImplNode *self = WP_IMPL_NODE (object); WpImplNode *self = WP_IMPL_NODE (object);
switch (property_id) { switch (property_id) {
case PROP_CORE:
g_value_take_object (value, g_weak_ref_get (&self->core));
break;
case PROP_PW_IMPL_NODE: case PROP_PW_IMPL_NODE:
g_value_set_pointer (value, self->pw_impl_node); g_value_set_pointer (value, self->pw_impl_node);
break; break;
...@@ -596,18 +585,65 @@ wp_impl_node_get_property (GObject * object, guint property_id, GValue * value, ...@@ -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 static void
wp_impl_node_class_init (WpImplNodeClass * klass) wp_impl_node_class_init (WpImplNodeClass * klass)
{ {
GObjectClass *object_class = (GObjectClass *) klass; GObjectClass *object_class = (GObjectClass *) klass;
WpObjectClass *wpobject_class = (WpObjectClass *) klass;
object_class->finalize = wp_impl_node_finalize; object_class->finalize = wp_impl_node_finalize;
object_class->set_property = wp_impl_node_set_property; object_class->set_property = wp_impl_node_set_property;
object_class->get_property = wp_impl_node_get_property; object_class->get_property = wp_impl_node_get_property;
g_object_class_install_property (object_class, PROP_CORE, wpobject_class->get_supported_features = wp_impl_node_get_supported_features;
g_param_spec_object ("core", "core", "The WpCore", WP_TYPE_CORE, wpobject_class->activate_get_next_step = wp_impl_node_activate_get_next_step;
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); wpobject_class->activate_execute_step = wp_impl_node_activate_execute_step;
g_object_class_install_property (object_class, PROP_PW_IMPL_NODE, g_object_class_install_property (object_class, PROP_PW_IMPL_NODE,
g_param_spec_pointer ("pw-impl-node", "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, ...@@ -676,18 +712,3 @@ wp_impl_node_new_from_pw_factory (WpCore * core,
return wp_impl_node_new_wrap (core, node); 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);
}
...@@ -114,7 +114,7 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command); ...@@ -114,7 +114,7 @@ void wp_node_send_command (WpNode * self, WpNodeCommand command);
*/ */
#define WP_TYPE_IMPL_NODE (wp_impl_node_get_type ()) #define WP_TYPE_IMPL_NODE (wp_impl_node_get_type ())
WP_API 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 WP_API
WpImplNode * wp_impl_node_new_wrap (WpCore * core, struct pw_impl_node * node); WpImplNode * wp_impl_node_new_wrap (WpCore * core, struct pw_impl_node * node);
...@@ -123,9 +123,6 @@ WP_API ...@@ -123,9 +123,6 @@ WP_API
WpImplNode * wp_impl_node_new_from_pw_factory (WpCore * core, WpImplNode * wp_impl_node_new_from_pw_factory (WpCore * core,
const gchar * factory_name, WpProperties * properties); const gchar * factory_name, WpProperties * properties);
WP_API
void wp_impl_node_export (WpImplNode * self);
G_END_DECLS G_END_DECLS
#endif #endif
...@@ -53,14 +53,14 @@ static void ...@@ -53,14 +53,14 @@ static void
wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self, wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self,
const struct WpParserNodeData *node_data) const struct WpParserNodeData *node_data)
{ {
g_autoptr (GObject) node = NULL; g_autoptr (WpObject) node = NULL;
g_return_if_fail (self->local_core); g_return_if_fail (self->local_core);
/* Create the node */ /* Create the node */
node = node_data->n.local ? 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)) : 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)); node_data->n.factory, wp_properties_ref (node_data->n.props));
if (!node) { if (!node) {
wp_warning_object (self, "failed to create node"); wp_warning_object (self, "failed to create node");
...@@ -68,14 +68,8 @@ wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self ...@@ -68,14 +68,8 @@ wp_config_static_objects_context_create_node (WpConfigStaticObjectsContext *self
} }
/* export */ /* export */
if (WP_IS_IMPL_NODE (node)) { wp_object_activate (node, WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL,
wp_impl_node_export (WP_IMPL_NODE (node)); NULL, on_object_created, self);
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);
}
} }
static void static void
......
...@@ -257,7 +257,7 @@ static void ...@@ -257,7 +257,7 @@ static void
create_node (WpMonitor * self, WpSpaDevice * parent, guint id, create_node (WpMonitor * self, WpSpaDevice * parent, guint id,
const gchar * spa_factory, WpProperties * props, WpProperties * dev_props) const gchar * spa_factory, WpProperties * props, WpProperties * dev_props)
{ {
GObject *node = NULL; WpObject *node = NULL;
const gchar *pw_factory_name; const gchar *pw_factory_name;
wp_debug_object (self, WP_OBJECT_FORMAT " new node %u (%s)", wp_debug_object (self, WP_OBJECT_FORMAT " new node %u (%s)",
...@@ -280,21 +280,18 @@ create_node (WpMonitor * self, WpSpaDevice * parent, guint id, ...@@ -280,21 +280,18 @@ create_node (WpMonitor * self, WpSpaDevice * parent, guint id,
/* create the node using the local core */ /* create the node using the local core */
node = (self->flags & FLAG_LOCAL_NODES) ? 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) : 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); props);
if (!node) if (!node)
return; return;
/* export to pipewire */ /* export to pipewire */
if (WP_IS_IMPL_NODE (node)) wp_object_activate (node, WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL,
wp_impl_node_export (WP_IMPL_NODE (node)); NULL, (GAsyncReadyCallback) activate_done, self);
else
wp_object_activate (WP_OBJECT (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 static void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment