From 23c5d9eadfe5d41f503777e59f757c2420e69c477795acb59652512852a5a677 Mon Sep 17 00:00:00 2001 From: Antonio Larrosa Date: Mon, 24 Jan 2022 16:17:22 +0000 Subject: [PATCH] Accepting request 948445 from home:alarrosa:branches:multimedia:libs - Back to version 0.4.6, and add patches incrementally to bisect it and find the issue * 0001-policy-node-fix-typo-when-finding-best-target.patch * 0002-policy-node-schedule-a-rescan-without-timeout-if-def.patch * 0003-policy-node-find-best-linkable-if-default-one-cannot.patch * 0004-spa-pod-fix-different-architecture-errors-for-boolea.patch * 0005-config-update-the-endpoints-config.patch * 0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch * 0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch * 0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch - Remove revert from previous change: * 0001-reversed-default-nodes-check-if-default-node-has-available-ro.patch OBS-URL: https://build.opensuse.org/request/show/948445 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/wireplumber?expand=0&rev=24 --- ...de-fix-typo-when-finding-best-target.patch | 25 ++++ ...eck-if-default-node-has-available-ro.patch | 108 --------------- ...dule-a-rescan-without-timeout-if-def.patch | 48 +++++++ ...-best-linkable-if-default-one-cannot.patch | 46 +++++++ ...erent-architecture-errors-for-boolea.patch | 39 ++++++ 0005-config-update-the-endpoints-config.patch | 126 ++++++++++++++++++ ...client.lua-fix-record-with-endpoints.patch | 43 ++++++ ...heck-if-the-ports-exist-in-rescan_om.patch | 47 +++++++ ...-log-warning-if-spa-devices-were-not.patch | 100 ++++++++++++++ _service | 2 +- _servicedata | 2 +- wireplumber-0.4.6.obscpio | 3 + wireplumber-0.4.7.obscpio | 3 - wireplumber.changes | 16 +++ wireplumber.obsinfo | 6 +- wireplumber.spec | 17 ++- 16 files changed, 513 insertions(+), 118 deletions(-) create mode 100644 0001-policy-node-fix-typo-when-finding-best-target.patch delete mode 100644 0001-reversed-default-nodes-check-if-default-node-has-available-ro.patch create mode 100644 0002-policy-node-schedule-a-rescan-without-timeout-if-def.patch create mode 100644 0003-policy-node-find-best-linkable-if-default-one-cannot.patch create mode 100644 0004-spa-pod-fix-different-architecture-errors-for-boolea.patch create mode 100644 0005-config-update-the-endpoints-config.patch create mode 100644 0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch create mode 100644 0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch create mode 100644 0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch create mode 100644 wireplumber-0.4.6.obscpio delete mode 100644 wireplumber-0.4.7.obscpio diff --git a/0001-policy-node-fix-typo-when-finding-best-target.patch b/0001-policy-node-fix-typo-when-finding-best-target.patch new file mode 100644 index 0000000..53da886 --- /dev/null +++ b/0001-policy-node-fix-typo-when-finding-best-target.patch @@ -0,0 +1,25 @@ +From 23fc4d21a9cfad492f8d3a367e438115197dff4a Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Fri, 7 Jan 2022 10:12:04 -0500 +Subject: [PATCH 01/14] policy-node: fix typo when finding best target + +--- + src/scripts/policy-node.lua | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua +index 0d716c1..8ca5a69 100644 +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -482,7 +482,7 @@ function findUndefinedTarget (si) + if default_nodes ~= nil then + return findDefaultlinkable (si) + else +- return findBestlinkable (si) ++ return findBestLinkable (si) + end + end + +-- +2.34.1 + diff --git a/0001-reversed-default-nodes-check-if-default-node-has-available-ro.patch b/0001-reversed-default-nodes-check-if-default-node-has-available-ro.patch deleted file mode 100644 index 9271693..0000000 --- a/0001-reversed-default-nodes-check-if-default-node-has-available-ro.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- b/modules/module-default-nodes.c -+++ a/modules/module-default-nodes.c -@@ -8,7 +8,6 @@ - - #include - #include --#include - #include - - #define COMPILING_MODULE_DEFAULT_NODES 1 -@@ -98,87 +97,6 @@ - } - } - --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) -@@ -206,9 +124,6 @@ - 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; - diff --git a/0002-policy-node-schedule-a-rescan-without-timeout-if-def.patch b/0002-policy-node-schedule-a-rescan-without-timeout-if-def.patch new file mode 100644 index 0000000..0e27499 --- /dev/null +++ b/0002-policy-node-schedule-a-rescan-without-timeout-if-def.patch @@ -0,0 +1,48 @@ +From afe71d7e48c28b0ae5cbd9327433e3c55c103fcb Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Thu, 6 Jan 2022 10:53:38 -0500 +Subject: [PATCH 02/14] policy-node: schedule a rescan without timeout if + defined target is not found + +Fixes #146 +--- + src/scripts/policy-node.lua | 17 ++++------------- + 1 file changed, 4 insertions(+), 13 deletions(-) + +diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua +index 8ca5a69..c273c1f 100644 +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -552,25 +552,16 @@ function handleLinkable (si) + si_target = nil + end + +- -- wait up to 2 seconds for the requested target to become available +- -- this is because the client may have already "seen" a target that we haven't +- -- yet prepared, which leads to a race condition ++ -- if the client has seen a target that we haven't yet prepared, schedule ++ -- a rescan one more time and hope for the best + local si_id = si.id + if si_props["node.target"] and si_props["node.target"] ~= "-1" + and not si_target + and not si_flags[si_id].was_handled + and not si_flags[si_id].done_waiting then +- if not si_flags[si_id].timeout_source then +- si_flags[si_id].timeout_source = Core.timeout_add(2000, function() +- if si_flags[si_id] then +- si_flags[si_id].done_waiting = true +- si_flags[si_id].timeout_source = nil +- scheduleRescan() +- end +- return false +- end) +- end + Log.info (si, "... waiting for target") ++ si_flags[si_id].done_waiting = true ++ scheduleRescan() + return + end + +-- +2.34.1 + diff --git a/0003-policy-node-find-best-linkable-if-default-one-cannot.patch b/0003-policy-node-find-best-linkable-if-default-one-cannot.patch new file mode 100644 index 0000000..f7a241a --- /dev/null +++ b/0003-policy-node-find-best-linkable-if-default-one-cannot.patch @@ -0,0 +1,46 @@ +From bee9827ae376b75feceea926b0afc727fecca51b Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Fri, 7 Jan 2022 15:35:10 -0500 +Subject: [PATCH 03/14] policy-node: find best linkable if default one cannot + be linked + +Fixes issue with echo cancellation pipewire module. +--- + src/scripts/policy-node.lua | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua +index c273c1f..9df5007 100644 +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -477,13 +477,22 @@ function findBestLinkable (si) + end + + function findUndefinedTarget (si) +- -- Find the default linkable if the default nodes module is loaded, otherwise +- -- just find the best linkable based on priority and routes +- if default_nodes ~= nil then +- return findDefaultlinkable (si) +- else ++ -- Just find the best linkable if default nodes module is not loaded ++ if default_nodes == nil then + return findBestLinkable (si) + end ++ ++ -- Otherwise find the default linkable. If the default linkabke cannot link, ++ -- we find the best one instead. We return nil if default does not exist. ++ local si_target, can_passthrough = findDefaultlinkable (si) ++ if si_target then ++ if canLink (si.properties, si_target) then ++ return si_target, can_passthrough ++ else ++ return findBestLinkable (si) ++ end ++ end ++ return nil, nil + end + + function lookupLink (si_id, si_target_id) +-- +2.34.1 + diff --git a/0004-spa-pod-fix-different-architecture-errors-for-boolea.patch b/0004-spa-pod-fix-different-architecture-errors-for-boolea.patch new file mode 100644 index 0000000..e13619a --- /dev/null +++ b/0004-spa-pod-fix-different-architecture-errors-for-boolea.patch @@ -0,0 +1,39 @@ +From bc76cb7d74a1eac20cabd99ebb27f749d447d6ca Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Mon, 13 Dec 2021 12:01:52 -0500 +Subject: [PATCH 04/14] spa-pod: fix different architecture errors for boolean + values + +--- + lib/wp/spa-pod.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/lib/wp/spa-pod.c b/lib/wp/spa-pod.c +index c1c2257..bd7b887 100644 +--- a/lib/wp/spa-pod.c ++++ b/lib/wp/spa-pod.c +@@ -2332,6 +2332,10 @@ wp_spa_pod_builder_add_valist (WpSpaPodBuilder *self, va_list args) + } + break; + } ++ case 'b': ++ spa_pod_builder_bool(&self->builder, ++ va_arg(args, gboolean) ? true : false); ++ break; + default: + SPA_POD_BUILDER_COLLECT(&self->builder, *format, args); + break; +@@ -2778,6 +2782,10 @@ wp_spa_pod_parser_get_valist (WpSpaPodParser *self, va_list args) + } + break; + } ++ case 'b': ++ *va_arg(args, gboolean*) = ++ SPA_POD_VALUE(struct spa_pod_bool, pod) ? TRUE : FALSE; ++ break; + default: + SPA_POD_PARSER_COLLECT (pod, *format, args); + break; +-- +2.34.1 + diff --git a/0005-config-update-the-endpoints-config.patch b/0005-config-update-the-endpoints-config.patch new file mode 100644 index 0000000..aeb75d7 --- /dev/null +++ b/0005-config-update-the-endpoints-config.patch @@ -0,0 +1,126 @@ +From 99dfa7d38a66943fc04181a2b82fe6da91402c4f Mon Sep 17 00:00:00 2001 +From: Ashok Sidipotu +Date: Tue, 11 Jan 2022 15:30:30 +0530 +Subject: [PATCH 05/14] config: update the endpoints config + +-Sync endpoints config from AGL. +-Add a capture endpoint. +--- + .../policy.lua.d/50-endpoints-config.lua | 84 +++++++++++++++---- + 1 file changed, 70 insertions(+), 14 deletions(-) + +diff --git a/src/config/policy.lua.d/50-endpoints-config.lua b/src/config/policy.lua.d/50-endpoints-config.lua +index 4bdf82a..6241509 100644 +--- a/src/config/policy.lua.d/50-endpoints-config.lua ++++ b/src/config/policy.lua.d/50-endpoints-config.lua +@@ -4,36 +4,92 @@ + --[[ + + default_policy.policy.roles = { ++ ["Capture"] = { ++ ["alias"] = { "Multimedia", "Music", "Voice", "Capture" }, ++ ["priority"] = 25, ++ ["action.default"] = "cork", ++ ["action.capture"] = "mix", ++ ["media.class"] = "Audio/Source", ++ }, + ["Multimedia"] = { + ["alias"] = { "Movie", "Music", "Game" }, +- ["priority"] = 10, +- ["action.default"] = "mix", ++ ["priority"] = 25, ++ ["action.default"] = "cork", ++ }, ++ ["Speech-Low"] = { ++ ["priority"] = 30, ++ ["action.default"] = "cork", ++ ["action.Speech-Low"] = "mix", ++ }, ++ ["Custom-Low"] = { ++ ["priority"] = 35, ++ ["action.default"] = "cork", ++ ["action.Custom-Low"] = "mix", + }, +- ["Notification"] = { +- ["priority"] = 20, ++ ["Navigation"] = { ++ ["priority"] = 50, + ["action.default"] = "duck", +- ["action.Notification"] = "mix", ++ ["action.Navigation"] = "mix", + }, +- ["Alert"] = { +- ["priority"] = 30, ++ ["Speech-High"] = { ++ ["priority"] = 60, ++ ["action.default"] = "cork", ++ ["action.Speech-High"] = "mix", ++ }, ++ ["Custom-High"] = { ++ ["priority"] = 65, + ["action.default"] = "cork", +- ["action.Alert"] = "mix", ++ ["action.Custom-High"] = "mix", ++ }, ++ ["Communication"] = { ++ ["priority"] = 75, ++ ["action.default"] = "cork", ++ ["action.Communication"] = "mix", ++ }, ++ ["Emergency"] = { ++ ["alias"] = { "Alert" }, ++ ["priority"] = 99, ++ ["action.default"] = "cork", ++ ["action.Emergency"] = "mix", + }, + } + + default_policy.endpoints = { ++ ["endpoint.capture"] = { ++ ["media.class"] = "Audio/Source", ++ ["role"] = "Capture", ++ }, + ["endpoint.multimedia"] = { + ["media.class"] = "Audio/Sink", + ["role"] = "Multimedia", + }, +- ["endpoint.notifications"] = { ++ ["endpoint.speech_low"] = { ++ ["media.class"] = "Audio/Sink", ++ ["role"] = "Speech-Low", ++ }, ++ ["endpoint.custom_low"] = { + ["media.class"] = "Audio/Sink", +- ["role"] = "Notification", ++ ["role"] = "Custom-Low", + }, +- ["endpoint.alert"] = { ++ ["endpoint.navigation"] = { + ["media.class"] = "Audio/Sink", +- ["role"] = "Alert", ++ ["role"] = "Navigation", ++ }, ++ ["endpoint.speech_high"] = { ++ ["media.class"] = "Audio/Sink", ++ ["role"] = "Speech-High", ++ }, ++ ["endpoint.custom_high"] = { ++ ["media.class"] = "Audio/Sink", ++ ["role"] = "Custom-High", ++ }, ++ ["endpoint.communication"] = { ++ ["media.class"] = "Audio/Sink", ++ ["role"] = "Communication", ++ }, ++ ["endpoint.emergency"] = { ++ ["media.class"] = "Audio/Sink", ++ ["role"] = "Emergency", + }, + } +- +-]]-- ++]]-- +\ No newline at end of file +-- +2.34.1 + diff --git a/0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch b/0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch new file mode 100644 index 0000000..57e2aae --- /dev/null +++ b/0006-policy-endpoint-client.lua-fix-record-with-endpoints.patch @@ -0,0 +1,43 @@ +From 2e23d827793e56655ffd6be39b377578cef21661 Mon Sep 17 00:00:00 2001 +From: Ashok Sidipotu +Date: Tue, 11 Jan 2022 15:31:40 +0530 +Subject: [PATCH 06/14] policy-endpoint-client.lua: fix record with endpoints + +The Role traversal of config data to take notice of the +media class as well so that source and sink roles dont +overstep on each other and pick up unexpected endpoints. +--- + src/scripts/policy-endpoint-client.lua | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/src/scripts/policy-endpoint-client.lua b/src/scripts/policy-endpoint-client.lua +index 6b96edf..e898e35 100644 +--- a/src/scripts/policy-endpoint-client.lua ++++ b/src/scripts/policy-endpoint-client.lua +@@ -37,10 +37,12 @@ function scheduleRescan () + end + end + +-function findRole(role) ++function findRole(role, tmc) + if role and not config.roles[role] then + for r, p in pairs(config.roles) do +- if type(p.alias) == "table" then ++ -- default media class can be overridden in the role config data ++ mc = p["media.class"] or "Audio/Sink" ++ if (type(p.alias) == "table" and tmc == mc) then + for i = 1, #(p.alias), 1 do + if role == p.alias[i] then + return r +@@ -69,7 +71,7 @@ function findTargetEndpoint (node, media_class) + end + + -- find highest priority endpoint by role +- media_role = findRole(node.properties["media.role"]) ++ media_role = findRole(node.properties["media.role"], target_media_class) + for si_target_ep in endpoints_om:iterate { + Constraint { "role", "=", media_role, type = "pw-global" }, + Constraint { "media.class", "=", target_media_class, type = "pw-global" }, +-- +2.34.1 + diff --git a/0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch b/0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch new file mode 100644 index 0000000..0ac2311 --- /dev/null +++ b/0007-default-nodes-check-if-the-ports-exist-in-rescan_om.patch @@ -0,0 +1,47 @@ +From 07a0a5b4043ab5982a82311e031ddfd6feb80da1 Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Tue, 11 Jan 2022 07:50:15 -0500 +Subject: [PATCH 07/14] default-nodes: check if the ports exist in rescan_om + +Ports might not be ready in the node's port object manager yet. + +Fixes #153 and #150 +--- + modules/module-default-nodes.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/modules/module-default-nodes.c b/modules/module-default-nodes.c +index 31eafcf..c45be2d 100644 +--- a/modules/module-default-nodes.c ++++ b/modules/module-default-nodes.c +@@ -307,7 +307,12 @@ nodes_ready (WpDefaultNodes * self) + PW_KEY_DEVICE_ID, "=i", device_id, NULL); + for (; wp_iterator_next (node_it, &node_val); g_value_unset (&node_val)) { + WpPipewireObject *node = g_value_get_object (&node_val); +- if (wp_node_get_n_ports (WP_NODE (node)) > 0) ++ g_autoptr (WpPort) port = ++ wp_object_manager_lookup (self->rescan_om, ++ WP_TYPE_PORT, WP_CONSTRAINT_TYPE_PW_PROPERTY, ++ PW_KEY_NODE_ID, "=u", wp_proxy_get_bound_id (WP_PROXY (node)), ++ NULL); ++ if (port) + ready_nodes++; + } + +@@ -327,7 +332,12 @@ nodes_ready (WpDefaultNodes * self) + WpPipewireObject *node = g_value_get_object (&node_val); + const gchar *media_class = wp_pipewire_object_get_property ( + WP_PIPEWIRE_OBJECT (node), PW_KEY_MEDIA_CLASS); +- if (wp_node_get_n_ports (WP_NODE (node)) == 0 && ++ g_autoptr (WpPort) port = ++ wp_object_manager_lookup (self->rescan_om, ++ WP_TYPE_PORT, WP_CONSTRAINT_TYPE_PW_PROPERTY, ++ PW_KEY_NODE_ID, "=u", wp_proxy_get_bound_id (WP_PROXY (node)), ++ NULL); ++ if (!port && + (g_strcmp0 ("Audio/Source/Virtual", media_class) == 0 || + g_strcmp0 ("Video/Source/Virtual", media_class) == 0)) + return FALSE; +-- +2.34.1 + diff --git a/0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch b/0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch new file mode 100644 index 0000000..421e112 --- /dev/null +++ b/0008-scripts-monitors-log-warning-if-spa-devices-were-not.patch @@ -0,0 +1,100 @@ +From 40b16974cf800ce728c7f084fbdd8b30b7a9f03c Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Tue, 11 Jan 2022 11:27:33 -0500 +Subject: [PATCH 08/14] scripts: monitors: log warning if spa devices were not + created successfully + +Can happen if the user does not have the specific spa pluging installed. +--- + src/scripts/monitors/alsa.lua | 10 +++++++--- + src/scripts/monitors/bluez.lua | 9 +++++++-- + src/scripts/monitors/libcamera.lua | 10 +++++++--- + src/scripts/monitors/v4l2.lua | 10 +++++++--- + 4 files changed, 28 insertions(+), 11 deletions(-) + +diff --git a/src/scripts/monitors/alsa.lua b/src/scripts/monitors/alsa.lua +index be4648e..8d297c1 100644 +--- a/src/scripts/monitors/alsa.lua ++++ b/src/scripts/monitors/alsa.lua +@@ -177,9 +177,13 @@ end + + function createDevice(parent, id, factory, properties) + local device = SpaDevice(factory, properties) +- device:connect("create-object", createNode) +- device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) +- parent:store_managed_object(id, device) ++ if device then ++ device:connect("create-object", createNode) ++ device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) ++ parent:store_managed_object(id, device) ++ else ++ Log.warning ("Failed to create '" .. factory .. "' device") ++ end + end + + function prepareDevice(parent, id, type, factory, properties) +diff --git a/src/scripts/monitors/bluez.lua b/src/scripts/monitors/bluez.lua +index 172e013..4a54a7b 100644 +--- a/src/scripts/monitors/bluez.lua ++++ b/src/scripts/monitors/bluez.lua +@@ -109,8 +109,13 @@ function createDevice(parent, id, type, factory, properties) + + -- create the device + device = SpaDevice(factory, properties) +- device:connect("create-object", createNode) +- parent:store_managed_object(id, device) ++ if device then ++ device:connect("create-object", createNode) ++ parent:store_managed_object(id, device) ++ else ++ Log.warning ("Failed to create '" .. factory .. "' device") ++ return ++ end + end + + Log.info(parent, string.format("%d, %s (%s): %s", +diff --git a/src/scripts/monitors/libcamera.lua b/src/scripts/monitors/libcamera.lua +index e6e3ed9..27c7459 100644 +--- a/src/scripts/monitors/libcamera.lua ++++ b/src/scripts/monitors/libcamera.lua +@@ -125,9 +125,13 @@ function createDevice(parent, id, type, factory, properties) + + -- create the device + local device = SpaDevice(factory, properties) +- device:connect("create-object", createNode) +- device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) +- parent:store_managed_object(id, device) ++ if device then ++ device:connect("create-object", createNode) ++ device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) ++ parent:store_managed_object(id, device) ++ else ++ Log.warning ("Failed to create '" .. factory .. "' device") ++ end + end + + monitor = SpaDevice("api.libcamera.enum.manager", config.properties or {}) +diff --git a/src/scripts/monitors/v4l2.lua b/src/scripts/monitors/v4l2.lua +index fd9a20d..102eb81 100644 +--- a/src/scripts/monitors/v4l2.lua ++++ b/src/scripts/monitors/v4l2.lua +@@ -125,9 +125,13 @@ function createDevice(parent, id, type, factory, properties) + + -- create the device + local device = SpaDevice(factory, properties) +- device:connect("create-object", createNode) +- device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) +- parent:store_managed_object(id, device) ++ if device then ++ device:connect("create-object", createNode) ++ device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) ++ parent:store_managed_object(id, device) ++ else ++ Log.warning ("Failed to create '" .. factory .. "' device") ++ end + end + + monitor = SpaDevice("api.v4l2.enum.udev", config.properties or {}) +-- +2.34.1 + diff --git a/_service b/_service index 69e3b07..41a4530 100644 --- a/_service +++ b/_service @@ -4,7 +4,7 @@ git https://gitlab.freedesktop.org/pipewire/wireplumber.git enable - 0.4.7 + 0.4.6 @PARENT_TAG@