device-profiles: Port to event-stack

This commit is contained in:
Ashok Sidipotu 2022-07-13 06:17:23 +05:30 committed by Julian Bouzas
parent 464cda4cad
commit 695b99f0e8
3 changed files with 106 additions and 24 deletions

View file

@ -43,10 +43,17 @@ typedef enum
WP_EVENT_HOOK_DEFAULT_PRIORITY_NODE_CHANGED_RESTORE_STREAM = WP_EVENT_HOOK_DEFAULT_PRIORITY_NODE_CHANGED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED = WP_EVENT_HOOK_DEFAULT_PRIORITY_NODE_CHANGED + PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_POLICY_DEVICE_ROUTES = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_DEFAULT_PROFILE = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_POLICY_DEVICE_PROFILE = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_DEFAULT_PROFILE - PRIORITY_STEP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_POLICY_DEVICE_ROUTES = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_POLICY_DEVICE_PROFILE - PRIORITY_STEP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED + PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_POLICY_DEVICE_ROUTES = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_REMOVED = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED + PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_REMOVED_POLICY_DEVICE_PROFILE = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_REMOVED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_REMOVED + PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_DEFAULT_PROFILE = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_POLICY_DEVICE_PROFILE = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_DEFAULT_PROFILE - PRIORITY_STEP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_POLICY_DEVICE_ROUTES = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_POLICY_DEVICE_PROFILE - PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_LINKABLE_ADDED = WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED + PRIORITY_JUMP,
WP_EVENT_HOOK_DEFAULT_PRIORITY_LINKABLE_ADDED_CREATE_ITEM = WP_EVENT_HOOK_DEFAULT_PRIORITY_LINKABLE_ADDED,

View file

@ -223,13 +223,24 @@ on_device_params_changed (WpPipewireObject * proxy, const gchar *param_name,
}
static void
on_device_added (WpObjectManager *om, WpPipewireObject *proxy, gpointer d)
on_device_params_changed_hook (WpEvent *event, gpointer d)
{
WpDefaultProfile *self = WP_DEFAULT_PROFILE (d);
g_autoptr (WpIterator) profiles = NULL;
g_autoptr (GObject) subject = wp_event_get_subject (event);
WpPipewireObject *proxy = WP_PIPEWIRE_OBJECT (subject);
g_signal_connect_object (proxy, "params-changed",
G_CALLBACK (on_device_params_changed), self, 0);
g_autoptr (WpProperties) p = wp_event_get_properties (event);
const gchar *param = wp_properties_get (p, "event.subject.param-id");
on_device_params_changed (proxy, param, self);
}
static void
on_device_added (WpEvent *event, gpointer d)
{
WpDefaultProfile *self = WP_DEFAULT_PROFILE (d);
g_autoptr (GObject) subject = wp_event_get_subject (event);
WpPipewireObject *proxy = WP_PIPEWIRE_OBJECT (subject);
on_device_params_changed (proxy, "EnumProfile", self);
}
@ -238,20 +249,47 @@ static void
wp_default_profile_enable (WpPlugin * plugin, WpTransition * transition)
{
g_autoptr (WpCore) core = wp_object_get_core (WP_OBJECT (plugin));
g_return_if_fail (core);
WpDefaultProfile *self = WP_DEFAULT_PROFILE (plugin);
WpDefaultProfilePrivate *priv =
wp_default_profile_get_instance_private (self);
g_autoptr (WpEventDispatcher) dispatcher =
wp_event_dispatcher_get_instance (core);
g_return_if_fail (dispatcher);
g_autoptr (WpEventHook) hook = NULL;
/* Create the devices object manager */
priv->devices_om = wp_object_manager_new ();
wp_object_manager_add_interest (priv->devices_om, WP_TYPE_DEVICE, NULL);
wp_object_manager_request_object_features (priv->devices_om,
WP_TYPE_DEVICE, WP_PIPEWIRE_OBJECT_FEATURES_ALL);
g_signal_connect_object (priv->devices_om, "object-added",
G_CALLBACK (on_device_added), self, 0);
wp_core_install_object_manager (core, priv->devices_om);
wp_object_update_features (WP_OBJECT (self), WP_PLUGIN_FEATURE_ENABLED, 0);
/* device added */
hook = wp_simple_event_hook_new ("m-default-profile",
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_ADDED_DEFAULT_PROFILE,
WP_EVENT_HOOK_EXEC_TYPE_ON_EVENT,
g_cclosure_new ((GCallback) on_device_added, self, NULL));
wp_interest_event_hook_add_interest (WP_INTEREST_EVENT_HOOK (hook),
WP_CONSTRAINT_TYPE_PW_PROPERTY, "event.type", "=s", "object-added",
WP_CONSTRAINT_TYPE_PW_PROPERTY, "event.subject.type", "=s", "device",
NULL);
wp_event_dispatcher_register_hook (dispatcher, hook);
g_clear_object(&hook);
/* device params changed */
hook = wp_simple_event_hook_new ("m-default-profile",
WP_EVENT_HOOK_DEFAULT_PRIORITY_DEVICE_PARAMS_CHANGED_DEFAULT_PROFILE,
WP_EVENT_HOOK_EXEC_TYPE_ON_EVENT,
g_cclosure_new ((GCallback) on_device_params_changed_hook, self, NULL));
wp_interest_event_hook_add_interest (WP_INTEREST_EVENT_HOOK (hook),
WP_CONSTRAINT_TYPE_PW_PROPERTY, "event.type", "=s", "params-changed",
WP_CONSTRAINT_TYPE_PW_PROPERTY, "event.subject.type", "=s", "device",
NULL);
wp_event_dispatcher_register_hook (dispatcher, hook);
g_clear_object(&hook);
}
static void

