Github messages for voidlinux
 help / color / mirror / Atom feed
* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
@ 2020-03-28 10:27 ` Duncaen
  2020-03-28 10:34 ` sirn
                   ` (60 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: Duncaen @ 2020-03-28 10:27 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 227 bytes --]

New comment by Duncaen on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-605427802

Comment:
The xdg-desktop-portal update is a pre releases and conditional patches are big no go.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
  2020-03-28 10:27 ` pipewire: update to 0.3.2 Duncaen
@ 2020-03-28 10:34 ` sirn
  2020-03-30  8:02 ` Piraty
                   ` (59 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-03-28 10:34 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 376 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-605428568

Comment:
Oh, I didn't realized it was a pre-release. I'll try to upstream the patch (given that glibc has `O_SYNC` aliased to `O_FSYNC`). Should I close this for the time being? (e.g. until xdg-desktop-portal has a pipewire-0.3 compatible release)

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
  2020-03-28 10:27 ` pipewire: update to 0.3.2 Duncaen
  2020-03-28 10:34 ` sirn
@ 2020-03-30  8:02 ` Piraty
  2020-04-05 11:28 ` [PR PATCH] [Updated] WIP: " sirn
                   ` (58 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: Piraty @ 2020-03-30  8:02 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 234 bytes --]

New comment by Piraty on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-605845530

Comment:
@sirn you can prefix the PR's title with `WIP: ` (preferred), or `NOMERGE` or mark it as draft

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (2 preceding siblings ...)
  2020-03-30  8:02 ` Piraty
@ 2020-04-05 11:28 ` sirn
  2020-04-05 11:30 ` sirn
                   ` (57 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-05 11:28 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1073 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.2
This PR updates pipewire to 0.3.2 as well as update packages that depends on it (xdg-desktop-portal to 1.7.1 and bump revision of xdg-desktop-portal-kde to force rebuild with pipewire-0.3)

xdg-desktop-portal 1.7.1 has few changes to xdg-document-portal and requires a patch to build on musl (`O_FSYNC` being undefined, see [musl's FFSYNC patch](https://git.musl-libc.org/cgit/musl/commit/?id=c1f4ed150137d793c9d07356305a89e8785e7e02)). 

Edit: on a second thought, I'm now providing `alsa-pipewire` (installs `libasound_module_pcm_pipewire.so`, so not much to configure) as well as `libjack-pipewire` and `libpulseaudio-pipewire` but still not sure what would be the best way to provide an option to replace `libpulse.so`/`libjack.so` with them. 

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 7443 bytes --]

From f6047ffd5ac99bf809fe5a71771b54749d552ae7 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/3] pipewire: update to 0.3.2

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 59 insertions(+), 17 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index 14e6c812fe2..8272c7e11f2 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.2_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..697c20c0347 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,39 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.2
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=fd1bb2ae65997d921d6c18e1828f23251dac3145bbe5031c324afeb39f9b26fb
 conf_files="/etc/pipewire/pipewire.conf"
 
+CFLAGS+="-Wformat"
+
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove usr/lib/pipewire-0.3
 	}
 }
 
@@ -28,25 +41,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +70,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove "usr/lib/libpulse-mainloop-glib-pw.so*"
+		vmove "usr/lib/libpulse-pw.so*"
+		vmove "usr/lib/libpulse-simple-pw.so*"
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove "usr/lib/alsa-lib"
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove "usr/lib/libjack-pw.so*"
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From b705425c5e4e628dabc3371dd33b1bfa3172f17d Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 2/3] xdg-desktop-portal: update to 1.7.2

---
 srcpkgs/xdg-desktop-portal/template | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..25b821f0b69 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,6 +1,6 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
-version=1.6.0
+version=1.7.2
 revision=1
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
@@ -11,7 +11,7 @@ maintainer="Duncaen <duncaen@voidlinux.org>"
 license="LGPL-2.1-or-later"
 homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
-checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
+checksum=2f2bffa93107d905b9939b844eb6c46f37267c37dc27146ab13ae429f03e629f
 
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"

From 6f95e5c599aa9ac1b0e93f6370abeb3d1086c8e5 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 3/3] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (3 preceding siblings ...)
  2020-04-05 11:28 ` [PR PATCH] [Updated] WIP: " sirn
@ 2020-04-05 11:30 ` sirn
  2020-04-18  7:53 ` [PR PATCH] [Updated] " sirn
                   ` (56 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-05 11:30 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 367 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-609401673

Comment:
I've bumped `xdg-desktop-portal` to 1.7.2 which include a fix for building under musl so conditional patch is no longer needed. It's still prerelease though, but I'll keep this PR updated until 1.8.0(?) is released. :bowing_man: 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (4 preceding siblings ...)
  2020-04-05 11:30 ` sirn
@ 2020-04-18  7:53 ` sirn
  2020-04-29 19:44 ` mnabid
                   ` (55 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-18  7:53 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1073 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.2
This PR updates pipewire to 0.3.2 as well as update packages that depends on it (xdg-desktop-portal to 1.7.1 and bump revision of xdg-desktop-portal-kde to force rebuild with pipewire-0.3)

xdg-desktop-portal 1.7.1 has few changes to xdg-document-portal and requires a patch to build on musl (`O_FSYNC` being undefined, see [musl's FFSYNC patch](https://git.musl-libc.org/cgit/musl/commit/?id=c1f4ed150137d793c9d07356305a89e8785e7e02)). 

Edit: on a second thought, I'm now providing `alsa-pipewire` (installs `libasound_module_pcm_pipewire.so`, so not much to configure) as well as `libjack-pipewire` and `libpulseaudio-pipewire` but still not sure what would be the best way to provide an option to replace `libpulse.so`/`libjack.so` with them. 

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 7443 bytes --]

From 6285fbb16f13bb54fea82aeef15c9616db27634d Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/3] pipewire: update to 0.3.2

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 59 insertions(+), 17 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index 53a59b7303b..7f23af47ca9 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3201,7 +3201,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.2_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..697c20c0347 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,39 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.2
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=fd1bb2ae65997d921d6c18e1828f23251dac3145bbe5031c324afeb39f9b26fb
 conf_files="/etc/pipewire/pipewire.conf"
 
+CFLAGS+="-Wformat"
+
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove usr/lib/pipewire-0.3
 	}
 }
 
@@ -28,25 +41,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +70,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove "usr/lib/libpulse-mainloop-glib-pw.so*"
+		vmove "usr/lib/libpulse-pw.so*"
+		vmove "usr/lib/libpulse-simple-pw.so*"
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove "usr/lib/alsa-lib"
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove "usr/lib/libjack-pw.so*"
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 40e6e8398cdb1034a339189d09e82889210e27b2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 2/3] xdg-desktop-portal: update to 1.7.2

---
 srcpkgs/xdg-desktop-portal/template | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..25b821f0b69 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,6 +1,6 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
-version=1.6.0
+version=1.7.2
 revision=1
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
@@ -11,7 +11,7 @@ maintainer="Duncaen <duncaen@voidlinux.org>"
 license="LGPL-2.1-or-later"
 homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
-checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
+checksum=2f2bffa93107d905b9939b844eb6c46f37267c37dc27146ab13ae429f03e629f
 
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"

