impl-node: derive from WpProxy
This commit is contained in:
@@ -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
|
|||||||
* 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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
|||||||
|
|
||||||
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);
|
|||||||
*/
|
*/
|
||||||
#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
|
|||||||
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
|
|||||||
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,15 +68,9 @@ 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));
|
|
||||||
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);
|
NULL, on_object_created, self);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_device_added (WpObjectManager *om, WpObject *proxy, gpointer p)
|
on_device_added (WpObjectManager *om, WpObject *proxy, gpointer p)
|
||||||
|
@@ -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,
|
|||||||
|
|
||||||
/* 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));
|
|
||||||
else
|
|
||||||
wp_object_activate (WP_OBJECT (node), WP_PIPEWIRE_OBJECT_FEATURES_MINIMAL,
|
|
||||||
NULL, (GAsyncReadyCallback) activate_done, self);
|
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
|
||||||
|
Reference in New Issue
Block a user