View file

@ -109,6 +109,10 @@ function handleProfiles (device, new_device)
local dev_id = device ["bound-id"]
local dev_name = device.properties ["device.name"]
if not dev_name then
return
end
local def_profile = findDefaultProfile (device)
-- Do not do anything if active profile is both persistent and default
@ -152,21 +156,54 @@ function onDeviceParamsChanged (device, param_name)
end
end
self.om = ObjectManager {
Interest {
type = "device",
Constraint { "device.name", "is-present", type = "pw-global" },
}
}
SimpleEventHook {
name = "policy-device-profile",
type = "on-event",
priority = "device-added-policy-device-profile",
interests = {
EventInterest {
Constraint { "event.type", "=", "object-added" },
Constraint { "event.subject.type", "=", "device" },
},
},
execute = function (event, transition)
handleProfiles (event:get_subject (), true)
end
}:register ()
self.om:connect ("object-added", function (_, device)
device:connect ("params-changed", onDeviceParamsChanged)
handleProfiles (device, true)
end)
SimpleEventHook {
name = "policy-device-profile",
type = "on-event",
priority = "device-params-changed-policy-device-profile",
interests = {
EventInterest {
Constraint { "event.type", "=", "params-changed" },
Constraint { "event.subject.type", "=", "device" },
},
},
execute = function (event, transition)
local device = event:get_subject ()
local props = event:get_properties()
local param_name = props ["event.subject.param-id"]
self.om:connect ("object-removed", function (_, device)
local dev_id = device ["bound-id"]
self.active_profiles [dev_id] = nil
end)
onDeviceParamsChanged (device, param_name)
end
}:register()
SimpleEventHook {
name = "policy-device-profile",
type = "on-event",
priority = "device-removed-policy-device-profile",
interests = {
EventInterest {
Constraint { "event.type", "=", "object-removed" },
Constraint { "event.subject.type", "=", "device" },
},
},
execute = function (event, transition)
local device = event:get_subject ()
local dev_id = device ["bound-id"]
self.active_profiles [dev_id] = nil
end
}:register ()
self.om:activate ()