From 770d6085921e1eb046e35d0f1454a1c1c35f2989 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 3/3] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (5 preceding siblings ...)
  2020-04-18  7:53 ` [PR PATCH] [Updated] " sirn
@ 2020-04-29 19:44 ` mnabid
  2020-04-29 19:46 ` mnabid
                   ` (54 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 19:44 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 668 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621423386

Comment:
@sirn
I rebuilt `xdg-desktop-portal` 1.6.0 with [this patch](https://github.com/flatpak/xdg-desktop-portal/commit/a38901e5e7f835efe7b7a06c55790c8c20bc91a2) and that seems to be built fine. 

God knows when **1.8.0** will be released ! `mutter-3.36` needs `libpipewire-0.3.x `, so all **gnome 3.36** updates will be stuck if pipewire can't be updated. Could you just revbump `xdg-desktop-portal` for now? I've modified [template](https://github.com/mnabid/void-packages/commit/a91e2a2a8177ad231f1f49f168b44279f5f18ec0) a bit. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (6 preceding siblings ...)
  2020-04-29 19:44 ` mnabid
@ 2020-04-29 19:46 ` mnabid
  2020-04-29 19:47 ` mnabid
                   ` (53 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 19:46 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 672 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621423386

Comment:
@sirn
I rebuilt `xdg-desktop-portal` 1.6.0 with [this patch](https://github.com/flatpak/xdg-desktop-portal/commit/a38901e5e7f835efe7b7a06c55790c8c20bc91a2) and that seems to be built fine. 

God knows when **1.8.0** will be released ! `mutter-3.36` needs `libpipewire-0.3.x `, so all **gnome 3.36** updates will be stuck if pipewire can't be updated. Could you just revbump `xdg-desktop-portal` for now? I've modified the [template](https://github.com/mnabid/void-packages/commit/a91e2a2a8177ad231f1f49f168b44279f5f18ec0) a bit. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (7 preceding siblings ...)
  2020-04-29 19:46 ` mnabid
@ 2020-04-29 19:47 ` mnabid
  2020-04-29 20:02 ` [PR PATCH] [Updated] " sirn
                   ` (52 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 19:47 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 669 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621423386

Comment:
@sirn
I rebuilt `xdg-desktop-portal` 1.6.0 with [this patch](https://github.com/flatpak/xdg-desktop-portal/commit/a38901e5e7f835efe7b7a06c55790c8c20bc91a2) and that seems to be built fine. 

God knows when **1.8.0** will be released ! `mutter-3.36` needs `libpipewire-0.3`, so all **gnome 3.36** updates will be stuck if pipewire can't be updated. Could you just revbump `xdg-desktop-portal` for now? I've modified the [template](https://github.com/mnabid/void-packages/commit/a91e2a2a8177ad231f1f49f168b44279f5f18ec0) a bit. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (8 preceding siblings ...)
  2020-04-29 19:47 ` mnabid
@ 2020-04-29 20:02 ` sirn
  2020-04-29 20:04 ` sirn
                   ` (51 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 20:02 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1073 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.2
This PR updates pipewire to 0.3.2 as well as update packages that depends on it (xdg-desktop-portal to 1.7.1 and bump revision of xdg-desktop-portal-kde to force rebuild with pipewire-0.3)

xdg-desktop-portal 1.7.1 has few changes to xdg-document-portal and requires a patch to build on musl (`O_FSYNC` being undefined, see [musl's FFSYNC patch](https://git.musl-libc.org/cgit/musl/commit/?id=c1f4ed150137d793c9d07356305a89e8785e7e02)). 

Edit: on a second thought, I'm now providing `alsa-pipewire` (installs `libasound_module_pcm_pipewire.so`, so not much to configure) as well as `libjack-pipewire` and `libpulseaudio-pipewire` but still not sure what would be the best way to provide an option to replace `libpulse.so`/`libjack.so` with them. 

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 7443 bytes --]

From 6285fbb16f13bb54fea82aeef15c9616db27634d Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/3] pipewire: update to 0.3.2

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 59 insertions(+), 17 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index 53a59b7303b..7f23af47ca9 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3201,7 +3201,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.2_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..697c20c0347 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,39 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.2
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=fd1bb2ae65997d921d6c18e1828f23251dac3145bbe5031c324afeb39f9b26fb
 conf_files="/etc/pipewire/pipewire.conf"
 
+CFLAGS+="-Wformat"
+
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove usr/lib/pipewire-0.3
 	}
 }
 
@@ -28,25 +41,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +70,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove "usr/lib/libpulse-mainloop-glib-pw.so*"
+		vmove "usr/lib/libpulse-pw.so*"
+		vmove "usr/lib/libpulse-simple-pw.so*"
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove "usr/lib/alsa-lib"
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove "usr/lib/libjack-pw.so*"
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 40e6e8398cdb1034a339189d09e82889210e27b2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 2/3] xdg-desktop-portal: update to 1.7.2

---
 srcpkgs/xdg-desktop-portal/template | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..25b821f0b69 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,6 +1,6 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
-version=1.6.0
+version=1.7.2
 revision=1
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
@@ -11,7 +11,7 @@ maintainer="Duncaen <duncaen@voidlinux.org>"
 license="LGPL-2.1-or-later"
 homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
-checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
+checksum=2f2bffa93107d905b9939b844eb6c46f37267c37dc27146ab13ae429f03e629f
 
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"

From 770d6085921e1eb046e35d0f1454a1c1c35f2989 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 3/3] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (9 preceding siblings ...)
  2020-04-29 20:02 ` [PR PATCH] [Updated] " sirn
@ 2020-04-29 20:04 ` sirn
  2020-04-29 20:09 ` sirn
                   ` (50 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 20:04 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 201 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621433367

Comment:
@mnabid I've cherry-pick pipewire from your branch. Thank you! 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (10 preceding siblings ...)
  2020-04-29 20:04 ` sirn
@ 2020-04-29 20:09 ` sirn
  2020-04-29 20:23 ` sirn
                   ` (49 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 20:09 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 222 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621433367

Comment:
@mnabid I've cherry-pick ~pipewire~ xdg-desktop-portal from your branch. Thank you! 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (11 preceding siblings ...)
  2020-04-29 20:09 ` sirn
@ 2020-04-29 20:23 ` sirn
  2020-04-29 20:32 ` mnabid
                   ` (48 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 20:23 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 363 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621442760

Comment:
@Duncaen since this PR is now building `xdg-desktop-portal` 1.6.0 with pipewire 0.3 patch, and it seems to build in all systems (& also confirmed working locally on x86_64-musl), is it possible to re-review? Thank you! :bow: 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (12 preceding siblings ...)
  2020-04-29 20:23 ` sirn
@ 2020-04-29 20:32 ` mnabid
  2020-04-29 20:37 ` sirn
                   ` (47 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 20:32 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 325 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621447056

Comment:
Now that I think about it...
`mutter-3.34` is still in the repo and needs `libpipewire-0.2`, so that'll create **unresolvable shlib** issue. I'm working on gnome 3.36 updates (#21382).

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (13 preceding siblings ...)
  2020-04-29 20:32 ` mnabid
@ 2020-04-29 20:37 ` sirn
  2020-04-29 20:38 ` mnabid
                   ` (46 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 20:37 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 590 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621450118

Comment:
Looks like so far only mutter hasn't been updated:

```
$ xbps-query -RX libpipewire
gstreamer1-pipewire-0.2.7_1
mutter-3.34.1_2
pipewire-0.2.7_1
pipewire-devel-0.2.7_1
xdg-desktop-portal-1.6.0_1
xdg-desktop-portal-kde-5.18.4.1_1
```

Is it possible to version bump just Mutter, or that requires the rest of GNOME 3.36 as well? In the latter case I guess it makes more sense that I'll close this PR and let #21382 incorporate pipewire-0.3? 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (14 preceding siblings ...)
  2020-04-29 20:37 ` sirn
@ 2020-04-29 20:38 ` mnabid
  2020-04-29 20:40 ` mnabid
                   ` (45 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 20:38 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 640 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621450613

Comment:
> Looks like so far only mutter hasn't been updated:
> 
> ```
> $ xbps-query -RX libpipewire
> gstreamer1-pipewire-0.2.7_1
> mutter-3.34.1_2
> pipewire-0.2.7_1
> pipewire-devel-0.2.7_1
> xdg-desktop-portal-1.6.0_1
> xdg-desktop-portal-kde-5.18.4.1_1
> ```
> 
> Is it possible to version bump just Mutter, or that requires the rest of GNOME 3.36 as well? In the latter case I guess it makes more sense that I'll close this PR and let #21382 incorporate pipewire-0.3?

Yeah, rest of 3.36.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (15 preceding siblings ...)
  2020-04-29 20:38 ` mnabid
@ 2020-04-29 20:40 ` mnabid
  2020-04-29 21:18 ` [PR PATCH] [Updated] " sirn
                   ` (44 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-29 20:40 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 681 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621450613

Comment:
> Looks like so far only mutter hasn't been updated:
> 
> ```
> $ xbps-query -RX libpipewire
> gstreamer1-pipewire-0.2.7_1
> mutter-3.34.1_2
> pipewire-0.2.7_1
> pipewire-devel-0.2.7_1
> xdg-desktop-portal-1.6.0_1
> xdg-desktop-portal-kde-5.18.4.1_1
> ```
> 
> Is it possible to version bump just Mutter, or that requires the rest of GNOME 3.36 as well? In the latter case I guess it makes more sense that I'll close this PR and let #21382 incorporate pipewire-0.3?

Yeah, rest of 3.36.
I tried to revbump mutter, didn't work.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (16 preceding siblings ...)
  2020-04-29 20:40 ` mnabid
@ 2020-04-29 21:18 ` sirn
  2020-04-29 21:20 ` sirn
                   ` (43 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 21:18 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1068 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.2
This PR updates pipewire to 0.3.2 as well as update packages that depends on it (xdg-desktop-portal to 1.7.1 and bump revision of xdg-desktop-portal-kde to force rebuild with pipewire-0.3)

xdg-desktop-portal 1.7.1 has few changes to xdg-document-portal and requires a patch to build on musl (`O_FSYNC` being undefined, see [musl's FFSYNC patch](https://git.musl-libc.org/cgit/musl/commit/?id=c1f4ed150137d793c9d07356305a89e8785e7e02)). 

Edit: on a second thought, I'm now providing `alsa-pipewire` (installs `libasound_module_pcm_pipewire.so`, so not much to configure) as well as `libjack-pipewire` and `libpulseaudio-pipewire` but still not sure what would be the best way to provide an option to replace `libpulse.so`/`libjack.so` with them. 

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50842 bytes --]

From bcffa68d6816ccfcd1cb5b9418fa7ecf9ddf30ed Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.2

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 59 insertions(+), 17 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index a208407b359..0b58777db72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.2_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..697c20c0347 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,39 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.2
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=fd1bb2ae65997d921d6c18e1828f23251dac3145bbe5031c324afeb39f9b26fb
 conf_files="/etc/pipewire/pipewire.conf"
 
+CFLAGS+="-Wformat"
+
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove usr/lib/pipewire-0.3
 	}
 }
 
@@ -28,25 +41,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +70,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove "usr/lib/libpulse-mainloop-glib-pw.so*"
+		vmove "usr/lib/libpulse-pw.so*"
+		vmove "usr/lib/libpulse-simple-pw.so*"
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove "usr/lib/alsa-lib"
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove "usr/lib/libjack-pw.so*"
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 6007b0cf7c3b3c59f1c787474c966ba59457c925 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 3eea0de9b0c08e078717b0ecbc9e3ba33a69daf5 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 708fa62cf95351f1b48507b14458a7c0f8af6c1f Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (17 preceding siblings ...)
  2020-04-29 21:18 ` [PR PATCH] [Updated] " sirn
@ 2020-04-29 21:20 ` sirn
  2020-04-29 21:21 ` [WIP] " sirn
                   ` (42 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 21:20 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 394 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621470496

Comment:
A patch at https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062 does seems to get mutter to built against pipewire 0.3. I'm not sure if I need to revbump something else. @mnabid do you mind testing if screencast under this patched mutter-3.34 works?

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [WIP] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (18 preceding siblings ...)
  2020-04-29 21:20 ` sirn
@ 2020-04-29 21:21 ` sirn
  2020-04-30  3:29 ` mnabid
                   ` (41 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-29 21:21 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 427 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621442760

Comment:
> ~@Duncaen since this PR is now building `xdg-desktop-portal` 1.6.0 with pipewire 0.3 patch, and it seems to build in all systems (& also confirmed working locally on x86_64-musl), is it possible to re-review? Thank you! :bow:~

Sorry for the noise. Back to WIP again because of Mutter.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [WIP] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (19 preceding siblings ...)
  2020-04-29 21:21 ` [WIP] " sirn
@ 2020-04-30  3:29 ` mnabid
  2020-04-30  3:29 ` mnabid
                   ` (40 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-30  3:29 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 167 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621591500

Comment:
Yeah, works fine. Thanks ! 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [WIP] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (20 preceding siblings ...)
  2020-04-30  3:29 ` mnabid
@ 2020-04-30  3:29 ` mnabid
  2020-04-30  4:10 ` mnabid
                   ` (39 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-30  3:29 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 173 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621591500

Comment:
@sirn Yeah, works fine. Thanks ! 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [WIP] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (21 preceding siblings ...)
  2020-04-30  3:29 ` mnabid
@ 2020-04-30  4:10 ` mnabid
  2020-04-30 20:51 ` [PR PATCH] [Updated] " sirn
                   ` (38 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-04-30  4:10 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 246 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-621591500

Comment:
@sirn Yeah, works fine. Thanks ! 

Maybe edit the PR description to match the current state of this PR. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (22 preceding siblings ...)
  2020-04-30  4:10 ` mnabid
@ 2020-04-30 20:51 ` sirn
  2020-04-30 20:52 ` sirn
                   ` (37 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-30 20:51 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.2
This PR updates `pipewire` to 0.3.2 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50987 bytes --]

From e61689ba95dc79ac203ac55d5d3c5dd7f2b93b62 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 75 ++++++++++++++++++++++++++--------
 5 files changed, 62 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index a208407b359..0b58777db72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.2_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..5f14a189e6f 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,42 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
+post_patch() {
+	# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233
+	vsed -i meson.build -e 's|.*-Werror=suggest-attribute=format.*||g'
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +44,24 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,10 +72,36 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"
 	pkg_install() {
 		vmove usr/share/doc
 	}
-}
+}
\ No newline at end of file

From fb045f236438ac4dc05427d09187c2e59c030de9 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 8749796a1cd9a8a88a6bba94f6c42e5e05f61362 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From e7495d196ca454d35bd552f3f7c1771e983a41d2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.2
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (23 preceding siblings ...)
  2020-04-30 20:51 ` [PR PATCH] [Updated] " sirn
@ 2020-04-30 20:52 ` sirn
  2020-04-30 21:02 ` [PR PATCH] [Updated] pipewire: update to 0.3.4 sirn
                   ` (36 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-30 20:52 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.2
This PR updates `pipewire` to 0.3.2 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50987 bytes --]

From 1c12b0c869252455e8d4fd37b14cce45b45c4421 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 75 ++++++++++++++++++++++++++--------
 5 files changed, 62 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..5f14a189e6f 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,42 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
+post_patch() {
+	# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233
+	vsed -i meson.build -e 's|.*-Werror=suggest-attribute=format.*||g'
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +44,24 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,10 +72,36 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"
 	pkg_install() {
 		vmove usr/share/doc
 	}
-}
+}
\ No newline at end of file

From 98e645034ab200ac8ed372a8b4fea479a355781c Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 22b52438bebe94609e24ae933ee09ae2c33e1f32 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 57525f5c7c5bb1b7b7ed4e6ab2a9af1593435fad Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (24 preceding siblings ...)
  2020-04-30 20:52 ` sirn
@ 2020-04-30 21:02 ` sirn
  2020-04-30 21:07 ` sirn
                   ` (35 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-30 21:02 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 51037 bytes --]

From a1048b9de261a2c421a781b7178e598e67918f85 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 76 ++++++++++++++++++++++++++--------
 5 files changed, 63 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..d975c40d81d 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,42 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
+post_patch() {
+	# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233
+	vsed -i meson.build -e 's|.*-Werror=suggest-attribute=format.*||g'
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +44,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+                vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,10 +73,36 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"
 	pkg_install() {
 		vmove usr/share/doc
 	}
-}
+}
\ No newline at end of file

From 0e5566fcec7ac6eababcceba689b66a5b8341ff9 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 765c1fc4dd64865b7b01a9ec782ca682863ce82f Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From e9ffc3b878df2ad44ea79fa364ba215f18b3f576 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (25 preceding siblings ...)
  2020-04-30 21:02 ` [PR PATCH] [Updated] pipewire: update to 0.3.4 sirn
@ 2020-04-30 21:07 ` sirn
  2020-04-30 21:42 ` [PR PATCH] [Updated] " sirn
                   ` (34 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-30 21:07 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 687 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-622112769

Comment:
Updated to pipewire-0.3.4 which needs removing `-Werror=suggest-attribute=format` from `meson.build` (enabled since 0.3.3). See also: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233

pipewire-0.3.4 also now provides `pw-pulse` and `pw-jack` which is a wrapper for setting `LD_LIBRARY_PATH` to pipewire's pulseaudio/JACK implementation for anyone to try out without replacing their system library. This is part of `pipewire-{pulseaudio,jack}` subtree so I install them in `libpulseaudio-pipewire` and `libjack-pipewire` respectively. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (26 preceding siblings ...)
  2020-04-30 21:07 ` sirn
@ 2020-04-30 21:42 ` sirn
  2020-05-01 10:35 ` sirn
                   ` (33 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-04-30 21:42 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50943 bytes --]

From 79ba1a1a1cdbac1c15bfc5ba46833febb88c8a04 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 74 ++++++++++++++++++++++++++--------
 5 files changed, 62 insertions(+), 17 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..1c1931b1a6d 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,42 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
 maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
+post_patch() {
+	# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233
+	vsed -i meson.build -e 's|.*-Werror=suggest-attribute=format.*||g'
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +44,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +73,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 868ae7f7272c6b30abd425dbdcf512c122085809 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From ca2692712b496fd85fb783532b6e197e4808030d Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From dc0c1053e3b0a73a33b8286b94dd02d53340e0fa Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (27 preceding siblings ...)
  2020-04-30 21:42 ` [PR PATCH] [Updated] " sirn
@ 2020-05-01 10:35 ` sirn
  2020-05-01 10:36 ` sirn
                   ` (32 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-01 10:35 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 54847 bytes --]

From 19c49156336625e3dd5244fd5d22c11407bd5d98 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |   2 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 .../patches/01-fix-format-warning.patch       |  37 ++++++
 .../patches/02-fix-spa_log_func-musl.patch    |  25 ++++
 srcpkgs/pipewire/template                     | 120 ++++++++++++------
 7 files changed, 147 insertions(+), 40 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..2d1fc3d006c 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,66 +1,108 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+        makedepends+=" libatomic-devel"
+        LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+        vlicense LICENSE
+}
+
+post_patch() {
+        # https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/233
+        vsed -i meson.build -e 's|have_neon = .*|have_neon = false|g'
+}
+
 libpipewire_package() {
-	short_desc+=" - pipewire library"
-	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
-	}
+        short_desc+=" - pipewire library"
+        pkg_install() {
+                vmove "usr/lib/libpipewire-0.3.so.*"
+                vmove "usr/lib/pipewire-0.3/*.so"
+        }
 }
 
 pipewire-devel_package() {
-	depends="libpipewire-${version}_${revision}"
-	short_desc+=" - pipewire and libspa development files"
-	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
-	}
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - pipewire and libspa development files"
+        pkg_install() {
+                vmove usr/include/pipewire-0.3
+                vmove usr/include/spa-0.2
+                vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+                vmove usr/lib/pkgconfig/libspa-0.2.pc
+                vmove usr/lib/libpipewire-0.3.so
+        }
 }
 
 libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
-	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
-	}
+        short_desc+=" - ffmpeg plugins"
+        pkg_install() {
+                vmove usr/lib/spa-0.2/ffmpeg
+        }
 }
 
 libspa-bluetooth_package() {
-	short_desc+=" - bluetooth plugins"
-	pkg_install() {
-		vmove usr/lib/spa/bluez5
-	}
+        short_desc+=" - bluetooth plugins"
+        pkg_install() {
+                vmove usr/lib/spa-0.2/bluez5
+        }
 }
 
 gstreamer1-pipewire_package() {
-	short_desc+=" - gstreamer plugin"
-	pkg_install() {
-		vmove usr/lib/gstreamer-1.0
-	}
+        short_desc+=" - gstreamer plugin"
+        pkg_install() {
+                vmove usr/lib/gstreamer-1.0
+        }
+}
+
+libpulseaudio-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - PulseAudio client library"
+        pkg_install() {
+                vmove usr/lib/pipewire-0.3/pulse
+                vmove usr/bin/pw-pulse
+        }
+}
+
+alsa-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - ALSA client library"
+        pkg_install() {
+                vmove usr/lib/alsa-lib
+        }
+}
+
+libjack-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - JACK client library"
+        pkg_install() {
+                vmove usr/lib/pipewire-0.3/jack
+                vmove usr/bin/pw-jack
+        }
 }
 
 pipewire-doc_package() {
-	archs=noarch
-	short_desc+=" - documentation"
-	pkg_install() {
-		vmove usr/share/doc
-	}
+        archs=noarch
+        short_desc+=" - documentation"
+        pkg_install() {
+                vmove usr/share/doc
+        }
 }

From 3eb77d83e0a1edd2e0bd2ebc48a0a40828be4962 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From f6e60ceb7cd1a87d7f8797b8642f58226b4e83b9 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 97b3f09ded23a98e0f5d0ff2bd97f63d409c124e Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (28 preceding siblings ...)
  2020-05-01 10:35 ` sirn
@ 2020-05-01 10:36 ` sirn
  2020-05-01 10:37 ` sirn
                   ` (31 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-01 10:36 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 54682 bytes --]

From fa6113de01d92cedd8421de67496cbe7c5d9deb6 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |   2 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 .../patches/01-fix-format-warning.patch       |  37 ++++++
 .../patches/02-fix-spa_log_func-musl.patch    |  25 ++++
 srcpkgs/pipewire/template                     | 115 ++++++++++++------
 7 files changed, 142 insertions(+), 40 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..31061aa4639 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,66 +1,103 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+        makedepends+=" libatomic-devel"
+        LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+        vlicense LICENSE
+}
+
 libpipewire_package() {
-	short_desc+=" - pipewire library"
-	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
-	}
+        short_desc+=" - pipewire library"
+        pkg_install() {
+                vmove "usr/lib/libpipewire-0.3.so.*"
+                vmove "usr/lib/pipewire-0.3/*.so"
+        }
 }
 
 pipewire-devel_package() {
-	depends="libpipewire-${version}_${revision}"
-	short_desc+=" - pipewire and libspa development files"
-	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
-	}
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - pipewire and libspa development files"
+        pkg_install() {
+                vmove usr/include/pipewire-0.3
+                vmove usr/include/spa-0.2
+                vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+                vmove usr/lib/pkgconfig/libspa-0.2.pc
+                vmove usr/lib/libpipewire-0.3.so
+        }
 }
 
 libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
-	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
-	}
+        short_desc+=" - ffmpeg plugins"
+        pkg_install() {
+                vmove usr/lib/spa-0.2/ffmpeg
+        }
 }
 
 libspa-bluetooth_package() {
-	short_desc+=" - bluetooth plugins"
-	pkg_install() {
-		vmove usr/lib/spa/bluez5
-	}
+        short_desc+=" - bluetooth plugins"
+        pkg_install() {
+                vmove usr/lib/spa-0.2/bluez5
+        }
 }
 
 gstreamer1-pipewire_package() {
-	short_desc+=" - gstreamer plugin"
-	pkg_install() {
-		vmove usr/lib/gstreamer-1.0
-	}
+        short_desc+=" - gstreamer plugin"
+        pkg_install() {
+                vmove usr/lib/gstreamer-1.0
+        }
+}
+
+libpulseaudio-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - PulseAudio client library"
+        pkg_install() {
+                vmove usr/lib/pipewire-0.3/pulse
+                vmove usr/bin/pw-pulse
+        }
+}
+
+alsa-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - ALSA client library"
+        pkg_install() {
+                vmove usr/lib/alsa-lib
+        }
+}
+
+libjack-pipewire_package() {
+        depends="libpipewire-${version}_${revision}"
+        short_desc+=" - JACK client library"
+        pkg_install() {
+                vmove usr/lib/pipewire-0.3/jack
+                vmove usr/bin/pw-jack
+        }
 }
 
 pipewire-doc_package() {
-	archs=noarch
-	short_desc+=" - documentation"
-	pkg_install() {
-		vmove usr/share/doc
-	}
+        archs=noarch
+        short_desc+=" - documentation"
+        pkg_install() {
+                vmove usr/share/doc
+        }
 }

From b2a5929a8f20b5ffd0b3045b74a0d0c68446424a Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From d51b970c68f4d3f3e8b465ac36964ef423a559fd Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 331e28c2ace5f8bda452873dcec31bd820af8d13 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (29 preceding siblings ...)
  2020-05-01 10:36 ` sirn
@ 2020-05-01 10:37 ` sirn
  2020-05-01 11:50 ` [PR PATCH] [Updated] WIP: " sirn
                   ` (30 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-01 10:37 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 388 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-622337272

Comment:
Replaced `-Wformat` and `-Werror=suggest-attribute=format` with a patch from upstream which now fixes warnings/compilation on musl. armv6l/armv7l currently failing due to [neon support](https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/235). 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (30 preceding siblings ...)
  2020-05-01 10:37 ` sirn
@ 2020-05-01 11:50 ` sirn
  2020-05-07 18:27 ` sirn
                   ` (29 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-01 11:50 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 790 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 53636 bytes --]

From e158e5265ca524d3ee166f86f41ef21e52238c64 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |  2 +-
 srcpkgs/alsa-pipewire                         |  1 +
 srcpkgs/libjack-pipewire                      |  1 +
 srcpkgs/libpulseaudio-pipewire                |  1 +
 .../patches/01-fix-format-warning.patch       | 37 ++++++++++
 .../patches/02-fix-spa_log_func-musl.patch    | 25 +++++++
 srcpkgs/pipewire/template                     | 71 ++++++++++++++-----
 7 files changed, 120 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch

diff --git a/common/shlibs b/common/shlibs
index a208407b359..07279a7bc72 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3199,7 +3199,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..763b7f9b365 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From a8f0956ea2cf8744b34ff73895ce90d0cd5ed79e Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index f26057d323a..9519abc19f6 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.4.1
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From a690faebd0e8fb453f6be22fdf181735ebe70132 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 6cd114d22c60e99fb406c054c1ee300965765dfa Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (31 preceding siblings ...)
  2020-05-01 11:50 ` [PR PATCH] [Updated] WIP: " sirn
@ 2020-05-07 18:27 ` sirn
  2020-05-09 15:10 ` sirn
                   ` (28 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-07 18:27 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 790 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 53634 bytes --]

From c8ded5e466639202af420a8fac4332fad1486997 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |  2 +-
 srcpkgs/alsa-pipewire                         |  1 +
 srcpkgs/libjack-pipewire                      |  1 +
 srcpkgs/libpulseaudio-pipewire                |  1 +
 .../patches/01-fix-format-warning.patch       | 37 ++++++++++
 .../patches/02-fix-spa_log_func-musl.patch    | 25 +++++++
 srcpkgs/pipewire/template                     | 71 ++++++++++++++-----
 7 files changed, 120 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch

diff --git a/common/shlibs b/common/shlibs
index 4bdc03e8b23..8ae2256900b 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3203,7 +3203,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..763b7f9b365 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From e0e70fc4e9cf8c74b6c575cb76ef00cd766ec118 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From f86806c3945675f280b99e5e24677e223c1cb207 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From cb24ab8ad4e7cb40fe6d6d5469c924a323e354e2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] WIP: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (32 preceding siblings ...)
  2020-05-07 18:27 ` sirn
@ 2020-05-09 15:10 ` sirn
  2020-05-09 15:22 ` sirn
                   ` (27 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-09 15:10 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 790 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

WIP: pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 55493 bytes --]

From f317d0685aff2fb60b0398f236bf0cb0f3b3c96c Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |  2 +-
 srcpkgs/alsa-pipewire                         |  1 +
 srcpkgs/libjack-pipewire                      |  1 +
 srcpkgs/libpulseaudio-pipewire                |  1 +
 .../patches/01-fix-format-warning.patch       | 37 ++++++++++
 .../patches/02-fix-spa_log_func-musl.patch    | 25 +++++++
 .../patches/03-fix-neon-compilation.patch     | 58 +++++++++++++++
 srcpkgs/pipewire/template                     | 71 ++++++++++++++-----
 8 files changed, 178 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
 create mode 100644 srcpkgs/pipewire/patches/03-fix-neon-compilation.patch

diff --git a/common/shlibs b/common/shlibs
index 8342e117092..15227d2035a 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch b/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch
new file mode 100644
index 00000000000..28d9f05b754
--- /dev/null
+++ b/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch
@@ -0,0 +1,58 @@
+From 011992e774fcb58966f567099f03943c57e66c2b Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 8 May 2020 22:12:24 +0200
+Subject: [PATCH] meson: try to compile a little NEON program to be sure
+
+Fixes #235
+---
+ meson.build | 34 ++++++++++++++++++++++++++++++----
+ 1 file changed, 30 insertions(+), 4 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index 17864da0..5a49c124 100644
+--- meson.build
++++ meson.build
+@@ -100,11 +100,37 @@ have_avx2 = cc.has_argument(avx2_args)
+
+ have_neon = false
+ if host_machine.cpu_family() == 'aarch64'
+-  neon_args = []
+-  have_neon = true
++  if cc.compiles('''
++    #include <arm_neon.h>
++    int main () {
++      float *s;
++      asm volatile(
++	"      ld1 { v0.4s }, [%[s]], #16\n"
++        "      fcvtzs v0.4s, v0.4s, #31\n"
++	: [s] "+r" (s) : :);
++    }
++    ''',
++    name : 'aarch64 Neon Support')
++      neon_args = []
++      have_neon = true
++
++  endif
+ elif cc.has_argument('-mfpu=neon')
+-  neon_args = ['-mfpu=neon']
+-  have_neon = true
++  if cc.compiles('''
++    #include <arm_neon.h>
++    int main () {
++      float *s;
++      asm volatile(
++        "      vld1.32 { q0 }, [%[s]]!\n"
++        "      vcvt.s32.f32 q0, q0, #31\n"
++	: [s] "+r" (s) : :);
++    }
++    ''',
++    args: '-mfpu=neon',
++    name : 'arm Neon Support')
++      neon_args = ['-mfpu=neon']
++      have_neon = true
++  endif
+ endif
+
+
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..763b7f9b365 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 59697e7db1d587b224ea8c68807fac32a0a8c15c Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From a3636bf73bed3671e8e781d41bba868f5acc90b5 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 1378d38d85cca63e14cd7af035f7898749e1a083 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: WIP: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (33 preceding siblings ...)
  2020-05-09 15:10 ` sirn
@ 2020-05-09 15:22 ` sirn
  2020-05-09 15:43 ` mnabid
                   ` (26 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-09 15:22 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 341 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-626191903

Comment:
Compilation on armv6l/armv7l is now fixed with a [patch from upstream](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/011992e774fcb58966f567099f03943c57e66c2b). I'm removing WIP (for now...). 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (34 preceding siblings ...)
  2020-05-09 15:22 ` sirn
@ 2020-05-09 15:43 ` mnabid
  2020-05-09 15:43 ` mnabid
                   ` (25 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-09 15:43 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 376 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-626194781

Comment:
> Compilation on armv6l/armv7l is now fixed with a [patch from upstream](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/011992e774fcb58966f567099f03943c57e66c2b). I'm removing WIP (for now...).

I tried that patch. No luck.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (35 preceding siblings ...)
  2020-05-09 15:43 ` mnabid
@ 2020-05-09 15:43 ` mnabid
  2020-05-09 15:44 ` mnabid
                   ` (24 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-09 15:43 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 382 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-626194781

Comment:
> Compilation on armv6l/armv7l is now fixed with a [patch from upstream](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/011992e774fcb58966f567099f03943c57e66c2b). I'm removing WIP (for now...).

@sirn I tried that patch. No luck.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (36 preceding siblings ...)
  2020-05-09 15:43 ` mnabid
@ 2020-05-09 15:44 ` mnabid
  2020-05-12 17:38 ` [PR PATCH] [Updated] " sirn
                   ` (23 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-09 15:44 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 382 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-626194781

Comment:
> Compilation on armv6l/armv7l is now fixed with a [patch from upstream](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/011992e774fcb58966f567099f03943c57e66c2b). I'm removing WIP (for now...).

@sirn I tried that patch. No luck.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (37 preceding siblings ...)
  2020-05-09 15:44 ` mnabid
@ 2020-05-12 17:38 ` sirn
  2020-05-12 18:08 ` sirn
                   ` (22 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-12 17:38 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 55493 bytes --]

From 1d4a46b9b117713771727e630d0805680281af2b Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                                 |  2 +-
 srcpkgs/alsa-pipewire                         |  1 +
 srcpkgs/libjack-pipewire                      |  1 +
 srcpkgs/libpulseaudio-pipewire                |  1 +
 .../patches/01-fix-format-warning.patch       | 37 ++++++++++
 .../patches/02-fix-spa_log_func-musl.patch    | 25 +++++++
 .../patches/03-fix-neon-compilation.patch     | 58 +++++++++++++++
 srcpkgs/pipewire/template                     | 71 ++++++++++++++-----
 8 files changed, 178 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 100644 srcpkgs/pipewire/patches/01-fix-format-warning.patch
 create mode 100644 srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
 create mode 100644 srcpkgs/pipewire/patches/03-fix-neon-compilation.patch

diff --git a/common/shlibs b/common/shlibs
index 580a12d9c87..7b50a83dd25 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/01-fix-format-warning.patch b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
new file mode 100644
index 00000000000..b4e8748390e
--- /dev/null
+++ b/srcpkgs/pipewire/patches/01-fix-format-warning.patch
@@ -0,0 +1,37 @@
+From 979a81a70d468d6482773521b89aaf67ce79b921 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:05:38 +0200
+Subject: [PATCH] meson: add -Wformat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+cc1: warning: ‘-Wformat-security’ ignored without ‘-Wformat’ [-Wformat-security]
+
+Fixes #234
+---
+ meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 74142587..1631e763 100644
+--- meson.build
++++ meson.build
+@@ -51,6 +51,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+@@ -68,6 +69,7 @@ if cc.get_id() == 'gcc'
+ 			'-Wsign-compare',
+ 			'-Wimplicit-fallthrough',
+ 			'-Wpointer-arith',
++			'-Wformat',
+ 			'-Wformat-security',
+ 			'-Werror=suggest-attribute=format',
+ 			'-Wmissing-braces',
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
new file mode 100644
index 00000000000..b816975a6eb
--- /dev/null
+++ b/srcpkgs/pipewire/patches/02-fix-spa_log_func-musl.patch
@@ -0,0 +1,25 @@
+From e83bf8a33f720050c7f1ec5f00530fafd5af5698 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 1 May 2020 11:18:28 +0200
+Subject: [PATCH] log: use printf attribute for log fallback
+
+Fixes #233
+---
+ spa/include/spa/support/log.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/spa/include/spa/support/log.h b/spa/include/spa/support/log.h
+index c97cc8e5..51b3e741 100644
+--- spa/include/spa/support/log.h
++++ spa/include/spa/support/log.h
+@@ -139,7 +139,7 @@ struct spa_log_methods {
+ #else
+
+ #define SPA_LOG_FUNC(name,lev)							\
+-static inline void spa_log_##name (struct spa_log *l, const char *format, ...)  \
++static inline SPA_PRINTF_FUNC(2,3) void spa_log_##name (struct spa_log *l, const char *format, ...)  \
+ {										\
+ 	if (SPA_UNLIKELY(spa_log_level_enabled(l, lev))) {			\
+ 		va_list varargs;						\
+--
+2.26.2
diff --git a/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch b/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch
new file mode 100644
index 00000000000..28d9f05b754
--- /dev/null
+++ b/srcpkgs/pipewire/patches/03-fix-neon-compilation.patch
@@ -0,0 +1,58 @@
+From 011992e774fcb58966f567099f03943c57e66c2b Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Fri, 8 May 2020 22:12:24 +0200
+Subject: [PATCH] meson: try to compile a little NEON program to be sure
+
+Fixes #235
+---
+ meson.build | 34 ++++++++++++++++++++++++++++++----
+ 1 file changed, 30 insertions(+), 4 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index 17864da0..5a49c124 100644
+--- meson.build
++++ meson.build
+@@ -100,11 +100,37 @@ have_avx2 = cc.has_argument(avx2_args)
+
+ have_neon = false
+ if host_machine.cpu_family() == 'aarch64'
+-  neon_args = []
+-  have_neon = true
++  if cc.compiles('''
++    #include <arm_neon.h>
++    int main () {
++      float *s;
++      asm volatile(
++	"      ld1 { v0.4s }, [%[s]], #16\n"
++        "      fcvtzs v0.4s, v0.4s, #31\n"
++	: [s] "+r" (s) : :);
++    }
++    ''',
++    name : 'aarch64 Neon Support')
++      neon_args = []
++      have_neon = true
++
++  endif
+ elif cc.has_argument('-mfpu=neon')
+-  neon_args = ['-mfpu=neon']
+-  have_neon = true
++  if cc.compiles('''
++    #include <arm_neon.h>
++    int main () {
++      float *s;
++      asm volatile(
++        "      vld1.32 { q0 }, [%[s]]!\n"
++        "      vcvt.s32.f32 q0, q0, #31\n"
++	: [s] "+r" (s) : :);
++    }
++    ''',
++    args: '-mfpu=neon',
++    name : 'arm Neon Support')
++      neon_args = ['-mfpu=neon']
++      have_neon = true
++  endif
+ endif
+
+
+--
+2.26.2
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..763b7f9b365 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.4
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=6a1c9c671514c84b38ce96d51823354702bc4d5dbaba12d501faa0448f892515
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 7eb801dd1937cefd473fc2325aa1a48f76558dfb Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From dd0d4a4ef98cc9dd40a1f146f83c5dfebb6b7695 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 79616eaa8fe83b5a30efff504789a32916135fe7 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (38 preceding siblings ...)
  2020-05-12 17:38 ` [PR PATCH] [Updated] " sirn
@ 2020-05-12 18:08 ` sirn
  2020-05-12 18:08 ` sirn
                   ` (21 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-12 18:08 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50839 bytes --]

From 3524da02f9cd321b740ffd841d23189ccee19530 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.4

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 58 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index 580a12d9c87..7b50a83dd25 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..7e0df31570b 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From aca77ef246d485099a6a6e1bede8203f1e0f1b21 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 057698827f923050f31549fe7829f5cc32264744 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From a701e26e7af28dc1428117efe8ca9b59d803d60f Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.4
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (39 preceding siblings ...)
  2020-05-12 18:08 ` sirn
@ 2020-05-12 18:08 ` sirn
  2020-05-22  2:19 ` pipewire: update to 0.3.5 not-chicken
                   ` (20 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-12 18:08 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.4
This PR updates `pipewire` to 0.3.4 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 50839 bytes --]

From 2f4ddc43900f7ba390928dd551f8ee3d19970b24 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.5

---
 common/shlibs                  |  2 +-
 srcpkgs/alsa-pipewire          |  1 +
 srcpkgs/libjack-pipewire       |  1 +
 srcpkgs/libpulseaudio-pipewire |  1 +
 srcpkgs/pipewire/template      | 71 ++++++++++++++++++++++++++--------
 5 files changed, 58 insertions(+), 18 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire

diff --git a/common/shlibs b/common/shlibs
index 580a12d9c87..7b50a83dd25 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.4_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..7e0df31570b 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,25 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
 libspa-ffmpeg_package() {
 	short_desc+=" - ffmpeg plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/ffmpeg
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
 	}
 }
 
@@ -57,6 +68,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 571c903aa3491913dc36a6e3ae2c29a02d9935b7 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 847d49f8b307af90ece124677a00549beb3427e2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 5a29497d9ad289cad5349c460aae7977e3523edc Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (40 preceding siblings ...)
  2020-05-12 18:08 ` sirn
@ 2020-05-22  2:19 ` not-chicken
  2020-05-22  2:45 ` sirn
                   ` (19 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: not-chicken @ 2020-05-22  2:19 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 182 bytes --]

New comment by not-chicken on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-632440944

Comment:
@sirn  It's still failing on arm* : (

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (41 preceding siblings ...)
  2020-05-22  2:19 ` pipewire: update to 0.3.5 not-chicken
@ 2020-05-22  2:45 ` sirn
  2020-05-22 18:04 ` mnabid
                   ` (18 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-22  2:45 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 344 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-632447721

Comment:
@not-chicken I noticed this also, but still haven't got a chance to take a detailed look. Strange that the NEON check program compiles but actual build says unsupported :\ Will take a look over the weekend.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (42 preceding siblings ...)
  2020-05-22  2:45 ` sirn
@ 2020-05-22 18:04 ` mnabid
  2020-05-23  9:40 ` mnabid
                   ` (17 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-22 18:04 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 589 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-632833378

Comment:
@sirn As far as I can remember, `pipewire-0.3.2` was the last one still working for `arm*`. So I tried reverting [`a81e269a`](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/a81e269a7e058f97f333a1a5c2f393ecbbb5b3dd) (partially, only **meson.build**) and I was able to build for arm again. 

Here's the [patch](https://github.com/mnabid/void-packages/commit/45537fd5e6db1e7b08018a6b21b2c46df5a27975#diff-6761ede86a57277d05036e9d5cc36295).

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (43 preceding siblings ...)
  2020-05-22 18:04 ` mnabid
@ 2020-05-23  9:40 ` mnabid
  2020-05-26 19:52 ` sirn
                   ` (16 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-23  9:40 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 590 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-632833378

Comment:
@sirn As far as I can remember, `pipewire-0.3.2` was the last one still working for `arm*`. So I tried reverting [`a81e269a`](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/a81e269a7e058f97f333a1a5c2f393ecbbb5b3dd) (partially, only **meson.build**) and I was able to build for arm* again. 

Here's the [patch](https://github.com/mnabid/void-packages/commit/45537fd5e6db1e7b08018a6b21b2c46df5a27975#diff-6761ede86a57277d05036e9d5cc36295).

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (44 preceding siblings ...)
  2020-05-23  9:40 ` mnabid
@ 2020-05-26 19:52 ` sirn
  2020-05-26 19:53 ` sirn
                   ` (15 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-26 19:52 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 902 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634242946

Comment:
> @sirn As far as I can remember, `pipewire-0.3.2` was the last one still working for `arm*`. So I tried reverting [`a81e269a`](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/a81e269a7e058f97f333a1a5c2f393ecbbb5b3dd) (partially, only **meson.build**) and I was able to build for arm* again.
> 
> Here's the [patch](https://github.com/mnabid/void-packages/commit/45537fd5e6db1e7b08018a6b21b2c46df5a27975#diff-6761ede86a57277d05036e9d5cc36295).

This one works! Though, I'm starting to wonder if we should try to enable NEON for non-`aarch64` at all, given xbps is distributing a binary package and not all armv6l/armv7l has NEON as it would probably going to segfault in some armv6l/armv7l systems if pipewire were built with NEON support by default.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (45 preceding siblings ...)
  2020-05-26 19:52 ` sirn
@ 2020-05-26 19:53 ` sirn
  2020-05-27 20:06 ` shizonic
                   ` (14 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-26 19:53 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 905 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634242946

Comment:
> @sirn As far as I can remember, `pipewire-0.3.2` was the last one still working for `arm*`. So I tried reverting [`a81e269a`](https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/a81e269a7e058f97f333a1a5c2f393ecbbb5b3dd) (partially, only **meson.build**) and I was able to build for arm* again.
> 
> Here's the [patch](https://github.com/mnabid/void-packages/commit/45537fd5e6db1e7b08018a6b21b2c46df5a27975#diff-6761ede86a57277d05036e9d5cc36295).

This one works! Though, I'm starting to wonder if we should try to enable NEON for non-`aarch64` at all, given xbps is distributing a binary package and not all armv6l/armv7l have NEON (and it would probably going to segfault in some armv6l/armv7l systems if pipewire were built with NEON support by default)

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (46 preceding siblings ...)
  2020-05-26 19:53 ` sirn
@ 2020-05-27 20:06 ` shizonic
  2020-05-27 20:07 ` shizonic
                   ` (13 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: shizonic @ 2020-05-27 20:06 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 437 bytes --]

New comment by shizonic on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634911319

Comment:
Since https://github.com/void-linux/void-packages/pull/21382 depends on this may I ask if there is still one working on? AFAIK it's the small little missing piece for the GNOME 3.36.x update. So I would really appreciate if someone focus on again.

Of course If I can help, please let me know.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (47 preceding siblings ...)
  2020-05-27 20:06 ` shizonic
@ 2020-05-27 20:07 ` shizonic
  2020-05-27 20:08 ` sirn
                   ` (12 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: shizonic @ 2020-05-27 20:07 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 448 bytes --]

New comment by shizonic on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634911319

Comment:
Since https://github.com/void-linux/void-packages/pull/21382 depends on this PR, may I ask if there is still one working on it? AFAIK it's the small little missing piece for the GNOME 3.36.x update. So I would really appreciate if someone focus on it again.

Of course, If I can help, please let me know.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (48 preceding siblings ...)
  2020-05-27 20:07 ` shizonic
@ 2020-05-27 20:08 ` sirn
  2020-05-27 20:09 ` shizonic
                   ` (11 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-27 20:08 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 163 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634912494

Comment:
I'm still working on it. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (49 preceding siblings ...)
  2020-05-27 20:08 ` sirn
@ 2020-05-27 20:09 ` shizonic
  2020-05-30  3:59 ` [PR PATCH] [Updated] " sirn
                   ` (10 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: shizonic @ 2020-05-27 20:09 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 187 bytes --]

New comment by shizonic on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-634913018

Comment:
> I'm still working on it.

Well thank you!

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (50 preceding siblings ...)
  2020-05-27 20:09 ` shizonic
@ 2020-05-30  3:59 ` sirn
  2020-05-30  4:00 ` sirn
                   ` (9 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  3:59 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.5
This PR updates `pipewire` to 0.3.5 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 63864 bytes --]

From a1dd50ac42f3fe5d36e5fb07e25df7fae1da6f43 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Tue, 28 Apr 2020 17:17:28 +0900
Subject: [PATCH 1/7] ndppd: bump to latest 0.2 series

---
 .../0002-Fixes-strerror_r-GNU-XSI.patch       | 32 ++++++++-----------
 srcpkgs/ndppd/template                        |  8 +++--
 2 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/srcpkgs/ndppd/patches/0002-Fixes-strerror_r-GNU-XSI.patch b/srcpkgs/ndppd/patches/0002-Fixes-strerror_r-GNU-XSI.patch
index 8ba9c63b4e1..0388391d50f 100644
--- a/srcpkgs/ndppd/patches/0002-Fixes-strerror_r-GNU-XSI.patch
+++ b/srcpkgs/ndppd/patches/0002-Fixes-strerror_r-GNU-XSI.patch
@@ -1,30 +1,25 @@
-From 1f610129b475b417509b251e022ad46d2210ff50 Mon Sep 17 00:00:00 2001
-From: Rafael Cossovan <navossoc@gmail.com>
-Date: Tue, 3 Apr 2018 17:04:35 -0300
-Subject: [PATCH 2/3] Fixes strerror_r GNU/XSI issue #40.
- http://www.zverovich.net/2015/03/13/reliable-detection-of-strerror-variants.html
-
----
- src/logger.cc | 14 ++++++++++++-
- src/logger.h  |  3 +++
- 2 files changed, 15 insertions(+), 1 deletions(-)
-
 diff --git a/src/logger.cc b/src/logger.cc
-index 6ddbea9..6ccb2a0 100644
+index 6ddbea9..9a04b8a 100644
 --- a/src/logger.cc
 +++ b/src/logger.cc
-@@ -84,6 +84,6 @@ std::string logger::err()
- {
+@@ -85,11 +85,11 @@ std::string logger::err()
      char buf[2048];
+ 
+ #if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE
+-    if (strerror_r(errno, buf, sizeof(buf))
++    if (strerror_r_wrapper(strerror_r(errno, buf, sizeof(buf))), buf)
+         return "Unknown error";
+     return buf;
+ #else
 -    return strerror_r(errno, buf, sizeof(buf));
 +    return strerror_r_wrapper(strerror_r(errno, buf, sizeof(buf)), buf);
+ #endif
  }
  
- logger logger::error()
-@@ -221,4 +221,16 @@ 
+@@ -228,4 +228,16 @@ bool logger::verbosity(const std::string& name)
      return false;
  }
-
+ 
 +// XSI-compliant: int
 +std::string logger::strerror_r_wrapper(int, char* s)
 +{
@@ -42,7 +37,7 @@ diff --git a/src/logger.h b/src/logger.h
 index 7d3d7db..0446595 100644
 --- a/src/logger.h
 +++ b/src/logger.h
-@@ -91,6 +91,9 @@ class logger {
+@@ -91,6 +91,9 @@ private:
  
      static int _max_pri;
  
@@ -52,4 +47,3 @@ index 7d3d7db..0446595 100644
  
  };
  
-
diff --git a/srcpkgs/ndppd/template b/srcpkgs/ndppd/template
index 48f78c040ab..c043d909629 100644
--- a/srcpkgs/ndppd/template
+++ b/srcpkgs/ndppd/template
@@ -1,14 +1,16 @@
 # Template file for 'ndppd'
 pkgname=ndppd
-version=0.2.5
+version=0.2.5.git20191215
+_version=2eb55c8e2b122998800bef871d6217ea0c932ec6
 revision=1
 build_style=gnu-makefile
 short_desc="NDP Proxy Daemon"
 maintainer="lemmi <lemmi@nerd2nerd.org>"
 license="GPL-3.0-or-later"
 homepage="https://github.com/DanielAdolfsson/ndppd"
-distfiles="https://github.com/DanielAdolfsson/ndppd/archive/${version}.tar.gz"
-checksum=ee934167f8357f0bd0015e201a77fbe4d028c59e89dc98113805c6855e1c3992
+distfiles="https://github.com/DanielAdolfsson/ndppd/archive/${_version}.tar.gz"
+checksum=cd0929ddfa37638ff786a7f38b84eb21fe2098c490af336a4c93fa3372e2b883
+wrksrc="${pkgname}-${_version}"
 patch_args="-Np1"
 
 do_install() {

From 4e31a11e9b888de6137f3e8156e245c32125f6bd Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Wed, 29 Apr 2020 01:13:48 +0900
Subject: [PATCH 2/7] grub: add zfs rpool detection patch

---
 srcpkgs/grub/patches/linux-rpool-detect.patch | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 srcpkgs/grub/patches/linux-rpool-detect.patch

diff --git a/srcpkgs/grub/patches/linux-rpool-detect.patch b/srcpkgs/grub/patches/linux-rpool-detect.patch
new file mode 100644
index 00000000000..281393cb32b
--- /dev/null
+++ b/srcpkgs/grub/patches/linux-rpool-detect.patch
@@ -0,0 +1,14 @@
+Patches rpool detection since grub-probe may not be able to detect
+zfs filesystem with certain flags.
+--- util/grub.d/10_linux.in	2018-11-25 02:13:02.000000000 +0900
++++ util/grub.d/10_linux.in	2020-04-29 00:38:53.091231269 +0900
+@@ -72,6 +72,9 @@
+ 	fi;;
+     xzfs)
+ 	rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
++	if [ -z "${rpool}" ] && command -v zdb >/dev/null; then
++		rpool=`zdb -l ${GRUB_DEVICE} |grep " name:" | cut -d\' -f2`
++	fi
+ 	bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
+ 	LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}"
+ 	;;

From 911105c971b04636e4d7cd9f55be21ace2bf3ee5 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sun, 17 May 2020 07:21:31 +0900
Subject: [PATCH 3/7] plasma-applet-caffeine-plus: new package

---
 .../patches/00_add_system_tray_support.patch  | 24 +++++++++++++++++++
 srcpkgs/plasma-applet-caffeine-plus/template  | 12 ++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 srcpkgs/plasma-applet-caffeine-plus/patches/00_add_system_tray_support.patch
 create mode 100644 srcpkgs/plasma-applet-caffeine-plus/template

diff --git a/srcpkgs/plasma-applet-caffeine-plus/patches/00_add_system_tray_support.patch b/srcpkgs/plasma-applet-caffeine-plus/patches/00_add_system_tray_support.patch
new file mode 100644
index 00000000000..d74f9eb3810
--- /dev/null
+++ b/srcpkgs/plasma-applet-caffeine-plus/patches/00_add_system_tray_support.patch
@@ -0,0 +1,24 @@
+From f2159d95fc843263f600861f9e7429737f508e8a Mon Sep 17 00:00:00 2001
+From: properlypurple <40858144+properlypurple@users.noreply.github.com>
+Date: Wed, 22 Apr 2020 15:15:21 +0530
+Subject: [PATCH] Update metadata.desktop
+
+Add option to show plasmoid in notification area(system tray)
+---
+ plasmoid/metadata.desktop | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/plasmoid/metadata.desktop b/plasmoid/metadata.desktop
+index d1c7e08..620eff8 100644
+--- plasmoid/metadata.desktop
++++ plasmoid/metadata.desktop
+@@ -15,4 +15,7 @@ X-KDE-PluginInfo-Website=plasma.kde.org
+ X-Plasma-API=declarativeappletscript
+ X-Plasma-MainScript=ui/main.qml
+ X-KDE-PluginInfo-Category=Miscellaneous
+-X-KDE-PluginInfo-EnabledByDefault=true
+\ No newline at end of file
++X-KDE-PluginInfo-EnabledByDefault=true
++
++X-Plasma-NotificationArea=true
++X-Plasma-NotificationAreaCategory=Hardware
diff --git a/srcpkgs/plasma-applet-caffeine-plus/template b/srcpkgs/plasma-applet-caffeine-plus/template
new file mode 100644
index 00000000000..ff2518b0d6e
--- /dev/null
+++ b/srcpkgs/plasma-applet-caffeine-plus/template
@@ -0,0 +1,12 @@
+pkgname=plasma-applet-caffeine-plus
+version=1.4
+revision=1
+build_style=cmake
+hostmakedepends="extra-cmake-modules"
+makedepends="plasma-framework-devel kdeclarative-devel"
+short_desc="Disable screensaver and auto suspend"
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="GPL-2.0"
+homepage="https://github.com/qunxyz/plasma-applet-caffeine-plus"
+distfiles="https://github.com/qunxyz/plasma-applet-caffeine-plus/archive/v${version}.tar.gz"
+checksum=f15ac283d5adbdbd909dc76b258aa406b7ba05d0156bef76c9632ef7da67ce8f

From 5088a5683dc8d74ce6a0fe9abd299ea130686237 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 4/7] pipewire: update to 0.3.5

---
 common/shlibs                                 |  14 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 srcpkgs/libspa-alsa                           |   1 +
 srcpkgs/libspa-audioconvert                   |   1 +
 srcpkgs/libspa-audiomixer                     |   1 +
 srcpkgs/libspa-control                        |   1 +
 srcpkgs/libspa-jack                           |   1 +
 srcpkgs/libspa-v4l2                           |   1 +
 srcpkgs/libspa-videoconvert                   |   1 +
 srcpkgs/libspa-vulkan                         |   1 +
 .../pipewire/patches/fix-neon-detection.patch |  52 +++++++
 srcpkgs/pipewire/template                     | 131 +++++++++++++++---
 14 files changed, 188 insertions(+), 20 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 120000 srcpkgs/libspa-alsa
 create mode 120000 srcpkgs/libspa-audioconvert
 create mode 120000 srcpkgs/libspa-audiomixer
 create mode 120000 srcpkgs/libspa-control
 create mode 120000 srcpkgs/libspa-jack
 create mode 120000 srcpkgs/libspa-v4l2
 create mode 120000 srcpkgs/libspa-videoconvert
 create mode 120000 srcpkgs/libspa-vulkan
 create mode 100644 srcpkgs/pipewire/patches/fix-neon-detection.patch

diff --git a/common/shlibs b/common/shlibs
index 22e35e26882..7cd9a711214 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.5_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
@@ -3433,6 +3433,18 @@ libcss_parser.so.0 htmlcxx-0.86_1
 libaom.so.0 libaom-1.0.0_1
 libre.so re-0.5.8_1
 libspandsp.so.2 spandsp-0.0.6_1
+libspa-alsa.so libspa-alsa-0.3.5_1
+libspa-audioconvert.so libspa-audioconvert-0.3.5_1
+libspa-audiomixer.so libspa-audiomixer-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-control.so libspa-control-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
+libspa-jack.so libspa-jack-0.3.5_1
+libspa-v4l2.so libspa-v4l2-0.3.5_1
+libspa-videoconvert.so libspa-videoconvert-0.3.5_1
+libspa-vulkan.so libspa-vulkan-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
 librem.so rem-0.5.3_1
 libshp.so.1 shapelib-1.4.1_1
 libantlr3c.so libantlr3c-3.4_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-alsa b/srcpkgs/libspa-alsa
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-alsa
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audioconvert b/srcpkgs/libspa-audioconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audioconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audiomixer b/srcpkgs/libspa-audiomixer
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audiomixer
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-control b/srcpkgs/libspa-control
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-control
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-jack b/srcpkgs/libspa-jack
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-jack
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-v4l2 b/srcpkgs/libspa-v4l2
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-v4l2
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-videoconvert b/srcpkgs/libspa-videoconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-videoconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-vulkan b/srcpkgs/libspa-vulkan
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-vulkan
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/fix-neon-detection.patch b/srcpkgs/pipewire/patches/fix-neon-detection.patch
new file mode 100644
index 00000000000..9dcc90fab36
--- /dev/null
+++ b/srcpkgs/pipewire/patches/fix-neon-detection.patch
@@ -0,0 +1,52 @@
+diff --git meson.build meson.build
+index 29b4b892..0d048a1f 100644
+--- meson.build
++++ meson.build
+@@ -99,37 +99,16 @@ have_avx = cc.has_argument(avx_args)
+ have_avx2 = cc.has_argument(avx2_args)
+ 
+ have_neon = false
+-if host_machine.cpu_family() == 'aarch64'
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-	"      ld1 { v0.4s }, [%[s]], #16\n"
+-        "      fcvtzs v0.4s, v0.4s, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    name : 'aarch64 Neon Support')
+-      neon_args = []
+-      have_neon = true
+-
+-  endif
+-elif cc.has_argument('-mfpu=neon')
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-        "      vld1.32 { q0 }, [%[s]]!\n"
+-        "      vcvt.s32.f32 q0, q0, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    args: '-mfpu=neon',
+-    name : 'arm Neon Support')
+-      neon_args = ['-mfpu=neon']
+-      have_neon = true
++if host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64'
++  if cc.compiles(
++'''
++#include <arm_neon.h>
++int32x4_t testfunc(int16_t *a, int16_t *b) {
++return vmull_s16(vld1_s16(a), vld1_s16(b));
++}
++''',
++   name : 'NEON support')
++    have_neon = true
+   endif
+ endif
+ 
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..d2dec8f4695 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,81 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
-libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
+libspa-alsa_package() {
+	short_desc+=" - alsa plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/alsa
+	}
+}
+
+libspa-audioconvert_package() {
+	short_desc+=" - audioconvert plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/audioconvert
+	}
+}
+
+libspa-audiomixer_package() {
+	short_desc+=" - audiomixer plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/audiomixer
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
+	}
+}
+
+libspa-control_package() {
+	short_desc+=" - control plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/control
+	}
+}
+
+libspa-ffmpeg_package() {
+	short_desc+=" - ffmpeg plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/ffmpeg
+	}
+}
+
+libspa-jack_package() {
+	short_desc+=" - jack plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/jack
+	}
+}
+
+libspa-v4l2_package() {
+	short_desc+=" - v4l2 plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/v4l2
+	}
+}
+
+libspa-videoconvert_package() {
+	short_desc+=" - videoconvert plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/videoconvert
+	}
+}
+
+libspa-vulkan_package() {
+	short_desc+=" - vulkan plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/vulkan
 	}
 }
 
@@ -57,6 +124,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 3216614fbc23b6ee50866db5be38a1608b599bcf Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 5/7] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 97e40153eb6f690f13ee39bea43b8fa744a289b2 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 6/7] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From b4ad9a35001a94f16b918aea85a230396024363f Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 7/7] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (51 preceding siblings ...)
  2020-05-30  3:59 ` [PR PATCH] [Updated] " sirn
@ 2020-05-30  4:00 ` sirn
  2020-05-30  4:01 ` [PR PATCH] [Updated] " sirn
                   ` (8 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  4:00 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 228 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636271504

Comment:
Updated to include a patch from @mnabid & split libspa into its own package per @ifreund. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (52 preceding siblings ...)
  2020-05-30  4:00 ` sirn
@ 2020-05-30  4:01 ` sirn
  2020-05-30  4:28 ` sirn
                   ` (7 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  4:01 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.5
This PR updates `pipewire` to 0.3.5 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 56850 bytes --]

From dd30218de259038456966d41721e4cfc2aeef102 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.5

---
 common/shlibs                                 |  14 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 srcpkgs/libspa-alsa                           |   1 +
 srcpkgs/libspa-audioconvert                   |   1 +
 srcpkgs/libspa-audiomixer                     |   1 +
 srcpkgs/libspa-control                        |   1 +
 srcpkgs/libspa-jack                           |   1 +
 srcpkgs/libspa-v4l2                           |   1 +
 srcpkgs/libspa-videoconvert                   |   1 +
 srcpkgs/libspa-vulkan                         |   1 +
 .../pipewire/patches/fix-neon-detection.patch |  52 +++++++
 srcpkgs/pipewire/template                     | 131 +++++++++++++++---
 14 files changed, 188 insertions(+), 20 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 120000 srcpkgs/libspa-alsa
 create mode 120000 srcpkgs/libspa-audioconvert
 create mode 120000 srcpkgs/libspa-audiomixer
 create mode 120000 srcpkgs/libspa-control
 create mode 120000 srcpkgs/libspa-jack
 create mode 120000 srcpkgs/libspa-v4l2
 create mode 120000 srcpkgs/libspa-videoconvert
 create mode 120000 srcpkgs/libspa-vulkan
 create mode 100644 srcpkgs/pipewire/patches/fix-neon-detection.patch

diff --git a/common/shlibs b/common/shlibs
index 22e35e26882..7cd9a711214 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.5_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
@@ -3433,6 +3433,18 @@ libcss_parser.so.0 htmlcxx-0.86_1
 libaom.so.0 libaom-1.0.0_1
 libre.so re-0.5.8_1
 libspandsp.so.2 spandsp-0.0.6_1
+libspa-alsa.so libspa-alsa-0.3.5_1
+libspa-audioconvert.so libspa-audioconvert-0.3.5_1
+libspa-audiomixer.so libspa-audiomixer-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-control.so libspa-control-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
+libspa-jack.so libspa-jack-0.3.5_1
+libspa-v4l2.so libspa-v4l2-0.3.5_1
+libspa-videoconvert.so libspa-videoconvert-0.3.5_1
+libspa-vulkan.so libspa-vulkan-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
 librem.so rem-0.5.3_1
 libshp.so.1 shapelib-1.4.1_1
 libantlr3c.so libantlr3c-3.4_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-alsa b/srcpkgs/libspa-alsa
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-alsa
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audioconvert b/srcpkgs/libspa-audioconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audioconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audiomixer b/srcpkgs/libspa-audiomixer
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audiomixer
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-control b/srcpkgs/libspa-control
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-control
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-jack b/srcpkgs/libspa-jack
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-jack
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-v4l2 b/srcpkgs/libspa-v4l2
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-v4l2
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-videoconvert b/srcpkgs/libspa-videoconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-videoconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-vulkan b/srcpkgs/libspa-vulkan
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-vulkan
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/fix-neon-detection.patch b/srcpkgs/pipewire/patches/fix-neon-detection.patch
new file mode 100644
index 00000000000..9dcc90fab36
--- /dev/null
+++ b/srcpkgs/pipewire/patches/fix-neon-detection.patch
@@ -0,0 +1,52 @@
+diff --git meson.build meson.build
+index 29b4b892..0d048a1f 100644
+--- meson.build
++++ meson.build
+@@ -99,37 +99,16 @@ have_avx = cc.has_argument(avx_args)
+ have_avx2 = cc.has_argument(avx2_args)
+ 
+ have_neon = false
+-if host_machine.cpu_family() == 'aarch64'
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-	"      ld1 { v0.4s }, [%[s]], #16\n"
+-        "      fcvtzs v0.4s, v0.4s, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    name : 'aarch64 Neon Support')
+-      neon_args = []
+-      have_neon = true
+-
+-  endif
+-elif cc.has_argument('-mfpu=neon')
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-        "      vld1.32 { q0 }, [%[s]]!\n"
+-        "      vcvt.s32.f32 q0, q0, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    args: '-mfpu=neon',
+-    name : 'arm Neon Support')
+-      neon_args = ['-mfpu=neon']
+-      have_neon = true
++if host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64'
++  if cc.compiles(
++'''
++#include <arm_neon.h>
++int32x4_t testfunc(int16_t *a, int16_t *b) {
++return vmull_s16(vld1_s16(a), vld1_s16(b));
++}
++''',
++   name : 'NEON support')
++    have_neon = true
+   endif
+ endif
+ 
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..d2dec8f4695 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,81 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
-libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
+libspa-alsa_package() {
+	short_desc+=" - alsa plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/alsa
+	}
+}
+
+libspa-audioconvert_package() {
+	short_desc+=" - audioconvert plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/audioconvert
+	}
+}
+
+libspa-audiomixer_package() {
+	short_desc+=" - audiomixer plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/audiomixer
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
+	}
+}
+
+libspa-control_package() {
+	short_desc+=" - control plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/control
+	}
+}
+
+libspa-ffmpeg_package() {
+	short_desc+=" - ffmpeg plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/ffmpeg
+	}
+}
+
+libspa-jack_package() {
+	short_desc+=" - jack plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/jack
+	}
+}
+
+libspa-v4l2_package() {
+	short_desc+=" - v4l2 plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/v4l2
+	}
+}
+
+libspa-videoconvert_package() {
+	short_desc+=" - videoconvert plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/videoconvert
+	}
+}
+
+libspa-vulkan_package() {
+	short_desc+=" - vulkan plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/vulkan
 	}
 }
 
