Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wireplumber for openSUSE:Factory checked in at 2023-04-06 15:55:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wireplumber (Old) and /work/SRC/openSUSE:Factory/.wireplumber.new.19717 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wireplumber" Thu Apr 6 15:55:40 2023 rev:22 rq:1077110 version:0.4.14 Changes: -------- --- /work/SRC/openSUSE:Factory/wireplumber/wireplumber.changes 2023-01-14 00:02:11.393351677 +0100 +++ /work/SRC/openSUSE:Factory/.wireplumber.new.19717/wireplumber.changes 2023-04-06 15:55:40.796207084 +0200 @@ -1,0 +2,29 @@ +Fri Mar 10 23:20:12 UTC 2023 - Alexei Sorokin <sor.ale...@meowr.ru> + +- Update to version 0.4.14: + * Additions + - Add support for managing Bluetooth-MIDI, complementing the + parts that were merged in PipeWire recently. + - Add a default volume configuration option for streams whose + volume has never been saved before; that allows starting new + streams at a lower volume than 100% by default, if desired. + - Add support for managing link errors and propagating them to + the client(s) involved. This allows better error handling on + the application side in case a format cannot be negotiated - + useful in video streams. + - snd_aloop devices are now described as being "Loopback" + devices. + - ALSA nodes in the pro audio profile now get increased graph + priority, so that they are more likely to become the driver + in the graph. + - Add support for disabling libcamera nodes & devices with + node.disabled and device.disabled, like it works for ALSA + and V4L2. +- Drop reduce-meson-required-version.patch: openSUSE Leap 15.3 is + no longer supported. +- Drop patches already included upstream: + * 0001-alsa-monitor-handle-snd_aloop-devices-better.patch + * 0001-spa-json-make-sure-we-only-add-encoded-string-data.patch + * 0001-m-lua-scripting-ignore-string-integer-table-keys-when-constructing-a-JSON-Array-Object.patch + +------------------------------------------------------------------- Old: ---- 0001-alsa-monitor-handle-snd_aloop-devices-better.patch 0001-m-lua-scripting-ignore-string-integer-table-keys-when-constructing-a-JSON-Array-Object.patch 0001-spa-json-make-sure-we-only-add-encoded-string-data.patch reduce-meson-required-version.patch wireplumber-0.4.13.obscpio New: ---- wireplumber-0.4.14.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wireplumber.spec ++++++ --- /var/tmp/diff_new_pack.AdpzsZ/_old 2023-04-06 15:55:41.392210450 +0200 +++ /var/tmp/diff_new_pack.AdpzsZ/_new 2023-04-06 15:55:41.396210473 +0200 @@ -22,7 +22,7 @@ %define sover 0 %define libwireplumber libwireplumber-%{apiver_str}-%{sover} Name: wireplumber -Version: 0.4.13 +Version: 0.4.14 Release: 0 Summary: Session / policy manager implementation for PipeWire License: MIT @@ -30,26 +30,13 @@ URL: https://gitlab.freedesktop.org/pipewire/wireplumber Source0: wireplumber-%{version}.tar.xz Source1: split-config-file.py -# PATCH-FIX-OPENSUSE reduce-meson-required-version.patch -Patch0: reduce-meson-required-version.patch -# PATCH-FIX-UPSTREAM 0001-alsa-monitor-handle-snd_aloop-devices-better.patch -Patch1: 0001-alsa-monitor-handle-snd_aloop-devices-better.patch -# PATCH-FIX-UPSTREAM 0001-spa-json-make-sure-we-only-add-encoded-string-data.patch -Patch2: 0001-spa-json-make-sure-we-only-add-encoded-string-data.patch -# PATCH-FIX-UPSTREAM 0001-m-lua-scripting-ignore-string-integer-table-keys-when-constructing-a-JSON-Array-Object.patch -Patch3: 0001-m-lua-scripting-ignore-string-integer-table-keys-when-constructing-a-JSON-Array-Object.patch - # docs BuildRequires: doxygen BuildRequires: graphviz # /docs BuildRequires: cmake BuildRequires: fdupes -%if 0%{?sle_version} <= 150300 -BuildRequires: meson >= 0.54.0 -%else BuildRequires: meson >= 0.59.0 -%endif BuildRequires: pipewire >= %{pipewire_minimum_version} BuildRequires: pipewire-spa-plugins-0_2 >= %{pipewire_minimum_version} BuildRequires: pkgconfig @@ -145,13 +132,7 @@ the wireplumber shared library. %prep -%autosetup -N -%if 0%{?suse_version} <= 1500 && 0%{?sle_version} <= 150300 -%patch0 -p1 -%endif -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 +%autosetup -p1 pushd src/config/main.lua.d python3 %{SOURCE1} @@ -161,6 +142,7 @@ %build %if %{pkg_vcmp gcc < 8} export CC=gcc-9 +export CXX=g++-9 %endif %meson -Ddoc=disabled \ -Dsystem-lua=true \ ++++++ _service ++++++ --- /var/tmp/diff_new_pack.AdpzsZ/_old 2023-04-06 15:55:41.424210631 +0200 +++ /var/tmp/diff_new_pack.AdpzsZ/_new 2023-04-06 15:55:41.428210653 +0200 @@ -1,9 +1,9 @@ <?xml version="1.0"?> <services> - <service name="obs_scm" mode="disabled"> + <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://gitlab.freedesktop.org/pipewire/wireplumber.git</param> - <param name="revision">0.4.13</param> + <param name="revision">refs/tags/0.4.14</param> <param name="versionformat">@PARENT_TAG@</param> <!-- <param name="revision">master</param> @@ -15,6 +15,6 @@ <param name="file">*.tar</param> <param name="compression">xz</param> </service> - <service name="set_version" mode="disabled" /> + <service name="set_version" mode="manual" /> </services> ++++++ wireplumber-0.4.13.obscpio -> wireplumber-0.4.14.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/NEWS.rst new/wireplumber-0.4.14/NEWS.rst --- old/wireplumber-0.4.13/NEWS.rst 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/NEWS.rst 2023-03-09 16:37:42.000000000 +0100 @@ -1,8 +1,37 @@ -WirePlumber 0.4.13 +WirePlumber 0.4.14 ~~~~~~~~~~~~~~~~~~ Additions: + - Added support for managing Bluetooth-MIDI, complimenting the parts that + were merged in PipeWire recently (!453) + + - Added a default volume configuration option for streams whose volume + has never been saved before; that allows starting new streams at a lower + volume than 100% by default, if desired (!480) + + - Added support for managing link errors and propagating them to the + client(s) involved. This allows better error handling on the application + side in case a format cannot be negotiated - useful in video streams + (see !484, pipewire#2935) + + - snd_aloop devices are now described as being "Loopback" devices + (pipewire#2214) + + - ALSA nodes in the pro audio profile now get increased graph priority, so + that they are more likely to become the driver in the graph + + - Added support for disabling libcamera nodes & devices with ``node.disabled`` + and ``device.disabled``, like it works for ALSA and V4L2 (#418) + +Past releases +~~~~~~~~~~~~~ + +WirePlumber 0.4.13 +.................. + +Additions: + - Added bluetooth SCO (HSP/HFP) hardware offload support, together with an example script that enables this functionality on the PinePhone diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/docs/rst/configuration/alsa.rst new/wireplumber-0.4.14/docs/rst/configuration/alsa.rst --- old/wireplumber-0.4.13/docs/rst/configuration/alsa.rst 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/docs/rst/configuration/alsa.rst 2023-03-09 16:37:42.000000000 +0100 @@ -198,6 +198,21 @@ restoring ports. It can, for example, restore previously saved volumes. Enable this here when the session manager does not handle port restore. +.. code-block:: lua + + ["api.acp.probe-rate"] = 48000 + +Sets the samplerate used for probing the ALSA devices and collecting the profiles +and ports. + +.. code-block:: lua + + ["api.acp.pro-channels"] = 64 + +Sets the number of channels to use when probing the Pro Audio profile. Normally, +the maximum amount of channels will be used but with this setting this can be +reduced, which can make it possible to use other samplerates on some devices. + Some of the other properties that might be configured on devices: .. code-block:: lua diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/docs/rst/lua_api/lua_introduction.rst new/wireplumber-0.4.14/docs/rst/lua_api/lua_introduction.rst --- old/wireplumber-0.4.13/docs/rst/lua_api/lua_introduction.rst 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/docs/rst/lua_api/lua_introduction.rst 2023-03-09 16:37:42.000000000 +0100 @@ -14,7 +14,9 @@ - To implement the scripting engine - To implement lua-based :ref:`config files <config_lua>` -This section is only documenting the API of the **scripting engine** +This section is only documenting the API of the **scripting engine**. Scripts can be ran with the ``wpexec`` tool. + +Example scripts can be found in the `tests/examples` directory of the wireplumber source tree. Lua Reference ------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/lib/wp/spa-json.c new/wireplumber-0.4.14/lib/wp/spa-json.c --- old/wireplumber-0.4.13/lib/wp/spa-json.c 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/lib/wp/spa-json.c 2023-03-09 16:37:42.000000000 +0100 @@ -391,9 +391,8 @@ { size_t size = (strlen (value) * 4) + 2; gchar dst[size]; - spa_json_encode_string (dst, sizeof(dst), value); - return wp_spa_json_new_from_builder ( - wp_spa_json_builder_new_formatted ("%s", dst)); + gint enc_size = spa_json_encode_string (dst, sizeof(dst), value); + return wp_spa_json_new_from_builder (wp_spa_json_builder_new (dst, enc_size)); } /* Args is not a pointer in some architectures, so this needs to be a macro to @@ -971,6 +970,14 @@ } static void +builder_add (WpSpaJsonBuilder *self, const gchar *data, size_t size) +{ + g_return_if_fail (self->max_size - self->size >= size + 1); + snprintf (self->data + self->size, size + 1, "%s", data); + self->size += size; +} + +static void builder_add_json (WpSpaJsonBuilder *self, WpSpaJson *json) { g_return_if_fail (self->max_size - self->size >= json->size + 1); @@ -990,10 +997,12 @@ { size_t size = (strlen (key) * 4) + 3; gchar dst[size]; + gint enc_size; ensure_separator (self, TRUE); ensure_allocated_max_size (self, size); - spa_json_encode_string (dst, sizeof(dst), key); - builder_add_formatted (self, "%s:", dst); + enc_size = spa_json_encode_string (dst, sizeof(dst), key); + builder_add (self, dst, enc_size); + builder_add (self, ":", 1); } /*! @@ -1067,10 +1076,11 @@ { size_t size = (strlen (value) * 4) + 2; gchar dst[size]; + gint enc_size; ensure_separator (self, FALSE); ensure_allocated_max_size (self, size); - spa_json_encode_string (dst, sizeof(dst), value); - builder_add_formatted (self, "%s", dst); + enc_size = spa_json_encode_string (dst, sizeof(dst), value); + builder_add (self, dst, enc_size); } /*! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/meson.build new/wireplumber-0.4.14/meson.build --- old/wireplumber-0.4.13/meson.build 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/meson.build 2023-03-09 16:37:42.000000000 +0100 @@ -1,5 +1,5 @@ project('wireplumber', ['c'], - version : '0.4.13', + version : '0.4.14', license : 'MIT', meson_version : '>= 0.59.0', default_options : [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/modules/module-lua-scripting/api/json.c new/wireplumber-0.4.14/modules/module-lua-scripting/api/json.c --- old/wireplumber-0.4.13/modules/module-lua-scripting/api/json.c 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/modules/module-lua-scripting/api/json.c 2023-03-09 16:37:42.000000000 +0100 @@ -242,31 +242,33 @@ luaL_checktype (L, 1, LUA_TTABLE); lua_pushnil (L); - while (lua_next (L, 1)) { - switch (lua_type (L, -1)) { - case LUA_TBOOLEAN: - wp_spa_json_builder_add_boolean (builder, lua_toboolean (L, -1)); - break; - case LUA_TNUMBER: - if (lua_isinteger (L, -1)) - wp_spa_json_builder_add_int (builder, lua_tointeger (L, -1)); - else - wp_spa_json_builder_add_float (builder, lua_tonumber (L, -1)); - break; - case LUA_TSTRING: - wp_spa_json_builder_add_string (builder, lua_tostring (L, -1)); - break; - case LUA_TUSERDATA: { - WpSpaJson *json = wplua_checkboxed (L, -1, WP_TYPE_SPA_JSON); - wp_spa_json_builder_add_json (builder, json); - break; + while (lua_next (L, -2)) { + /* We only add table values with integer keys */ + if (lua_isinteger (L, -2)) { + switch (lua_type (L, -1)) { + case LUA_TBOOLEAN: + wp_spa_json_builder_add_boolean (builder, lua_toboolean (L, -1)); + break; + case LUA_TNUMBER: + if (lua_isinteger (L, -1)) + wp_spa_json_builder_add_int (builder, lua_tointeger (L, -1)); + else + wp_spa_json_builder_add_float (builder, lua_tonumber (L, -1)); + break; + case LUA_TSTRING: + wp_spa_json_builder_add_string (builder, lua_tostring (L, -1)); + break; + case LUA_TUSERDATA: { + WpSpaJson *json = wplua_checkboxed (L, -1, WP_TYPE_SPA_JSON); + wp_spa_json_builder_add_json (builder, json); + break; + } + default: + luaL_error (L, "Json does not support lua type ", + lua_typename(L, lua_type(L, -1))); + break; } - default: - luaL_error (L, "Json does not support lua type ", - lua_typename(L, lua_type(L, -1))); - break; } - lua_pop (L, 1); } @@ -285,30 +287,33 @@ lua_pushnil (L); while (lua_next (L, -2)) { - wp_spa_json_builder_add_property (builder, lua_tostring (L, -2)); - - switch (lua_type (L, -1)) { - case LUA_TBOOLEAN: - wp_spa_json_builder_add_boolean (builder, lua_toboolean (L, -1)); - break; - case LUA_TNUMBER: - if (lua_isinteger (L, -1)) - wp_spa_json_builder_add_int (builder, lua_tointeger (L, -1)); - else - wp_spa_json_builder_add_float (builder, lua_tonumber (L, -1)); - break; - case LUA_TSTRING: - wp_spa_json_builder_add_string (builder, lua_tostring (L, -1)); - break; - case LUA_TUSERDATA: { - WpSpaJson *json = wplua_checkboxed (L, -1, WP_TYPE_SPA_JSON); - wp_spa_json_builder_add_json (builder, json); - break; + /* We only add table values with string keys */ + if (lua_type (L, -2) == LUA_TSTRING) { + wp_spa_json_builder_add_property (builder, lua_tostring (L, -2)); + + switch (lua_type (L, -1)) { + case LUA_TBOOLEAN: + wp_spa_json_builder_add_boolean (builder, lua_toboolean (L, -1)); + break; + case LUA_TNUMBER: + if (lua_isinteger (L, -1)) + wp_spa_json_builder_add_int (builder, lua_tointeger (L, -1)); + else + wp_spa_json_builder_add_float (builder, lua_tonumber (L, -1)); + break; + case LUA_TSTRING: + wp_spa_json_builder_add_string (builder, lua_tostring (L, -1)); + break; + case LUA_TUSERDATA: { + WpSpaJson *json = wplua_checkboxed (L, -1, WP_TYPE_SPA_JSON); + wp_spa_json_builder_add_json (builder, json); + break; + } + default: + luaL_error (L, "Json does not support lua type ", + lua_typename(L, lua_type(L, -1))); + break; } - default: - luaL_error (L, "Json does not support lua type ", - lua_typename(L, lua_type(L, -1))); - break; } lua_pop (L, 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/modules/module-lua-scripting/api/pod.c new/wireplumber-0.4.14/modules/module-lua-scripting/api/pod.c --- old/wireplumber-0.4.13/modules/module-lua-scripting/api/pod.c 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/modules/module-lua-scripting/api/pod.c 2023-03-09 16:37:42.000000000 +0100 @@ -549,7 +549,7 @@ return 1; } default: - luaL_error (L, "Only numner and strings are valid for bytes pod"); + luaL_error (L, "Only number and strings are valid for bytes pod"); break; } return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/modules/module-lua-scripting/module.c new/wireplumber-0.4.14/modules/module-lua-scripting/module.c --- old/wireplumber-0.4.13/modules/module-lua-scripting/module.c 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/modules/module-lua-scripting/module.c 2023-03-09 16:37:42.000000000 +0100 @@ -121,7 +121,7 @@ export_core = g_object_get_data (G_OBJECT (core), "wireplumber.export-core"); if (export_core) { lua_pushliteral (self->L, "wireplumber_export_core"); - wplua_pushobject (self->L, export_core); + wplua_pushobject (self->L, g_object_ref (export_core)); lua_settable (self->L, LUA_REGISTRYINDEX); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/modules/module-si-standard-link.c new/wireplumber-0.4.14/modules/module-si-standard-link.c --- old/wireplumber-0.4.13/modules/module-si-standard-link.c 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/modules/module-si-standard-link.c 2023-03-09 16:37:42.000000000 +0100 @@ -32,6 +32,13 @@ guint n_async_ops_wait; }; +enum { + SIGNAL_LINK_ERROR, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + static void si_standard_link_link_init (WpSiLinkInterface * iface); G_DECLARE_FINAL_TYPE (WpSiStandardLink, si_standard_link, WP, SI_STANDARD_LINK, @@ -215,6 +222,17 @@ } } +static void +on_link_state_changed (WpLink *link, WpLinkState old_state, + WpLinkState new_state, WpSiStandardLink * self) +{ + if (new_state == WP_LINK_STATE_ERROR) { + const gchar *error_msg; + wp_link_get_state (link, &error_msg); + g_signal_emit_by_name (self, "link-error", error_msg); + } +} + struct port { guint32 node_id; @@ -352,6 +370,9 @@ WP_OBJECT_FEATURES_ALL & ~WP_LINK_FEATURE_ESTABLISHED, NULL, g_cclosure_new_object ( (GCallback) on_link_activated, G_OBJECT (transition))); + + g_signal_connect_object (link, "state-changed", + G_CALLBACK (on_link_state_changed), self, 0); } g_variant_iter_free (iter); return self->node_links->len > 0; @@ -718,6 +739,10 @@ si_class->get_associated_proxy = si_standard_link_get_associated_proxy; si_class->disable_active = si_standard_link_disable_active; si_class->enable_active = si_standard_link_enable_active; + + signals[SIGNAL_LINK_ERROR] = g_signal_new ( + "link-error", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_STRING); } static GVariant * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/po/de.po new/wireplumber-0.4.14/po/de.po --- old/wireplumber-0.4.13/po/de.po 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/po/de.po 2023-03-09 16:37:42.000000000 +0100 @@ -1,30 +1,30 @@ -# translation of pipewire.master-tx.de.po to -# German translation of pipewire -# Copyright (C) 2008 pipewire -# This file is distributed under the same license as the pipewire package. +# translation of WirePlumber +# German translation of WirePlumber +# Copyright (C) 2008 WirePlumber +# This file is distributed under the same license as the WirePlumber package. # # # Fabian Affolter <f...@fedoraproject.org>, 2008-2009. # Micha Pietsch <bar...@fedoraproject.org>, 2008, 2009. # Hedda Peters <hpet...@redhat.com>, 2009, 2012. # Mario Blättermann <mario.blaetterm...@gmail.com>, 2016. +# Jürgen Benvenuti <gastor...@posteo.org>, 2023. # msgid "" msgstr "" -"Project-Id-Version: pipewire.master-tx.de\n" -"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/wireplumber/" -"issues/new\n" -"POT-Creation-Date: 2022-04-09 15:19+0300\n" -"PO-Revision-Date: 2021-01-09 11:36+0000\n" -"Last-Translator: Tobias Weise <tobias.we...@web.de>\n" -"Language-Team: German <https://translate.fedoraproject.org/projects/pipewire/" -"pipewire/de/>\n" +"Project-Id-Version: WirePlumber\n" +"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/wireplumber/-/" +"issues\n" +"POT-Creation-Date: 2023-01-30 15:31+0000\n" +"PO-Revision-Date: 2023-01-28 20:55+0100\n" +"Last-Translator: Jürgen Benvenuti <gastor...@posteo.org>\n" +"Language-Team: German <gnome...@gnome.org>\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" +"X-Generator: Poedit 3.1.1\n" #. WirePlumber #. @@ -34,6 +34,7 @@ #. SPDX-License-Identifier: MIT #. Receive script arguments from config.lua #. ensure config.properties is not nil +#. unique device/node name tables #. preprocess rules and create Interest objects #. applies properties from config.rules when asked to #. set the device id and spa factory name; REQUIRED, do not change @@ -49,15 +50,68 @@ #. ensure the node has a description #. also sanitize description, replace ':' with ' ' #. add api.alsa.card.* properties for rule matching purposes +#. apply VM overrides #. apply properties from config.rules #. create the node #. ensure the device has an appropriate name #. deduplicate devices with the same name #. ensure the device has a description -#: src/scripts/monitors/alsa.lua:222 +#: src/scripts/monitors/alsa.lua:234 +msgid "Loopback" +msgstr "Schleifenschaltung" + +#: src/scripts/monitors/alsa.lua:236 msgid "Built-in Audio" msgstr "Internes Audio" -#: src/scripts/monitors/alsa.lua:224 +#: src/scripts/monitors/alsa.lua:238 msgid "Modem" msgstr "Modem" + +#. ensure the device has a nick +#. set the icon name +#. form factor -> icon +#. apply properties from config.rules +#. override the device factory to use ACP +#. use device reservation, if available +#. unlike pipewire-media-session, this logic here keeps the device +#. acquired at all times and destroys it if someone else acquires +#. create the device +#. attempt to acquire again +#. destroy the device +#. TODO enable the jack device +#. TODO disable the jack device +#. create the device +#. handle create-object to prepare device +#. handle object-removed to destroy device reservations and recycle device name +#. reset the name tables to make sure names are recycled +#. activate monitor +#. create the JACK device (for PipeWire to act as client to a JACK server) +#. enable device reservation if requested +#. if the reserve-device plugin is enabled, at the point of script execution +#. it is expected to be connected. if it is not, assume the d-bus connection +#. has failed and continue without it +#. handle rd_plugin state changes to destroy and re-create the ALSA monitor in +#. case D-Bus service is restarted +#. create the monitor +#. WirePlumber +#. +#. Copyright © 2021 Collabora Ltd. +#. @author George Kiagiadakis <george.kiagiada...@collabora.com> +#. +#. SPDX-License-Identifier: MIT +#. preprocess rules and create Interest objects +#. applies properties from config.rules when asked to +#. set the device id and spa factory name; REQUIRED, do not change +#. set the default pause-on-idle setting +#. set the node name +#. sanitize name +#. deduplicate nodes with the same name +#. set the node description +#: src/scripts/monitors/libcamera.lua:88 +msgid "Built-in Front Camera" +msgstr "Interne vordere Kamera" + +#: src/scripts/monitors/libcamera.lua:90 +msgid "Built-in Back Camera" +msgstr "Interne hintere Kamera" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/po/pl.po new/wireplumber-0.4.14/po/pl.po --- old/wireplumber-0.4.13/po/pl.po 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/po/pl.po 2023-03-09 16:37:42.000000000 +0100 @@ -1,15 +1,15 @@ # Polish translation for wireplumber. -# Copyright © 2008-2022 the wireplumber authors. +# Copyright © 2008-2023 the wireplumber authors. # This file is distributed under the same license as the wireplumber package. -# Piotr DrÄ g <piotrd...@gmail.com>, 2008, 2012-2022. +# Piotr DrÄ g <piotrd...@gmail.com>, 2008, 2012-2023. # msgid "" msgstr "" "Project-Id-Version: wireplumber\n" "Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/wireplumber/-/" "issues\n" -"POT-Creation-Date: 2022-06-15 15:30+0000\n" -"PO-Revision-Date: 2022-06-16 13:20+0200\n" +"POT-Creation-Date: 2023-03-04 13:34+0000\n" +"PO-Revision-Date: 2023-03-04 14:35+0100\n" "Last-Translator: Piotr DrÄ g <piotrd...@gmail.com>\n" "Language-Team: Polish <community-pol...@mozilla.org>\n" "Language: pl\n" @@ -43,16 +43,21 @@ #. ensure the node has a description #. also sanitize description, replace ':' with ' ' #. add api.alsa.card.* properties for rule matching purposes +#. apply VM overrides #. apply properties from config.rules #. create the node #. ensure the device has an appropriate name #. deduplicate devices with the same name #. ensure the device has a description -#: src/scripts/monitors/alsa.lua:220 +#: src/scripts/monitors/alsa.lua:236 +msgid "Loopback" +msgstr "UrzÄ dzenie zwrotne" + +#: src/scripts/monitors/alsa.lua:238 msgid "Built-in Audio" msgstr "Wbudowany dźwiÄk" -#: src/scripts/monitors/alsa.lua:222 +#: src/scripts/monitors/alsa.lua:240 msgid "Modem" msgstr "Modem" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/po/uk.po new/wireplumber-0.4.14/po/uk.po --- old/wireplumber-0.4.13/po/uk.po 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/po/uk.po 2023-03-09 16:37:42.000000000 +0100 @@ -1,14 +1,14 @@ # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the pipewire package. # -# Yuri Chornoivan <yurc...@ukr.net>, 2009-2021, 2022. +# Yuri Chornoivan <yurc...@ukr.net>, 2009-2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: pipewire\n" -"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/wireplumber/-/is" -"sues\n" -"POT-Creation-Date: 2022-06-15 15:30+0000\n" -"PO-Revision-Date: 2022-06-18 12:57+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/wireplumber/-/i" +"ssues\n" +"POT-Creation-Date: 2022-12-13 15:30+0000\n" +"PO-Revision-Date: 2023-02-15 22:44+0200\n" "Last-Translator: Yuri Chornoivan <yurc...@ukr.net>\n" "Language-Team: Ukrainian <trans...@lists.fedoraproject.org>\n" "Language: uk\n" @@ -43,16 +43,21 @@ #. ensure the node has a description #. also sanitize description, replace ':' with ' ' #. add api.alsa.card.* properties for rule matching purposes +#. apply VM overrides #. apply properties from config.rules #. create the node #. ensure the device has an appropriate name #. deduplicate devices with the same name #. ensure the device has a description -#: src/scripts/monitors/alsa.lua:220 +#: src/scripts/monitors/alsa.lua:234 +msgid "Loopback" +msgstr "ÐеÑлÑ" + +#: src/scripts/monitors/alsa.lua:236 msgid "Built-in Audio" msgstr "ÐбÑдоване аÑдÑо" -#: src/scripts/monitors/alsa.lua:222 +#: src/scripts/monitors/alsa.lua:238 msgid "Modem" msgstr "Ðодем" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/bluetooth.conf new/wireplumber-0.4.14/src/config/bluetooth.conf --- old/wireplumber-0.4.13/src/config/bluetooth.conf 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/bluetooth.conf 2023-03-09 16:37:42.000000000 +0100 @@ -68,6 +68,9 @@ # Provides factories to make session manager objects. { name = libpipewire-module-session-manager } + + # Provides factories to make SPA node objects. + { name = libpipewire-module-spa-node-factory } ] wireplumber.components = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/bluetooth.lua.d/30-bluez-midi-monitor.lua new/wireplumber-0.4.14/src/config/bluetooth.lua.d/30-bluez-midi-monitor.lua --- old/wireplumber-0.4.13/src/config/bluetooth.lua.d/30-bluez-midi-monitor.lua 1970-01-01 01:00:00.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/bluetooth.lua.d/30-bluez-midi-monitor.lua 2023-03-09 16:37:42.000000000 +0100 @@ -0,0 +1,18 @@ +bluez_midi_monitor = {} +bluez_midi_monitor.properties = {} +bluez_midi_monitor.rules = {} + +function bluez_midi_monitor.enable() + if bluez_midi_monitor.enabled == false then + return + end + + load_monitor("bluez-midi", { + properties = bluez_midi_monitor.properties, + rules = bluez_midi_monitor.rules, + }) + + if bluez_midi_monitor.properties["with-logind"] then + load_optional_module("logind") + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/bluetooth.lua.d/50-bluez-config.lua new/wireplumber-0.4.14/src/config/bluetooth.lua.d/50-bluez-config.lua --- old/wireplumber-0.4.13/src/config/bluetooth.lua.d/50-bluez-config.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/bluetooth.lua.d/50-bluez-config.lua 2023-03-09 16:37:42.000000000 +0100 @@ -11,7 +11,7 @@ -- See bluez-hardware.conf for the hardware database. - -- Enabled headset roles (default: [ hsp_hs hfp_ag ]), this + -- Enabled headset roles (default: [ hfp_hf hfp_ag ]), this -- property only applies to native backend. Currently some headsets -- (Sony WH-1000XM3) are not working with both hsp_ag and hfp_ag -- enabled, disable either hsp_ag or hfp_ag to work around it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/bluetooth.lua.d/50-bluez-midi-config.lua new/wireplumber-0.4.14/src/config/bluetooth.lua.d/50-bluez-midi-config.lua --- old/wireplumber-0.4.13/src/config/bluetooth.lua.d/50-bluez-midi-config.lua 1970-01-01 01:00:00.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/bluetooth.lua.d/50-bluez-midi-config.lua 2023-03-09 16:37:42.000000000 +0100 @@ -0,0 +1,42 @@ +-- BLE MIDI is currently disabled by default, because it conflicts with +-- the SELinux policy on Fedora 37 and potentially other systems using +-- SELinux. For a workaround, see +-- https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/spa/plugins/bluez5/README-MIDI.md +bluez_midi_monitor.enabled = false + +bluez_midi_monitor.properties = { + -- Enable the logind module, which arbitrates which user will be allowed + -- to have bluetooth audio enabled at any given time (particularly useful + -- if you are using GDM as a display manager, as the gdm user also launches + -- pipewire and wireplumber). + -- This requires access to the D-Bus user session; disable if you are running + -- a system-wide instance of wireplumber. + ["with-logind"] = true, + + -- List of MIDI server node names. Each node name given will create a new instance + -- of a BLE MIDI service. Typical BLE MIDI instruments have on service instance, + -- so adding more than one here may confuse some clients. The node property matching + -- rules below apply also to these servers. + --["servers"] = { "bluez_midi.server" }, +} + +bluez_midi_monitor.rules = { + -- An array of matches/actions to evaluate. + { + matches = { + { + -- Matches all nodes. + { "node.name", "matches", "bluez_midi.*" }, + }, + }, + apply_properties = { + --["node.nick"] = "My Node", + --["priority.driver"] = 100, + --["priority.session"] = 100, + --["node.pause-on-idle"] = false, + --["session.suspend-timeout-seconds"] = 5, -- 0 disables suspend + --["monitor.channel-volumes"] = false, + --["node.latency-offset-msec"] = -10, -- delay (<0) input to reduce jitter + }, + }, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/bluetooth.lua.d/90-enable-all.lua new/wireplumber-0.4.14/src/config/bluetooth.lua.d/90-enable-all.lua --- old/wireplumber-0.4.13/src/config/bluetooth.lua.d/90-enable-all.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/bluetooth.lua.d/90-enable-all.lua 2023-03-09 16:37:42.000000000 +0100 @@ -1 +1,2 @@ bluez_monitor.enable() +bluez_midi_monitor.enable() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/main.lua.d/40-stream-defaults.lua new/wireplumber-0.4.14/src/config/main.lua.d/40-stream-defaults.lua --- old/wireplumber-0.4.13/src/config/main.lua.d/40-stream-defaults.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/main.lua.d/40-stream-defaults.lua 2023-03-09 16:37:42.000000000 +0100 @@ -7,6 +7,10 @@ -- whether to restore the last stream target or not ["restore-target"] = true, + + -- the default channel volume for new streams whose props were never saved + -- previously. This is only used if "restore-props" is set to true. + ["default-channel-volume"] = 1.0, } stream_defaults.rules = { @@ -20,6 +24,7 @@ -- apply_properties = { -- ["state.restore-props"] = false, -- ["state.restore-target"] = false, + -- ["state.default-channel-volume"] = 0.5, -- }, -- }, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/config/wireplumber.conf new/wireplumber-0.4.14/src/config/wireplumber.conf --- old/wireplumber-0.4.13/src/config/wireplumber.conf 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/config/wireplumber.conf 2023-03-09 16:37:42.000000000 +0100 @@ -71,6 +71,9 @@ # Provides factories to make session manager objects. { name = libpipewire-module-session-manager } + + # Provides factories to make SPA node objects. + { name = libpipewire-module-spa-node-factory } ] wireplumber.components = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/scripts/monitors/alsa.lua new/wireplumber-0.4.14/src/scripts/monitors/alsa.lua --- old/wireplumber-0.4.13/src/scripts/monitors/alsa.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/scripts/monitors/alsa.lua 2023-03-09 16:37:42.000000000 +0100 @@ -82,7 +82,9 @@ priority = priority - (tonumber(dev) * 16) - tonumber(subdev) - if profile:find("^analog%-") then + if profile:find("^pro%-") then + priority = priority + 500 + elseif profile:find("^analog%-") then priority = priority + 9 elseif profile:find("^iec958%-") then priority = priority + 8 @@ -228,8 +230,11 @@ local d = nil local f = properties["device.form-factor"] local c = properties["device.class"] + local n = properties["api.alsa.card.name"] - if f == "internal" then + if n == "Loopback" then + d = I18n.gettext("Loopback") + elseif f == "internal" then d = I18n.gettext("Built-in Audio") elseif c == "modem" then d = I18n.gettext("Modem") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/scripts/monitors/bluez-midi.lua new/wireplumber-0.4.14/src/scripts/monitors/bluez-midi.lua --- old/wireplumber-0.4.13/src/scripts/monitors/bluez-midi.lua 1970-01-01 01:00:00.000000000 +0100 +++ new/wireplumber-0.4.14/src/scripts/monitors/bluez-midi.lua 2023-03-09 16:37:42.000000000 +0100 @@ -0,0 +1,187 @@ +-- WirePlumber +-- +-- Copyright © 2022 Pauli Virtanen +-- @author Pauli Virtanen +-- +-- SPDX-License-Identifier: MIT + +local config = ... or {} + +-- unique device/node name tables +node_names_table = nil +id_to_name_table = nil + +-- preprocess rules and create Interest objects +for _, r in ipairs(config.rules or {}) do + r.interests = {} + for _, i in ipairs(r.matches) do + local interest_desc = { type = "properties" } + for _, c in ipairs(i) do + c.type = "pw" + table.insert(interest_desc, Constraint(c)) + end + local interest = Interest(interest_desc) + table.insert(r.interests, interest) + end + r.matches = nil +end + +-- applies properties from config.rules when asked to +function rulesApplyProperties(properties) + for _, r in ipairs(config.rules or {}) do + if r.apply_properties then + for _, interest in ipairs(r.interests) do + if interest:matches(properties) then + for k, v in pairs(r.apply_properties) do + properties[k] = v + end + end + end + end + end +end + +function setLatencyOffset(node, offset_msec) + if not offset_msec then + return + end + + local props = { "Spa:Pod:Object:Param:Props", "Props" } + props.latencyOffsetNsec = tonumber(offset_msec) * 1000000 + + local param = Pod.Object(props) + Log.debug(param, "setting latency offset on " .. tostring(node)) + node:set_param("Props", param) +end + +function createNode(parent, id, type, factory, properties) + properties["factory.name"] = factory + + -- set the node description + local desc = properties["node.description"] + -- sanitize description, replace ':' with ' ' + properties["node.description"] = desc:gsub("(:)", " ") + + -- set the node name + local name = + "bluez_midi." .. properties["api.bluez5.address"] + -- sanitize name + name = name:gsub("([^%w_%-%.])", "_") + -- deduplicate nodes with the same name + properties["node.name"] = name + for counter = 2, 99, 1 do + if node_names_table[properties["node.name"]] ~= true then + node_names_table[properties["node.name"]] = true + break + end + properties["node.name"] = name .. "." .. counter + end + + properties["api.glib.mainloop"] = "true" + + -- apply properties from config.rules + rulesApplyProperties(properties) + + local latency_offset = properties["node.latency-offset-msec"] + properties["node.latency-offset-msec"] = nil + + -- create the node + -- it doesn't necessarily need to be a local node, + -- the other Bluetooth parts run in the local process, + -- so it's consistent to have also this here + local node = LocalNode("spa-node-factory", properties) + node:activate(Feature.Proxy.BOUND) + parent:store_managed_object(id, node) + id_to_name_table[id] = properties["node.name"] + setLatencyOffset(node, latency_offset) +end + +function createMonitor() + local monitor_props = {} + for k, v in pairs(config.properties or {}) do + monitor_props[k] = v + end + monitor_props["server"] = nil + + monitor_props["api.glib.mainloop"] = "true" + + local monitor = SpaDevice("api.bluez5.midi.enum", monitor_props) + if monitor then + monitor:connect("create-object", createNode) + monitor:connect("object-removed", function (parent, id) + node_names_table[id_to_name_table[id]] = nil + id_to_name_table[id] = nil + end) + else + Log.message("PipeWire's BlueZ MIDI SPA missing or broken. Bluetooth not supported.") + return nil + end + + -- reset the name tables to make sure names are recycled + node_names_table = {} + id_to_name_table = {} + + monitor:activate(Feature.SpaDevice.ENABLED) + return monitor +end + +function createServers() + local props = config.properties or {} + + if not props["servers"] then + return nil + end + + local servers = {} + local i = 1 + + for k, v in pairs(props["servers"]) do + local node_props = { + ["node.name"] = v, + ["node.description"] = string.format(I18n.gettext("BLE MIDI %d"), i), + ["api.bluez5.role"] = "server", + ["factory.name"] = "api.bluez5.midi.node", + ["api.glib.mainloop"] = "true", + } + rulesApplyProperties(node_props) + + local latency_offset = node_props["node.latency-offset-msec"] + node_props["node.latency-offset-msec"] = nil + + local node = LocalNode("spa-node-factory", node_props) + if node then + node:activate(Feature.Proxy.BOUND) + table.insert(servers, node) + setLatencyOffset(node, latency_offset) + else + Log.message("Failed to create BLE MIDI server.") + end + i = i + 1 + end + + return servers +end + +logind_plugin = Plugin.find("logind") +if logind_plugin then + -- if logind support is enabled, activate + -- the monitor only when the seat is active + function startStopMonitor(seat_state) + Log.info(logind_plugin, "Seat state changed: " .. seat_state) + + if seat_state == "active" then + monitor = createMonitor() + servers = createServers() + elseif monitor then + monitor:deactivate(Feature.SpaDevice.ENABLED) + monitor = nil + servers = nil + end + end + + logind_plugin:connect("state-changed", function(p, s) startStopMonitor(s) end) + startStopMonitor(logind_plugin:call("get-state")) +else + monitor = createMonitor() + servers = createServers() +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/scripts/monitors/libcamera.lua new/wireplumber-0.4.14/src/scripts/monitors/libcamera.lua --- old/wireplumber-0.4.13/src/scripts/monitors/libcamera.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/scripts/monitors/libcamera.lua 2023-03-09 16:37:42.000000000 +0100 @@ -114,6 +114,9 @@ -- apply properties from config.rules rulesApplyProperties(properties) + if properties ["node.disabled"] then + return + end -- create the node local node = Node("spa-node-factory", properties) @@ -148,7 +151,9 @@ -- apply properties from config.rules rulesApplyProperties(properties) - + if properties ["device.disabled"] then + return + end -- create the device local device = SpaDevice(factory, properties) if device then diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/scripts/policy-node.lua new/wireplumber-0.4.14/src/scripts/policy-node.lua --- old/wireplumber-0.4.13/src/scripts/policy-node.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/scripts/policy-node.lua 2023-03-09 16:37:42.000000000 +0100 @@ -98,6 +98,32 @@ return end + si_link:connect("link-error", function (_, error_msg) + local ids = {si_id} + if si_flags[si_id] ~= nil then + table.insert (ids, si_flags[si_id].peer_id) + end + + for _, id in ipairs (ids) do + local si = linkables_om:lookup { + Constraint { "id", "=", id, type = "gobject" }, + } + if si then + local node = si:get_associated_proxy ("node") + local client_id = node.properties["client.id"] + if client_id then + local client = clients_om:lookup { + Constraint { "bound-id", "=", client_id, type = "gobject" } + } + if client then + Log.info (node, "sending client error: " .. error_msg) + client:send_error (node["bound-id"], -32, error_msg) + end + end + end + end + end) + -- register si_flags[si_id].peer_id = si_target.id si_flags[si_id].failed_peer_id = si_target.id diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/src/scripts/restore-stream.lua new/wireplumber-0.4.14/src/scripts/restore-stream.lua --- old/wireplumber-0.4.13/src/scripts/restore-stream.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/src/scripts/restore-stream.lua 2023-03-09 16:37:42.000000000 +0100 @@ -13,6 +13,7 @@ config.properties = config.properties or {} config_restore_props = config.properties["restore-props"] or false config_restore_target = config.properties["restore-target"] or false +config_default_channel_volume = config.properties["default-channel-volume"] or 1.0 -- preprocess rules and create Interest objects for _, r in ipairs(config.rules or {}) do @@ -322,6 +323,31 @@ end end +function build_default_channel_volumes (node) + local def_vol = config_default_channel_volume + local channels = 2 + local res = {} + + local str = node.properties["state.default-channel-volume"] + if str ~= nil then + def_vol = tonumber (str) + end + + for pod in node:iterate_params("Format") do + local pod_parsed = pod:parse() + if pod_parsed ~= nil then + channels = pod_parsed.properties.channels + break + end + end + + while (#res < channels) do + table.insert(res, def_vol) + end + + return res; +end + function restoreStream(node) local stream_props = node.properties rulesApplyProperties(stream_props) @@ -332,23 +358,19 @@ end if config_restore_props and stream_props["state.restore-props"] ~= false then - local needsRestore = false local props = { "Spa:Pod:Object:Param:Props", "Props" } local str = state_table[key_base .. ":volume"] - needsRestore = str and true or needsRestore props.volume = str and tonumber(str) or nil local str = state_table[key_base .. ":mute"] - needsRestore = str and true or needsRestore props.mute = str and (str == "true") or nil local str = state_table[key_base .. ":channelVolumes"] - needsRestore = str and true or needsRestore - props.channelVolumes = str and parseArray(str, tonumber) or nil + props.channelVolumes = str and parseArray(str, tonumber) or + build_default_channel_volumes (node) local str = state_table[key_base .. ":channelMap"] - needsRestore = str and true or needsRestore props.channelMap = str and parseArray(str) or nil -- convert arrays to Spa Pod @@ -361,13 +383,10 @@ props.channelMap = Pod.Array(props.channelMap) end - if needsRestore then - Log.info(node, "restore values from " .. key_base) - - local param = Pod.Object(props) - Log.debug(param, "setting props on " .. tostring(node)) - node:set_param("Props", param) - end + Log.info(node, "restore values from " .. key_base) + local param = Pod.Object(props) + Log.debug(param, "setting props on " .. tostring(node)) + node:set_param("Props", param) end if config_restore_target and stream_props["state.restore-target"] ~= false then diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wireplumber-0.4.13/tests/wplua/scripts/json.lua new/wireplumber-0.4.14/tests/wplua/scripts/json.lua --- old/wireplumber-0.4.13/tests/wplua/scripts/json.lua 2022-12-13 10:39:14.000000000 +0100 +++ new/wireplumber-0.4.14/tests/wplua/scripts/json.lua 2023-03-09 16:37:42.000000000 +0100 @@ -102,6 +102,19 @@ assert (json:get_data() == "[[{\"key1\":1}, {\"key2\":2}]]") assert (json:get_data() == json:to_string()) +table = {} +table[1] = 1 +table[2] = 2 +table[3] = 3 +table["4"] = 4 +json = Json.Array (table) +assert (json:is_array()) +val = json:parse () +assert (val[1] == 1) +assert (val[2] == 2) +assert (val[3] == 3) +assert (val["4"] == nil) + -- Object json = Json.Object { key1 = Json.Null(), @@ -134,6 +147,19 @@ assert (not val.key7.key_nested3[3]) assert (val.key7["Key with spaces and (special % characters)"] == 50.0) +table = {} +table["1"] = 1 +table["2"] = 2 +table["3"] = 3 +table[4] = 4 +json = Json.Object (table) +assert (json:is_object()) +val = json:parse () +assert (val["1"] == 1) +assert (val["2"] == 2) +assert (val["3"] == 3) +assert (val[4] == nil) + -- Raw json = Json.Raw ("[\"foo\", \"bar\"]") assert (json:is_array()) ++++++ wireplumber.obsinfo ++++++ --- /var/tmp/diff_new_pack.AdpzsZ/_old 2023-04-06 15:55:41.780212641 +0200 +++ /var/tmp/diff_new_pack.AdpzsZ/_new 2023-04-06 15:55:41.784212664 +0200 @@ -1,5 +1,5 @@ name: wireplumber -version: 0.4.13 -mtime: 1670924354 -commit: 7cb1b8b92e96ebd1b7e632cda32715fed713d333 +version: 0.4.14 +mtime: 1678376262 +commit: 6d0c7f7b7f484b3cd2aaf2e2b3cc902c095b4946