impl-node: derive from WpProxy

This commit is contained in:
George Kiagiadakis
2021-01-18 17:33:16 +02:00
parent 18229e8265
commit c678cbed2c
4 changed files with 65 additions and 56 deletions

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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,
wp_object_activate (node, WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL,
NULL, on_object_created, self);
}
}
static void

View File

@@ -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,
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