@@ -57,6 +124,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 01ba6c08e4b8771c07d3a69304ecbf11935c70d3 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From ba494b7870b185376d221f2c99998f5dcd3dca5a Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 47acc1f91875d6478faa78685a340e4b999de025 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (53 preceding siblings ...)
  2020-05-30  4:01 ` [PR PATCH] [Updated] " sirn
@ 2020-05-30  4:28 ` sirn
  2020-05-30  4:33 ` not-chicken
                   ` (6 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  4:28 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.5
This PR updates `pipewire` to 0.3.5 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 56863 bytes --]

From 048c68d9c3c188854abe7a48f275115ded29d40a Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.5

---
 common/shlibs                                 |  14 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 srcpkgs/libspa-alsa                           |   1 +
 srcpkgs/libspa-audioconvert                   |   1 +
 srcpkgs/libspa-audiomixer                     |   1 +
 srcpkgs/libspa-control                        |   1 +
 srcpkgs/libspa-jack                           |   1 +
 srcpkgs/libspa-v4l2                           |   1 +
 srcpkgs/libspa-videoconvert                   |   1 +
 srcpkgs/libspa-vulkan                         |   1 +
 .../pipewire/patches/fix-neon-detection.patch |  52 +++++++
 srcpkgs/pipewire/template                     | 131 +++++++++++++++---
 14 files changed, 188 insertions(+), 20 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 120000 srcpkgs/libspa-alsa
 create mode 120000 srcpkgs/libspa-audioconvert
 create mode 120000 srcpkgs/libspa-audiomixer
 create mode 120000 srcpkgs/libspa-control
 create mode 120000 srcpkgs/libspa-jack
 create mode 120000 srcpkgs/libspa-v4l2
 create mode 120000 srcpkgs/libspa-videoconvert
 create mode 120000 srcpkgs/libspa-vulkan
 create mode 100644 srcpkgs/pipewire/patches/fix-neon-detection.patch

