diff --git a/0009-default-nodes-check-if-default-node-has-available-ro.patch b/0009-default-nodes-check-if-default-node-has-available-ro.patch new file mode 100644 index 0000000..105fe2d --- /dev/null +++ b/0009-default-nodes-check-if-default-node-has-available-ro.patch @@ -0,0 +1,124 @@ +From 75281d86817a090147a15711266709114b15aefa Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Tue, 11 Jan 2022 13:59:58 -0500 +Subject: [PATCH 09/14] default-nodes: check if default node has available + route + +Fixes #145 +--- + modules/module-default-nodes.c | 85 ++++++++++++++++++++++++++++++++++ + 1 file changed, 85 insertions(+) + +diff --git a/modules/module-default-nodes.c b/modules/module-default-nodes.c +index c45be2d..354c474 100644 +--- a/modules/module-default-nodes.c ++++ b/modules/module-default-nodes.c +@@ -8,6 +8,7 @@ + + #include + #include ++#include + #include + + #define COMPILING_MODULE_DEFAULT_NODES 1 +@@ -97,6 +98,87 @@ timer_start (WpDefaultNodes *self) + } + } + ++static gboolean ++node_has_available_routes (WpDefaultNodes * self, WpNode *node) ++{ ++ const gchar *dev_id_str = wp_pipewire_object_get_property ( ++ WP_PIPEWIRE_OBJECT (node), PW_KEY_DEVICE_ID); ++ const gchar *cpd_str = wp_pipewire_object_get_property ( ++ WP_PIPEWIRE_OBJECT (node), "card.profile.device"); ++ gint dev_id = dev_id_str ? atoi (dev_id_str) : -1; ++ gint cpd = cpd_str ? atoi (cpd_str) : -1; ++ g_autoptr (WpDevice) device = NULL; ++ ++ if (dev_id == -1 || cpd == -1) ++ return TRUE; ++ ++ /* Get the device */ ++ device = wp_object_manager_lookup (self->rescan_om, WP_TYPE_DEVICE, ++ WP_CONSTRAINT_TYPE_G_PROPERTY, "bound-id", "=i", dev_id, NULL); ++ if (!device) ++ return TRUE; ++ ++ /* Check if the current device route supports the node card device profile */ ++ { ++ g_autoptr (WpIterator) routes = NULL; ++ g_auto (GValue) val = G_VALUE_INIT; ++ routes = wp_pipewire_object_enum_params_sync (WP_PIPEWIRE_OBJECT (device), ++ "Route", NULL); ++ for (; wp_iterator_next (routes, &val); g_value_unset (&val)) { ++ WpSpaPod *route = g_value_get_boxed (&val); ++ gint route_device = -1; ++ guint32 route_avail = SPA_PARAM_AVAILABILITY_unknown; ++ ++ if (!wp_spa_pod_get_object (route, NULL, ++ "device", "i", &route_device, ++ "available", "?I", &route_avail, ++ NULL)) ++ continue; ++ ++ if (route_device != cpd) ++ continue; ++ ++ if (route_avail == SPA_PARAM_AVAILABILITY_no) ++ return FALSE; ++ ++ return TRUE; ++ } ++ } ++ ++ /* Check if available routes support the node card device profile */ ++ { ++ g_autoptr (WpIterator) routes = NULL; ++ g_auto (GValue) val = G_VALUE_INIT; ++ routes = wp_pipewire_object_enum_params_sync (WP_PIPEWIRE_OBJECT (device), ++ "EnumRoute", NULL); ++ for (; wp_iterator_next (routes, &val); g_value_unset (&val)) { ++ WpSpaPod *route = g_value_get_boxed (&val); ++ guint32 route_avail = SPA_PARAM_AVAILABILITY_unknown; ++ g_autoptr (WpSpaPod) route_devices = NULL; ++ ++ if (!wp_spa_pod_get_object (route, NULL, ++ "available", "?I", &route_avail, ++ "devices", "?P", &route_devices, ++ NULL)) ++ continue; ++ ++ { ++ g_autoptr (WpIterator) it = wp_spa_pod_new_iterator (route_devices); ++ g_auto (GValue) v = G_VALUE_INIT; ++ for (; wp_iterator_next (it, &v); g_value_unset (&v)) { ++ gint32 *d = (gint32 *)g_value_get_pointer (&v); ++ if (d && *d == cpd) { ++ if (route_avail != SPA_PARAM_AVAILABILITY_no) ++ return TRUE; ++ } ++ } ++ } ++ } ++ } ++ ++ return FALSE; ++} ++ + static WpNode * + find_best_media_class_node (WpDefaultNodes * self, const gchar *media_class, + const gchar *node_name, WpDirection direction, gint *priority) +@@ -124,6 +206,9 @@ find_best_media_class_node (WpDefaultNodes * self, const gchar *media_class, + WP_PIPEWIRE_OBJECT (node), PW_KEY_PRIORITY_SESSION); + gint prio = prio_str ? atoi (prio_str) : -1; + ++ if (!node_has_available_routes (self, node)) ++ continue; ++ + if (name && node_name && g_strcmp0 (name, node_name) == 0) + prio += 10000; + +-- +2.34.1 + diff --git a/0010-added-support-for-disabling-nodes-and-devices-throug.patch b/0010-added-support-for-disabling-nodes-and-devices-throug.patch new file mode 100644 index 0000000..21eb9c3 --- /dev/null +++ b/0010-added-support-for-disabling-nodes-and-devices-throug.patch @@ -0,0 +1,62 @@ +From bbd23fa3e3a4e13c86bf37b36e7d19d8dcaff771 Mon Sep 17 00:00:00 2001 +From: mazunki +Date: Wed, 12 Jan 2022 12:13:08 +0100 +Subject: [PATCH 10/14] added support for disabling nodes and devices through + conf + +--- + src/config/main.lua.d/50-alsa-config.lua | 13 +++++++++++++ + src/scripts/monitors/alsa.lua | 6 ++++++ + 2 files changed, 19 insertions(+) + +diff --git a/src/config/main.lua.d/50-alsa-config.lua b/src/config/main.lua.d/50-alsa-config.lua +index 9259cf5..23f8ca1 100644 +--- a/src/config/main.lua.d/50-alsa-config.lua ++++ b/src/config/main.lua.d/50-alsa-config.lua +@@ -17,6 +17,19 @@ alsa_monitor.properties = { + + alsa_monitor.rules = { + -- An array of matches/actions to evaluate. ++ -- ++ -- If you want to disable some devices or nodes, you can apply properties per device as the following example. ++ -- The name can be found by running pw-cli ls Device, or pw-cli dump Device ++ --{ ++ -- matches = { ++ -- { ++ -- { "device.name", "matches", "name_of_some_disabled_card" }, ++ -- }, ++ -- }, ++ -- apply_properties = { ++ -- ["device.disabled"] = true, ++ -- }, ++ --} + { + -- Rules for matching a device or node. It is an array of + -- properties that all need to match the regexp. If any of the +diff --git a/src/scripts/monitors/alsa.lua b/src/scripts/monitors/alsa.lua +index 8d297c1..c917a5c 100644 +--- a/src/scripts/monitors/alsa.lua ++++ b/src/scripts/monitors/alsa.lua +@@ -168,6 +168,9 @@ function createNode(parent, id, type, factory, properties) + + -- apply properties from config.rules + rulesApplyProperties(properties) ++ if properties["node.disabled"] then ++ return ++ end + + -- create the node + local node = Node("adapter", properties) +@@ -254,6 +257,9 @@ function prepareDevice(parent, id, type, factory, properties) + + -- apply properties from config.rules + rulesApplyProperties(properties) ++ if properties["device.disabled"] then ++ return ++ end + + -- override the device factory to use ACP + if properties["api.alsa.use-acp"] then +-- +2.34.1 + diff --git a/wireplumber.changes b/wireplumber.changes index 45484d1..b6cea96 100644 --- a/wireplumber.changes +++ b/wireplumber.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Mon Jan 24 18:32:54 UTC 2022 - Antonio Larrosa + +- So far it passed openQA, so let's try adding two more patches: + * 0009-default-nodes-check-if-default-node-has-available-ro.patch + * 0010-added-support-for-disabling-nodes-and-devices-throug.patch + ------------------------------------------------------------------- Mon Jan 24 15:40:22 UTC 2022 - alarrosa@suse.com diff --git a/wireplumber.spec b/wireplumber.spec index 64180a7..363e994 100644 --- a/wireplumber.spec +++ b/wireplumber.spec @@ -38,6 +38,8 @@ Patch5: 0005-config-update-the-endpoints-config.patch Patch6: 0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch Patch7: 0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch Patch8: 0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch +Patch9: 0009-default-nodes-check-if-default-node-has-available-ro.patch +Patch10: 0010-added-support-for-disabling-nodes-and-devices-throug.patch #0009-default-nodes-check-if-default-node-has-available-ro.patch #0010-added-support-for-disabling-nodes-and-devices-throug.patch #0011-default-nodes-add-more-logs.patch