From 10b14794ed90fc9f7aed4bc80312610883d08b04 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Sun, 3 May 2026 14:36:49 +0900 Subject: [PATCH] update to upstream pipewire-rs (#508) * update to upstream pipewire-rs * CI to use 24.04 without no pipewire ppa * fix build without openxr feature --- .github/workflows/build-all-features.yml | 2 +- .github/workflows/build-appimage.yml | 2 +- .github/workflows/build-default.yml | 2 +- .github/workflows/build-wayland-openvr.yml | 2 +- .github/workflows/build-wayland-openxr.yml | 2 +- .github/workflows/build-x11-openvr.yml | 2 +- .github/workflows/build-x11-openxr.yml | 2 +- .github/workflows/make-release.yml | 2 +- .../workflows/scripts/appimage_prepare_env.sh | 2 - Cargo.lock | 126 ++++++------------ wayvr/src/overlays/dashboard.rs | 3 + wlx-capture/Cargo.toml | 4 +- wlx-capture/src/pipewire.rs | 60 +++++---- 13 files changed, 86 insertions(+), 125 deletions(-) diff --git a/.github/workflows/build-all-features.yml b/.github/workflows/build-all-features.yml index ea748df3..81267f63 100644 --- a/.github/workflows/build-all-features.yml +++ b/.github/workflows/build-all-features.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-appimage.yml b/.github/workflows/build-appimage.yml index 9eb37b2c..4776d417 100644 --- a/.github/workflows/build-appimage.yml +++ b/.github/workflows/build-appimage.yml @@ -15,7 +15,7 @@ env: jobs: build_appimage: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-default.yml b/.github/workflows/build-default.yml index a20e5dfa..3ad4d140 100644 --- a/.github/workflows/build-default.yml +++ b/.github/workflows/build-default.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-wayland-openvr.yml b/.github/workflows/build-wayland-openvr.yml index 9b540dc5..dd3beb57 100644 --- a/.github/workflows/build-wayland-openvr.yml +++ b/.github/workflows/build-wayland-openvr.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-wayland-openxr.yml b/.github/workflows/build-wayland-openxr.yml index 42a5c33c..9ff5c9d4 100644 --- a/.github/workflows/build-wayland-openxr.yml +++ b/.github/workflows/build-wayland-openxr.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-x11-openvr.yml b/.github/workflows/build-x11-openvr.yml index cacd5e5c..2d54b81f 100644 --- a/.github/workflows/build-x11-openvr.yml +++ b/.github/workflows/build-x11-openvr.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/build-x11-openxr.yml b/.github/workflows/build-x11-openxr.yml index 7e045dee..697f0806 100644 --- a/.github/workflows/build-x11-openxr.yml +++ b/.github/workflows/build-x11-openxr.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 3225e372..01286bc0 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -13,7 +13,7 @@ env: jobs: make_release: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 defaults: run: working-directory: ./wayvr diff --git a/.github/workflows/scripts/appimage_prepare_env.sh b/.github/workflows/scripts/appimage_prepare_env.sh index 7b7f14f3..857d81c7 100755 --- a/.github/workflows/scripts/appimage_prepare_env.sh +++ b/.github/workflows/scripts/appimage_prepare_env.sh @@ -1,7 +1,5 @@ #!/bin/sh -sudo add-apt-repository -syn universe -sudo add-apt-repository -syn ppa:pipewire-debian/pipewire-upstream || sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 25088A0359807596 sudo apt-get update sudo apt-get install -y fuse cmake pkg-config fontconfig libasound2-dev libxkbcommon-dev libxkbcommon-x11-0 libxkbcommon-x11-dev libopenxr-dev libfontconfig-dev libdbus-1-dev libpipewire-0.3-0 libpipewire-0.3-dev libspa-0.2-dev libx11-6 libxext6 libxrandr2 libx11-dev libxext-dev libxrandr-dev libopenvr-dev libopenvr-api1 libwayland-dev libegl-dev libxcb-glx0 libxcb-glx0-dev rustup update diff --git a/Cargo.lock b/Cargo.lock index dcfac810..0be28f52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,6 +143,16 @@ dependencies = [ "libc", ] +[[package]] +name = "annotate-snippets" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4" +dependencies = [ + "anstyle", + "unicode-width 0.2.2", +] + [[package]] name = "anstream" version = "0.6.21" @@ -677,6 +687,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ + "annotate-snippets", "bitflags 2.10.0", "cexpr", "clang-sys", @@ -880,9 +891,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.8" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "3c6b04e07d8080154ed4ac03546d9a2b303cc2fe1901ba0b35b301516e289368" dependencies = [ "smallvec", "target-lexicon", @@ -1051,7 +1062,7 @@ dependencies = [ "serde-untagged", "serde_core", "serde_json", - "toml 0.9.10+spec-1.1.0", + "toml", "winnow", "yaml-rust2", ] @@ -1096,9 +1107,6 @@ name = "cookie-factory" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" -dependencies = [ - "futures", -] [[package]] name = "core-foundation" @@ -2881,24 +2889,23 @@ dependencies = [ [[package]] name = "libspa" -version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" +version = "0.9.2" +source = "git+https://gitlab.freedesktop.org/pipewire/pipewire-rs.git?rev=670b0aabf04263ece5dc1e752e5d64aeae3056e8#670b0aabf04263ece5dc1e752e5d64aeae3056e8" dependencies = [ "bitflags 2.10.0", "cc", - "convert_case 0.6.0", "cookie-factory", "libc", "libspa-sys", - "nix 0.27.1", - "nom 7.1.3", + "nom 8.0.0", + "rustix 1.1.3", "system-deps", ] [[package]] name = "libspa-sys" -version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" +version = "0.9.2" +source = "git+https://gitlab.freedesktop.org/pipewire/pipewire-rs.git?rev=670b0aabf04263ece5dc1e752e5d64aeae3056e8#670b0aabf04263ece5dc1e752e5d64aeae3056e8" dependencies = [ "bindgen", "cc", @@ -3167,17 +3174,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "libc", -] - [[package]] name = "nix" version = "0.29.0" @@ -3991,24 +3987,21 @@ dependencies = [ [[package]] name = "pipewire" -version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" +version = "0.9.2" +source = "git+https://gitlab.freedesktop.org/pipewire/pipewire-rs.git?rev=670b0aabf04263ece5dc1e752e5d64aeae3056e8#670b0aabf04263ece5dc1e752e5d64aeae3056e8" dependencies = [ - "anyhow", "bitflags 2.10.0", "libc", "libspa", "libspa-sys", - "nix 0.27.1", - "once_cell", "pipewire-sys", - "thiserror 1.0.69", + "rustix 1.1.3", ] [[package]] name = "pipewire-sys" -version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" +version = "0.9.2" +source = "git+https://gitlab.freedesktop.org/pipewire/pipewire-rs.git?rev=670b0aabf04263ece5dc1e752e5d64aeae3056e8#670b0aabf04263ece5dc1e752e5d64aeae3056e8" dependencies = [ "bindgen", "libspa-sys", @@ -4116,7 +4109,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit", ] [[package]] @@ -4946,15 +4939,6 @@ dependencies = [ "syn 2.0.113", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "serde_spanned" version = "1.0.4" @@ -5454,14 +5438,14 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.2" +version = "7.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.23", + "toml", "version-compare", ] @@ -5479,9 +5463,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tempfile" @@ -5684,40 +5668,21 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - [[package]] name = "toml" version = "0.9.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" dependencies = [ + "indexmap 2.12.1", "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", + "serde_spanned", + "toml_datetime", "toml_parser", + "toml_writer", "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -5727,19 +5692,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.12.1", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "winnow", -] - [[package]] name = "toml_edit" version = "0.23.10+spec-1.0.0" @@ -5747,7 +5699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap 2.12.1", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime", "toml_parser", "winnow", ] @@ -5761,6 +5713,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + [[package]] name = "tracing" version = "0.1.44" diff --git a/wayvr/src/overlays/dashboard.rs b/wayvr/src/overlays/dashboard.rs index 316f66ff..a3eaf6b0 100644 --- a/wayvr/src/overlays/dashboard.rs +++ b/wayvr/src/overlays/dashboard.rs @@ -481,7 +481,10 @@ impl DashInterface for DashInterfaceLive { fn get_feats(&mut self, data: &mut AppState) -> dash_interface::InterfaceFeats { dash_interface::InterfaceFeats { openxr: matches!(data.xr_backend, XrBackend::OpenXR), + #[cfg(feature = "openxr")] monado: data.monado_state.is_some(), + #[cfg(not(feature = "openxr"))] + monado: false, } } diff --git a/wlx-capture/Cargo.toml b/wlx-capture/Cargo.toml index 8ff3a9e0..5294556e 100644 --- a/wlx-capture/Cargo.toml +++ b/wlx-capture/Cargo.toml @@ -32,8 +32,8 @@ drm-fourcc = "2.2.0" idmap = { workspace = true } libc = "0.2.178" log = { workspace = true } -pipewire = { git = "https://gitlab.freedesktop.org/galister/pipewire-rs.git", rev = "6ef2cd1af41e5e8844c63c37ea9a01f0758079b0", features = [ - "v0_3_33", +pipewire = { git = "https://gitlab.freedesktop.org/pipewire/pipewire-rs.git", rev = "670b0aabf04263ece5dc1e752e5d64aeae3056e8", features = [ + "v0_3_33", "v0_3_65", ], optional = true } #pipewire = { version = "0.8.0", features = ["v0_3_33"], optional = true } rxscreen = { version = "0.1.7", features = [ diff --git a/wlx-capture/src/pipewire.rs b/wlx-capture/src/pipewire.rs index 3d5de1cf..f3e5cdd5 100644 --- a/wlx-capture/src/pipewire.rs +++ b/wlx-capture/src/pipewire.rs @@ -17,14 +17,17 @@ use drm_fourcc::DrmFormat; use drm_fourcc::DrmFourcc; use drm_fourcc::DrmModifier; use pipewire as pw; +use pipewire::context::ContextRc; +use pipewire::main_loop::MainLoopRc; +use pipewire::spa::buffer::meta::MetaVideoTransformValue; +use pipewire::spa::buffer::meta::{MetaCursor, MetaHeader, MetaHeaderFlags, MetaVideoTransform}; +use pipewire::stream::StreamRc; use pw::spa; +use pw::Error; use pw::properties::properties; use pw::stream::{Stream, StreamFlags}; -use pw::{Error, context::Context, main_loop::MainLoop}; use spa::buffer::DataType; -use spa::buffer::MetaData; -use spa::buffer::MetaType; use spa::param::ParamType; use spa::param::video::VideoFormat; use spa::param::video::VideoInfoRaw; @@ -278,12 +281,12 @@ where R: Any, { log::debug!("{}: pipewire main_loop start", &name); - let main_loop = MainLoop::new(None)?; - let context = Context::new(&main_loop)?; - let core = context.connect(None)?; + let main_loop = MainLoopRc::new(None)?; + let context = ContextRc::new(&main_loop, None)?; + let core = context.connect_rc(None)?; - let stream = Stream::new( - &core, + let stream = StreamRc::new( + core, &name, properties! { *pw::keys::MEDIA_TYPE => "Video", @@ -377,36 +380,35 @@ where } if let Some(mut buffer) = maybe_buffer { - if let MetaData::Header(header) = buffer.find_meta_data(MetaType::Header) - && header.flags & spa::sys::SPA_META_HEADER_FLAG_CORRUPTED != 0 + if let Some(header) = buffer.find_meta::() + && header.flags().contains(MetaHeaderFlags::CORRUPTED) { log::warn!("{}: PipeWire buffer is corrupt.", &name); return; } - if let MetaData::VideoTransform(transform) = - buffer.find_meta_data(MetaType::VideoTransform) - { - format.transform = match transform.transform { - spa::sys::SPA_META_TRANSFORMATION_None => Transform::Normal, - spa::sys::SPA_META_TRANSFORMATION_90 => Transform::Rotated90, - spa::sys::SPA_META_TRANSFORMATION_180 => Transform::Rotated180, - spa::sys::SPA_META_TRANSFORMATION_270 => Transform::Rotated270, - spa::sys::SPA_META_TRANSFORMATION_Flipped => Transform::Flipped, - spa::sys::SPA_META_TRANSFORMATION_Flipped90 => Transform::Flipped90, - spa::sys::SPA_META_TRANSFORMATION_Flipped180 => Transform::Flipped180, - spa::sys::SPA_META_TRANSFORMATION_Flipped270 => Transform::Flipped270, + + if let Some(transform) = buffer.find_meta::() { + format.transform = match transform.transform() { + MetaVideoTransformValue::NONE => Transform::Normal, + MetaVideoTransformValue::ROTATED90 => Transform::Rotated90, + MetaVideoTransformValue::ROTATED180 => Transform::Rotated180, + MetaVideoTransformValue::ROTATED270 => Transform::Rotated270, + MetaVideoTransformValue::FLIPPED => Transform::Flipped, + MetaVideoTransformValue::FLIPPED90 => Transform::Flipped90, + MetaVideoTransformValue::FLIPPED180 => Transform::Flipped180, + MetaVideoTransformValue::FLIPPED270 => Transform::Flipped270, _ => Transform::Undefined, }; log::debug!("{}: Transform: {:?}", &name, &format.transform); } - let mouse_meta = match buffer.find_meta_data(MetaType::Cursor) { - MetaData::Cursor(cursor) if cursor.id != 0 => Some(MouseMeta { - x: cursor.position.x as f32 / format.width as f32, - y: cursor.position.y as f32 / format.height as f32, - }), - _ => None, - }; + let mouse_meta = buffer + .find_meta::() + .filter(|c| c.is_valid()) + .map(|c| MouseMeta { + x: c.position().x as f32 / format.width as f32, + y: c.position().y as f32 / format.height as f32, + }); let datas = buffer.datas_mut(); if datas.is_empty() {