diff --git a/common/shlibs b/common/shlibs
index 22e35e26882..7cd9a711214 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3204,7 +3204,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.5_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
@@ -3433,6 +3433,18 @@ libcss_parser.so.0 htmlcxx-0.86_1
 libaom.so.0 libaom-1.0.0_1
 libre.so re-0.5.8_1
 libspandsp.so.2 spandsp-0.0.6_1
+libspa-alsa.so libspa-alsa-0.3.5_1
+libspa-audioconvert.so libspa-audioconvert-0.3.5_1
+libspa-audiomixer.so libspa-audiomixer-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-control.so libspa-control-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
+libspa-jack.so libspa-jack-0.3.5_1
+libspa-v4l2.so libspa-v4l2-0.3.5_1
+libspa-videoconvert.so libspa-videoconvert-0.3.5_1
+libspa-vulkan.so libspa-vulkan-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
 librem.so rem-0.5.3_1
 libshp.so.1 shapelib-1.4.1_1
 libantlr3c.so libantlr3c-3.4_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-alsa b/srcpkgs/libspa-alsa
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-alsa
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audioconvert b/srcpkgs/libspa-audioconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audioconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audiomixer b/srcpkgs/libspa-audiomixer
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audiomixer
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-control b/srcpkgs/libspa-control
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-control
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-jack b/srcpkgs/libspa-jack
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-jack
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-v4l2 b/srcpkgs/libspa-v4l2
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-v4l2
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-videoconvert b/srcpkgs/libspa-videoconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-videoconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-vulkan b/srcpkgs/libspa-vulkan
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-vulkan
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/fix-neon-detection.patch b/srcpkgs/pipewire/patches/fix-neon-detection.patch
new file mode 100644
index 00000000000..c56a5238982
--- /dev/null
+++ b/srcpkgs/pipewire/patches/fix-neon-detection.patch
@@ -0,0 +1,52 @@
+diff --git meson.build meson.build
+index 29b4b892..0d048a1f 100644
+--- meson.build
++++ meson.build
+@@ -99,36 +99,16 @@ have_avx = cc.has_argument(avx_args)
+ have_avx2 = cc.has_argument(avx2_args)
+
+ have_neon = false
+-if host_machine.cpu_family() == 'aarch64'
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-	"      ld1 { v0.4s }, [%[s]], #16\n"
+-        "      fcvtzs v0.4s, v0.4s, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    name : 'aarch64 Neon Support')
+-      neon_args = []
+-      have_neon = true
+-
+-  endif
+-elif cc.has_argument('-mfpu=neon')
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-        "      vld1.32 { q0 }, [%[s]]!\n"
+-        "      vcvt.s32.f32 q0, q0, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    args: '-mfpu=neon',
+-    name : 'arm Neon Support')
+-      neon_args = ['-mfpu=neon']
+-      have_neon = true
++neon_args = []
++if host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64'
++  if cc.compiles(
++'''
++#include <arm_neon.h>
++int32x4_t testfunc(int16_t *a, int16_t *b) {
++return vmull_s16(vld1_s16(a), vld1_s16(b));
++}
++''',
++   name : 'NEON support')
++    have_neon = true
+   endif
+ endif
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..d2dec8f4695 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,81 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
-libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
+libspa-alsa_package() {
+	short_desc+=" - alsa plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/alsa
+	}
+}
+
+libspa-audioconvert_package() {
+	short_desc+=" - audioconvert plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/audioconvert
+	}
+}
+
+libspa-audiomixer_package() {
+	short_desc+=" - audiomixer plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/audiomixer
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
+	}
+}
+
+libspa-control_package() {
+	short_desc+=" - control plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/control
+	}
+}
+
+libspa-ffmpeg_package() {
+	short_desc+=" - ffmpeg plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/ffmpeg
+	}
+}
+
+libspa-jack_package() {
+	short_desc+=" - jack plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/jack
+	}
+}
+
+libspa-v4l2_package() {
+	short_desc+=" - v4l2 plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/v4l2
+	}
+}
+
+libspa-videoconvert_package() {
+	short_desc+=" - videoconvert plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/videoconvert
+	}
+}
+
+libspa-vulkan_package() {
+	short_desc+=" - vulkan plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/vulkan
 	}
 }
 
