summaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia/pipewire
diff options
context:
space:
mode:
authorAshok Sidipotu <ashok.sidipotu@collabora.com>2022-02-24 11:46:15 +0530
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2022-03-05 19:16:04 +0000
commitdebe203be9bf5e842b082751f53cb0502be02db1 (patch)
tree6303438434b673d9ea80608e6eee6f3072b576e2 /meta-pipewire/recipes-multimedia/pipewire
parent76af8fd0941168ca3bbd1cf3b7c283a87c382281 (diff)
pipewire: Update pw to v0.3.47 and wp to v0.4.8
Highlights of Pipewire. - Removed check and warnings to catch leaked listeners on the proxy. - Fix critical bug where alsa devices would not show when the kernel was compiled without VERBOSE_PROCFS - Almost all limits on number of ports, clients and nodes are removed. - Many more bug fixes and imporovements. Highlights of Wireplumber. - Added bluetooth profile auto-switching support between A2DP and HFP modes - Better default audio sources and sinks selection - Backported a fix for a known issue with selecting the default devices on top of 0.4.8 (ae6c9a5e) - Many more bug fixes and imporovements. Change-Id: Id5414aed065593893a237437a8c77645cbf15804 Signed-off-by: Ashok Sidipotu <ashok.sidipotu@collabora.com> Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/27220 Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> Tested-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
Diffstat (limited to 'meta-pipewire/recipes-multimedia/pipewire')
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-Revert-treewide-meson.build-use-project_-build-sourc.patch101
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-feature.allowed.patch277
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-treewide-meson.build-use-dependency-variable-.patch (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-dependency-variable-.patch)140
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-systemd-correctly-prefix-systemd-system-units.patch25
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-treewide-meson.build-simplify-get_variable-ca.patch130
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-Revert-treewide-meson.build-get-SPA_PLUGIN_DIR-from-.patch124
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-pipewiresink-set-a-default-channel-map-if-the-number.patch77
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-Revert-meson-declare-spa_dep-and-override_dependency.patch (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-meson-declare-spa_dep-and-override_dependency.patch)17
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-Revert-meson-use-meson-variables-for-the-SMs-uninsta.patch47
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-Revert-meson-declare-spa_dep-and-override_dependency.patch31
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-Revert-test-add-test-for-the-loop.patch32
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-Revert-spa-improve-the-AEC-interface.patch502
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0011-Revert-module-echo-cancel-Move-backends-to-dynamic-l.patch1055
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0012-Miscellanous-changes-to-account-for-lower-version-of.patch166
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bb (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bb)6
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bbappend (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bbappend)15
16 files changed, 2484 insertions, 261 deletions
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-Revert-treewide-meson.build-use-project_-build-sourc.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-Revert-treewide-meson.build-use-project_-build-sourc.patch
index 42f01086a..89507df60 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-Revert-treewide-meson.build-use-project_-build-sourc.patch
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-Revert-treewide-meson.build-use-project_-build-sourc.patch
@@ -1,24 +1,21 @@
-From e850a4c080c80fc218224521727996062ebb9487 Mon Sep 17 00:00:00 2001
+From 7bf582601f73c5f796b23a7cc2868424b03a0fd1 Mon Sep 17 00:00:00 2001
From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
Date: Fri, 14 Jan 2022 16:12:55 +0530
-Subject: [PATCH 1/4] Revert "treewide: meson.build: use
+Subject: [PATCH 01/12] Revert "treewide: meson.build: use
project_{build,source}_root()"
This reverts commit 8ed46a283fa1f8623b940eaeb9f7cbcc52eebf0e.
Upstream-Status: Inappropriate[meson version dependent]
---
- doc/meson.build | 34 ++++++++++++++--------------
- meson.build | 8 +++----
- spa/plugins/audioconvert/meson.build | 4 ++--
- spa/tests/meson.build | 4 ++--
- src/daemon/meson.build | 6 ++---
- src/modules/meson.build | 6 ++---
- src/tests/meson.build | 6 ++---
- test/meson.build | 4 ++--
- 8 files changed, 36 insertions(+), 36 deletions(-)
+ doc/meson.build | 34 +++++++++++++++++-----------------
+ meson.build | 8 ++++----
+ spa/tests/meson.build | 4 ++--
+ src/daemon/meson.build | 6 +++---
+ test/meson.build | 4 ++--
+ 5 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/doc/meson.build b/doc/meson.build
-index 0e6d7f8e3..082780145 100644
+index 7e876bce5..95fecffc2 100644
--- a/doc/meson.build
+++ b/doc/meson.build
@@ -1,8 +1,8 @@
@@ -32,7 +29,7 @@ index 0e6d7f8e3..082780145 100644
dot_found = find_program('dot', required: false).found()
summary({'dot (used with doxygen)': dot_found}, bool_yn: true, section: 'Optional programs')
-@@ -49,35 +49,35 @@ extra_docs = [
+@@ -48,35 +48,35 @@ extra_docs = [
inputs = []
foreach extra : extra_docs
@@ -81,7 +78,7 @@ index 0e6d7f8e3..082780145 100644
]
# Example files (in order from simple to esoteric)
-@@ -118,8 +118,8 @@ input_dirs += [ 'doc/examples.dox' ]
+@@ -141,8 +141,8 @@ input_dirs += [ 'doc/pipewire-tools.dox' ]
doxyfile_conf.set('inputs', ' '.join(inputs + input_dirs))
doxyfile_conf.set('cssfiles', ' '.join(cssfiles))
doxyfile_conf.set('path_prefixes', ' '.join(path_prefixes))
@@ -93,10 +90,10 @@ index 0e6d7f8e3..082780145 100644
doxyfile = configure_file(input: 'Doxyfile.in',
output: 'Doxyfile',
diff --git a/meson.build b/meson.build
-index b1ea32f7a..67e697c15 100644
+index 440845e37..338192073 100644
--- a/meson.build
+++ b/meson.build
-@@ -304,9 +304,9 @@ includes_inc = include_directories('include')
+@@ -247,9 +247,9 @@ includes_inc = include_directories('include')
pipewire_inc = include_directories('src')
makedata = configuration_data()
@@ -109,7 +106,7 @@ index b1ea32f7a..67e697c15 100644
if version_arr.length() == 4
makedata.set('TAG', 'HEAD')
else
-@@ -498,7 +498,7 @@ endif
+@@ -436,7 +436,7 @@ endif
setenv = find_program('pw-uninstalled.sh')
run_target('pw-uninstalled',
command : [setenv,
@@ -118,30 +115,8 @@ index b1ea32f7a..67e697c15 100644
'-v@0@'.format(pipewire_version)]
)
-diff --git a/spa/plugins/audioconvert/meson.build b/spa/plugins/audioconvert/meson.build
-index de9f491af..4d15271f5 100644
---- a/spa/plugins/audioconvert/meson.build
-+++ b/spa/plugins/audioconvert/meson.build
-@@ -140,7 +140,7 @@ foreach a : test_apps
- install : installed_tests_enabled,
- install_dir : installed_tests_execdir / 'audioconvert'),
- env : [
-- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
-+ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
- ])
-
- if installed_tests_enabled
-@@ -170,7 +170,7 @@ foreach a : benchmark_apps
- install : installed_tests_enabled,
- install_dir : installed_tests_execdir / 'audioconvert'),
- env : [
-- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
-+ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
- ])
-
- if installed_tests_enabled
diff --git a/spa/tests/meson.build b/spa/tests/meson.build
-index 990df87bd..9e2a211e2 100644
+index c73c887f4..9c78dcbd2 100644
--- a/spa/tests/meson.build
+++ b/spa/tests/meson.build
@@ -5,7 +5,7 @@ find = find_program('find', required: false)
@@ -153,17 +128,17 @@ index 990df87bd..9e2a211e2 100644
'-name', '*.h',
'-not', '-name', 'type-info.h',
'-type', 'f',
-@@ -40,7 +40,7 @@ foreach a : benchmark_apps
+@@ -41,7 +41,7 @@ foreach a : benchmark_apps
install_dir : installed_tests_execdir,
),
env : [
-- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
+ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
]
)
diff --git a/src/daemon/meson.build b/src/daemon/meson.build
-index 44a574337..5e64287a1 100644
+index a2e4c55e3..647d7393d 100644
--- a/src/daemon/meson.build
+++ b/src/daemon/meson.build
@@ -18,9 +18,9 @@ conf_config.set('pulse_comment', '#')
@@ -178,7 +153,7 @@ index 44a574337..5e64287a1 100644
conf_config_uninstalled.set('pulse_comment', '')
build_ms = 'media-session' in get_option('session-managers')
-@@ -105,7 +105,7 @@ custom_target('pipewire-uninstalled',
+@@ -106,7 +106,7 @@ custom_target('pipewire-uninstalled',
install: false,
input: pipewire_exec,
output: 'pipewire-uninstalled',
@@ -187,42 +162,8 @@ index 44a574337..5e64287a1 100644
)
#desktop_file = i18n.merge_file(
-diff --git a/src/modules/meson.build b/src/modules/meson.build
-index 93dc70173..45852f3b9 100644
---- a/src/modules/meson.build
-+++ b/src/modules/meson.build
-@@ -370,9 +370,9 @@ test('pw-test-protocol-native',
- install_dir : installed_tests_execdir,
- ),
- env : [
-- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
-- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
-- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
-+ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
-+ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.build_root()),
-+ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.build_root())
- ]
- )
-
-diff --git a/src/tests/meson.build b/src/tests/meson.build
-index 3e8d05012..1b03967fb 100644
---- a/src/tests/meson.build
-+++ b/src/tests/meson.build
-@@ -13,9 +13,9 @@ foreach a : test_apps
- install : installed_tests_enabled,
- install_dir : installed_tests_execdir),
- env : [
-- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
-- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
-- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
-+ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
-+ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.build_root()),
-+ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.build_root())
- ])
-
- if installed_tests_enabled
diff --git a/test/meson.build b/test/meson.build
-index 20bdcb210..89f2bc2ec 100644
+index 74908d587..eca92eb24 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -14,8 +14,8 @@ pwtest_deps = [
@@ -237,5 +178,5 @@ index 20bdcb210..89f2bc2ec 100644
pwtest_inc = [
--
-2.34.1
+2.35.1
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-feature.allowed.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-feature.allowed.patch
new file mode 100644
index 000000000..eaef35c2e
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-feature.allowed.patch
@@ -0,0 +1,277 @@
+From 6dec8c7faf57a1bd0162a4e790ed031945588d98 Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 11:22:34 +0530
+Subject: [PATCH 02/12] Revert "treewide: meson.build: use feature.allowed()"
+
+This reverts commit cc7305351202424a2800425d86ae9c9b72aefa15.
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ man/meson.build | 2 +-
+ meson.build | 14 +++++++-------
+ spa/meson.build | 4 ++--
+ spa/plugins/bluez5/meson.build | 18 +++++++++---------
+ spa/plugins/meson.build | 18 +++++++++---------
+ spa/plugins/support/meson.build | 2 +-
+ src/daemon/systemd/meson.build | 4 ++--
+ src/gst/meson.build | 2 +-
+ src/meson.build | 4 ++--
+ src/tools/meson.build | 2 +-
+ 10 files changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/man/meson.build b/man/meson.build
+index 54d1c5eca..8e6e7dbe4 100644
+--- a/man/meson.build
++++ b/man/meson.build
+@@ -19,7 +19,7 @@ manpages = [
+ 'pw-profiler.1.rst.in',
+ ]
+
+-if get_option('pipewire-jack').allowed()
++if not get_option('pipewire-jack').disabled()
+ manpages += 'pw-jack.1.rst.in'
+ endif
+
+diff --git a/meson.build b/meson.build
+index 338192073..9d806198a 100644
+--- a/meson.build
++++ b/meson.build
+@@ -336,7 +336,7 @@ endforeach
+ gst_dp_found = gst_dep.length() > 0
+ summary({'gstreamer-device-provider': gst_dp_found}, bool_yn: true, section: 'Backend')
+
+-cdata.set('HAVE_GSTREAMER_DEVICE_PROVIDER', get_option('gstreamer-device-provider').allowed())
++cdata.set('HAVE_GSTREAMER_DEVICE_PROVIDER', not get_option('gstreamer-device-provider').disabled())
+
+ webrtc_dep = dependency('webrtc-audio-processing',
+ version : ['>= 0.2', '< 1.0'],
+@@ -382,10 +382,10 @@ cdata.set('HAVE_LILV', lilv_lib.found())
+
+ installed_tests_metadir = pipewire_datadir / 'installed-tests' / pipewire_name
+ installed_tests_execdir = pipewire_libexecdir / 'installed-tests' / pipewire_name
+-installed_tests_enabled = get_option('installed_tests').allowed()
++installed_tests_enabled = not get_option('installed_tests').disabled()
+ installed_tests_template = files('template.test.in')
+
+-if get_option('tests').allowed()
++if not get_option('tests').disabled()
+ gstack = find_program('gstack', required : false)
+ cdata.set('HAVE_GSTACK', gstack.found())
+ endif
+@@ -394,17 +394,17 @@ subdir('po')
+ subdir('spa')
+ subdir('src')
+
+-if get_option('tests').allowed()
++if not get_option('tests').disabled()
+ subdir('test')
+ endif
+
+ configure_file(output : 'config.h',
+ configuration : cdata)
+
+-if get_option('pipewire-jack').allowed()
++if not get_option('pipewire-jack').disabled()
+ subdir('pipewire-jack')
+ endif
+-if get_option('pipewire-v4l2').allowed()
++if not get_option('pipewire-v4l2').disabled()
+ subdir('pipewire-v4l2')
+ endif
+
+@@ -415,7 +415,7 @@ if alsa_dep.found()
+ endif
+
+ generate_manpages = false
+-if get_option('man').allowed()
++if not get_option('man').disabled()
+ rst2man = find_program('rst2man', required: false)
+ if not rst2man.found()
+ rst2man = find_program('rst2man.py', required: get_option('man'))
+diff --git a/spa/meson.build b/spa/meson.build
+index 1931d35b1..2404748df 100644
+--- a/spa/meson.build
++++ b/spa/meson.build
+@@ -31,7 +31,7 @@ pkgconfig.generate(filebase : 'lib@0@'.format(spa_name),
+
+ subdir('include')
+
+-if get_option('spa-plugins').allowed()
++if not get_option('spa-plugins').disabled()
+ udevrulesdir = get_option('udevrulesdir')
+ if udevrulesdir == ''
+ # absolute path, otherwise meson prepends the prefix
+@@ -74,6 +74,6 @@ endif
+
+ subdir('tools')
+ subdir('tests')
+-if get_option('examples').allowed()
++if not get_option('examples').disabled()
+ subdir('examples')
+ endif
+diff --git a/spa/plugins/bluez5/meson.build b/spa/plugins/bluez5/meson.build
+index 4567b67dd..7a1e12ec7 100644
+--- a/spa/plugins/bluez5/meson.build
++++ b/spa/plugins/bluez5/meson.build
+@@ -6,12 +6,12 @@ foreach dep: bluez5_deps
+ endforeach
+
+ cdata.set('HAVE_BLUEZ_5_BACKEND_NATIVE',
+- get_option('bluez5-backend-hsp-native').allowed() or
+- get_option('bluez5-backend-hfp-native').allowed())
+-cdata.set('HAVE_BLUEZ_5_BACKEND_HSP_NATIVE', get_option('bluez5-backend-hsp-native').allowed())
+-cdata.set('HAVE_BLUEZ_5_BACKEND_HFP_NATIVE', get_option('bluez5-backend-hfp-native').allowed())
+-cdata.set('HAVE_BLUEZ_5_BACKEND_OFONO', get_option('bluez5-backend-ofono').allowed())
+-cdata.set('HAVE_BLUEZ_5_BACKEND_HSPHFPD', get_option('bluez5-backend-hsphfpd').allowed())
++ not get_option('bluez5-backend-hsp-native').disabled() or
++ not get_option('bluez5-backend-hfp-native').disabled())
++cdata.set('HAVE_BLUEZ_5_BACKEND_HSP_NATIVE', not get_option('bluez5-backend-hsp-native').disabled())
++cdata.set('HAVE_BLUEZ_5_BACKEND_HFP_NATIVE', not get_option('bluez5-backend-hfp-native').disabled())
++cdata.set('HAVE_BLUEZ_5_BACKEND_OFONO', not get_option('bluez5-backend-ofono').disabled())
++cdata.set('HAVE_BLUEZ_5_BACKEND_HSPHFPD', not get_option('bluez5-backend-hsphfpd').disabled())
+ cdata.set('HAVE_BLUEZ_5_HCI', dependency('bluez', version: '< 6', required: false).found())
+
+ bluez5_sources = [
+@@ -34,18 +34,18 @@ bluez5_data = ['bluez-hardware.conf']
+
+ install_data(bluez5_data, install_dir : spa_datadir / 'bluez5')
+
+-if get_option('bluez5-backend-hsp-native').allowed() or get_option('bluez5-backend-hfp-native').allowed()
++if not get_option('bluez5-backend-hsp-native').disabled() or not get_option('bluez5-backend-hfp-native').disabled()
+ if libusb_dep.found()
+ bluez5_deps += libusb_dep
+ endif
+ bluez5_sources += ['backend-native.c']
+ endif
+
+-if get_option('bluez5-backend-ofono').allowed()
++if not get_option('bluez5-backend-ofono').disabled()
+ bluez5_sources += ['backend-ofono.c']
+ endif
+
+-if get_option('bluez5-backend-hsphfpd').allowed()
++if not get_option('bluez5-backend-hsphfpd').disabled()
+ bluez5_sources += ['backend-hsphfpd.c']
+ endif
+
+diff --git a/spa/plugins/meson.build b/spa/plugins/meson.build
+index fcf007aa9..0b581b29b 100644
+--- a/spa/plugins/meson.build
++++ b/spa/plugins/meson.build
+@@ -1,16 +1,16 @@
+ if alsa_dep.found()
+ subdir('alsa')
+ endif
+-if get_option('audioconvert').allowed()
++if not get_option('audioconvert').disabled()
+ subdir('audioconvert')
+ endif
+-if get_option('audiomixer').allowed()
++if not get_option('audiomixer').disabled()
+ subdir('audiomixer')
+ endif
+-if get_option('control').allowed()
++if not get_option('control').disabled()
+ subdir('control')
+ endif
+-if get_option('audiotestsrc').allowed()
++if not get_option('audiotestsrc').disabled()
+ subdir('audiotestsrc')
+ endif
+ if bluez_dep.found()
+@@ -22,19 +22,19 @@ endif
+ if jack_dep.found()
+ subdir('jack')
+ endif
+-if get_option('support').allowed()
++if not get_option('support').disabled()
+ subdir('support')
+ endif
+-if get_option('test').allowed()
++if not get_option('test').disabled()
+ subdir('test')
+ endif
+-if get_option('videoconvert').allowed()
++if not get_option('videoconvert').disabled()
+ subdir('videoconvert')
+ endif
+-if get_option('videotestsrc').allowed()
++if not get_option('videotestsrc').disabled()
+ subdir('videotestsrc')
+ endif
+-if get_option('volume').allowed()
++if not get_option('volume').disabled()
+ subdir('volume')
+ endif
+ if vulkan_headers
+diff --git a/spa/plugins/support/meson.build b/spa/plugins/support/meson.build
+index 1672d38df..b810b283c 100644
+--- a/spa/plugins/support/meson.build
++++ b/spa/plugins/support/meson.build
+@@ -23,7 +23,7 @@ spa_support_lib = shared_library('spa-support',
+ install_dir : spa_plugindir / 'support')
+ spa_support_dep = declare_dependency(link_with: spa_support_lib)
+
+-if get_option('evl').allowed()
++if not get_option('evl').disabled()
+ evl_inc = include_directories('/usr/evl/include')
+ evl_lib = cc.find_library('evl',
+ dirs: ['/usr/evl/lib/'],
+diff --git a/src/daemon/systemd/meson.build b/src/daemon/systemd/meson.build
+index 482a44c4b..89ad2f6dc 100644
+--- a/src/daemon/systemd/meson.build
++++ b/src/daemon/systemd/meson.build
+@@ -1,6 +1,6 @@
+-if get_option('systemd-system-service').allowed()
++if not get_option('systemd-system-service').disabled()
+ subdir('system')
+ endif
+-if get_option('systemd-user-service').allowed()
++if not get_option('systemd-user-service').disabled()
+ subdir('user')
+ endif
+diff --git a/src/gst/meson.build b/src/gst/meson.build
+index fd552f6cb..709dc0f1c 100644
+--- a/src/gst/meson.build
++++ b/src/gst/meson.build
+@@ -8,7 +8,7 @@ pipewire_gst_sources = [
+ 'gstpipewiresrc.c',
+ ]
+
+-if get_option('gstreamer-device-provider').allowed()
++if not get_option('gstreamer-device-provider').disabled()
+ pipewire_gst_sources += [ 'gstpipewiredeviceprovider.c' ]
+ endif
+
+diff --git a/src/meson.build b/src/meson.build
+index cefc329eb..2fb73fd59 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -3,10 +3,10 @@ subdir('pipewire')
+ subdir('daemon')
+ subdir('tools')
+ subdir('modules')
+-if get_option('examples').allowed()
++if not get_option('examples').disabled()
+ subdir('examples')
+ endif
+-if get_option('tests').allowed()
++if not get_option('tests').disabled()
+ subdir('tests')
+ endif
+
+diff --git a/src/tools/meson.build b/src/tools/meson.build
+index 02514c253..038231fcd 100644
+--- a/src/tools/meson.build
++++ b/src/tools/meson.build
+@@ -34,7 +34,7 @@ if ncurses_dep.found()
+ endif
+
+ build_pw_cat = false
+-if get_option('pw-cat').allowed() and sndfile_dep.found()
++if not get_option('pw-cat').disabled() and sndfile_dep.found()
+ build_pw_cat = true
+
+ pwcat_sources = [
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-dependency-variable-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-treewide-meson.build-use-dependency-variable-.patch
index 4131e6c27..40735422f 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-Revert-treewide-meson.build-use-dependency-variable-.patch
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-treewide-meson.build-use-dependency-variable-.patch
@@ -1,7 +1,7 @@
-From cbe87dc5390c91523a9f0bc3eb126fa500c351e2 Mon Sep 17 00:00:00 2001
+From 8eda9c8d98d14dfc411e22c30e81fa32a5cb2f56 Mon Sep 17 00:00:00 2001
From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
Date: Fri, 14 Jan 2022 18:23:54 +0530
-Subject: [PATCH 2/4] Revert "treewide: meson.build: use dependency variable
+Subject: [PATCH 03/12] Revert "treewide: meson.build: use dependency variable
for SPA"
This reverts commit 2b110af36683f13f2b55064dec4ae02c1b407561.
@@ -9,13 +9,13 @@ This reverts commit 2b110af36683f13f2b55064dec4ae02c1b407561.
Upstream-Status: Inappropriate[meson version dependent]
---
spa/examples/meson.build | 4 +-
- spa/meson.build | 41 +++++++-------
+ spa/meson.build | 42 ++++++-------
spa/plugins/alsa/acp/meson.build | 4 +-
- spa/plugins/alsa/meson.build | 7 +--
- spa/plugins/audioconvert/meson.build | 33 ++++++------
+ spa/plugins/alsa/meson.build | 7 ++-
+ spa/plugins/audioconvert/meson.build | 34 ++++++-----
spa/plugins/audiomixer/meson.build | 11 ++--
spa/plugins/audiotestsrc/meson.build | 3 +-
- spa/plugins/bluez5/meson.build | 24 ++++-----
+ spa/plugins/bluez5/meson.build | 24 ++++----
spa/plugins/control/meson.build | 3 +-
spa/plugins/ffmpeg/meson.build | 3 +-
spa/plugins/jack/meson.build | 3 +-
@@ -28,14 +28,14 @@ Upstream-Status: Inappropriate[meson version dependent]
spa/plugins/volume/meson.build | 2 +-
spa/plugins/vulkan/meson.build | 3 +-
spa/tests/meson.build | 5 +-
- spa/tools/meson.build | 9 ++--
+ spa/tools/meson.build | 9 ++-
src/daemon/meson.build | 8 +--
src/gst/meson.build | 4 +-
- src/modules/meson.build | 80 ++++++++++++++--------------
- src/modules/spa/meson.build | 16 +++---
+ src/modules/meson.build | 88 ++++++++++++++++------------
+ src/modules/spa/meson.build | 16 ++---
src/pipewire/meson.build | 4 +-
- test/meson.build | 11 ++--
- 27 files changed, 160 insertions(+), 147 deletions(-)
+ test/meson.build | 11 +---
+ 27 files changed, 170 insertions(+), 147 deletions(-)
diff --git a/spa/examples/meson.build b/spa/examples/meson.build
index 7064a0643..bc04b723c 100644
@@ -53,10 +53,10 @@ index 7064a0643..bc04b723c 100644
install_dir : installed_tests_execdir / 'examples' / 'spa'
)
diff --git a/spa/meson.build b/spa/meson.build
-index 4ad37cdb4..2717b86d6 100644
+index 2404748df..2717b86d6 100644
--- a/spa/meson.build
+++ b/spa/meson.build
-@@ -5,28 +5,7 @@
+@@ -5,29 +5,7 @@
#pthread_lib = dependencies('threads')
#mathlib = cc.find_library('m', required : false)
@@ -64,6 +64,7 @@ index 4ad37cdb4..2717b86d6 100644
- include_directories : [
- include_directories('include'),
- ],
+- dependencies : [atomic_dep],
- version : spaversion,
- variables : {
- 'plugindir' : meson.current_build_dir() / 'plugins',
@@ -86,7 +87,7 @@ index 4ad37cdb4..2717b86d6 100644
subdir('include')
-@@ -76,3 +55,21 @@ subdir('tests')
+@@ -77,3 +55,21 @@ subdir('tests')
if not get_option('examples').disabled()
subdir('examples')
endif
@@ -148,7 +149,7 @@ index e3fa6f0d7..402d93486 100644
)
diff --git a/spa/plugins/audioconvert/meson.build b/spa/plugins/audioconvert/meson.build
-index 4d15271f5..6f4fd968b 100644
+index 89af12671..55e88ccc4 100644
--- a/spa/plugins/audioconvert/meson.build
+++ b/spa/plugins/audioconvert/meson.build
@@ -17,7 +17,7 @@ if have_sse
@@ -265,10 +266,11 @@ index 4d15271f5..6f4fd968b 100644
c_args : [ simd_cargs ],
install_rpath : spa_plugindir / 'audioconvert',
install : installed_tests_enabled,
-@@ -192,8 +192,9 @@ if sndfile_dep.found()
+@@ -191,8 +191,10 @@ if sndfile_dep.found()
+ ]
executable('spa-resample',
sparesample_sources,
- c_args : [ simd_cargs ],
++ c_args : [ simd_cargs ],
+ include_directories : [spa_inc ],
link_with : [ test_lib ],
- dependencies : [ spa_dep, sndfile_dep, mathlib, audioconvert_dep ],
@@ -340,10 +342,10 @@ index d1b22428d..8011ee883 100644
install : true,
install_dir : spa_plugindir / 'audiotestsrc')
diff --git a/spa/plugins/bluez5/meson.build b/spa/plugins/bluez5/meson.build
-index b13e23cf4..eca9c9eb5 100644
+index 7a1e12ec7..ae6d8e8e0 100644
--- a/spa/plugins/bluez5/meson.build
+++ b/spa/plugins/bluez5/meson.build
-@@ -56,8 +56,8 @@ endif
+@@ -51,8 +51,8 @@ endif
bluez5lib = shared_library('spa-bluez5',
bluez5_sources,
@@ -354,7 +356,7 @@ index b13e23cf4..eca9c9eb5 100644
install : true,
install_dir : spa_plugindir / 'bluez5')
-@@ -65,26 +65,26 @@ codec_args = [ '-DCODEC_PLUGIN' ]
+@@ -60,26 +60,26 @@ codec_args = [ '-DCODEC_PLUGIN' ]
bluez_codec_sbc = shared_library('spa-codec-bluez5-sbc',
[ 'a2dp-codec-sbc.c', 'a2dp-codecs.c' ],
@@ -387,7 +389,7 @@ index b13e23cf4..eca9c9eb5 100644
install : true,
install_dir : spa_plugindir / 'bluez5')
endif
-@@ -92,9 +92,9 @@ endif
+@@ -87,9 +87,9 @@ endif
if aptx_dep.found()
bluez_codec_aptx = shared_library('spa-codec-bluez5-aptx',
[ 'a2dp-codec-aptx.c', 'a2dp-codecs.c' ],
@@ -399,7 +401,7 @@ index b13e23cf4..eca9c9eb5 100644
install : true,
install_dir : spa_plugindir / 'bluez5')
endif
-@@ -108,9 +108,9 @@ if ldac_dep.found()
+@@ -103,9 +103,9 @@ if ldac_dep.found()
endif
bluez_codec_ldac = shared_library('spa-codec-bluez5-ldac',
[ 'a2dp-codec-ldac.c', 'a2dp-codecs.c' ],
@@ -594,11 +596,11 @@ index b79bca2cf..9683b41ea 100644
install : true,
install_dir : spa_plugindir / 'vulkan')
diff --git a/spa/tests/meson.build b/spa/tests/meson.build
-index 9e2a211e2..146cfe08a 100644
+index 9c78dcbd2..ea00a2cfe 100644
--- a/spa/tests/meson.build
+++ b/spa/tests/meson.build
-@@ -20,7 +20,7 @@ if find.found()
- configuration: c)
+@@ -21,7 +21,7 @@ if find.found()
+ })
executable('spa-include-test-@0@'.format(spa_header.underscorify()),
src,
- dependencies: [ spa_dep ],
@@ -606,7 +608,7 @@ index 9e2a211e2..146cfe08a 100644
install: false)
endif
endforeach
-@@ -35,7 +35,8 @@ benchmark_apps = [
+@@ -36,7 +36,8 @@ benchmark_apps = [
foreach a : benchmark_apps
benchmark('spa-' + a,
executable('spa-' + a, a + '.c',
@@ -639,10 +641,10 @@ index 6f12e9c8f..e4df6c3ac 100644
+ dependencies : [dl_lib, ],
install : true)
diff --git a/src/daemon/meson.build b/src/daemon/meson.build
-index 5e64287a1..104a6dbf3 100644
+index 647d7393d..28cbe4467 100644
--- a/src/daemon/meson.build
+++ b/src/daemon/meson.build
-@@ -86,16 +86,16 @@ pipewire_exec = executable('pipewire',
+@@ -87,16 +87,16 @@ pipewire_exec = executable('pipewire',
pipewire_daemon_sources,
install: true,
c_args : pipewire_c_args,
@@ -679,10 +681,10 @@ index 709dc0f1c..b91b33dc9 100644
install_dir : '@0@/gstreamer-1.0'.format(get_option('libdir')),
)
diff --git a/src/modules/meson.build b/src/modules/meson.build
-index 45852f3b9..61a53bd6f 100644
+index 2d3a800d3..ba30275ab 100644
--- a/src/modules/meson.build
+++ b/src/modules/meson.build
-@@ -30,20 +30,20 @@ module_sources = [
+@@ -31,20 +31,20 @@ module_sources = [
]
pipewire_module_access = shared_library('pipewire-module-access', [ 'module-access.c' ],
@@ -707,7 +709,7 @@ index 45852f3b9..61a53bd6f 100644
)
simd_cargs = []
-@@ -53,7 +53,7 @@ if have_sse
+@@ -54,7 +54,7 @@ if have_sse
pffft_sse = static_library('pffft_sse',
['module-filter-chain/pffft.c' ],
c_args : [sse_args, '-O3', '-DHAVE_SSE'],
@@ -716,7 +718,7 @@ index 45852f3b9..61a53bd6f 100644
install : false
)
simd_cargs += ['-DHAVE_SSE']
-@@ -63,7 +63,7 @@ if have_neon
+@@ -64,7 +64,7 @@ if have_neon
pffft_neon = static_library('pffft_neon',
['module-filter-chain/pffft.c' ],
c_args : [neon_args, '-O3', '-DHAVE_NEON'],
@@ -725,7 +727,7 @@ index 45852f3b9..61a53bd6f 100644
install : false
)
simd_cargs += ['-DHAVE_NEON']
-@@ -73,7 +73,7 @@ endif
+@@ -74,7 +74,7 @@ endif
pffft_c = static_library('pffft_c',
['module-filter-chain/pffft.c' ],
c_args : [simd_cargs, '-O3', '-DPFFFT_SIMD_DISABLE'],
@@ -734,7 +736,7 @@ index 45852f3b9..61a53bd6f 100644
install : false
)
simd_dependencies += pffft_c
-@@ -99,7 +99,7 @@ endif
+@@ -100,7 +100,7 @@ endif
pipewire_module_filter_chain = shared_library('pipewire-module-filter-chain',
filter_chain_sources,
@@ -743,7 +745,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -120,7 +120,7 @@ endif
+@@ -114,7 +114,7 @@ pipewire_module_echo_cancel_sources = [
pipewire_module_echo_cancel = shared_library('pipewire-module-echo-cancel',
pipewire_module_echo_cancel_sources,
@@ -752,7 +754,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -130,17 +130,17 @@ pipewire_module_echo_cancel = shared_library('pipewire-module-echo-cancel',
+@@ -124,26 +124,36 @@ pipewire_module_echo_cancel = shared_library('pipewire-module-echo-cancel',
pipewire_module_profiler = shared_library('pipewire-module-profiler',
[ 'module-profiler.c',
'module-profiler/protocol-native.c', ],
@@ -765,7 +767,7 @@ index 45852f3b9..61a53bd6f 100644
+ dependencies : [mathlib, dl_lib, pipewire_dep],
)
- build_module_rt = build_machine.system() == 'linux'
+ build_module_rt = dbus_dep.found()
if build_module_rt
pipewire_module_rt = shared_library('pipewire-module-rt', [ 'module-rt.c' ],
- include_directories : [configinc],
@@ -773,16 +775,26 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -152,7 +152,7 @@ summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
- build_module_rtkit = dbus_dep.found()
- if build_module_rtkit
- pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rtkit.c' ],
-- include_directories : [configinc],
+ dependencies : [dbus_dep, mathlib, dl_lib, pipewire_dep],
+ )
++<<<<<<< HEAD
+ # TODO: This serves as a temporary alias to prevent breaking existing setups
+ # while `module-rtkit` is being migrated to `module-rt`
+ pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rt.c' ],
+ include_directories : [configinc],
++=======
++endif
++summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
++
++build_module_rtkit = dbus_dep.found()
++if build_module_rtkit
++pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rtkit.c' ],
+ include_directories : [configinc, spa_inc],
++>>>>>>> Revert "treewide: meson.build: use dependency variable for SPA"
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -164,7 +164,7 @@ summary({'rtkit': build_module_rtkit}, bool_yn: true, section: 'Optional Modules
+@@ -155,7 +165,7 @@ summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
build_module_portal = dbus_dep.found()
if build_module_portal
pipewire_module_portal = shared_library('pipewire-module-portal', [ 'module-portal.c' ],
@@ -791,7 +803,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -178,20 +178,20 @@ pipewire_module_client_device = shared_library('pipewire-module-client-device',
+@@ -169,20 +179,20 @@ pipewire_module_client_device = shared_library('pipewire-module-client-device',
'module-client-device/resource-device.c',
'module-client-device/proxy-device.c',
'module-client-device/protocol-native.c', ],
@@ -816,7 +828,7 @@ index 45852f3b9..61a53bd6f 100644
)
pipewire_module_protocol_deps = [mathlib, dl_lib, pipewire_dep]
-@@ -207,7 +207,7 @@ pipewire_module_protocol_native = shared_library('pipewire-module-protocol-nativ
+@@ -198,7 +208,7 @@ pipewire_module_protocol_native = shared_library('pipewire-module-protocol-nativ
'module-protocol-native/protocol-native.c',
'module-protocol-native/v0/protocol-native.c',
'module-protocol-native/connection.c' ],
@@ -825,7 +837,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -281,7 +281,7 @@ endif
+@@ -273,7 +283,7 @@ endif
pipewire_module_protocol_pulse = shared_library('pipewire-module-protocol-pulse',
pipewire_module_protocol_pulse_sources,
@@ -834,7 +846,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -293,7 +293,7 @@ if build_module_pulse_tunnel
+@@ -285,7 +295,7 @@ if build_module_pulse_tunnel
pipewire_module_pulse_tunnel = shared_library('pipewire-module-pulse-tunnel',
[ 'module-pulse-tunnel.c',
'module-protocol-pulse/format.c' ],
@@ -843,7 +855,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -304,7 +304,7 @@ summary({'pulse-tunnel': build_module_pulse_tunnel}, bool_yn: true, section: 'Op
+@@ -296,7 +306,7 @@ summary({'pulse-tunnel': build_module_pulse_tunnel}, bool_yn: true, section: 'Op
pipewire_module_protocol_simple = shared_library('pipewire-module-protocol-simple',
[ 'module-protocol-simple.c' ],
@@ -852,7 +864,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -313,20 +313,20 @@ pipewire_module_protocol_simple = shared_library('pipewire-module-protocol-simpl
+@@ -305,20 +315,20 @@ pipewire_module_protocol_simple = shared_library('pipewire-module-protocol-simpl
pipewire_module_example_sink = shared_library('pipewire-module-example-sink',
[ 'module-example-sink.c' ],
@@ -877,7 +889,7 @@ index 45852f3b9..61a53bd6f 100644
)
pipewire_module_client_node = shared_library('pipewire-module-client-node',
-@@ -338,12 +338,12 @@ pipewire_module_client_node = shared_library('pipewire-module-client-node',
+@@ -330,12 +340,12 @@ pipewire_module_client_node = shared_library('pipewire-module-client-node',
'module-client-node/v0/transport.c',
'module-client-node/v0/protocol-native.c',
'spa/spa-node.c', ],
@@ -892,7 +904,7 @@ index 45852f3b9..61a53bd6f 100644
)
pipewire_module_metadata = shared_library('pipewire-module-metadata',
-@@ -351,12 +351,12 @@ pipewire_module_metadata = shared_library('pipewire-module-metadata',
+@@ -343,12 +353,12 @@ pipewire_module_metadata = shared_library('pipewire-module-metadata',
'module-metadata/proxy-metadata.c',
'module-metadata/metadata.c',
'module-metadata/protocol-native.c'],
@@ -907,7 +919,7 @@ index 45852f3b9..61a53bd6f 100644
)
test('pw-test-protocol-native',
-@@ -364,8 +364,8 @@ test('pw-test-protocol-native',
+@@ -356,8 +366,8 @@ test('pw-test-protocol-native',
[ 'module-protocol-native/test-connection.c',
'module-protocol-native/connection.c' ],
c_args : libpipewire_c_args,
@@ -918,7 +930,7 @@ index 45852f3b9..61a53bd6f 100644
install : installed_tests_enabled,
install_dir : installed_tests_execdir,
),
-@@ -391,7 +391,7 @@ pipewire_module_adapter = shared_library('pipewire-module-adapter',
+@@ -383,7 +393,7 @@ pipewire_module_adapter = shared_library('pipewire-module-adapter',
[ 'module-adapter.c',
'module-adapter/adapter.c',
'spa/spa-node.c' ],
@@ -927,7 +939,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -413,11 +413,11 @@ pipewire_module_session_manager = shared_library('pipewire-module-session-manage
+@@ -405,11 +415,11 @@ pipewire_module_session_manager = shared_library('pipewire-module-session-manage
'module-session-manager/proxy-session-manager.c',
'module-session-manager/session.c',
],
@@ -941,7 +953,7 @@ index 45852f3b9..61a53bd6f 100644
)
build_module_zeroconf_discover = avahi_dep.found()
-@@ -426,7 +426,7 @@ pipewire_module_zeroconf_discover = shared_library('pipewire-module-zeroconf-dis
+@@ -418,7 +428,7 @@ pipewire_module_zeroconf_discover = shared_library('pipewire-module-zeroconf-dis
[ 'module-zeroconf-discover.c',
'module-protocol-pulse/format.c',
'module-zeroconf-discover/avahi-poll.c' ],
@@ -950,7 +962,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -440,7 +440,7 @@ if build_module_raop_discover
+@@ -432,7 +442,7 @@ if build_module_raop_discover
pipewire_module_raop_discover = shared_library('pipewire-module-raop-discover',
[ 'module-raop-discover.c',
'module-zeroconf-discover/avahi-poll.c' ],
@@ -959,7 +971,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -454,7 +454,7 @@ if build_module_raop
+@@ -446,7 +456,7 @@ if build_module_raop
pipewire_module_raop_sink = shared_library('pipewire-module-raop-sink',
[ 'module-raop-sink.c',
'module-raop/rtsp-client.c' ],
@@ -968,7 +980,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -470,7 +470,7 @@ build_module_roc = roc_lib.found()
+@@ -462,7 +472,7 @@ build_module_roc = roc_lib.found()
if build_module_roc
pipewire_module_roc_sink = shared_library('pipewire-module-roc-sink',
[ 'module-roc-sink.c' ],
@@ -977,7 +989,7 @@ index 45852f3b9..61a53bd6f 100644
install : true,
install_dir : modules_install_dir,
install_rpath: modules_install_dir,
-@@ -479,7 +479,7 @@ pipewire_module_roc_sink = shared_library('pipewire-module-roc-sink',
+@@ -471,7 +481,7 @@ pipewire_module_roc_sink = shared_library('pipewire-module-roc-sink',
pipewire_module_roc_source = shared_library('pipewire-module-roc-source',
[ 'module-roc-source.c' ],
@@ -1047,7 +1059,7 @@ index 969f50b22..f66ce8746 100644
pipewire_dep = declare_dependency(link_with : libpipewire,
diff --git a/test/meson.build b/test/meson.build
-index 89f2bc2ec..87e211431 100644
+index eca92eb24..4108ac14b 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -19,6 +19,7 @@ pwtest_c_args = [
@@ -1098,7 +1110,7 @@ index 89f2bc2ec..87e211431 100644
link_with: pwtest_lib)
)
-@@ -80,7 +76,7 @@ test('test-context',
+@@ -88,7 +84,7 @@ test('test-context',
'test-context.c',
'test-config.c',
include_directories: pwtest_inc,
@@ -1107,7 +1119,7 @@ index 89f2bc2ec..87e211431 100644
link_with: [pwtest_lib,
pipewire_module_protocol_native,
pipewire_module_client_node,
-@@ -95,7 +91,7 @@ test('test-support',
+@@ -103,7 +99,7 @@ test('test-support',
'test-support.c',
'test-logger.c',
include_directories: pwtest_inc,
@@ -1116,7 +1128,7 @@ index 89f2bc2ec..87e211431 100644
link_with: [pwtest_lib])
)
test('test-spa',
-@@ -107,7 +103,6 @@ test('test-spa',
+@@ -115,7 +111,6 @@ test('test-spa',
'test-spa-node.c',
'test-spa-pod.c',
include_directories: pwtest_inc,
@@ -1125,5 +1137,5 @@ index 89f2bc2ec..87e211431 100644
)
--
-2.34.1
+2.35.1
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-systemd-correctly-prefix-systemd-system-units.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-systemd-correctly-prefix-systemd-system-units.patch
deleted file mode 100644
index 8b975d07f..000000000
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-systemd-correctly-prefix-systemd-system-units.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 85d47ff146f1bda2f94d32b5b392024089c6f564 Mon Sep 17 00:00:00 2001
-From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
-Date: Fri, 14 Jan 2022 20:51:09 +0530
-Subject: [PATCH 4/4] Revert "systemd: correctly prefix systemd system units"
-
-This reverts commit 5054b48c9de655b4b48f7c801cb305d9eb122520.
-
-Upstream-Status: Inappropriate[this systemd configuration is in not relvent to AGL]
----
- src/daemon/systemd/system/meson.build | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/daemon/systemd/system/meson.build b/src/daemon/systemd/system/meson.build
-index 7e1c223f8..4d942c1ab 100644
---- a/src/daemon/systemd/system/meson.build
-+++ b/src/daemon/systemd/system/meson.build
-@@ -1,4 +1,4 @@
--systemd_system_services_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir', pkgconfig_define : [ 'rootprefix', prefix])
-+systemd_system_services_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir', pkgconfig_define : [ 'prefix', prefix])
-
- install_data(sources : 'pipewire.socket',
- install_dir : systemd_system_services_dir)
---
-2.34.1
-
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-treewide-meson.build-simplify-get_variable-ca.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-treewide-meson.build-simplify-get_variable-ca.patch
new file mode 100644
index 000000000..bd7e3804f
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-Revert-treewide-meson.build-simplify-get_variable-ca.patch
@@ -0,0 +1,130 @@
+From 82c58fbde3d85465dc4b6e0af460124f67d1e485 Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 11:36:15 +0530
+Subject: [PATCH 04/12] Revert "treewide: meson.build: simplify
+ `get_variable()` calls"
+
+This reverts commit ec465966bcc783203041de09dce5c315bb0a6f76.
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ meson.build | 8 ++++----
+ spa/plugins/audioconvert/meson.build | 4 ++--
+ spa/tests/meson.build | 2 +-
+ src/daemon/systemd/system/meson.build | 2 +-
+ src/daemon/systemd/user/meson.build | 2 +-
+ src/modules/meson.build | 6 +++---
+ src/tests/meson.build | 6 +++---
+ 7 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index 9d806198a..7040e39ac 100644
+--- a/meson.build
++++ b/meson.build
+@@ -445,11 +445,11 @@ devenv = environment()
+ builddir = meson.project_build_root()
+ srcdir = meson.project_source_root()
+
+-devenv.set('PIPEWIRE_CONFIG_DIR', pipewire_dep.get_variable('confdatadir'))
+-devenv.set('PIPEWIRE_MODULE_DIR', pipewire_dep.get_variable('moduledir'))
++devenv.set('PIPEWIRE_CONFIG_DIR', pipewire_dep.get_variable(internal: 'confdatadir'))
++devenv.set('PIPEWIRE_MODULE_DIR', pipewire_dep.get_variable(internal: 'moduledir'))
+
+-devenv.set('SPA_PLUGIN_DIR', spa_dep.get_variable('plugindir'))
+-devenv.set('SPA_DATA_DIR', spa_dep.get_variable('datadir'))
++devenv.set('SPA_PLUGIN_DIR', spa_dep.get_variable(internal: 'plugindir'))
++devenv.set('SPA_DATA_DIR', spa_dep.get_variable(internal: 'datadir'))
+
+ devenv.set('GST_PLUGIN_PATH', builddir / 'src'/ 'gst')
+
+diff --git a/spa/plugins/audioconvert/meson.build b/spa/plugins/audioconvert/meson.build
+index 55e88ccc4..42332a538 100644
+--- a/spa/plugins/audioconvert/meson.build
++++ b/spa/plugins/audioconvert/meson.build
+@@ -140,7 +140,7 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
++ 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+ ])
+
+ if installed_tests_enabled
+@@ -170,7 +170,7 @@ foreach a : benchmark_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
++ 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+ ])
+
+ if installed_tests_enabled
+diff --git a/spa/tests/meson.build b/spa/tests/meson.build
+index ea00a2cfe..0b26fdf02 100644
+--- a/spa/tests/meson.build
++++ b/spa/tests/meson.build
+@@ -42,7 +42,7 @@ foreach a : benchmark_apps
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
++ 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+ ]
+ )
+
+diff --git a/src/daemon/systemd/system/meson.build b/src/daemon/systemd/system/meson.build
+index 84ca0b068..b3e5f1f41 100644
+--- a/src/daemon/systemd/system/meson.build
++++ b/src/daemon/systemd/system/meson.build
+@@ -1,4 +1,4 @@
+-systemd_system_services_dir = systemd.get_variable('systemdsystemunitdir', pkgconfig_define : [ 'rootprefix', prefix])
++systemd_system_services_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir', pkgconfig_define : [ 'rootprefix', prefix])
+ if get_option('systemd-system-unit-dir') != ''
+ systemd_system_services_dir = get_option('systemd-system-unit-dir')
+ endif
+diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build
+index d17f3794f..a24f9b174 100644
+--- a/src/daemon/systemd/user/meson.build
++++ b/src/daemon/systemd/user/meson.build
+@@ -1,4 +1,4 @@
+-systemd_user_services_dir = systemd.get_variable('systemduserunitdir', pkgconfig_define : [ 'prefix', prefix])
++systemd_user_services_dir = systemd.get_variable(pkgconfig: 'systemduserunitdir', pkgconfig_define : [ 'prefix', prefix])
+ if get_option('systemd-user-unit-dir') != ''
+ systemd_user_services_dir = get_option('systemd-user-unit-dir')
+ endif
+diff --git a/src/modules/meson.build b/src/modules/meson.build
+index ba30275ab..c1225e3e0 100644
+--- a/src/modules/meson.build
++++ b/src/modules/meson.build
+@@ -372,9 +372,9 @@ test('pw-test-protocol-native',
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
+- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable('confdatadir')),
+- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable('moduledir')),
++ 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
++ 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
++ 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
+ ]
+ )
+
+diff --git a/src/tests/meson.build b/src/tests/meson.build
+index 3e03a4c75..3e8d05012 100644
+--- a/src/tests/meson.build
++++ b/src/tests/meson.build
+@@ -13,9 +13,9 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
+- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable('confdatadir')),
+- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable('moduledir')),
++ 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
++ 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
++ 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
+ ])
+
+ if installed_tests_enabled
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-Revert-treewide-meson.build-get-SPA_PLUGIN_DIR-from-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-Revert-treewide-meson.build-get-SPA_PLUGIN_DIR-from-.patch
new file mode 100644
index 000000000..f2a9d0d09
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-Revert-treewide-meson.build-get-SPA_PLUGIN_DIR-from-.patch
@@ -0,0 +1,124 @@
+From cf7b3a0db10cf0bcd140800ef547199703fdf16e Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 11:54:54 +0530
+Subject: [PATCH 05/12] Revert "treewide: meson.build: get SPA_PLUGIN_DIR from
+ dependency"
+
+This reverts commit 26eb66fb5b56bb5534745a8e223bd099cf5fe4fa.
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ meson.build | 4 ++--
+ spa/plugins/audioconvert/meson.build | 4 ++--
+ spa/tests/meson.build | 2 +-
+ src/modules/meson.build | 13 +++----------
+ src/tests/meson.build | 6 +++---
+ 5 files changed, 11 insertions(+), 18 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index 7040e39ac..1b87bd004 100644
+--- a/meson.build
++++ b/meson.build
+@@ -448,8 +448,8 @@ srcdir = meson.project_source_root()
+ devenv.set('PIPEWIRE_CONFIG_DIR', pipewire_dep.get_variable(internal: 'confdatadir'))
+ devenv.set('PIPEWIRE_MODULE_DIR', pipewire_dep.get_variable(internal: 'moduledir'))
+
+-devenv.set('SPA_PLUGIN_DIR', spa_dep.get_variable(internal: 'plugindir'))
+-devenv.set('SPA_DATA_DIR', spa_dep.get_variable(internal: 'datadir'))
++ devenv.set('SPA_PLUGIN_DIR', builddir / 'spa' / 'plugins')
++ devenv.set('SPA_DATA_DIR', srcdir / 'spa' / 'plugins')
+
+ devenv.set('GST_PLUGIN_PATH', builddir / 'src'/ 'gst')
+
+diff --git a/spa/plugins/audioconvert/meson.build b/spa/plugins/audioconvert/meson.build
+index 42332a538..3aa0f3846 100644
+--- a/spa/plugins/audioconvert/meson.build
++++ b/spa/plugins/audioconvert/meson.build
+@@ -140,7 +140,7 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
+ ])
+
+ if installed_tests_enabled
+@@ -170,7 +170,7 @@ foreach a : benchmark_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
+ ])
+
+ if installed_tests_enabled
+diff --git a/spa/tests/meson.build b/spa/tests/meson.build
+index 0b26fdf02..d995cfaa4 100644
+--- a/spa/tests/meson.build
++++ b/spa/tests/meson.build
+@@ -42,7 +42,7 @@ foreach a : benchmark_apps
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
+ ]
+ )
+
+diff --git a/src/modules/meson.build b/src/modules/meson.build
+index c1225e3e0..bd7d3f711 100644
+--- a/src/modules/meson.build
++++ b/src/modules/meson.build
+@@ -140,12 +140,6 @@ pipewire_module_rt = shared_library('pipewire-module-rt', [ 'module-rt.c' ],
+ install_rpath: modules_install_dir,
+ dependencies : [dbus_dep, mathlib, dl_lib, pipewire_dep],
+ )
+-<<<<<<< HEAD
+-# TODO: This serves as a temporary alias to prevent breaking existing setups
+-# while `module-rtkit` is being migrated to `module-rt`
+-pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rt.c' ],
+- include_directories : [configinc],
+-=======
+ endif
+ summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
+
+@@ -153,7 +147,6 @@ build_module_rtkit = dbus_dep.found()
+ if build_module_rtkit
+ pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rtkit.c' ],
+ include_directories : [configinc, spa_inc],
+->>>>>>> Revert "treewide: meson.build: use dependency variable for SPA"
+ install : true,
+ install_dir : modules_install_dir,
+ install_rpath: modules_install_dir,
+@@ -372,9 +365,9 @@ test('pw-test-protocol-native',
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
+- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
++ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.project_build_root()),
++ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.project_build_root())
+ ]
+ )
+
+diff --git a/src/tests/meson.build b/src/tests/meson.build
+index 3e8d05012..9a595d431 100644
+--- a/src/tests/meson.build
++++ b/src/tests/meson.build
+@@ -13,9 +13,9 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable(internal: 'plugindir')),
+- 'PIPEWIRE_CONFIG_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'confdatadir')),
+- 'PIPEWIRE_MODULE_DIR=@0@'.format(pipewire_dep.get_variable(internal: 'moduledir')),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
++ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.project_build_root()),
++ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.project_build_root())
+ ])
+
+ if installed_tests_enabled
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-pipewiresink-set-a-default-channel-map-if-the-number.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-pipewiresink-set-a-default-channel-map-if-the-number.patch
deleted file mode 100644
index 3b1b2a490..000000000
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-pipewiresink-set-a-default-channel-map-if-the-number.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From ee2e6412d37d012fbf8d25bd37271a5ee92b3ad4 Mon Sep 17 00:00:00 2001
-From: George Kiagiadakis <george.kiagiadakis@collabora.com>
-Date: Thu, 3 Feb 2022 15:08:57 +0200
-Subject: [PATCH] pipewiresink: set a default channel map if the number of
- channels is fixed
-
-This allows remaping streams using pipewiresink to match the channel layout
-of the target device
-Upstream-Status: Backport [from master/0.3.46]
----
- src/gst/gstpipewireformat.c | 42 ++++++++++++++++++++++++++++++++++++-
- 1 file changed, 41 insertions(+), 1 deletion(-)
-
-diff --git a/src/gst/gstpipewireformat.c b/src/gst/gstpipewireformat.c
-index dca90267c..c8ce7ba62 100644
---- a/src/gst/gstpipewireformat.c
-+++ b/src/gst/gstpipewireformat.c
-@@ -445,6 +445,44 @@ handle_video_fields (ConvertData *d)
- return TRUE;
- }
-
-+static void
-+set_default_channels (struct spa_pod_builder *b, uint32_t channels)
-+{
-+ uint32_t position[SPA_AUDIO_MAX_CHANNELS] = {0};
-+ gboolean ok = TRUE;
-+
-+ switch (channels) {
-+ case 8:
-+ position[6] = SPA_AUDIO_CHANNEL_SL;
-+ position[7] = SPA_AUDIO_CHANNEL_SR;
-+ SPA_FALLTHROUGH
-+ case 6:
-+ position[5] = SPA_AUDIO_CHANNEL_LFE;
-+ SPA_FALLTHROUGH
-+ case 5:
-+ position[4] = SPA_AUDIO_CHANNEL_FC;
-+ SPA_FALLTHROUGH
-+ case 4:
-+ position[2] = SPA_AUDIO_CHANNEL_RL;
-+ position[3] = SPA_AUDIO_CHANNEL_RR;
-+ SPA_FALLTHROUGH
-+ case 2:
-+ position[0] = SPA_AUDIO_CHANNEL_FL;
-+ position[1] = SPA_AUDIO_CHANNEL_FR;
-+ break;
-+ case 1:
-+ position[0] = SPA_AUDIO_CHANNEL_MONO;
-+ break;
-+ default:
-+ ok = FALSE;
-+ break;
-+ }
-+
-+ if (ok)
-+ spa_pod_builder_add (b, SPA_FORMAT_AUDIO_position,
-+ SPA_POD_Array(sizeof(uint32_t), SPA_TYPE_Id, channels, position), 0);
-+}
-+
- static gboolean
- handle_audio_fields (ConvertData *d)
- {
-@@ -538,8 +576,10 @@ handle_audio_fields (ConvertData *d)
- }
- if (i > 0) {
- choice = spa_pod_builder_pop(&d->b, &f);
-- if (i == 1)
-+ if (i == 1) {
- choice->body.type = SPA_CHOICE_None;
-+ set_default_channels (&d->b, v);
-+ }
- }
- }
- return TRUE;
---
-2.34.1
-
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-meson-declare-spa_dep-and-override_dependency.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-Revert-meson-declare-spa_dep-and-override_dependency.patch
index 47e4f3cc2..fe44c07ed 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-Revert-meson-declare-spa_dep-and-override_dependency.patch
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-Revert-meson-declare-spa_dep-and-override_dependency.patch
@@ -1,11 +1,10 @@
-From 83b7f6457e5dca3ee2145e35f361f1520d24be42 Mon Sep 17 00:00:00 2001
+From 869e53ac9ded351ce6cb47b5ce04ef345c673b48 Mon Sep 17 00:00:00 2001
From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
-Date: Fri, 14 Jan 2022 18:30:44 +0530
-Subject: [PATCH 3/4] Revert "meson: declare spa_dep and override_dependency()
- for spa and pipewire"
+Date: Thu, 24 Feb 2022 12:16:03 +0530
+Subject: [PATCH 06/12] Revert "meson: declare spa_dep and
+ override_dependency() for spa and pipewire"
This reverts commit 7ab5c35cadc075bcdf44031f1f7d95352cf9a13b.
-
Upstream-Status: Inappropriate[meson version dependent]
---
meson.build | 2 +-
@@ -14,14 +13,14 @@ Upstream-Status: Inappropriate[meson version dependent]
3 files changed, 4 insertions(+), 21 deletions(-)
diff --git a/meson.build b/meson.build
-index 67e697c15..476f722b7 100644
+index 1b87bd004..af60472f8 100644
--- a/meson.build
+++ b/meson.build
@@ -1,7 +1,7 @@
project('pipewire', ['c' ],
- version : '0.3.43',
+ version : '0.3.47',
license : [ 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ],
-- meson_version : '>= 0.56.0',
+- meson_version : '>= 0.59.0',
+ meson_version : '>= 0.49.0',
default_options : [ 'warning_level=3',
'c_std=gnu99',
@@ -79,5 +78,5 @@ index f66ce8746..5cfaba3f9 100644
-
subdir('extensions')
--
-2.34.1
+2.35.1
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-Revert-meson-use-meson-variables-for-the-SMs-uninsta.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-Revert-meson-use-meson-variables-for-the-SMs-uninsta.patch
new file mode 100644
index 000000000..3fff8eb27
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-Revert-meson-use-meson-variables-for-the-SMs-uninsta.patch
@@ -0,0 +1,47 @@
+From 4e8241675e68d5fb082d42ff597e681955eabbc4 Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 12:37:27 +0530
+Subject: [PATCH 07/12] Revert "meson: use meson variables for the SMs'
+ uninstalled scripts"
+
+This reverts commit d5825b8551c34cefabf278a6b5ed04bc6ab0f301.
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ src/daemon/meson.build | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/src/daemon/meson.build b/src/daemon/meson.build
+index 28cbe4467..cd17d23c3 100644
+--- a/src/daemon/meson.build
++++ b/src/daemon/meson.build
+@@ -46,17 +46,21 @@ elif default_sm == 'media-session'
+ ms_bindir = ms_proj.get_variable('media_session_bin_dir', pipewire_bindir)
+ conf_config.set('session_manager_path', ms_bindir / 'pipewire-media-session')
+
+- ms_uninstalled = ms_proj.get_variable('media_session_uninstalled')
+- conf_config_uninstalled.set('session_manager_path', ms_uninstalled.full_path())
+- conf_config_uninstalled.set('session_manager_args', 'pipewire-media-session')
++ conf_config_uninstalled.set('session_manager_path',
++ meson.source_root() / 'subprojects' / 'media-session' / 'media-session-uninstalled.sh')
++ conf_config_uninstalled.set('session_manager_args',
++ '-b ' + meson.build_root() / 'subprojects' / 'media-session' + ' pipewire-media-session')
+ conf_config_uninstalled.set('sm_comment', '')
+ elif default_sm == 'wireplumber'
+ wp_bindir = wp_proj.get_variable('wireplumber_bin_dir', pipewire_bindir)
++
+ conf_config.set('session_manager_path', wp_bindir / 'wireplumber')
+
+- wp_uninstalled = wp_proj.get_variable('wireplumber_uninstalled')
+- conf_config_uninstalled.set('session_manager_path', wp_uninstalled.full_path())
+- conf_config_uninstalled.set('session_manager_args', 'wireplumber')
++ # wp-uninstalled.sh -b path/to/wp/build/root wireplumber
++ conf_config_uninstalled.set('session_manager_path',
++ meson.source_root() / 'subprojects' / 'wireplumber' / 'wp-uninstalled.sh')
++ conf_config_uninstalled.set('session_manager_args',
++ '-b ' + meson.build_root() / 'subprojects' / 'wireplumber' + ' wireplumber')
+ conf_config_uninstalled.set('sm_comment', '')
+ else
+ conf_config_uninstalled.set('session_manager_path', default_sm)
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-Revert-meson-declare-spa_dep-and-override_dependency.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-Revert-meson-declare-spa_dep-and-override_dependency.patch
new file mode 100644
index 000000000..751adbe5b
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-Revert-meson-declare-spa_dep-and-override_dependency.patch
@@ -0,0 +1,31 @@
+From c5b9c082dafe2ad2ac118ffd39c5b88307f3357f Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 16:12:23 +0530
+Subject: [PATCH 08/12] Revert "meson: declare spa_dep and
+ override_dependency() for spa and pipewire"
+
+This reverts commit 7ab5c35cadc075bcdf44031f1f7d95352cf9a13b.
+---
+ src/pipewire/meson.build | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/src/pipewire/meson.build b/src/pipewire/meson.build
+index 5cfaba3f9..2dd5d790e 100644
+--- a/src/pipewire/meson.build
++++ b/src/pipewire/meson.build
+@@ -121,11 +121,6 @@ pkgconfig.generate(libpipewire,
+ description : 'PipeWire Interface',
+ version : pipewire_version,
+ extra_cflags : '-D_REENTRANT',
+- variables : ['moduledir=${libdir}/@0@'.format(pipewire_name)],
+- uninstalled_variables : [
+- 'moduledir=${prefix}/src/modules',
+- 'confdatadir=${prefix}/src/daemon',
+- ],
+-)
++ variables : ['moduledir=${libdir}/@0@'.format(pipewire_name)])
+
+ subdir('extensions')
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-Revert-test-add-test-for-the-loop.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-Revert-test-add-test-for-the-loop.patch
new file mode 100644
index 000000000..6628c5c34
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-Revert-test-add-test-for-the-loop.patch
@@ -0,0 +1,32 @@
+From bf29285fb6e534b754a3b0c7b33d2a0ed3b98b79 Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 16:13:54 +0530
+Subject: [PATCH 09/12] Revert "test: add test for the loop"
+
+This reverts commit 5ac5ebfe19618f303c2bb4f0f9295baba0299961.
+---
+ test/meson.build | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/test/meson.build b/test/meson.build
+index 4108ac14b..87e211431 100644
+--- a/test/meson.build
++++ b/test/meson.build
+@@ -71,14 +71,6 @@ test('test-client',
+ link_with: pwtest_lib)
+ )
+
+-test('test-loop',
+- executable('test-loop',
+- 'test-loop.c',
+- include_directories: pwtest_inc,
+- dependencies: [ spa_dep ],
+- link_with: pwtest_lib)
+-)
+-
+ test('test-context',
+ executable('test-context',
+ 'test-context.c',
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-Revert-spa-improve-the-AEC-interface.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-Revert-spa-improve-the-AEC-interface.patch
new file mode 100644
index 000000000..8bf945479
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-Revert-spa-improve-the-AEC-interface.patch
@@ -0,0 +1,502 @@
+From 3ac842085c60a0c745bd3f8f0d8419e98220675b Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 18:02:29 +0530
+Subject: [PATCH 10/12] Revert "spa: improve the AEC interface"
+
+This reverts commit c5c9ecdd87225ecd4978e9f6176a8a6d1fdd4252.
+Upstream-Status: Inappropriate[meson version dependent]
+
+This patch had to be reverted as it is dependent on
+9386c70b3a2cc2df6aabfd7b6a6bc1d7ec873bd1 which needs
+higher meson version.
+
+---
+ spa/include/spa/interfaces/audio/aec.h | 71 +++-----------------
+ spa/plugins/aec/aec-null.c | 62 +++++++++--------
+ spa/plugins/aec/aec-webrtc.cpp | 56 ++++++++-------
+ src/modules/module-echo-cancel.c | 39 +++++------
+ src/modules/module-echo-cancel/echo-cancel.h | 34 ++++++++++
+ 5 files changed, 130 insertions(+), 132 deletions(-)
+ create mode 100644 src/modules/module-echo-cancel/echo-cancel.h
+
+diff --git a/spa/include/spa/interfaces/audio/aec.h b/spa/include/spa/interfaces/audio/aec.h
+index 17e4e4e46..e1fcda563 100644
+--- a/spa/include/spa/interfaces/audio/aec.h
++++ b/spa/include/spa/interfaces/audio/aec.h
+@@ -25,71 +25,20 @@
+
+ #include <spa/utils/dict.h>
+ #include <spa/utils/hook.h>
++#include <spa/pod/pod.h>
+ #include <spa/param/audio/raw.h>
++#include <spa/support/plugin.h>
+
+-#ifndef SPA_AUDIO_AEC_H
+-#define SPA_AUDIO_AEC_H
++#define SPA_TYPE_INTERFACE_AEC SPA_TYPE_INFO_INTERFACE_BASE "AEC"
++#define SPA_VERSION_AUDIO_AEC 1
+
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-#define SPA_TYPE_INTERFACE_AUDIO_AEC SPA_TYPE_INFO_INTERFACE_BASE "Audio:AEC"
+-
+-#define SPA_VERSION_AUDIO_AEC 0
+-struct spa_audio_aec {
++struct echo_cancel_info {
+ struct spa_interface iface;
+ const char *name;
+- const struct spa_dict *info;
++ const struct spa_dict info;
+ const char *latency;
++ int (*create) (struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info);
++ int (*run) (struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
++ struct spa_dict *(*get_properties) (struct spa_handle *handle);
++ int (*set_properties) (struct spa_handle *handle, const struct spa_dict *args);
+ };
+-
+-struct spa_audio_aec_info {
+-#define SPA_AUDIO_AEC_CHANGE_MASK_PROPS (1u<<0)
+- uint64_t change_mask;
+-
+- const struct spa_dict *props;
+-};
+-
+-struct spa_audio_aec_events {
+-#define SPA_VERSION_AUDIO_AEC_EVENTS 0
+- uint32_t version; /**< version of this structure */
+-
+- /** Emitted when info changes */
+- void (*info) (void *data, const struct spa_audio_aec_info *info);
+-};
+-
+-struct spa_audio_aec_methods {
+-#define SPA_VERSION_AUDIO_AEC_METHODS 0
+- uint32_t version;
+-
+- int (*add_listener) (void *object,
+- struct spa_hook *listener,
+- const struct spa_audio_aec_events *events,
+- void *data);
+-
+- int (*init) (void *data, const struct spa_dict *args, const struct spa_audio_info_raw *info);
+- int (*run) (void *data, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
+- int (*set_props) (void *data, const struct spa_dict *args);
+-};
+-
+-#define spa_audio_aec_method(o,method,version,...) \
+-({ \
+- int _res = -ENOTSUP; \
+- struct spa_audio_aec *_o = o; \
+- spa_interface_call_res(&_o->iface, \
+- struct spa_audio_aec_methods, _res, \
+- method, version, ##__VA_ARGS__); \
+- _res; \
+-})
+-
+-#define spa_audio_aec_add_listener(o,...) spa_audio_aec_method(o, add_listener, 0, __VA_ARGS__)
+-#define spa_audio_aec_init(o,...) spa_audio_aec_method(o, init, 0, __VA_ARGS__)
+-#define spa_audio_aec_run(o,...) spa_audio_aec_method(o, run, 0, __VA_ARGS__)
+-#define spa_audio_aec_set_props(o,...) spa_audio_aec_method(o, set_props, 0, __VA_ARGS__)
+-
+-#ifdef __cplusplus
+-} /* extern "C" */
+-#endif
+-
+-#endif /* SPA_AUDIO_AEC_H */
+diff --git a/spa/plugins/aec/aec-null.c b/spa/plugins/aec/aec-null.c
+index 2909eb213..3168a6b36 100644
+--- a/spa/plugins/aec/aec-null.c
++++ b/spa/plugins/aec/aec-null.c
+@@ -30,11 +30,7 @@
+
+ struct impl {
+ struct spa_handle handle;
+- struct spa_audio_aec aec;
+ struct spa_log *log;
+-
+- struct spa_hook_list hooks_list;
+-
+ uint32_t channels;
+ };
+
+@@ -42,38 +38,54 @@ static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.aec.null");
+ #undef SPA_LOG_TOPIC_DEFAULT
+ #define SPA_LOG_TOPIC_DEFAULT &log_topic
+
+-static int null_init(void *data, const struct spa_dict *args, const struct spa_audio_info_raw *info)
++static int null_create(struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info)
+ {
+- struct impl *impl = data;
++ struct impl *impl;
++ impl = (struct impl *) handle;
+ impl->channels = info->channels;
++
+ return 0;
+ }
+
+-static int null_run(void *data, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
++static int null_run(struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
+ {
+- struct impl *impl = data;
++ struct impl *impl = (struct impl *) handle;
+ uint32_t i;
+ for (i = 0; i < impl->channels; i++)
+ memcpy(out[i], rec[i], n_samples * sizeof(float));
+ return 0;
+ }
+
+-static struct spa_audio_aec_methods impl_aec = {
+- .init = null_init,
++struct spa_dict *null_get_properties(SPA_UNUSED struct spa_handle *handle)
++{
++ /* Not supported */
++ return NULL;
++}
++
++int null_set_properties(SPA_UNUSED struct spa_handle *handle, SPA_UNUSED const struct spa_dict *args)
++{
++ /* Not supported */
++ return -1;
++}
++
++static struct echo_cancel_info echo_cancel_null_impl = {
++ .name = "null",
++ .info = SPA_DICT_INIT(NULL, 0),
++ .latency = NULL,
++ .create = null_create,
+ .run = null_run,
++ .get_properties = null_get_properties,
++ .set_properties = null_set_properties,
+ };
+
+ static int impl_get_interface(struct spa_handle *handle, const char *type, void **interface)
+ {
+- struct impl *impl;
+
+ spa_return_val_if_fail(handle != NULL, -EINVAL);
+ spa_return_val_if_fail(interface != NULL, -EINVAL);
+
+- impl = (struct impl *) handle;
+-
+- if (spa_streq(type, SPA_TYPE_INTERFACE_AUDIO_AEC))
+- *interface = &impl->aec;
++ if (spa_streq(type, SPA_TYPE_INTERFACE_AEC))
++ *interface = &echo_cancel_null_impl;
+ else
+ return -ENOENT;
+
+@@ -106,29 +118,23 @@ impl_init(const struct spa_handle_factory *factory,
+ spa_return_val_if_fail(factory != NULL, -EINVAL);
+ spa_return_val_if_fail(handle != NULL, -EINVAL);
+
++ echo_cancel_null_impl.iface = SPA_INTERFACE_INIT(
++ SPA_TYPE_INTERFACE_AEC,
++ SPA_VERSION_AUDIO_AEC,
++ NULL,
++ NULL);
++
+ handle->get_interface = impl_get_interface;
+ handle->clear = impl_clear;
+-
+ impl = (struct impl *) handle;
+-
+- impl->aec.iface = SPA_INTERFACE_INIT(
+- SPA_TYPE_INTERFACE_AUDIO_AEC,
+- SPA_VERSION_AUDIO_AEC,
+- &impl_aec, impl);
+- impl->aec.name = "null";
+- impl->aec.info = NULL;
+- impl->aec.latency = NULL;
+-
+ impl->log = (struct spa_log*)spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Log);
+ spa_log_topic_init(impl->log, &log_topic);
+
+- spa_hook_list_init(&impl->hooks_list);
+-
+ return 0;
+ }
+
+ static const struct spa_interface_info impl_interfaces[] = {
+- {SPA_TYPE_INTERFACE_AUDIO_AEC,},
++ {SPA_TYPE_INTERFACE_AEC,},
+ };
+
+ static int
+diff --git a/spa/plugins/aec/aec-webrtc.cpp b/spa/plugins/aec/aec-webrtc.cpp
+index f519189c7..d44fa6e30 100644
+--- a/spa/plugins/aec/aec-webrtc.cpp
++++ b/spa/plugins/aec/aec-webrtc.cpp
+@@ -38,8 +38,6 @@
+
+ struct impl_data {
+ struct spa_handle handle;
+- struct spa_audio_aec aec;
+-
+ struct spa_log *log;
+ std::unique_ptr<webrtc::AudioProcessing> apm;
+ spa_audio_info_raw info;
+@@ -60,9 +58,9 @@ static bool webrtc_get_spa_bool(const struct spa_dict *args, const char *key, bo
+ return value;
+ }
+
+-static int webrtc_init(void *data, const struct spa_dict *args, const struct spa_audio_info_raw *info)
++static int webrtc_create(struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info)
+ {
+- auto impl = reinterpret_cast<struct impl_data*>(data);
++ auto impl = reinterpret_cast<struct impl_data*>(handle);
+
+ bool extended_filter = webrtc_get_spa_bool(args, "webrtc.extended_filter", true);
+ bool delay_agnostic = webrtc_get_spa_bool(args, "webrtc.delay_agnostic", true);
+@@ -122,9 +120,9 @@ static int webrtc_init(void *data, const struct spa_dict *args, const struct spa
+ return 0;
+ }
+
+-static int webrtc_run(void *data, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
++static int webrtc_run(struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
+ {
+- auto impl = reinterpret_cast<struct impl_data*>(data);
++ auto impl = reinterpret_cast<struct impl_data*>(handle);
+ webrtc::StreamConfig config =
+ webrtc::StreamConfig(impl->info.rate, impl->info.channels, false);
+ unsigned int num_blocks = n_samples * 1000 / impl->info.rate / 10;
+@@ -160,22 +158,36 @@ static int webrtc_run(void *data, const float *rec[], const float *play[], float
+ return 0;
+ }
+
+-static struct spa_audio_aec_methods impl_aec = {
+- SPA_VERSION_AUDIO_AEC_METHODS,
+- .add_listener = NULL,
+- .init = webrtc_init,
++struct spa_dict *webrtc_get_properties(SPA_UNUSED struct spa_handle *handle)
++{
++ /* Not supported */
++ return NULL;
++}
++
++int webrtc_set_properties(SPA_UNUSED struct spa_handle *handle, SPA_UNUSED const struct spa_dict *args)
++{
++ /* Not supported */
++ return -1;
++}
++
++static struct echo_cancel_info echo_cancel_webrtc_impl = {
++ .name = "webrtc",
++ .info = SPA_DICT_INIT(NULL, 0),
++ .latency = "480/48000",
++ .create = webrtc_create,
+ .run = webrtc_run,
++ .get_properties = webrtc_get_properties,
++ .set_properties = webrtc_set_properties,
+ };
+
+ static int impl_get_interface(struct spa_handle *handle, const char *type, void **interface)
+ {
+- auto impl = reinterpret_cast<struct impl_data*>(handle);
+
+ spa_return_val_if_fail(handle != NULL, -EINVAL);
+ spa_return_val_if_fail(interface != NULL, -EINVAL);
+
+- if (spa_streq(type, SPA_TYPE_INTERFACE_AUDIO_AEC))
+- *interface = &impl->aec;
++ if (spa_streq(type, SPA_TYPE_INTERFACE_AEC))
++ *interface = &echo_cancel_webrtc_impl;
+ else
+ return -ENOENT;
+
+@@ -207,19 +219,15 @@ impl_init(const struct spa_handle_factory *factory,
+ spa_return_val_if_fail(factory != NULL, -EINVAL);
+ spa_return_val_if_fail(handle != NULL, -EINVAL);
+
+- auto impl = new (handle) impl_data();
++ echo_cancel_webrtc_impl.iface = SPA_INTERFACE_INIT(
++ SPA_TYPE_INTERFACE_AEC,
++ SPA_VERSION_AUDIO_AEC,
++ NULL,
++ NULL);
+
++ auto impl = new (handle) impl_data();
+ impl->handle.get_interface = impl_get_interface;
+ impl->handle.clear = impl_clear;
+-
+- impl->aec.iface = SPA_INTERFACE_INIT(
+- SPA_TYPE_INTERFACE_AUDIO_AEC,
+- SPA_VERSION_AUDIO_AEC,
+- &impl_aec, impl);
+- impl->aec.name = "webrtc",
+- impl->aec.info = NULL;
+- impl->aec.latency = "480/48000",
+-
+ impl->log = (struct spa_log*)spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Log);
+ spa_log_topic_init(impl->log, &log_topic);
+
+@@ -227,7 +235,7 @@ impl_init(const struct spa_handle_factory *factory,
+ }
+
+ static const struct spa_interface_info impl_interfaces[] = {
+- {SPA_TYPE_INTERFACE_AUDIO_AEC,},
++ {SPA_TYPE_INTERFACE_AEC,},
+ };
+
+ static int
+diff --git a/src/modules/module-echo-cancel.c b/src/modules/module-echo-cancel.c
+index c933a9376..728325938 100644
+--- a/src/modules/module-echo-cancel.c
++++ b/src/modules/module-echo-cancel.c
+@@ -24,6 +24,7 @@
+ */
+
+ #include "config.h"
++#include "module-echo-cancel/echo-cancel.h"
+
+ #include <errno.h>
+ #include <fcntl.h>
+@@ -187,7 +188,7 @@ struct impl {
+ uint32_t out_ringsize;
+ struct spa_ringbuffer out_ring;
+
+- struct spa_audio_aec *aec;
++ const struct echo_cancel_info *aec_info;
+ uint32_t aec_blocksize;
+
+ unsigned int capture_ready:1;
+@@ -287,7 +288,7 @@ static void process(struct impl *impl)
+ pw_stream_queue_buffer(impl->playback, pout);
+
+ /* Now run the canceller */
+- spa_audio_aec_run(impl->aec, rec, play_delayed, out, size / sizeof(float));
++ echo_cancel_run(impl->aec_info, impl->spa_handle, rec, play_delayed, out, size / sizeof(float));
+
+ /* Next, copy over the output to the output ringbuffer */
+ avail = spa_ringbuffer_get_write_index(&impl->out_ring, &oindex);
+@@ -651,8 +652,8 @@ static int setup_streams(struct impl *impl)
+ pw_properties_set(props, PW_KEY_NODE_LINK_GROUP, str);
+ if ((str = pw_properties_get(impl->source_props, PW_KEY_NODE_LATENCY)) != NULL)
+ pw_properties_set(props, PW_KEY_NODE_LATENCY, str);
+- else if (impl->aec->latency)
+- pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec->latency);
++ else if (impl->aec_info->latency)
++ pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec_info->latency);
+
+ impl->capture = pw_stream_new(impl->core,
+ "Echo-Cancel Capture", props);
+@@ -684,8 +685,8 @@ static int setup_streams(struct impl *impl)
+ pw_properties_set(props, PW_KEY_NODE_LINK_GROUP, str);
+ if ((str = pw_properties_get(impl->sink_props, PW_KEY_NODE_LATENCY)) != NULL)
+ pw_properties_set(props, PW_KEY_NODE_LATENCY, str);
+- else if (impl->aec->latency)
+- pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec->latency);
++ else if (impl->aec_info->latency)
++ pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec_info->latency);
+
+ impl->playback = pw_stream_new(impl->core,
+ "Echo-Cancel Playback", props);
+@@ -998,42 +999,42 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ return -ENOENT;
+ }
+
+- if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_AUDIO_AEC, &iface)) < 0) {
+- pw_log_error("can't get %s interface %d", SPA_TYPE_INTERFACE_AUDIO_AEC, res);
++ if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_AEC, &iface)) < 0) {
++ pw_log_error("can't get %s interface %d", SPA_TYPE_INTERFACE_AEC, res);
+ return res;
+ }
+- impl->aec = iface;
++ impl->aec_info = iface;
+ impl->spa_handle = handle;
+- if (impl->aec->iface.version != SPA_VERSION_AUDIO_AEC) {
++ if (impl->aec_info->iface.version != SPA_VERSION_AUDIO_AEC) {
+ pw_log_error("codec plugin %s has incompatible ABI version (%d != %d)",
+- SPA_NAME_AEC, impl->aec->iface.version, SPA_VERSION_AUDIO_AEC);
++ SPA_NAME_AEC, impl->aec_info->iface.version, SPA_VERSION_AUDIO_AEC);
+ res = -ENOENT;
+ goto error;
+ }
+
+- (void)SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_AUDIO_AEC, (struct spa_audio_aec *)impl->aec);
++ (void)SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_AEC, (struct echo_cancel_info *)impl->aec_info);
+
+- pw_log_info("Using plugin AEC %s", impl->aec->name);
++ pw_log_info("Using plugin AEC %s", impl->aec_info->name);
+
+ if ((str = pw_properties_get(props, "aec.args")) != NULL)
+ aec_props = pw_properties_new_string(str);
+ else
+ aec_props = pw_properties_new(NULL, NULL);
+
+- if (spa_audio_aec_init(impl->aec, &aec_props->dict, &impl->info)) {
+- pw_log_error("codec plugin %s create failed", impl->aec->name);
++ if (echo_cancel_create(impl->aec_info, impl->spa_handle, &aec_props->dict, &impl->info)) {
++ pw_log_error("codec plugin %s create failed", impl->aec_info->name);
+ res = -ENOENT;
+ goto error;
+ }
+
+ pw_properties_free(aec_props);
+
+- if (impl->aec->latency) {
++ if (impl->aec_info->latency) {
+ unsigned int num, denom, req_num, req_denom;
+ unsigned int factor = 0;
+ unsigned int new_num = 0;
+
+- spa_assert_se(sscanf(impl->aec->latency, "%u/%u", &num, &denom) == 2);
++ spa_assert_se(sscanf(impl->aec_info->latency, "%u/%u", &num, &denom) == 2);
+
+ if ((str = pw_properties_get(props, PW_KEY_NODE_LATENCY)) != NULL) {
+ sscanf(str, "%u/%u", &req_num, &req_denom);
+@@ -1042,8 +1043,8 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ }
+
+ if (factor == 0 || new_num == 0) {
+- pw_log_info("Setting node latency to %s", impl->aec->latency);
+- pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec->latency);
++ pw_log_info("Setting node latency to %s", impl->aec_info->latency);
++ pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec_info->latency);
+ impl->aec_blocksize = sizeof(float) * impl->info.rate * num / denom;
+ } else {
+ pw_log_info("Setting node latency to %u/%u", new_num, req_denom);
+diff --git a/src/modules/module-echo-cancel/echo-cancel.h b/src/modules/module-echo-cancel/echo-cancel.h
+new file mode 100644
+index 000000000..ac83f70e4
+--- /dev/null
++++ b/src/modules/module-echo-cancel/echo-cancel.h
+@@ -0,0 +1,34 @@
++/* PipeWire
++ *
++ * Copyright © 2021 Wim Taymans <wim.taymans@gmail.com>
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ */
++
++
++#include <spa/utils/dict.h>
++#include <spa/utils/hook.h>
++#include <spa/param/audio/raw.h>
++#include <spa/support/plugin.h>
++
++#include <pipewire/properties.h>
++
++#define echo_cancel_create(i,...) (i)->create(__VA_ARGS__)
++#define echo_cancel_run(i,...) (i)->run(__VA_ARGS__)
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0011-Revert-module-echo-cancel-Move-backends-to-dynamic-l.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0011-Revert-module-echo-cancel-Move-backends-to-dynamic-l.patch
new file mode 100644
index 000000000..4d62abcfc
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0011-Revert-module-echo-cancel-Move-backends-to-dynamic-l.patch
@@ -0,0 +1,1055 @@
+From 7f14334d055da433521c32c622682f89fe2dd1c5 Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 18:02:48 +0530
+Subject: [PATCH 11/12] Revert "module-echo-cancel: Move backends to dynamic
+ libaries"
+
+This reverts commit 9386c70b3a2cc2df6aabfd7b6a6bc1d7ec873bd1.
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ spa/include/meson.build | 1 -
+ spa/include/spa/utils/names.h | 2 -
+ spa/plugins/aec/aec-null.c | 185 -----------
+ spa/plugins/aec/aec-webrtc.cpp | 286 ------------------
+ spa/plugins/aec/meson.build | 16 -
+ spa/plugins/meson.build | 2 -
+ src/modules/meson.build | 9 +-
+ src/modules/module-echo-cancel.c | 83 ++---
+ .../modules/module-echo-cancel/aec-null.c | 56 ++--
+ src/modules/module-echo-cancel/aec-webrtc.cpp | 163 ++++++++++
+ src/modules/module-echo-cancel/echo-cancel.h | 20 +-
+ 11 files changed, 247 insertions(+), 576 deletions(-)
+ delete mode 100644 spa/plugins/aec/aec-null.c
+ delete mode 100644 spa/plugins/aec/aec-webrtc.cpp
+ delete mode 100644 spa/plugins/aec/meson.build
+ rename spa/include/spa/interfaces/audio/aec.h => src/modules/module-echo-cancel/aec-null.c (58%)
+ create mode 100644 src/modules/module-echo-cancel/aec-webrtc.cpp
+
+diff --git a/spa/include/meson.build b/spa/include/meson.build
+index 443db7dca..0566b025d 100644
+--- a/spa/include/meson.build
++++ b/spa/include/meson.build
+@@ -3,7 +3,6 @@ spa_sections = [
+ 'control',
+ 'debug',
+ 'graph',
+- 'interfaces',
+ 'monitor',
+ 'node',
+ 'param',
+diff --git a/spa/include/spa/utils/names.h b/spa/include/spa/utils/names.h
+index 3ece5a861..1e570d098 100644
+--- a/spa/include/spa/utils/names.h
++++ b/spa/include/spa/utils/names.h
+@@ -82,8 +82,6 @@ extern "C" {
+ #define SPA_NAME_AUDIO_ADAPT "audio.adapt" /**< combination of a node and an
+ * audio.convert. Does clock slaving */
+
+-#define SPA_NAME_AEC "audio.aec" /**< Echo canceling */
+-
+ /** video processing */
+ #define SPA_NAME_VIDEO_PROCESS_FORMAT "video.process.format" /**< processes raw video from one format
+ * to another */
+diff --git a/spa/plugins/aec/aec-null.c b/spa/plugins/aec/aec-null.c
+deleted file mode 100644
+index 3168a6b36..000000000
+--- a/spa/plugins/aec/aec-null.c
++++ /dev/null
+@@ -1,185 +0,0 @@
+-/* PipeWire
+- *
+- * Copyright © 2021 Wim Taymans <wim.taymans@gmail.com>
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a
+- * copy of this software and associated documentation files (the "Software"),
+- * to deal in the Software without restriction, including without limitation
+- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+- * and/or sell copies of the Software, and to permit persons to whom the
+- * Software is furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice (including the next
+- * paragraph) shall be included in all copies or substantial portions of the
+- * Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+- * DEALINGS IN THE SOFTWARE.
+- */
+-
+-#include <spa/interfaces/audio/aec.h>
+-#include <spa/support/log.h>
+-#include <spa/utils/string.h>
+-#include <spa/utils/names.h>
+-#include <spa/support/plugin.h>
+-
+-struct impl {
+- struct spa_handle handle;
+- struct spa_log *log;
+- uint32_t channels;
+-};
+-
+-static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.aec.null");
+-#undef SPA_LOG_TOPIC_DEFAULT
+-#define SPA_LOG_TOPIC_DEFAULT &log_topic
+-
+-static int null_create(struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info)
+-{
+- struct impl *impl;
+- impl = (struct impl *) handle;
+- impl->channels = info->channels;
+-
+- return 0;
+-}
+-
+-static int null_run(struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
+-{
+- struct impl *impl = (struct impl *) handle;
+- uint32_t i;
+- for (i = 0; i < impl->channels; i++)
+- memcpy(out[i], rec[i], n_samples * sizeof(float));
+- return 0;
+-}
+-
+-struct spa_dict *null_get_properties(SPA_UNUSED struct spa_handle *handle)
+-{
+- /* Not supported */
+- return NULL;
+-}
+-
+-int null_set_properties(SPA_UNUSED struct spa_handle *handle, SPA_UNUSED const struct spa_dict *args)
+-{
+- /* Not supported */
+- return -1;
+-}
+-
+-static struct echo_cancel_info echo_cancel_null_impl = {
+- .name = "null",
+- .info = SPA_DICT_INIT(NULL, 0),
+- .latency = NULL,
+- .create = null_create,
+- .run = null_run,
+- .get_properties = null_get_properties,
+- .set_properties = null_set_properties,
+-};
+-
+-static int impl_get_interface(struct spa_handle *handle, const char *type, void **interface)
+-{
+-
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+- spa_return_val_if_fail(interface != NULL, -EINVAL);
+-
+- if (spa_streq(type, SPA_TYPE_INTERFACE_AEC))
+- *interface = &echo_cancel_null_impl;
+- else
+- return -ENOENT;
+-
+- return 0;
+-}
+-
+-static int impl_clear(struct spa_handle *handle)
+-{
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+-
+- return 0;
+-}
+-
+-static size_t
+-impl_get_size(const struct spa_handle_factory *factory,
+- const struct spa_dict *params)
+-{
+- return sizeof(struct impl);
+-}
+-
+-static int
+-impl_init(const struct spa_handle_factory *factory,
+- struct spa_handle *handle,
+- const struct spa_dict *info,
+- const struct spa_support *support,
+- uint32_t n_support)
+-{
+- struct impl *impl;
+-
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+-
+- echo_cancel_null_impl.iface = SPA_INTERFACE_INIT(
+- SPA_TYPE_INTERFACE_AEC,
+- SPA_VERSION_AUDIO_AEC,
+- NULL,
+- NULL);
+-
+- handle->get_interface = impl_get_interface;
+- handle->clear = impl_clear;
+- impl = (struct impl *) handle;
+- impl->log = (struct spa_log*)spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Log);
+- spa_log_topic_init(impl->log, &log_topic);
+-
+- return 0;
+-}
+-
+-static const struct spa_interface_info impl_interfaces[] = {
+- {SPA_TYPE_INTERFACE_AEC,},
+-};
+-
+-static int
+-impl_enum_interface_info(const struct spa_handle_factory *factory,
+- const struct spa_interface_info **info,
+- uint32_t *index)
+-{
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(info != NULL, -EINVAL);
+- spa_return_val_if_fail(index != NULL, -EINVAL);
+-
+- switch (*index) {
+- case 0:
+- *info = &impl_interfaces[*index];
+- break;
+- default:
+- return 0;
+- }
+- (*index)++;
+- return 1;
+-}
+-
+-const struct spa_handle_factory spa_aec_exaudio_factory = {
+- SPA_VERSION_HANDLE_FACTORY,
+- SPA_NAME_AEC,
+- NULL,
+- impl_get_size,
+- impl_init,
+- impl_enum_interface_info,
+-};
+-
+-
+-SPA_EXPORT
+-int spa_handle_factory_enum(const struct spa_handle_factory **factory, uint32_t *index)
+-{
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(index != NULL, -EINVAL);
+-
+- switch (*index) {
+- case 0:
+- *factory = &spa_aec_exaudio_factory;
+- break;
+- default:
+- return 0;
+- }
+- (*index)++;
+- return 1;
+-}
+diff --git a/spa/plugins/aec/aec-webrtc.cpp b/spa/plugins/aec/aec-webrtc.cpp
+deleted file mode 100644
+index d44fa6e30..000000000
+--- a/spa/plugins/aec/aec-webrtc.cpp
++++ /dev/null
+@@ -1,286 +0,0 @@
+-/* PipeWire
+- *
+- * Copyright © 2021 Wim Taymans <wim.taymans@gmail.com>
+- * © 2021 Arun Raghavan <arun@asymptotic.io>
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a
+- * copy of this software and associated documentation files (the "Software"),
+- * to deal in the Software without restriction, including without limitation
+- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+- * and/or sell copies of the Software, and to permit persons to whom the
+- * Software is furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice (including the next
+- * paragraph) shall be included in all copies or substantial portions of the
+- * Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+- * DEALINGS IN THE SOFTWARE.
+- */
+-
+-#include <memory>
+-#include <utility>
+-
+-#include <spa/interfaces/audio/aec.h>
+-#include <spa/support/log.h>
+-#include <spa/utils/string.h>
+-#include <spa/utils/names.h>
+-#include <spa/support/plugin.h>
+-
+-#include <webrtc/modules/audio_processing/include/audio_processing.h>
+-#include <webrtc/modules/interface/module_common_types.h>
+-#include <webrtc/system_wrappers/include/trace.h>
+-
+-struct impl_data {
+- struct spa_handle handle;
+- struct spa_log *log;
+- std::unique_ptr<webrtc::AudioProcessing> apm;
+- spa_audio_info_raw info;
+- std::unique_ptr<float *[]> play_buffer, rec_buffer, out_buffer;
+-};
+-
+-static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.eac.webrtc");
+-#undef SPA_LOG_TOPIC_DEFAULT
+-#define SPA_LOG_TOPIC_DEFAULT &log_topic
+-
+-static bool webrtc_get_spa_bool(const struct spa_dict *args, const char *key, bool default_value) {
+- const char *str_val;
+- bool value = default_value;
+- str_val = spa_dict_lookup(args, key);
+- if (str_val != NULL)
+- value =spa_atob(str_val);
+-
+- return value;
+-}
+-
+-static int webrtc_create(struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info)
+-{
+- auto impl = reinterpret_cast<struct impl_data*>(handle);
+-
+- bool extended_filter = webrtc_get_spa_bool(args, "webrtc.extended_filter", true);
+- bool delay_agnostic = webrtc_get_spa_bool(args, "webrtc.delay_agnostic", true);
+- bool high_pass_filter = webrtc_get_spa_bool(args, "webrtc.high_pass_filter", true);
+- bool noise_suppression = webrtc_get_spa_bool(args, "webrtc.noise_suppression", true);
+- bool voice_detection = webrtc_get_spa_bool(args, "webrtc.voice_detection", true);
+-
+- // Note: AGC seems to mess up with Agnostic Delay Detection, especially with speech,
+- // result in very poor performance, disable by default
+- bool gain_control = webrtc_get_spa_bool(args, "webrtc.gain_control", false);
+-
+- // Disable experimental flags by default
+- bool experimental_agc = webrtc_get_spa_bool(args, "webrtc.experimental_agc", false);
+- bool experimental_ns = webrtc_get_spa_bool(args, "webrtc.experimental_ns", false);
+-
+- // FIXME: Intelligibility enhancer is not currently supported
+- // This filter will modify playback buffer (when calling ProcessReverseStream), but now
+- // playback buffer modifications are discarded.
+-
+- webrtc::Config config;
+- config.Set<webrtc::ExtendedFilter>(new webrtc::ExtendedFilter(extended_filter));
+- config.Set<webrtc::DelayAgnostic>(new webrtc::DelayAgnostic(delay_agnostic));
+- config.Set<webrtc::ExperimentalAgc>(new webrtc::ExperimentalAgc(experimental_agc));
+- config.Set<webrtc::ExperimentalNs>(new webrtc::ExperimentalNs(experimental_ns));
+-
+- webrtc::ProcessingConfig pconfig = {{
+- webrtc::StreamConfig(info->rate, info->channels, false), /* input stream */
+- webrtc::StreamConfig(info->rate, info->channels, false), /* output stream */
+- webrtc::StreamConfig(info->rate, info->channels, false), /* reverse input stream */
+- webrtc::StreamConfig(info->rate, info->channels, false), /* reverse output stream */
+- }};
+-
+- auto apm = std::unique_ptr<webrtc::AudioProcessing>(webrtc::AudioProcessing::Create(config));
+- if (apm->Initialize(pconfig) != webrtc::AudioProcessing::kNoError) {
+- spa_log_error(impl->log, "Error initialising webrtc audio processing module");
+- return -1;
+- }
+-
+- apm->high_pass_filter()->Enable(high_pass_filter);
+- // Always disable drift compensation since it requires drift sampling
+- apm->echo_cancellation()->enable_drift_compensation(false);
+- apm->echo_cancellation()->Enable(true);
+- // TODO: wire up supression levels to args
+- apm->echo_cancellation()->set_suppression_level(webrtc::EchoCancellation::kHighSuppression);
+- apm->noise_suppression()->set_level(webrtc::NoiseSuppression::kHigh);
+- apm->noise_suppression()->Enable(noise_suppression);
+- apm->voice_detection()->Enable(voice_detection);
+- // TODO: wire up AGC parameters to args
+- apm->gain_control()->set_analog_level_limits(0, 255);
+- apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital);
+- apm->gain_control()->Enable(gain_control);
+- impl->apm = std::move(apm);
+- impl->info = *info;
+- impl->play_buffer = std::make_unique<float *[]>(info->channels);
+- impl->rec_buffer = std::make_unique<float *[]>(info->channels);
+- impl->out_buffer = std::make_unique<float *[]>(info->channels);
+- return 0;
+-}
+-
+-static int webrtc_run(struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
+-{
+- auto impl = reinterpret_cast<struct impl_data*>(handle);
+- webrtc::StreamConfig config =
+- webrtc::StreamConfig(impl->info.rate, impl->info.channels, false);
+- unsigned int num_blocks = n_samples * 1000 / impl->info.rate / 10;
+-
+- if (n_samples * 1000 / impl->info.rate % 10 != 0) {
+- spa_log_error(impl->log, "Buffers must be multiples of 10ms in length (currently %u samples)", n_samples);
+- return -1;
+- }
+-
+- for (size_t i = 0; i < num_blocks; i ++) {
+- for (size_t j = 0; j < impl->info.channels; j++) {
+- impl->play_buffer[j] = const_cast<float *>(play[j]) + config.num_frames() * i;
+- impl->rec_buffer[j] = const_cast<float *>(rec[j]) + config.num_frames() * i;
+- impl->out_buffer[j] = out[j] + config.num_frames() * i;
+- }
+- /* FIXME: ProcessReverseStream may change the playback buffer, in which
+- * case we should use that, if we ever expose the intelligibility
+- * enhancer */
+- if (impl->apm->ProcessReverseStream(impl->play_buffer.get(), config, config, impl->play_buffer.get()) !=
+- webrtc::AudioProcessing::kNoError) {
+- spa_log_error(impl->log, "Processing reverse stream failed");
+- }
+-
+- // Extra delay introduced by multiple frames
+- impl->apm->set_stream_delay_ms((num_blocks - 1) * 10);
+-
+- if (impl->apm->ProcessStream(impl->rec_buffer.get(), config, config, impl->out_buffer.get()) !=
+- webrtc::AudioProcessing::kNoError) {
+- spa_log_error(impl->log, "Processing stream failed");
+- }
+- }
+-
+- return 0;
+-}
+-
+-struct spa_dict *webrtc_get_properties(SPA_UNUSED struct spa_handle *handle)
+-{
+- /* Not supported */
+- return NULL;
+-}
+-
+-int webrtc_set_properties(SPA_UNUSED struct spa_handle *handle, SPA_UNUSED const struct spa_dict *args)
+-{
+- /* Not supported */
+- return -1;
+-}
+-
+-static struct echo_cancel_info echo_cancel_webrtc_impl = {
+- .name = "webrtc",
+- .info = SPA_DICT_INIT(NULL, 0),
+- .latency = "480/48000",
+- .create = webrtc_create,
+- .run = webrtc_run,
+- .get_properties = webrtc_get_properties,
+- .set_properties = webrtc_set_properties,
+-};
+-
+-static int impl_get_interface(struct spa_handle *handle, const char *type, void **interface)
+-{
+-
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+- spa_return_val_if_fail(interface != NULL, -EINVAL);
+-
+- if (spa_streq(type, SPA_TYPE_INTERFACE_AEC))
+- *interface = &echo_cancel_webrtc_impl;
+- else
+- return -ENOENT;
+-
+- return 0;
+-}
+-
+-static int impl_clear(struct spa_handle *handle)
+-{
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+- auto impl = reinterpret_cast<struct impl_data*>(handle);
+- impl->~impl_data();
+- return 0;
+-}
+-
+-static size_t
+-impl_get_size(const struct spa_handle_factory *factory,
+- const struct spa_dict *params)
+-{
+- return sizeof(struct impl_data);
+-}
+-
+-static int
+-impl_init(const struct spa_handle_factory *factory,
+- struct spa_handle *handle,
+- const struct spa_dict *info,
+- const struct spa_support *support,
+- uint32_t n_support)
+-{
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(handle != NULL, -EINVAL);
+-
+- echo_cancel_webrtc_impl.iface = SPA_INTERFACE_INIT(
+- SPA_TYPE_INTERFACE_AEC,
+- SPA_VERSION_AUDIO_AEC,
+- NULL,
+- NULL);
+-
+- auto impl = new (handle) impl_data();
+- impl->handle.get_interface = impl_get_interface;
+- impl->handle.clear = impl_clear;
+- impl->log = (struct spa_log*)spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Log);
+- spa_log_topic_init(impl->log, &log_topic);
+-
+- return 0;
+-}
+-
+-static const struct spa_interface_info impl_interfaces[] = {
+- {SPA_TYPE_INTERFACE_AEC,},
+-};
+-
+-static int
+-impl_enum_interface_info(const struct spa_handle_factory *factory,
+- const struct spa_interface_info **info,
+- uint32_t *index)
+-{
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(info != NULL, -EINVAL);
+- spa_return_val_if_fail(index != NULL, -EINVAL);
+-
+- switch (*index) {
+- case 0:
+- *info = &impl_interfaces[*index];
+- break;
+- default:
+- return 0;
+- }
+- (*index)++;
+- return 1;
+-}
+-
+-const struct spa_handle_factory spa_aec_exaudio_factory = {
+- SPA_VERSION_HANDLE_FACTORY,
+- SPA_NAME_AEC,
+- NULL,
+- impl_get_size,
+- impl_init,
+- impl_enum_interface_info,
+-};
+-
+-
+-SPA_EXPORT
+-int spa_handle_factory_enum(const struct spa_handle_factory **factory, uint32_t *index)
+-{
+- spa_return_val_if_fail(factory != NULL, -EINVAL);
+- spa_return_val_if_fail(index != NULL, -EINVAL);
+-
+- switch (*index) {
+- case 0:
+- *factory = &spa_aec_exaudio_factory;
+- break;
+- default:
+- return 0;
+- }
+- (*index)++;
+- return 1;
+-}
+diff --git a/spa/plugins/aec/meson.build b/spa/plugins/aec/meson.build
+deleted file mode 100644
+index 2b1a2c05a..000000000
+--- a/spa/plugins/aec/meson.build
++++ /dev/null
+@@ -1,16 +0,0 @@
+-aec_null = shared_library('spa-aec-null',
+- [ 'aec-null.c' ],
+- include_directories : [ configinc ],
+- dependencies : [ spa_dep ],
+- install : true,
+- install_dir : spa_plugindir / 'aec')
+-
+-if webrtc_dep.found()
+- aec_webrtc = shared_library('spa-aec-webrtc',
+- [ 'aec-webrtc.cpp' ],
+- include_directories : [ configinc ],
+- dependencies : [ spa_dep, webrtc_dep ],
+- install : true,
+- install_dir : spa_plugindir / 'aec')
+-endif
+-
+diff --git a/spa/plugins/meson.build b/spa/plugins/meson.build
+index 0b581b29b..fd229d460 100644
+--- a/spa/plugins/meson.build
++++ b/spa/plugins/meson.build
+@@ -51,5 +51,3 @@ endif
+ if libcamera_dep.found()
+ subdir('libcamera')
+ endif
+-
+-subdir('aec')
+\ No newline at end of file
+diff --git a/src/modules/meson.build b/src/modules/meson.build
+index bd7d3f711..568b32c50 100644
+--- a/src/modules/meson.build
++++ b/src/modules/meson.build
+@@ -110,15 +110,22 @@ pipewire_module_filter_chain = shared_library('pipewire-module-filter-chain',
+
+ pipewire_module_echo_cancel_sources = [
+ 'module-echo-cancel.c',
++ 'module-echo-cancel/aec-null.c',
+ ]
+
++if webrtc_dep.found()
++ pipewire_module_echo_cancel_sources += [
++ 'module-echo-cancel/aec-webrtc.cpp'
++ ]
++endif
++
+ pipewire_module_echo_cancel = shared_library('pipewire-module-echo-cancel',
+ pipewire_module_echo_cancel_sources,
+ include_directories : [configinc, spa_inc],
+ install : true,
+ install_dir : modules_install_dir,
+ install_rpath: modules_install_dir,
+- dependencies : [mathlib, dl_lib, pipewire_dep],
++ dependencies : [mathlib, dl_lib, pipewire_dep, webrtc_dep],
+ )
+
+ pipewire_module_profiler = shared_library('pipewire-module-profiler',
+diff --git a/src/modules/module-echo-cancel.c b/src/modules/module-echo-cancel.c
+index 728325938..00adbbfc5 100644
+--- a/src/modules/module-echo-cancel.c
++++ b/src/modules/module-echo-cancel.c
+@@ -24,7 +24,6 @@
+ */
+
+ #include "config.h"
+-#include "module-echo-cancel/echo-cancel.h"
+
+ #include <errno.h>
+ #include <fcntl.h>
+@@ -44,14 +43,10 @@
+ #include <spa/param/audio/raw.h>
+ #include <spa/param/profiler.h>
+ #include <spa/pod/builder.h>
+-#include <spa/support/plugin.h>
+ #include <spa/utils/json.h>
+-#include <spa/utils/names.h>
+ #include <spa/utils/result.h>
+ #include <spa/utils/ringbuffer.h>
+ #include <spa/utils/string.h>
+-#include <spa/support/plugin-loader.h>
+-#include <spa/interfaces/audio/aec.h>
+
+ #include <pipewire/private.h>
+ #include <pipewire/impl.h>
+@@ -59,6 +54,8 @@
+
+ #include <pipewire/extensions/profiler.h>
+
++#include "module-echo-cancel/echo-cancel.h"
++
+ /** \page page_module_echo_cancel PipeWire Module: Echo Cancel
+ *
+ * The `echo-cancel` module performs echo cancellation. The module creates
+@@ -71,8 +68,8 @@
+ *
+ * - `source.props = {}`: properties to be passed to the source stream
+ * - `sink.props = {}`: properties to be passed to the sink stream
+- * - `library.name = <str>`: the echo cancellation library Currently supported:
+- * `aec/libspa-aec-exaudio`. Leave unset to use the default method (`aec/libspa-aec-exaudio`).
++ * - `aec.method = <str>`: the echo cancellation method. Currently supported:
++ * `webrtc`. Leave unset to use the default method (`webrtc`).
+ * - `aec.args = <str>`: arguments to pass to the echo cancellation method
+ *
+ * ## General options
+@@ -97,7 +94,7 @@
+ * context.modules = [
+ * { name = libpipewire-module-echo-cancel
+ * args = {
+- * # library.name = aec/libspa-aec-exaudio
++ * # aec.method = webrtc
+ * # node.latency = 1024/48000
+ * source.props = {
+ * node.name = "Echo Cancellation Source"
+@@ -141,7 +138,7 @@ static const struct spa_dict_item module_props[] = {
+ "[ audio.position=<channel map> ] "
+ "[ buffer.max_size=<max buffer size in ms> ] "
+ "[ buffer.play_delay=<play delay in ms> ] "
+- "[ library.name =<library name> ] "
++ "[ aec.method=<aec method> ] "
+ "[ aec.args=<aec arguments> ] "
+ "[ source.props=<properties> ] "
+ "[ sink.props=<properties> ] " },
+@@ -189,6 +186,7 @@ struct impl {
+ struct spa_ringbuffer out_ring;
+
+ const struct echo_cancel_info *aec_info;
++ void *aec;
+ uint32_t aec_blocksize;
+
+ unsigned int capture_ready:1;
+@@ -199,9 +197,6 @@ struct impl {
+
+ uint32_t max_buffer_size;
+ uint32_t buffer_delay;
+-
+- struct spa_handle *spa_handle;
+- struct spa_plugin_loader *loader;
+ };
+
+ static void do_unload_module(void *obj, void *data, int res, uint32_t id)
+@@ -288,7 +283,7 @@ static void process(struct impl *impl)
+ pw_stream_queue_buffer(impl->playback, pout);
+
+ /* Now run the canceller */
+- echo_cancel_run(impl->aec_info, impl->spa_handle, rec, play_delayed, out, size / sizeof(float));
++ echo_cancel_run(impl->aec_info, impl->aec, rec, play_delayed, out, size / sizeof(float));
+
+ /* Next, copy over the output to the output ringbuffer */
+ avail = spa_ringbuffer_get_write_index(&impl->out_ring, &oindex);
+@@ -808,8 +803,8 @@ static void impl_destroy(struct impl *impl)
+ pw_stream_destroy(impl->sink);
+ if (impl->core && impl->do_disconnect)
+ pw_core_disconnect(impl->core);
+- if (impl->spa_handle)
+- spa_plugin_loader_unload(impl->loader, impl->spa_handle);
++ if (impl->aec)
++ echo_cancel_destroy(impl->aec_info, impl->aec);
+ pw_properties_free(impl->source_props);
+ pw_properties_free(impl->sink_props);
+
+@@ -898,10 +893,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ struct impl *impl;
+ uint32_t id = pw_global_get_id(pw_impl_module_get_global(module));
+ const char *str;
+- const char *path;
+- int res = 0;
+- struct spa_handle *handle = NULL;
+- void *iface;
++ int res;
+
+ PW_LOG_TOPIC_INIT(mod_topic);
+
+@@ -975,57 +967,22 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
+ if (pw_properties_get(impl->sink_props, PW_KEY_MEDIA_CLASS) == NULL)
+ pw_properties_set(impl->sink_props, PW_KEY_MEDIA_CLASS, "Audio/Sink");
+
+- if ((str = pw_properties_get(props, "aec.method")) != NULL)
+- pw_log_warn("aec.method is not supported anymore use library.name");
+-
+- /* Use webrtc as default */
+- if ((path = pw_properties_get(props, "library.name")) == NULL)
+- path = "aec/libspa-aec-webrtc";
+-
+- struct spa_dict_item info_items[] = {
+- { SPA_KEY_LIBRARY_NAME, path },
+- };
+- struct spa_dict info = SPA_DICT_INIT_ARRAY(info_items);
+-
+- impl->loader = spa_support_find(context->support, context->n_support, SPA_TYPE_INTERFACE_PluginLoader);
+- if (impl->loader == NULL) {
+- pw_log_error("a plugin loader is needed");
+- return -EINVAL;
+- }
+-
+- handle = spa_plugin_loader_load(impl->loader, SPA_NAME_AEC, &info);
+- if (handle == NULL) {
+- pw_log_error("AEC codec plugin %s not available library.name %s", SPA_NAME_AEC, path);
+- return -ENOENT;
+- }
+-
+- if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_AEC, &iface)) < 0) {
+- pw_log_error("can't get %s interface %d", SPA_TYPE_INTERFACE_AEC, res);
+- return res;
+- }
+- impl->aec_info = iface;
+- impl->spa_handle = handle;
+- if (impl->aec_info->iface.version != SPA_VERSION_AUDIO_AEC) {
+- pw_log_error("codec plugin %s has incompatible ABI version (%d != %d)",
+- SPA_NAME_AEC, impl->aec_info->iface.version, SPA_VERSION_AUDIO_AEC);
+- res = -ENOENT;
+- goto error;
+- }
+-
+- (void)SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_AEC, (struct echo_cancel_info *)impl->aec_info);
++ if ((str = pw_properties_get(props, "aec.method")) == NULL)
++ str = "webrtc";
+
+- pw_log_info("Using plugin AEC %s", impl->aec_info->name);
++#ifdef HAVE_WEBRTC
++ if (spa_streq(str, "webrtc"))
++ impl->aec_info = echo_cancel_webrtc;
++ else
++#endif
++ impl->aec_info = echo_cancel_null;
+
+ if ((str = pw_properties_get(props, "aec.args")) != NULL)
+ aec_props = pw_properties_new_string(str);
+ else
+ aec_props = pw_properties_new(NULL, NULL);
+
+- if (echo_cancel_create(impl->aec_info, impl->spa_handle, &aec_props->dict, &impl->info)) {
+- pw_log_error("codec plugin %s create failed", impl->aec_info->name);
+- res = -ENOENT;
+- goto error;
+- }
++ impl->aec = echo_cancel_create(impl->aec_info, aec_props, &impl->info);
+
+ pw_properties_free(aec_props);
+
+diff --git a/spa/include/spa/interfaces/audio/aec.h b/src/modules/module-echo-cancel/aec-null.c
+similarity index 58%
+rename from spa/include/spa/interfaces/audio/aec.h
+rename to src/modules/module-echo-cancel/aec-null.c
+index e1fcda563..4ee9ac6d7 100644
+--- a/spa/include/spa/interfaces/audio/aec.h
++++ b/src/modules/module-echo-cancel/aec-null.c
+@@ -22,23 +22,43 @@
+ * DEALINGS IN THE SOFTWARE.
+ */
+
++#include "echo-cancel.h"
+
+-#include <spa/utils/dict.h>
+-#include <spa/utils/hook.h>
+-#include <spa/pod/pod.h>
+-#include <spa/param/audio/raw.h>
+-#include <spa/support/plugin.h>
+-
+-#define SPA_TYPE_INTERFACE_AEC SPA_TYPE_INFO_INTERFACE_BASE "AEC"
+-#define SPA_VERSION_AUDIO_AEC 1
+-
+-struct echo_cancel_info {
+- struct spa_interface iface;
+- const char *name;
+- const struct spa_dict info;
+- const char *latency;
+- int (*create) (struct spa_handle *handle, const struct spa_dict *args, const struct spa_audio_info_raw *info);
+- int (*run) (struct spa_handle *handle, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
+- struct spa_dict *(*get_properties) (struct spa_handle *handle);
+- int (*set_properties) (struct spa_handle *handle, const struct spa_dict *args);
++struct impl {
++ uint32_t channels;
+ };
++
++static void *null_create(const struct pw_properties *args, const struct spa_audio_info_raw *info)
++{
++ struct impl *impl;
++ impl = calloc(1, sizeof(struct impl));
++ impl->channels = info->channels;
++ return impl;
++}
++
++static void null_destroy(void *ec)
++{
++ free(ec);
++}
++
++static int null_run(void *ec, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
++{
++ struct impl *impl = ec;
++ uint32_t i;
++ for (i = 0; i < impl->channels; i++)
++ memcpy(out[i], rec[i], n_samples * sizeof(float));
++ return 0;
++}
++
++static const struct echo_cancel_info echo_cancel_null_impl = {
++ .name = "null",
++ .info = SPA_DICT_INIT(NULL, 0),
++ .latency = NULL,
++
++ .create = null_create,
++ .destroy = null_destroy,
++
++ .run = null_run,
++};
++
++const struct echo_cancel_info *echo_cancel_null = &echo_cancel_null_impl;
+diff --git a/src/modules/module-echo-cancel/aec-webrtc.cpp b/src/modules/module-echo-cancel/aec-webrtc.cpp
+new file mode 100644
+index 000000000..77b569a22
+--- /dev/null
++++ b/src/modules/module-echo-cancel/aec-webrtc.cpp
+@@ -0,0 +1,163 @@
++/* PipeWire
++ *
++ * Copyright © 2021 Wim Taymans <wim.taymans@gmail.com>
++ * © 2021 Arun Raghavan <arun@asymptotic.io>
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ */
++
++#include <memory>
++#include <utility>
++
++#include "echo-cancel.h"
++
++#include <pipewire/pipewire.h>
++
++#include <webrtc/modules/audio_processing/include/audio_processing.h>
++#include <webrtc/modules/interface/module_common_types.h>
++#include <webrtc/system_wrappers/include/trace.h>
++
++struct impl {
++ std::unique_ptr<webrtc::AudioProcessing> apm;
++ spa_audio_info_raw info;
++ std::unique_ptr<float *[]> play_buffer, rec_buffer, out_buffer;
++
++ impl(std::unique_ptr<webrtc::AudioProcessing> apm, const spa_audio_info_raw& info)
++ : apm(std::move(apm)),
++ info(info),
++ play_buffer(std::make_unique<float *[]>(info.channels)),
++ rec_buffer(std::make_unique<float *[]>(info.channels)),
++ out_buffer(std::make_unique<float *[]>(info.channels))
++ { }
++};
++
++static void *webrtc_create(const struct pw_properties *args, const spa_audio_info_raw *info)
++{
++ bool extended_filter = pw_properties_get_bool(args, "webrtc.extended_filter", true);
++ bool delay_agnostic = pw_properties_get_bool(args, "webrtc.delay_agnostic", true);
++ bool high_pass_filter = pw_properties_get_bool(args, "webrtc.high_pass_filter", true);
++ bool noise_suppression = pw_properties_get_bool(args, "webrtc.noise_suppression", true);
++ bool voice_detection = pw_properties_get_bool(args, "webrtc.voice_detection", true);
++
++ // Note: AGC seems to mess up with Agnostic Delay Detection, especially with speech,
++ // result in very poor performance, disable by default
++ bool gain_control = pw_properties_get_bool(args, "webrtc.gain_control", false);
++
++ // Disable experimental flags by default
++ bool experimental_agc = pw_properties_get_bool(args, "webrtc.experimental_agc", false);
++ bool experimental_ns = pw_properties_get_bool(args, "webrtc.experimental_ns", false);
++
++ // FIXME: Intelligibility enhancer is not currently supported
++ // This filter will modify playback buffer (when calling ProcessReverseStream), but now
++ // playback buffer modifications are discarded.
++
++ webrtc::Config config;
++ config.Set<webrtc::ExtendedFilter>(new webrtc::ExtendedFilter(extended_filter));
++ config.Set<webrtc::DelayAgnostic>(new webrtc::DelayAgnostic(delay_agnostic));
++ config.Set<webrtc::ExperimentalAgc>(new webrtc::ExperimentalAgc(experimental_agc));
++ config.Set<webrtc::ExperimentalNs>(new webrtc::ExperimentalNs(experimental_ns));
++
++ webrtc::ProcessingConfig pconfig = {{
++ webrtc::StreamConfig(info->rate, info->channels, false), /* input stream */
++ webrtc::StreamConfig(info->rate, info->channels, false), /* output stream */
++ webrtc::StreamConfig(info->rate, info->channels, false), /* reverse input stream */
++ webrtc::StreamConfig(info->rate, info->channels, false), /* reverse output stream */
++ }};
++
++ auto apm = std::unique_ptr<webrtc::AudioProcessing>(webrtc::AudioProcessing::Create(config));
++ if (apm->Initialize(pconfig) != webrtc::AudioProcessing::kNoError) {
++ pw_log_error("Error initialising webrtc audio processing module");
++ return nullptr;
++ }
++
++ apm->high_pass_filter()->Enable(high_pass_filter);
++ // Always disable drift compensation since it requires drift sampling
++ apm->echo_cancellation()->enable_drift_compensation(false);
++ apm->echo_cancellation()->Enable(true);
++ // TODO: wire up supression levels to args
++ apm->echo_cancellation()->set_suppression_level(webrtc::EchoCancellation::kHighSuppression);
++ apm->noise_suppression()->set_level(webrtc::NoiseSuppression::kHigh);
++ apm->noise_suppression()->Enable(noise_suppression);
++ apm->voice_detection()->Enable(voice_detection);
++ // TODO: wire up AGC parameters to args
++ apm->gain_control()->set_analog_level_limits(0, 255);
++ apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital);
++ apm->gain_control()->Enable(gain_control);
++
++ return new impl(std::move(apm), *info);
++}
++
++static void webrtc_destroy(void *ec)
++{
++ auto impl = static_cast<struct impl *>(ec);
++
++ delete impl;
++}
++
++static int webrtc_run(void *ec, const float *rec[], const float *play[], float *out[], uint32_t n_samples)
++{
++ auto impl = static_cast<struct impl *>(ec);
++ webrtc::StreamConfig config =
++ webrtc::StreamConfig(impl->info.rate, impl->info.channels, false);
++ unsigned int num_blocks = n_samples * 1000 / impl->info.rate / 10;
++
++ if (n_samples * 1000 / impl->info.rate % 10 != 0) {
++ pw_log_error("Buffers must be multiples of 10ms in length (currently %u samples)", n_samples);
++ return -1;
++ }
++
++ for (size_t i = 0; i < num_blocks; i ++) {
++ for (size_t j = 0; j < impl->info.channels; j++) {
++ impl->play_buffer[j] = const_cast<float *>(play[j]) + config.num_frames() * i;
++ impl->rec_buffer[j] = const_cast<float *>(rec[j]) + config.num_frames() * i;
++ impl->out_buffer[j] = out[j] + config.num_frames() * i;
++ }
++ /* FIXME: ProcessReverseStream may change the playback buffer, in which
++ * case we should use that, if we ever expose the intelligibility
++ * enhancer */
++ if (impl->apm->ProcessReverseStream(impl->play_buffer.get(), config, config, impl->play_buffer.get()) !=
++ webrtc::AudioProcessing::kNoError) {
++ pw_log_error("Processing reverse stream failed");
++ }
++
++ // Extra delay introduced by multiple frames
++ impl->apm->set_stream_delay_ms((num_blocks - 1) * 10);
++
++ if (impl->apm->ProcessStream(impl->rec_buffer.get(), config, config, impl->out_buffer.get()) !=
++ webrtc::AudioProcessing::kNoError) {
++ pw_log_error("Processing stream failed");
++ }
++ }
++
++ return 0;
++}
++
++static const struct echo_cancel_info echo_cancel_webrtc_impl = {
++ .name = "webrtc",
++ .info = SPA_DICT_INIT(NULL, 0),
++ .latency = "480/48000",
++
++ .create = webrtc_create,
++ .destroy = webrtc_destroy,
++
++ .run = webrtc_run,
++};
++
++const struct echo_cancel_info *echo_cancel_webrtc = &echo_cancel_webrtc_impl;
+diff --git a/src/modules/module-echo-cancel/echo-cancel.h b/src/modules/module-echo-cancel/echo-cancel.h
+index ac83f70e4..fe011b962 100644
+--- a/src/modules/module-echo-cancel/echo-cancel.h
++++ b/src/modules/module-echo-cancel/echo-cancel.h
+@@ -22,13 +22,29 @@
+ * DEALINGS IN THE SOFTWARE.
+ */
+
++#include "config.h"
+
+ #include <spa/utils/dict.h>
+-#include <spa/utils/hook.h>
+ #include <spa/param/audio/raw.h>
+-#include <spa/support/plugin.h>
+
+ #include <pipewire/properties.h>
+
++struct echo_cancel_info {
++ const char *name;
++ const struct spa_dict info;
++ const char *latency;
++
++ void *(*create) (const struct pw_properties *args, const struct spa_audio_info_raw *info);
++ void (*destroy) (void *ec);
++
++ int (*run) (void *ec, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
++};
++
+ #define echo_cancel_create(i,...) (i)->create(__VA_ARGS__)
++#define echo_cancel_destroy(i,...) (i)->destroy(__VA_ARGS__)
+ #define echo_cancel_run(i,...) (i)->run(__VA_ARGS__)
++
++#ifdef HAVE_WEBRTC
++extern const struct echo_cancel_info *echo_cancel_webrtc;
++#endif
++extern const struct echo_cancel_info *echo_cancel_null;
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0012-Miscellanous-changes-to-account-for-lower-version-of.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0012-Miscellanous-changes-to-account-for-lower-version-of.patch
new file mode 100644
index 000000000..69731a4f1
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0012-Miscellanous-changes-to-account-for-lower-version-of.patch
@@ -0,0 +1,166 @@
+From b781a4dbb45191a4b2746d5fe12d6f907681441c Mon Sep 17 00:00:00 2001
+From: Ashok Sidipotu <ashok.sidipotu@collabora.com>
+Date: Thu, 24 Feb 2022 12:28:59 +0530
+Subject: [PATCH 12/12] Miscellanous changes to account for lower version of
+ meson in agl
+
+Upstream-Status: Inappropriate[meson version dependent]
+---
+ meson.build | 30 ++++++++++++++-------------
+ spa/plugins/audioconvert/meson.build | 4 ++--
+ spa/tests/meson.build | 2 +-
+ src/daemon/systemd/system/meson.build | 5 +----
+ src/modules/meson.build | 18 +++-------------
+ src/tests/meson.build | 6 +++---
+ 6 files changed, 26 insertions(+), 39 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index af60472f8..7106eeaad 100644
+--- a/meson.build
++++ b/meson.build
+@@ -440,25 +440,27 @@ run_target('pw-uninstalled',
+ '-v@0@'.format(pipewire_version)]
+ )
+
+-devenv = environment()
++if meson.version().version_compare('>=0.58.0')
++ devenv = environment()
+
+-builddir = meson.project_build_root()
+-srcdir = meson.project_source_root()
++ builddir = meson.build_root()
++ srcdir = meson.source_root()
+
+-devenv.set('PIPEWIRE_CONFIG_DIR', pipewire_dep.get_variable(internal: 'confdatadir'))
+-devenv.set('PIPEWIRE_MODULE_DIR', pipewire_dep.get_variable(internal: 'moduledir'))
++ devenv.set('PIPEWIRE_CONFIG_DIR', pipewire_dep.get_variable(internal: 'confdatadir'))
++ devenv.set('PIPEWIRE_MODULE_DIR', pipewire_dep.get_variable(internal: 'moduledir'))
+
+- devenv.set('SPA_PLUGIN_DIR', builddir / 'spa' / 'plugins')
+- devenv.set('SPA_DATA_DIR', srcdir / 'spa' / 'plugins')
++ devenv.set('SPA_PLUGIN_DIR', builddir / 'spa' / 'plugins')
++ devenv.set('SPA_DATA_DIR', srcdir / 'spa' / 'plugins')
+
+-devenv.set('GST_PLUGIN_PATH', builddir / 'src'/ 'gst')
++ devenv.set('GST_PLUGIN_PATH', builddir / 'src'/ 'gst')
+
+-devenv.set('ALSA_PLUGIN_DIR', builddir / 'pipewire-alsa' / 'alsa-plugins')
+-devenv.set('ACP_PATHS_DIR', srcdir / 'spa' / 'plugins' / 'alsa' / 'mixer' / 'paths')
+-devenv.set('ACP_PROFILES_DIR', srcdir / 'spa' / 'plugins' / 'alsa' / 'mixer' / 'profile-sets')
++ devenv.set('ALSA_PLUGIN_DIR', builddir / 'pipewire-alsa' / 'alsa-plugins')
++ devenv.set('ACP_PATHS_DIR', srcdir / 'spa' / 'plugins' / 'alsa' / 'mixer' / 'paths')
++ devenv.set('ACP_PROFILES_DIR', srcdir / 'spa' / 'plugins' / 'alsa' / 'mixer' / 'profile-sets')
+
+-devenv.set('LD_LIBRARY_PATH', builddir / 'pipewire-jack' / 'src')
++ devenv.set('LD_LIBRARY_PATH', builddir / 'pipewire-jack' / 'src')
+
+-devenv.set('PW_UNINSTALLED', '1')
++ devenv.set('PW_UNINSTALLED', '1')
+
+-meson.add_devenv(devenv)
++ meson.add_devenv(devenv)
++endif
+diff --git a/spa/plugins/audioconvert/meson.build b/spa/plugins/audioconvert/meson.build
+index 3aa0f3846..6f4fd968b 100644
+--- a/spa/plugins/audioconvert/meson.build
++++ b/spa/plugins/audioconvert/meson.build
+@@ -140,7 +140,7 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
+ ])
+
+ if installed_tests_enabled
+@@ -170,7 +170,7 @@ foreach a : benchmark_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir / 'audioconvert'),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
+ ])
+
+ if installed_tests_enabled
+diff --git a/spa/tests/meson.build b/spa/tests/meson.build
+index d995cfaa4..ea00a2cfe 100644
+--- a/spa/tests/meson.build
++++ b/spa/tests/meson.build
+@@ -42,7 +42,7 @@ foreach a : benchmark_apps
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
+ ]
+ )
+
+diff --git a/src/daemon/systemd/system/meson.build b/src/daemon/systemd/system/meson.build
+index b3e5f1f41..4d942c1ab 100644
+--- a/src/daemon/systemd/system/meson.build
++++ b/src/daemon/systemd/system/meson.build
+@@ -1,7 +1,4 @@
+-systemd_system_services_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir', pkgconfig_define : [ 'rootprefix', prefix])
+-if get_option('systemd-system-unit-dir') != ''
+- systemd_system_services_dir = get_option('systemd-system-unit-dir')
+-endif
++systemd_system_services_dir = systemd.get_variable(pkgconfig: 'systemdsystemunitdir', pkgconfig_define : [ 'prefix', prefix])
+
+ install_data(sources : 'pipewire.socket',
+ install_dir : systemd_system_services_dir)
+diff --git a/src/modules/meson.build b/src/modules/meson.build
+index 568b32c50..8cf4f781d 100644
+--- a/src/modules/meson.build
++++ b/src/modules/meson.build
+@@ -150,18 +150,6 @@ pipewire_module_rt = shared_library('pipewire-module-rt', [ 'module-rt.c' ],
+ endif
+ summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
+
+-build_module_rtkit = dbus_dep.found()
+-if build_module_rtkit
+-pipewire_module_rtkit = shared_library('pipewire-module-rtkit', [ 'module-rtkit.c' ],
+- include_directories : [configinc, spa_inc],
+- install : true,
+- install_dir : modules_install_dir,
+- install_rpath: modules_install_dir,
+- dependencies : [dbus_dep, mathlib, dl_lib, pipewire_dep],
+-)
+-endif
+-summary({'rt': build_module_rt}, bool_yn: true, section: 'Optional Modules')
+-
+ build_module_portal = dbus_dep.found()
+ if build_module_portal
+ pipewire_module_portal = shared_library('pipewire-module-portal', [ 'module-portal.c' ],
+@@ -372,9 +360,9 @@ test('pw-test-protocol-native',
+ install_dir : installed_tests_execdir,
+ ),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
+- 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.project_build_root()),
+- 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.project_build_root())
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
++ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.build_root()),
++ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.build_root())
+ ]
+ )
+
+diff --git a/src/tests/meson.build b/src/tests/meson.build
+index 9a595d431..1b03967fb 100644
+--- a/src/tests/meson.build
++++ b/src/tests/meson.build
+@@ -13,9 +13,9 @@ foreach a : test_apps
+ install : installed_tests_enabled,
+ install_dir : installed_tests_execdir),
+ env : [
+- 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.project_build_root()),
+- 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.project_build_root()),
+- 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.project_build_root())
++ 'SPA_PLUGIN_DIR=@0@/spa/plugins/'.format(meson.build_root()),
++ 'PIPEWIRE_CONFIG_DIR=@0@/src/daemon/'.format(meson.build_root()),
++ 'PIPEWIRE_MODULE_DIR=@0@/src/modules/'.format(meson.build_root())
+ ])
+
+ if installed_tests_enabled
+--
+2.35.1
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bb b/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bb
index f1d4b3863..c7479bec9 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bb
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bb
@@ -20,8 +20,8 @@ SECTION = "multimedia"
DEPENDS = "dbus"
-# v0.3.43
-SRCREV = "07724b7aefa8a23a016727b53f4e426ecd63d248"
+# v0.3.47
+SRCREV = "2af393889358723a2789caa3c856700b1c968ef0"
SRC_URI = "git://gitlab.freedesktop.org/pipewire/pipewire.git;branch=master;protocol=https"
S = "${WORKDIR}/git"
@@ -242,6 +242,8 @@ FILES:${PN}-dev += " \
CONFFILES:libpipewire += "${datadir}/pipewire/client.conf"
FILES:libpipewire = " \
${datadir}/pipewire/client.conf \
+ ${datadir}/pipewire/client-rt.conf \
+ ${datadir}/pipewire/minimal.conf \
${libdir}/libpipewire-*.so.* \
"
# Add the bare minimum modules and plugins required to be able
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bbappend b/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bbappend
index 8d3df64cb..8c8467b52 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.43.bbappend
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.47.bbappend
@@ -8,10 +8,17 @@ PACKAGECONFIG = "\
SRC_URI += "\
file://0001-Revert-treewide-meson.build-use-project_-build-sourc.patch \
- file://0002-Revert-treewide-meson.build-use-dependency-variable-.patch \
- file://0003-Revert-meson-declare-spa_dep-and-override_dependency.patch \
- file://0004-Revert-systemd-correctly-prefix-systemd-system-units.patch \
- file://0005-pipewiresink-set-a-default-channel-map-if-the-number.patch \
+ file://0002-Revert-treewide-meson.build-use-feature.allowed.patch \
+ file://0003-Revert-treewide-meson.build-use-dependency-variable-.patch \
+ file://0004-Revert-treewide-meson.build-simplify-get_variable-ca.patch \
+ file://0005-Revert-treewide-meson.build-get-SPA_PLUGIN_DIR-from-.patch \
+ file://0006-Revert-meson-declare-spa_dep-and-override_dependency.patch \
+ file://0007-Revert-meson-use-meson-variables-for-the-SMs-uninsta.patch \
+ file://0008-Revert-meson-declare-spa_dep-and-override_dependency.patch \
+ file://0009-Revert-test-add-test-for-the-loop.patch \
+ file://0010-Revert-spa-improve-the-AEC-interface.patch \
+ file://0011-Revert-module-echo-cancel-Move-backends-to-dynamic-l.patch \
+ file://0012-Miscellanous-changes-to-account-for-lower-version-of.patch \
"
do_install:append() {