@@ -57,6 +124,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 9bf14003b2808a8d7b44c62ee345f52c54121d37 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 006814f0b08e0413124062071a6e1b29749f4255 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 07c341dcb3a2b0a00d9dbe072f5f4996a99ce82d Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (54 preceding siblings ...)
  2020-05-30  4:28 ` sirn
@ 2020-05-30  4:33 ` not-chicken
  2020-05-30  4:50 ` [PR PATCH] [Updated] " sirn
                   ` (5 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: not-chicken @ 2020-05-30  4:33 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 399 bytes --]

New comment by not-chicken on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636274514

Comment:
I don't know anything about arm, neon, etc but unless the detection fails due to something void specific maybe it's worth reopening https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/235 
In the meantime, I think it's fine to roll with the patch.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PR PATCH] [Updated] pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (55 preceding siblings ...)
  2020-05-30  4:33 ` not-chicken
@ 2020-05-30  4:50 ` sirn
  2020-05-30  5:11 ` sirn
                   ` (4 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  4:50 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 785 bytes --]

There is an updated pull request by sirn against master on the void-packages repository

https://github.com/sirn/void-packages pipewire-update
https://github.com/void-linux/void-packages/pull/20413

pipewire: update to 0.3.5
This PR updates `pipewire` to 0.3.5 and also updating/patching all packages that depends on it. 

* `xdg-desktop-portal` includes a patch backported from 1.7.0 to allow 1.6.0 to build against pipewire-0.3 (1.7.x is prerelease)
* `xdg-desktop-portal-kde` already includes Pipewire 0.3 support and only requires revbump.
* `mutter` includes a patch backported from 3.35 to allow 3.34 to build against pipewire-0.3 (upgrading to >=3.35 also requires upgrading GNOME).

A patch file from https://github.com/void-linux/void-packages/pull/20413.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-pipewire-update-20413.patch --]
[-- Type: text/x-diff, Size: 56863 bytes --]

From d3ae4a35851da52a3f98b149c6adf1d9e8f3b23c Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:23:52 +0900
Subject: [PATCH 1/4] pipewire: update to 0.3.5

---
 common/shlibs                                 |  14 +-
 srcpkgs/alsa-pipewire                         |   1 +
 srcpkgs/libjack-pipewire                      |   1 +
 srcpkgs/libpulseaudio-pipewire                |   1 +
 srcpkgs/libspa-alsa                           |   1 +
 srcpkgs/libspa-audioconvert                   |   1 +
 srcpkgs/libspa-audiomixer                     |   1 +
 srcpkgs/libspa-control                        |   1 +
 srcpkgs/libspa-jack                           |   1 +
 srcpkgs/libspa-v4l2                           |   1 +
 srcpkgs/libspa-videoconvert                   |   1 +
 srcpkgs/libspa-vulkan                         |   1 +
 .../pipewire/patches/fix-neon-detection.patch |  52 +++++++
 srcpkgs/pipewire/template                     | 131 +++++++++++++++---
 14 files changed, 188 insertions(+), 20 deletions(-)
 create mode 120000 srcpkgs/alsa-pipewire
 create mode 120000 srcpkgs/libjack-pipewire
 create mode 120000 srcpkgs/libpulseaudio-pipewire
 create mode 120000 srcpkgs/libspa-alsa
 create mode 120000 srcpkgs/libspa-audioconvert
 create mode 120000 srcpkgs/libspa-audiomixer
 create mode 120000 srcpkgs/libspa-control
 create mode 120000 srcpkgs/libspa-jack
 create mode 120000 srcpkgs/libspa-v4l2
 create mode 120000 srcpkgs/libspa-videoconvert
 create mode 120000 srcpkgs/libspa-vulkan
 create mode 100644 srcpkgs/pipewire/patches/fix-neon-detection.patch

diff --git a/common/shlibs b/common/shlibs
index f5c5bed6b93..1192273a66d 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3278,7 +3278,7 @@ libarcan_shmif_ext.so.0.11 arcan-0.5.4.3_1
 libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
-libpipewire-0.2.so.1 libpipewire-0.2.2_1
+libpipewire-0.3.so.0 libpipewire-0.3.5_1
 libvolk.so.2.2.1 volk-2.2.1_1
 libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
@@ -3507,6 +3507,18 @@ libcss_parser.so.0 htmlcxx-0.86_1
 libaom.so.0 libaom-1.0.0_1
 libre.so re-0.5.8_1
 libspandsp.so.2 spandsp-0.0.6_1
+libspa-alsa.so libspa-alsa-0.3.5_1
+libspa-audioconvert.so libspa-audioconvert-0.3.5_1
+libspa-audiomixer.so libspa-audiomixer-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-control.so libspa-control-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
+libspa-jack.so libspa-jack-0.3.5_1
+libspa-v4l2.so libspa-v4l2-0.3.5_1
+libspa-videoconvert.so libspa-videoconvert-0.3.5_1
+libspa-vulkan.so libspa-vulkan-0.3.5_1
+libspa-bluez5.so libspa-bluetooth-0.3.5_1
+libspa-ffmpeg.so libspa-ffmpeg-0.3.5_1
 librem.so rem-0.5.3_1
 libshp.so.1 shapelib-1.4.1_1
 libantlr3c.so libantlr3c-3.4_1
diff --git a/srcpkgs/alsa-pipewire b/srcpkgs/alsa-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/alsa-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libjack-pipewire b/srcpkgs/libjack-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libjack-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libpulseaudio-pipewire b/srcpkgs/libpulseaudio-pipewire
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libpulseaudio-pipewire
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-alsa b/srcpkgs/libspa-alsa
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-alsa
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audioconvert b/srcpkgs/libspa-audioconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audioconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-audiomixer b/srcpkgs/libspa-audiomixer
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-audiomixer
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-control b/srcpkgs/libspa-control
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-control
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-jack b/srcpkgs/libspa-jack
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-jack
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-v4l2 b/srcpkgs/libspa-v4l2
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-v4l2
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-videoconvert b/srcpkgs/libspa-videoconvert
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-videoconvert
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/libspa-vulkan b/srcpkgs/libspa-vulkan
new file mode 120000
index 00000000000..c9c97cf6707
--- /dev/null
+++ b/srcpkgs/libspa-vulkan
@@ -0,0 +1 @@
+pipewire
\ No newline at end of file
diff --git a/srcpkgs/pipewire/patches/fix-neon-detection.patch b/srcpkgs/pipewire/patches/fix-neon-detection.patch
new file mode 100644
index 00000000000..c56a5238982
--- /dev/null
+++ b/srcpkgs/pipewire/patches/fix-neon-detection.patch
@@ -0,0 +1,52 @@
+diff --git meson.build meson.build
+index 29b4b892..0d048a1f 100644
+--- meson.build
++++ meson.build
+@@ -99,36 +99,16 @@ have_avx = cc.has_argument(avx_args)
+ have_avx2 = cc.has_argument(avx2_args)
+
+ have_neon = false
+-if host_machine.cpu_family() == 'aarch64'
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-	"      ld1 { v0.4s }, [%[s]], #16\n"
+-        "      fcvtzs v0.4s, v0.4s, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    name : 'aarch64 Neon Support')
+-      neon_args = []
+-      have_neon = true
+-
+-  endif
+-elif cc.has_argument('-mfpu=neon')
+-  if cc.compiles('''
+-    #include <arm_neon.h>
+-    int main () {
+-      float *s;
+-      asm volatile(
+-        "      vld1.32 { q0 }, [%[s]]!\n"
+-        "      vcvt.s32.f32 q0, q0, #31\n"
+-	: [s] "+r" (s) : :);
+-    }
+-    ''',
+-    args: '-mfpu=neon',
+-    name : 'arm Neon Support')
+-      neon_args = ['-mfpu=neon']
+-      have_neon = true
++neon_args = []
++if host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64'
++  if cc.compiles(
++'''
++#include <arm_neon.h>
++int32x4_t testfunc(int16_t *a, int16_t *b) {
++return vmull_s16(vld1_s16(a), vld1_s16(b));
++}
++''',
++   name : 'NEON support')
++    have_neon = true
+   endif
+ endif
diff --git a/srcpkgs/pipewire/template b/srcpkgs/pipewire/template
index 7f646dad11d..d2dec8f4695 100644
--- a/srcpkgs/pipewire/template
+++ b/srcpkgs/pipewire/template
@@ -1,26 +1,37 @@
 # Template file for 'pipewire'
 pkgname=pipewire
-version=0.2.7
+version=0.3.5
 revision=1
 build_style=meson
-configure_args="-Dman=true -Dgstreamer=enabled -Ddocs=true -Dsystemd=false"
+configure_args="-Dman=true -Dgstreamer=true -Ddocs=true -Dsystemd=false
+ -Dbluez5=true -Dffmpeg=true -Dpipewire-alsa=true -Dpipewire-jack=true
+ -Dpipewire-pulseaudio=true"
 hostmakedepends="doxygen graphviz pkg-config xmltoman"
 makedepends="SDL2-devel ffmpeg-devel gst-plugins-base1-devel jack-devel
- sbc-devel v4l-utils-devel libva-devel"
+ sbc-devel v4l-utils-devel libva-devel libbluetooth-devel"
 short_desc="Server and user space API to deal with multimedia pipelines"
-maintainer="Orphaned <orphan@voidlinux.org>"
-#Next release will probably change to MIT, currently listed in master
-license="LGPL-2.1-only, GPL-2.0-only "
+maintainer="Kridsada Thanabulpong <sirn@ogsite.net>"
+license="MIT"
 homepage="https://pipewire.org/"
-changelog="https://raw.githubusercontent.com/PipeWire/pipewire/master/NEWS"
-distfiles="https://github.com/PipeWire/pipewire/archive/${version}.tar.gz"
-checksum=bfaa0f6ae6c0791e2e0b59234d399753bf24f1b33dbf587682363a8463dd8df1
+changelog="https://gitlab.freedesktop.org/pipewire/pipewire/-/raw/master/NEWS"
+distfiles="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${version}/pipewire-${version}.tar.gz"
+checksum=c8cef9ce93dee328187b274e213dbecfe2df8ecc45bba2bc21d470112b2df3f6
 conf_files="/etc/pipewire/pipewire.conf"
 
+if [ "$XBPS_TARGET_NO_ATOMIC8" ]; then
+	makedepends+=" libatomic-devel"
+	LDFLAGS+=" -latomic"
+fi
+
+post_install() {
+	vlicense LICENSE
+}
+
 libpipewire_package() {
 	short_desc+=" - pipewire library"
 	pkg_install() {
-		vmove "usr/lib/libpipewire-0.2.so.*"
+		vmove "usr/lib/libpipewire-0.3.so.*"
+		vmove "usr/lib/pipewire-0.3/*.so"
 	}
 }
 
@@ -28,25 +39,81 @@ pipewire-devel_package() {
 	depends="libpipewire-${version}_${revision}"
 	short_desc+=" - pipewire and libspa development files"
 	pkg_install() {
-		vmove usr/include/pipewire
-		vmove usr/include/spa
-		vmove usr/lib/pkgconfig/libpipewire-0.2.pc
-		vmove usr/lib/pkgconfig/libspa-0.1.pc
-		vmove usr/lib/libpipewire-0.2.so
+		vmove usr/include/pipewire-0.3
+		vmove usr/include/spa-0.2
+		vmove usr/lib/pkgconfig/libpipewire-0.3.pc
+		vmove usr/lib/pkgconfig/libspa-0.2.pc
+		vmove usr/lib/libpipewire-0.3.so
 	}
 }
 
-libspa-ffmpeg_package() {
-	short_desc+=" - ffmpeg plugins"
+libspa-alsa_package() {
+	short_desc+=" - alsa plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/alsa
+	}
+}
+
+libspa-audioconvert_package() {
+	short_desc+=" - audioconvert plugins"
 	pkg_install() {
-		vmove usr/lib/spa/ffmpeg
+		vmove usr/lib/spa-0.2/audioconvert
+	}
+}
+
+libspa-audiomixer_package() {
+	short_desc+=" - audiomixer plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/audiomixer
 	}
 }
 
 libspa-bluetooth_package() {
 	short_desc+=" - bluetooth plugins"
 	pkg_install() {
-		vmove usr/lib/spa/bluez5
+		vmove usr/lib/spa-0.2/bluez5
+	}
+}
+
+libspa-control_package() {
+	short_desc+=" - control plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/control
+	}
+}
+
+libspa-ffmpeg_package() {
+	short_desc+=" - ffmpeg plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/ffmpeg
+	}
+}
+
+libspa-jack_package() {
+	short_desc+=" - jack plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/jack
+	}
+}
+
+libspa-v4l2_package() {
+	short_desc+=" - v4l2 plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/v4l2
+	}
+}
+
+libspa-videoconvert_package() {
+	short_desc+=" - videoconvert plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/videoconvert
+	}
+}
+
+libspa-vulkan_package() {
+	short_desc+=" - vulkan plugins"
+	pkg_install() {
+		vmove usr/lib/spa-0.2/vulkan
 	}
 }
 
@@ -57,6 +124,32 @@ gstreamer1-pipewire_package() {
 	}
 }
 
+libpulseaudio-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - PulseAudio client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/pulse
+		vmove usr/bin/pw-pulse
+	}
+}
+
+alsa-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - ALSA client library"
+	pkg_install() {
+		vmove usr/lib/alsa-lib
+	}
+}
+
+libjack-pipewire_package() {
+	depends="libpipewire-${version}_${revision}"
+	short_desc+=" - JACK client library"
+	pkg_install() {
+		vmove usr/lib/pipewire-0.3/jack
+		vmove usr/bin/pw-jack
+	}
+}
+
 pipewire-doc_package() {
 	archs=noarch
 	short_desc+=" - documentation"

From 2c43c14b04b6d0a71f2361ff66fbf5703962ef28 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:46 +0900
Subject: [PATCH 2/4] xdg-desktop-portal-kde: rebuild for pipewire-0.3

---
 srcpkgs/xdg-desktop-portal-kde/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/xdg-desktop-portal-kde/template b/srcpkgs/xdg-desktop-portal-kde/template
index 7a2aaf16b96..574e28504b7 100644
--- a/srcpkgs/xdg-desktop-portal-kde/template
+++ b/srcpkgs/xdg-desktop-portal-kde/template
@@ -1,7 +1,7 @@
 # Template file for 'xdg-desktop-portal-kde'
 pkgname=xdg-desktop-portal-kde
 version=5.18.5
-revision=1
+revision=2
 build_style=cmake
 hostmakedepends="extra-cmake-modules qt5-qmake qt5-host-tools kcoreaddons gettext"
 makedepends="glib-devel kio-devel kwayland-devel libepoxy-devel pipewire-devel

From 79777d7824fefce7a04aa2b2286046449ec30227 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Sat, 28 Mar 2020 16:24:26 +0900
Subject: [PATCH 3/4] xdg-desktop-portal: rebuild for pipewire-0.3

---
 .../patches/pipewire-0.3.patch                | 551 ++++++++++++++++++
 srcpkgs/xdg-desktop-portal/template           |   8 +-
 2 files changed, 557 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch

diff --git a/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..94ebe083598
--- /dev/null
+++ b/srcpkgs/xdg-desktop-portal/patches/pipewire-0.3.patch
@@ -0,0 +1,551 @@
+From a38901e5e7f835efe7b7a06c55790c8c20bc91a2 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Tue, 14 Jan 2020 09:37:09 +0100
+Subject: [PATCH] PipeWire: update to 0.3 API
+
+---
+ configure.ac      |   2 +-
+ src/camera.c      |  24 ++++----
+ src/pipewire.c    | 141 +++++++++++++---------------------------------
+ src/pipewire.h    |  10 ++--
+ src/screen-cast.c |  98 ++++++--------------------------
+ 5 files changed, 72 insertions(+), 203 deletions(-)
+
+diff --git configure.ac configure.ac
+index 89902fa..62d7960 100644
+--- configure.ac
++++ configure.ac
+@@ -97,7 +97,7 @@ AC_ARG_ENABLE(pipewire,
+ 	      [AS_HELP_STRING([--enable-pipewire],[Enable PipeWire support. Needed for screen cast portal])],
+ 	      enable_pipewire=$enableval, enable_pipewire=yes)
+ if test x$enable_pipewire = xyes ; then
+-	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.2 >= 0.2.6])
++	PKG_CHECK_MODULES(PIPEWIRE, [libpipewire-0.3 >= 0.2.90])
+ 	AC_DEFINE([HAVE_PIPEWIRE],[1], [Define to enable PipeWire support])
+ fi
+ AM_CONDITIONAL([HAVE_PIPEWIRE],[test "$enable_pipewire" = "yes"])
+diff --git src/camera.c src/camera.c
+index c2b392c..20fe3aa 100644
+--- src/camera.c
++++ src/camera.c
+@@ -141,7 +141,7 @@ open_pipewire_camera_remote (const char *app_id,
+                              GError **error)
+ {
+   PipeWireRemote *remote;
+-  struct spa_dict_item permission_items[1];
++  struct pw_permission permission_items[2];
+   struct pw_properties *pipewire_properties;
+ 
+   pipewire_properties =
+@@ -158,12 +158,12 @@ open_pipewire_camera_remote (const char *app_id,
+    * Hide all existing and future nodes by default. PipeWire will use the
+    * permission store to set up permissions.
+    */
+-  permission_items[0].key = PW_CORE_PROXY_PERMISSIONS_DEFAULT;
+-  permission_items[0].value = "---";
++  permission_items[0] = PW_PERMISSION_INIT (PW_ID_CORE, PW_PERM_RWX);
++  permission_items[1] = PW_PERMISSION_INIT (PW_ID_ANY, 0);
+ 
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             &SPA_DICT_INIT (permission_items,
+-                                             G_N_ELEMENTS (permission_items)));
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                G_N_ELEMENTS (permission_items),
++                                permission_items);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -219,7 +219,7 @@ handle_open_pipewire_remote (XdpCamera *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
+@@ -250,29 +250,28 @@ camera_iface_init (XdpCameraIface *iface)
+ static void
+ global_added_cb (PipeWireRemote *remote,
+                  uint32_t id,
+-                 uint32_t type,
++                 const char *type,
+                  const struct spa_dict *props,
+                  gpointer user_data)
+ {
+   Camera *camera = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *media_class;
+   const struct spa_dict_item *media_role;
+ 
+-  if (type != core_type->node)
++  if (strcmp(type, PW_TYPE_INTERFACE_Node) != 0)
+     return;
+ 
+   if (!props)
+     return;
+ 
+-  media_class = spa_dict_lookup_item (props, "media.class");
++  media_class = spa_dict_lookup_item (props, PW_KEY_MEDIA_CLASS);
+   if (!media_class)
+     return;
+ 
+   if (g_strcmp0 (media_class->value, "Video/Source") != 0)
+     return;
+ 
+-  media_role = spa_dict_lookup_item (props, "media.role");
++  media_role = spa_dict_lookup_item (props, PW_KEY_MEDIA_ROLE);
+   if (!media_role)
+     return;
+ 
+@@ -342,6 +341,7 @@ create_pipewire_remote (Camera *camera,
+     }
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.is_portal", "true",
++                                           "portal.monitor", "Camera",
+                                            NULL);
+   camera->pipewire_remote = pipewire_remote_new_sync (pipewire_properties,
+                                                       global_added_cb,
+diff --git src/pipewire.c src/pipewire.c
+index 793a378..162cd55 100644
+--- src/pipewire.c
++++ src/pipewire.c
+@@ -21,6 +21,7 @@
+ #include <errno.h>
+ #include <glib.h>
+ #include <pipewire/pipewire.h>
++#include <spa/utils/result.h>
+ 
+ #include "pipewire.h"
+ 
+@@ -36,27 +37,25 @@ static gboolean is_pipewire_initialized = FALSE;
+ static void
+ registry_event_global (void *user_data,
+                        uint32_t id,
+-                       uint32_t parent_id,
+                        uint32_t permissions,
+-                       uint32_t type,
++                       const char *type,
+                        uint32_t version,
+                        const struct spa_dict *props)
+ {
+   PipeWireRemote *remote = user_data;
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+   const struct spa_dict_item *factory_object_type;
+   PipeWireGlobal *global;
+ 
+   global = g_new0 (PipeWireGlobal, 1);
+   *global = (PipeWireGlobal) {
+-    .parent_id = parent_id,
++    .parent_id = id,
+   };
+ 
+   g_hash_table_insert (remote->globals, GINT_TO_POINTER (id), global);
+   if (remote->global_added_cb)
+     remote->global_added_cb (remote, id, type, props, remote->user_data);
+ 
+-  if (type != core_type->factory)
++  if (strcmp(type, PW_TYPE_INTERFACE_Factory) != 0)
+     return;
+ 
+   factory_object_type = spa_dict_lookup_item (props, "factory.type.name");
+@@ -81,8 +80,8 @@ registry_event_global_remove (void *user_data,
+   g_hash_table_remove (remote->globals, GINT_TO_POINTER (id));
+ }
+ 
+-static const struct pw_registry_proxy_events registry_events = {
+-  PW_VERSION_REGISTRY_PROXY_EVENTS,
++static const struct pw_registry_events registry_events = {
++  PW_VERSION_REGISTRY_EVENTS,
+   .global = registry_event_global,
+   .global_remove = registry_event_global_remove,
+ };
+@@ -90,7 +89,7 @@ static const struct pw_registry_proxy_events registry_events = {
+ void
+ pipewire_remote_roundtrip (PipeWireRemote *remote)
+ {
+-  pw_core_proxy_sync (remote->core_proxy, ++remote->sync_seq);
++  remote->sync_seq = pw_core_sync (remote->core, PW_ID_CORE, remote->sync_seq);
+   pw_main_loop_run (remote->loop);
+ }
+ 
+@@ -98,16 +97,13 @@ static gboolean
+ discover_node_factory_sync (PipeWireRemote *remote,
+                             GError **error)
+ {
+-  struct pw_type *core_type = pw_core_get_type (remote->core);
+-  struct pw_registry_proxy *registry_proxy;
++  struct pw_registry *registry;
+ 
+-  registry_proxy = pw_core_proxy_get_registry (remote->core_proxy,
+-                                               core_type->registry,
+-                                               PW_VERSION_REGISTRY, 0);
+-  pw_registry_proxy_add_listener (registry_proxy,
+-                                  &remote->registry_listener,
+-                                  &registry_events,
+-                                  remote);
++  registry = pw_core_get_registry (remote->core, PW_VERSION_REGISTRY, 0);
++  pw_registry_add_listener (registry,
++                            &remote->registry_listener,
++                            &registry_events,
++                            remote);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -122,59 +118,35 @@ discover_node_factory_sync (PipeWireRemote *remote,
+ }
+ 
+ static void
+-on_state_changed (void *user_data,
+-                  enum pw_remote_state old,
+-                  enum pw_remote_state state,
+-                  const char *error)
++core_event_error (void       *user_data,
++                  uint32_t    id,
++		  int         seq,
++		  int         res,
++		  const char *message)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  switch (state)
++  if (id == PW_ID_CORE)
+     {
+-    case PW_REMOTE_STATE_ERROR:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "%s", error);
+-        }
++      g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
++                 "%s", message);
+       pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      if (!remote->error)
+-        {
+-          g_set_error (&remote->error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                       "Disconnected");
+-        }
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pw_main_loop_quit (remote->loop);
+-      break;
+-    default:
+-      g_warning ("Unknown PipeWire state");
+-      break;
+     }
+ }
+ 
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
+-};
+-
+ static void
+ core_event_done (void *user_data,
+-                 uint32_t seq)
++                 uint32_t id, int seq)
+ {
+   PipeWireRemote *remote = user_data;
+ 
+-  if (remote->sync_seq == seq)
++  if (id == PW_ID_CORE && remote->sync_seq == seq)
+     pw_main_loop_quit (remote->loop);
+ }
+ 
+-static const struct pw_core_proxy_events core_events = {
+-  PW_VERSION_CORE_PROXY_EVENTS,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = core_event_error,
+   .done = core_event_done,
+ };
+ 
+@@ -237,8 +209,8 @@ void
+ pipewire_remote_destroy (PipeWireRemote *remote)
+ {
+   g_clear_pointer (&remote->globals, g_hash_table_destroy);
+-  g_clear_pointer (&remote->remote, pw_remote_destroy);
+-  g_clear_pointer (&remote->core, pw_core_destroy);
++  g_clear_pointer (&remote->core, pw_core_disconnect);
++  g_clear_pointer (&remote->context, pw_context_destroy);
+   g_clear_pointer (&remote->loop, pw_main_loop_destroy);
+   g_clear_error (&remote->error);
+ 
+@@ -307,68 +279,31 @@ pipewire_remote_new_sync (struct pw_properties *pipewire_properties,
+       return NULL;
+     }
+ 
+-  remote->core = pw_core_new (pw_main_loop_get_loop (remote->loop), NULL);
+-  if (!remote->core)
++  remote->context = pw_context_new (pw_main_loop_get_loop (remote->loop), NULL, 0);
++  if (!remote->context)
+     {
+       pipewire_remote_destroy (remote);
+       pw_properties_free (pipewire_properties);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire core");
++                   "Couldn't create PipeWire context");
+       return NULL;
+     }
+ 
+-  remote->remote = pw_remote_new (remote->core, pipewire_properties, 0);
+-  if (!remote->remote)
++  remote->core = pw_context_connect (remote->context, pipewire_properties, 0);
++  if (!remote->core)
+     {
+       pipewire_remote_destroy (remote);
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't create PipeWire remote");
++                   "Couldn't connect to PipeWire");
+       return NULL;
+     }
+ 
+   remote->globals = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+ 
+-  pw_remote_add_listener (remote->remote,
+-                          &remote->remote_listener,
+-                          &remote_events,
+-                          remote);
+-
+-  if (pw_remote_connect (remote->remote) != 0)
+-    {
+-      pipewire_remote_destroy (remote);
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect PipeWire remote");
+-      return NULL;
+-    }
+-
+-  pw_main_loop_run (remote->loop);
+-
+-  switch (pw_remote_get_state (remote->remote, NULL))
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      *error = g_steal_pointer (&remote->error);
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "PipeWire loop stopped unexpectedly");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      break;
+-    default:
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Unexpected PipeWire state");
+-      pipewire_remote_destroy (remote);
+-      return NULL;
+-    }
+-
+-  remote->core_proxy = pw_remote_get_core_proxy (remote->remote);
+-  pw_core_proxy_add_listener (remote->core_proxy,
+-                              &remote->core_listener,
+-                              &core_events,
+-                              remote);
++  pw_core_add_listener (remote->core,
++                        &remote->core_listener,
++                        &core_events,
++                        remote);
+ 
+   if (!discover_node_factory_sync (remote, error))
+     {
+diff --git src/pipewire.h src/pipewire.h
+index 0f1bf54..bf48d5e 100644
+--- src/pipewire.h
++++ src/pipewire.h
+@@ -32,7 +32,7 @@ typedef struct _PipeWireGlobal
+ 
+ typedef void (* PipeWireGlobalAddedCallback) (PipeWireRemote *remote,
+                                               uint32_t id,
+-                                              uint32_t type,
++                                              const char *type,
+                                               const struct spa_dict *props,
+                                               gpointer user_data);
+ 
+@@ -43,13 +43,11 @@ typedef void (* PipeWireGlobalRemovedCallback) (PipeWireRemote *remote,
+ struct _PipeWireRemote
+ {
+   struct pw_main_loop *loop;
++  struct pw_context *context;
+   struct pw_core *core;
+-  struct pw_remote *remote;
+-  struct spa_hook remote_listener;
+-
+-  struct pw_core_proxy *core_proxy;
+   struct spa_hook core_listener;
+-  uint32_t sync_seq;
++
++  int sync_seq;
+ 
+   struct spa_hook registry_listener;
+ 
+diff --git src/screen-cast.c src/screen-cast.c
+index 7881ddc..1677050 100644
+--- src/screen-cast.c
++++ src/screen-cast.c
+@@ -31,10 +31,10 @@
+ #include "xdp-impl-dbus.h"
+ #include "xdp-utils.h"
+ 
+-#define PERMISSION_ITEM(item_key, item_value) \
+-  ((struct spa_dict_item) { \
+-    .key = item_key, \
+-    .value = item_value \
++#define PERMISSION_ITEM(item_id, item_permissions) \
++  ((struct pw_permission) { \
++    .id = item_id, \
++    .permissions = item_permissions \
+   })
+ 
+ typedef struct _ScreenCast ScreenCast;
+@@ -517,42 +517,9 @@ screen_cast_stream_get_pipewire_node_id (ScreenCastStream *stream)
+   return stream->id;
+ }
+ 
+-static void
+-append_parent_permissions (PipeWireRemote *remote,
+-                           GArray *permission_items,
+-                           GList **string_stash,
+-                           PipeWireGlobal *global,
+-                           const char *permission)
+-{
+-  PipeWireGlobal *parent;
+-  char *parent_permission_value;
+-
+-  if (global->parent_id == 0)
+-    return;
+-
+-  parent = g_hash_table_lookup (remote->globals, GINT_TO_POINTER (global->parent_id));
+-
+-  if (parent->permission_set)
+-    return;
+-  parent->permission_set = TRUE;
+-
+-  append_parent_permissions (remote, permission_items, string_stash,
+-                             parent, permission);
+-
+-  parent_permission_value = g_strdup_printf ("%u:%s",
+-                                             global->parent_id,
+-                                             permission);
+-  *string_stash = g_list_prepend (*string_stash, parent_permission_value);
+-
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       parent_permission_value));
+-}
+-
+ static void
+ append_stream_permissions (PipeWireRemote *remote,
+                            GArray *permission_items,
+-                           GList **string_stash,
+                            GList *streams)
+ {
+   GList *l;
+@@ -561,21 +528,10 @@ append_stream_permissions (PipeWireRemote *remote,
+     {
+       ScreenCastStream *stream = l->data;
+       uint32_t stream_id;
+-      PipeWireGlobal *stream_global;
+-      char *stream_permission_value;
+ 
+       stream_id = screen_cast_stream_get_pipewire_node_id (stream);
+-      stream_global = g_hash_table_lookup (remote->globals,
+-                                           GINT_TO_POINTER (stream_id));
+-
+-      append_parent_permissions (remote, permission_items, string_stash,
+-                                 stream_global, "r--");
+-
+-      stream_permission_value = g_strdup_printf ("%u:rwx", stream_id);
+-      *string_stash = g_list_prepend (*string_stash, stream_permission_value);
+       g_array_append_val (permission_items,
+-                          PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                           stream_permission_value));
++                          PERMISSION_ITEM (stream_id, PW_PERM_RWX));
+     }
+ }
+ 
+@@ -587,9 +543,6 @@ open_pipewire_screen_cast_remote (const char *app_id,
+   struct pw_properties *pipewire_properties;
+   PipeWireRemote *remote;
+   g_autoptr(GArray) permission_items = NULL;
+-  char *node_factory_permission_string;
+-  GList *string_stash = NULL;
+-  struct spa_dict *permission_dict;
+   PipeWireGlobal *node_global;
+ 
+   pipewire_properties = pw_properties_new ("pipewire.access.portal.app_id", app_id,
+@@ -603,48 +556,31 @@ open_pipewire_screen_cast_remote (const char *app_id,
+ 
+   permission_items = g_array_new (FALSE, TRUE, sizeof (struct spa_dict_item));
+ 
+-  /*
+-   * Hide all existing and future nodes (except the ones we explicitly list below.
+-   */
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_EXISTING,
+-                                       "---"));
+-  g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_DEFAULT,
+-                                       "---"));
+-
+   /*
+    * PipeWire:Interface:Core
+    * Needs rwx to be able create the sink node using the create-object method
+    */
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       "0:rwx"));
++                      PERMISSION_ITEM (PW_ID_CORE, PW_PERM_RWX));
+ 
+   /*
+    * PipeWire:Interface:NodeFactory
+    * Needs r-- so it can be passed to create-object when creating the sink node.
+    */
+-  node_factory_permission_string = g_strdup_printf ("%d:r--",
+-                                                    remote->node_factory_id);
+-  string_stash = g_list_prepend (string_stash, node_factory_permission_string);
+   g_array_append_val (permission_items,
+-                      PERMISSION_ITEM (PW_CORE_PROXY_PERMISSIONS_GLOBAL,
+-                                       node_factory_permission_string));
+-  node_global = g_hash_table_lookup (remote->globals,
+-                                     GINT_TO_POINTER (remote->node_factory_id));
+-  append_parent_permissions (remote, permission_items, &string_stash,
+-                             node_global, "r--");
++                      PERMISSION_ITEM (remote->node_factory_id, PW_PERM_R));
+ 
+-  append_stream_permissions (remote, permission_items, &string_stash, streams);
++  append_stream_permissions (remote, permission_items, streams);
+ 
+-  permission_dict =
+-    &SPA_DICT_INIT ((struct spa_dict_item *) permission_items->data,
+-                    permission_items->len);
+-  pw_core_proxy_permissions (pw_remote_get_core_proxy (remote->remote),
+-                             permission_dict);
++  /*
++   * Hide all existing and future nodes (except the ones we explicitly list above).
++   */
++  g_array_append_val (permission_items,
++                      PERMISSION_ITEM (PW_ID_ANY, 0));
+ 
+-  g_list_free_full (string_stash, g_free);
++  pw_client_update_permissions (pw_core_get_client(remote->core),
++                                permission_items->len,
++                                (const struct pw_permission *)permission_items->data);
+ 
+   pipewire_remote_roundtrip (remote);
+ 
+@@ -943,7 +879,7 @@ handle_open_pipewire_remote (XdpScreenCast *object,
+     }
+ 
+   out_fd_list = g_unix_fd_list_new ();
+-  fd = pw_remote_steal_fd (remote->remote);
++  fd = pw_core_steal_fd (remote->core);
+   fd_id = g_unix_fd_list_append (out_fd_list, fd, &error);
+   close (fd);
+   pipewire_remote_destroy (remote);
diff --git a/srcpkgs/xdg-desktop-portal/template b/srcpkgs/xdg-desktop-portal/template
index eb8a4602f5d..1136b6a6e0e 100644
--- a/srcpkgs/xdg-desktop-portal/template
+++ b/srcpkgs/xdg-desktop-portal/template
@@ -1,10 +1,10 @@
 # Template file for 'xdg-desktop-portal'
 pkgname=xdg-desktop-portal
 version=1.6.0
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--enable-pipewire --enable-geoclue --disable-libportal"
-hostmakedepends="pkg-config glib-devel"
+hostmakedepends="automake libtool gettext-devel pkg-config glib-devel"
 makedepends="flatpak-devel fuse-devel pipewire-devel geoclue2-devel"
 short_desc="Portal frontend service for Flatpak"
 maintainer="Duncaen <duncaen@voidlinux.org>"
@@ -13,6 +13,10 @@ homepage="https://github.com/flatpak/xdg-desktop-portal"
 distfiles="https://github.com/flatpak/${pkgname}/releases/download/${version}/${pkgname}-${version}.tar.xz"
 checksum=883c9c9a925e48af54812b5347f546dd776ec2e27076a83d5a8126af6bafb9da
 
+pre_configure() {
+	autoreconf -vfi
+}
+
 post_install() {
 	rm -rf "${DESTDIR}/usr/lib/systemd"
 }

From 3ac92e067db8ee688f93340ab8e2905ecc1a6b55 Mon Sep 17 00:00:00 2001
From: Kridsada Thanabulpong <sirn@ogsite.net>
Date: Thu, 30 Apr 2020 06:17:17 +0900
Subject: [PATCH 4/4] mutter: rebuild for pipewire-0.3

---
 srcpkgs/mutter/patches/pipewire-0.3.patch | 521 ++++++++++++++++++++++
 srcpkgs/mutter/template                   |   2 +-
 2 files changed, 522 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/mutter/patches/pipewire-0.3.patch

diff --git a/srcpkgs/mutter/patches/pipewire-0.3.patch b/srcpkgs/mutter/patches/pipewire-0.3.patch
new file mode 100644
index 00000000000..ebff65fba85
--- /dev/null
+++ b/srcpkgs/mutter/patches/pipewire-0.3.patch
@@ -0,0 +1,521 @@
+Build mutter against pipewire-0.3, based on a patch at:
+https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1062
+--- meson.build
++++ meson.build
+@@ -50,7 +50,7 @@ libinput_req = '>= 1.7'
+ gbm_req = '>= 10.3'
+
+ # screen cast version requirements
+-libpipewire_req = '>= 0.2.5'
++libpipewire_req = '>= 0.3.0'
+
+ gnome = import('gnome')
+ pkg = import('pkgconfig')
+@@ -241,7 +241,7 @@ endif
+
+ have_remote_desktop = get_option('remote_desktop')
+ if have_remote_desktop
+-  libpipewire_dep = dependency('libpipewire-0.2', version: libpipewire_req)
++  libpipewire_dep = dependency('libpipewire-0.3', version: libpipewire_req)
+ endif
+
+ have_introspection = get_option('introspection')
+diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
+index 82c5cba436..ba1ce94a7e 100644
+--- src/backends/meta-screen-cast-stream-src.c
++++ src/backends/meta-screen-cast-stream-src.c
+@@ -29,6 +29,7 @@
+ #include <spa/param/props.h>
+ #include <spa/param/format-utils.h>
+ #include <spa/param/video/format-utils.h>
++#include <spa/utils/result.h>
+ #include <stdint.h>
+ #include <sys/mman.h>
+
+@@ -62,15 +63,6 @@ enum
+
+ static guint signals[N_SIGNALS];
+
+-typedef struct _MetaSpaType
+-{
+-  struct spa_type_media_type media_type;
+-  struct spa_type_media_subtype media_subtype;
+-  struct spa_type_format_video format_video;
+-  struct spa_type_video_format video_format;
+-  uint32_t meta_cursor;
+-} MetaSpaType;
+-
+ typedef struct _MetaPipeWireSource
+ {
+   GSource base;
+@@ -82,19 +74,19 @@ typedef struct _MetaScreenCastStreamSrcPrivate
+ {
+   MetaScreenCastStream *stream;
+
++  struct pw_context *pipewire_context;
+   struct pw_core *pipewire_core;
+-  struct pw_remote *pipewire_remote;
+-  struct pw_type *pipewire_type;
+   MetaPipeWireSource *pipewire_source;
+-  struct spa_hook pipewire_remote_listener;
++  struct spa_hook pipewire_core_listener;
+
+   gboolean is_enabled;
+
+   struct pw_stream *pipewire_stream;
+   struct spa_hook pipewire_stream_listener;
++  uint32_t node_id;
+
+-  MetaSpaType spa_type;
+   struct spa_video_info_raw video_format;
++  int video_stride;
+
+   uint64_t last_frame_timestamp_us;
+
+@@ -112,8 +104,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
+                                                 meta_screen_cast_stream_src_init_initable_iface)
+                          G_ADD_PRIVATE (MetaScreenCastStreamSrc))
+
+-#define PROP_RANGE(min, max) 2, (min), (max)
+-
+ static void
+ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
+                                        int                     *width,
+@@ -286,9 +276,6 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+                                                               int                      x,
+                                                               int                      y)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+
+   spa_meta_cursor->id = 1;
+@@ -300,7 +287,7 @@ meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStre
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   spa_meta_cursor->hotspot.x = 0;
+@@ -317,9 +304,6 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+                                                         int                      y,
+                                                         float                    scale)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   CoglTexture *cursor_texture;
+   struct spa_meta_bitmap *spa_meta_bitmap;
+   int hotspot_x, hotspot_y;
+@@ -346,7 +330,7 @@ meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc
+   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
+                                 spa_meta_cursor->bitmap_offset,
+                                 struct spa_meta_bitmap);
+-  spa_meta_bitmap->format = spa_type->video_format.RGBA;
++  spa_meta_bitmap->format = SPA_VIDEO_FORMAT_RGBA;
+   spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
+
+   meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
+@@ -382,12 +366,10 @@ static void
+ add_cursor_metadata (MetaScreenCastStreamSrc *src,
+                      struct spa_buffer       *spa_buffer)
+ {
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  MetaSpaType *spa_type = &priv->spa_type;
+   struct spa_meta_cursor *spa_meta_cursor;
+
+-  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
++  spa_meta_cursor = spa_buffer_find_meta_data (spa_buffer, SPA_META_Cursor,
++                                               sizeof (*spa_meta_cursor));
+   if (spa_meta_cursor)
+     meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
+ }
+@@ -447,14 +429,14 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+     {
+       data = spa_buffer->datas[0].data;
+     }
+-  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
++  else if (spa_buffer->datas[0].type == SPA_DATA_MemFd)
+     {
+       map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
+                   PROT_READ | PROT_WRITE, MAP_SHARED,
+                   spa_buffer->datas[0].fd, 0);
+       if (map == MAP_FAILED)
+         {
+-          g_warning ("Failed to mmap pipewire stream buffer: %s\n",
++          g_warning ("Failed to mmap pipewire stream buffer: %s",
+                      strerror (errno));
+           return;
+         }
+@@ -469,28 +451,30 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
+
+   if (meta_screen_cast_stream_src_record_frame (src, data))
+     {
+-      struct spa_meta_video_crop *spa_meta_video_crop;
++      struct spa_meta_region *spa_meta_video_crop;
+
+       spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
++      spa_buffer->datas[0].chunk->stride = priv->video_stride;
+
+       /* Update VideoCrop if needed */
+       spa_meta_video_crop =
+-        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
++        spa_buffer_find_meta_data (spa_buffer, SPA_META_VideoCrop,
++                                   sizeof (*spa_meta_video_crop));
+       if (spa_meta_video_crop)
+         {
+           if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
+             {
+-              spa_meta_video_crop->x = crop_rect.x;
+-              spa_meta_video_crop->y = crop_rect.y;
+-              spa_meta_video_crop->width = crop_rect.width;
+-              spa_meta_video_crop->height = crop_rect.height;
++              spa_meta_video_crop->region.position.x = crop_rect.x;
++              spa_meta_video_crop->region.position.y = crop_rect.y;
++              spa_meta_video_crop->region.size.width = crop_rect.width;
++              spa_meta_video_crop->region.size.height = crop_rect.height;
+             }
+           else
+             {
+-              spa_meta_video_crop->x = 0;
+-              spa_meta_video_crop->y = 0;
+-              spa_meta_video_crop->width = priv->stream_width;
+-              spa_meta_video_crop->height = priv->stream_height;
++              spa_meta_video_crop->region.position.x = 0;
++              spa_meta_video_crop->region.position.y = 0;
++              spa_meta_video_crop->region.size.width = priv->stream_width;
++              spa_meta_video_crop->region.size.height = priv->stream_height;
+             }
+         }
+     }
+@@ -555,7 +539,6 @@ on_stream_state_changed (void                 *data,
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  uint32_t node_id;
+
+   switch (state)
+     {
+@@ -563,14 +546,12 @@ on_stream_state_changed (void                 *data,
+       g_warning ("pipewire stream error: %s", error_message);
+       meta_screen_cast_stream_src_notify_closed (src);
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      node_id = pw_stream_get_node_id (priv->pipewire_stream);
+-      g_signal_emit (src, signals[READY], 0, (unsigned int) node_id);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
++      if (priv->node_id == SPA_ID_INVALID && priv->pipewire_stream)
++        {
++          priv->node_id = pw_stream_get_node_id (priv->pipewire_stream);
++          g_signal_emit (src, signals[READY], 0, (unsigned int) priv->node_id);
++        }
+       if (meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_disable (src);
+       break;
+@@ -578,68 +559,69 @@ on_stream_state_changed (void                 *data,
+       if (!meta_screen_cast_stream_src_is_enabled (src))
+         meta_screen_cast_stream_src_enable (src);
+       break;
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
++      break;
+     }
+ }
+
+ static void
+-on_stream_format_changed (void                 *data,
+-                          const struct spa_pod *format)
++on_stream_param_changed (void                 *data,
++                         uint32_t              id,
++                         const struct spa_pod *format)
+ {
+   MetaScreenCastStreamSrc *src = data;
+   MetaScreenCastStreamSrcPrivate *priv =
+     meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   uint8_t params_buffer[1024];
+   int32_t width, height, stride, size;
+   struct spa_pod_builder pod_builder;
+   const struct spa_pod *params[3];
+   const int bpp = 4;
+
+-  if (!format)
+-    {
+-      pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
+-      return;
+-    }
++  if (!format || id != SPA_PARAM_Format)
++    return;
+
+   spa_format_video_raw_parse (format,
+-                              &priv->video_format,
+-                              &priv->spa_type.format_video);
++                              &priv->video_format);
+
+   width = priv->video_format.size.width;
+   height = priv->video_format.size.height;
+   stride = SPA_ROUND_UP_N (width * bpp, 4);
+   size = height * stride;
+
++  priv->video_stride = stride;
++
+   pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
+-    ":", pipewire_type->param_buffers.size, "i", size,
+-    ":", pipewire_type->param_buffers.stride, "i", stride,
+-    ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
+-    ":", pipewire_type->param_buffers.align, "i", 16);
+-
+-  params[1] = spa_pod_builder_object (
++    SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++    SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (16, 2, 16),
++    SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1),
++    SPA_PARAM_BUFFERS_size, SPA_POD_Int (size),
++    SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride),
++    SPA_PARAM_BUFFERS_align, SPA_POD_Int (16));
++
++  params[1] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
+-    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++    SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_region)));
+
+-  params[2] = spa_pod_builder_object (
++  params[2] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
+-    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
+-    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
++    SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++    SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Cursor),
++    SPA_PARAM_META_size, SPA_POD_Int (CURSOR_META_SIZE (64, 64)));
+
+-  pw_stream_finish_format (priv->pipewire_stream, 0,
+-                           params, G_N_ELEMENTS (params));
++  pw_stream_update_params (priv->pipewire_stream, params, G_N_ELEMENTS (params));
+ }
+
+ static const struct pw_stream_events stream_events = {
+   PW_VERSION_STREAM_EVENTS,
+   .state_changed = on_stream_state_changed,
+-  .format_changed = on_stream_format_changed,
++  .param_changed = on_stream_param_changed,
+ };
+
+ static struct pw_stream *
+@@ -652,8 +634,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   uint8_t buffer[1024];
+   struct spa_pod_builder pod_builder =
+     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
+-  MetaSpaType *spa_type = &priv->spa_type;
+-  struct pw_type *pipewire_type = priv->pipewire_type;
+   float frame_rate;
+   MetaFraction frame_rate_fraction;
+   struct spa_fraction max_framerate;
+@@ -661,7 +641,9 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   const struct spa_pod *params[1];
+   int result;
+
+-  pipewire_stream = pw_stream_new (priv->pipewire_remote,
++  priv->node_id = SPA_ID_INVALID;
++
++  pipewire_stream = pw_stream_new (priv->pipewire_core,
+                                    "meta-screen-cast-src",
+                                    NULL);
+   if (!pipewire_stream)
+@@ -682,17 +664,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+   max_framerate = SPA_FRACTION (frame_rate_fraction.num,
+                                 frame_rate_fraction.denom);
+
+-  params[0] = spa_pod_builder_object (
++  params[0] = spa_pod_builder_add_object (
+     &pod_builder,
+-    pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
+-    "I", spa_type->media_type.video,
+-    "I", spa_type->media_subtype.raw,
+-    ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
+-    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
+-                                                           priv->stream_height),
+-    ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
+-    ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
+-                                                      PROP_RANGE (&min_framerate,
++    SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++    SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video),
++    SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw),
++    SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx),
++    SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&SPA_RECTANGLE (priv->stream_width,
++                                                              priv->stream_height)),
++    SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction (&SPA_FRACTION (0, 1)),
++    SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction (&max_framerate,
++                                                                  &min_framerate,
+                                                                   &max_framerate));
+
+   pw_stream_add_listener (pipewire_stream,
+@@ -702,7 +684,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+
+   result = pw_stream_connect (pipewire_stream,
+                               PW_DIRECTION_OUTPUT,
+-                              NULL,
++                              SPA_ID_INVALID,
+                               (PW_STREAM_FLAG_DRIVER |
+                                PW_STREAM_FLAG_MAP_BUFFERS),
+                               params, G_N_ELEMENTS (params));
+@@ -717,40 +699,18 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
+ }
+
+ static void
+-on_state_changed (void                 *data,
+-                  enum pw_remote_state  old,
+-                  enum pw_remote_state  state,
+-                  const char           *error_message)
++on_core_error (void       *data,
++               uint32_t    id,
++	       int         seq,
++	       int         res,
++	       const char *message)
+ {
+   MetaScreenCastStreamSrc *src = data;
+-  MetaScreenCastStreamSrcPrivate *priv =
+-    meta_screen_cast_stream_src_get_instance_private (src);
+-  struct pw_stream *pipewire_stream;
+-  GError *error = NULL;
+
+-  switch (state)
+-    {
+-    case PW_REMOTE_STATE_ERROR:
+-      g_warning ("pipewire remote error: %s\n", error_message);
+-      meta_screen_cast_stream_src_notify_closed (src);
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      pipewire_stream = create_pipewire_stream (src, &error);
+-      if (!pipewire_stream)
+-        {
+-          g_warning ("Could not create pipewire stream: %s", error->message);
+-          g_error_free (error);
+-          meta_screen_cast_stream_src_notify_closed (src);
+-        }
+-      else
+-        {
+-          priv->pipewire_stream = pipewire_stream;
+-        }
+-      break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-    case PW_REMOTE_STATE_CONNECTING:
+-      break;
+-    }
++  g_warning ("pipewire remote error: id:%u %s", id, message);
++
++  if (id == PW_ID_CORE && res == -EPIPE)
++    meta_screen_cast_stream_src_notify_closed (src);
+ }
+
+ static gboolean
+@@ -793,17 +753,6 @@ static GSourceFuncs pipewire_source_funcs =
+   pipewire_loop_source_finalize
+ };
+
+-static void
+-init_spa_type (MetaSpaType         *type,
+-               struct spa_type_map *map)
+-{
+-  spa_type_media_type_map (map, &type->media_type);
+-  spa_type_media_subtype_map (map, &type->media_subtype);
+-  spa_type_format_video_map (map, &type->format_video);
+-  spa_type_video_format_map (map, &type->video_format);
+-  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
+-}
+-
+ static MetaPipeWireSource *
+ create_pipewire_source (void)
+ {
+@@ -829,9 +778,9 @@ create_pipewire_source (void)
+   return pipewire_source;
+ }
+
+-static const struct pw_remote_events remote_events = {
+-  PW_VERSION_REMOTE_EVENTS,
+-  .state_changed = on_state_changed,
++static const struct pw_core_events core_events = {
++  PW_VERSION_CORE_EVENTS,
++  .error = on_core_error,
+ };
+
+ static gboolean
+@@ -851,37 +800,31 @@ meta_screen_cast_stream_src_initable_init (GInitable     *initable,
+       return FALSE;
+     }
+
+-  priv->pipewire_core = pw_core_new (priv->pipewire_source->pipewire_loop,
+-                                     NULL);
+-  if (!priv->pipewire_core)
++  priv->pipewire_context = pw_context_new (priv->pipewire_source->pipewire_loop,
++                                           NULL, 0);
++  if (!priv->pipewire_context)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Failed to create pipewire core");
++                   "Failed to create pipewire context");
+       return FALSE;
+     }
+
+-  priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
+-  if (!priv->pipewire_remote)
++  priv->pipewire_core = pw_context_connect (priv->pipewire_context, NULL, 0);
++  if (!priv->pipewire_core)
+     {
+       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't creat pipewire remote");
++                   "Couldn't connect pipewire context");
+       return FALSE;
+     }
+
+-  pw_remote_add_listener (priv->pipewire_remote,
+-                          &priv->pipewire_remote_listener,
+-                          &remote_events,
+-                          src);
++  pw_core_add_listener (priv->pipewire_core,
++                        &priv->pipewire_core_listener,
++                        &core_events,
++                        src);
+
+-  priv->pipewire_type = pw_core_get_type (priv->pipewire_core);
+-  init_spa_type (&priv->spa_type, priv->pipewire_type->map);
+-
+-  if (pw_remote_connect (priv->pipewire_remote) != 0)
+-    {
+-      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+-                   "Couldn't connect pipewire remote");
+-      return FALSE;
+-    }
++  priv->pipewire_stream = create_pipewire_stream (src, error);
++  if (!priv->pipewire_stream)
++    return FALSE;
+
+   return TRUE;
+ }
+@@ -912,8 +855,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
+     meta_screen_cast_stream_src_disable (src);
+
+   g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy);
+-  g_clear_pointer (&priv->pipewire_remote, pw_remote_destroy);
+-  g_clear_pointer (&priv->pipewire_core, pw_core_destroy);
++  g_clear_pointer (&priv->pipewire_core, pw_core_disconnect);
++  g_clear_pointer (&priv->pipewire_context, pw_context_destroy);
+   g_source_destroy (&priv->pipewire_source->base);
+
+   G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
diff --git a/srcpkgs/mutter/template b/srcpkgs/mutter/template
index 4e0bd32b67d..806a3bef9f0 100644
--- a/srcpkgs/mutter/template
+++ b/srcpkgs/mutter/template
@@ -1,7 +1,7 @@
 # Template file for 'mutter'
 pkgname=mutter
 version=3.34.1
-revision=2
+revision=3
 build_helper="gir"
 build_style=meson
 configure_args="-Degl_device=true -Dudev=true -Dnative_backend=true

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (56 preceding siblings ...)
  2020-05-30  4:50 ` [PR PATCH] [Updated] " sirn
@ 2020-05-30  5:11 ` sirn
  2020-05-30  5:13 ` not-chicken
                   ` (3 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: sirn @ 2020-05-30  5:11 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 223 bytes --]

New comment by sirn on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636278231

Comment:
Now failing due to ICU... probably because of recent ICU update missing some revbump?

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (57 preceding siblings ...)
  2020-05-30  5:11 ` sirn
@ 2020-05-30  5:13 ` not-chicken
  2020-05-31 16:10 ` mnabid
                   ` (2 subsequent siblings)
  61 siblings, 0 replies; 62+ messages in thread
From: not-chicken @ 2020-05-30  5:13 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 388 bytes --]

New comment by not-chicken on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636278456

Comment:
> Now failing due to ICU... probably because of recent ICU update missing some revbump?

Builders are still busy rebuilding stuff for ICU 67.1 https://build.voidlinux.org/waterfall
We gotta wait till they are finished to get a clean CI run.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (58 preceding siblings ...)
  2020-05-30  5:13 ` not-chicken
@ 2020-05-31 16:10 ` mnabid
  2020-05-31 20:19 ` mnabid
  2020-05-31 20:25 ` mnabid
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-31 16:10 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 173 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636491878

Comment:
@sirn Travis should run fine now.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (59 preceding siblings ...)
  2020-05-31 16:10 ` mnabid
@ 2020-05-31 20:19 ` mnabid
  2020-05-31 20:25 ` mnabid
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-31 20:19 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 247 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636491878

Comment:
~~@sirn Travis should run fine now.~~

No, I take that back. I'm still getting the same error in Travis. 

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: pipewire: update to 0.3.5
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
                   ` (60 preceding siblings ...)
  2020-05-31 20:19 ` mnabid
@ 2020-05-31 20:25 ` mnabid
  61 siblings, 0 replies; 62+ messages in thread
From: mnabid @ 2020-05-31 20:25 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 267 bytes --]

New comment by mnabid on void-packages repository

https://github.com/void-linux/void-packages/pull/20413#issuecomment-636491878

Comment:
~~@sirn Travis should run fine now.~~

No, I take that back. I'm still getting the same error in Travis. Sorry for bothering.

^ permalink raw reply	[flat|nested] 62+ messages in thread

end of thread, other threads:[~2020-05-31 20:25 UTC | newest]

Thread overview: 62+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-20413@inbox.vuxu.org>
2020-03-28 10:27 ` pipewire: update to 0.3.2 Duncaen
2020-03-28 10:34 ` sirn
2020-03-30  8:02 ` Piraty
2020-04-05 11:28 ` [PR PATCH] [Updated] WIP: " sirn
2020-04-05 11:30 ` sirn
2020-04-18  7:53 ` [PR PATCH] [Updated] " sirn
2020-04-29 19:44 ` mnabid
2020-04-29 19:46 ` mnabid
2020-04-29 19:47 ` mnabid
2020-04-29 20:02 ` [PR PATCH] [Updated] " sirn
2020-04-29 20:04 ` sirn
2020-04-29 20:09 ` sirn
2020-04-29 20:23 ` sirn
2020-04-29 20:32 ` mnabid
2020-04-29 20:37 ` sirn
2020-04-29 20:38 ` mnabid
2020-04-29 20:40 ` mnabid
2020-04-29 21:18 ` [PR PATCH] [Updated] " sirn
2020-04-29 21:20 ` sirn
2020-04-29 21:21 ` [WIP] " sirn
2020-04-30  3:29 ` mnabid
2020-04-30  3:29 ` mnabid
2020-04-30  4:10 ` mnabid
2020-04-30 20:51 ` [PR PATCH] [Updated] " sirn
2020-04-30 20:52 ` sirn
2020-04-30 21:02 ` [PR PATCH] [Updated] pipewire: update to 0.3.4 sirn
2020-04-30 21:07 ` sirn
2020-04-30 21:42 ` [PR PATCH] [Updated] " sirn
2020-05-01 10:35 ` sirn
2020-05-01 10:36 ` sirn
2020-05-01 10:37 ` sirn
2020-05-01 11:50 ` [PR PATCH] [Updated] WIP: " sirn
2020-05-07 18:27 ` sirn
2020-05-09 15:10 ` sirn
2020-05-09 15:22 ` sirn
2020-05-09 15:43 ` mnabid
2020-05-09 15:43 ` mnabid
2020-05-09 15:44 ` mnabid
2020-05-12 17:38 ` [PR PATCH] [Updated] " sirn
2020-05-12 18:08 ` sirn
2020-05-12 18:08 ` sirn
2020-05-22  2:19 ` pipewire: update to 0.3.5 not-chicken
2020-05-22  2:45 ` sirn
2020-05-22 18:04 ` mnabid
2020-05-23  9:40 ` mnabid
2020-05-26 19:52 ` sirn
2020-05-26 19:53 ` sirn
2020-05-27 20:06 ` shizonic
2020-05-27 20:07 ` shizonic
2020-05-27 20:08 ` sirn
2020-05-27 20:09 ` shizonic
2020-05-30  3:59 ` [PR PATCH] [Updated] " sirn
2020-05-30  4:00 ` sirn
2020-05-30  4:01 ` [PR PATCH] [Updated] " sirn
2020-05-30  4:28 ` sirn
2020-05-30  4:33 ` not-chicken
2020-05-30  4:50 ` [PR PATCH] [Updated] " sirn
2020-05-30  5:11 ` sirn
2020-05-30  5:13 ` not-chicken
2020-05-31 16:10 ` mnabid
2020-05-31 20:19 ` mnabid
2020-05-31 20:25 ` mnabid

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).