chore(release): bump workspace version to 0.22.2
android-screenshots / screenshots (push) Successful in 1m32s
audit / cargo-audit (push) Successful in 38s
audit / bun-audit (plugin-kit) (push) Successful in 20s
audit / bun-audit (sdk) (push) Successful in 15s
audit / bun-audit (web) (push) Successful in 15s
audit / docs-site-audit (push) Successful in 14s
audit / pnpm-audit (push) Successful in 16s
android / android (push) Successful in 5m17s
apple / swift (push) Successful in 5m7s
audit / license-gate (push) Successful in 4m33s
decky / build-publish (push) Successful in 48s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Successful in 14s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Successful in 12s
docker / builders (ci/arch-ci.Dockerfile, punktfunk-arch-ci) (push) Successful in 51s
docker / builders (ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 1m3s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 24s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 20s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Successful in 35s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 35s
sbom / sbom (push) Successful in 1m17s
linux-client-screenshots / screenshots (push) Successful in 3m43s
docker / deploy-docs (push) Successful in 19s
docker / builders-arm64cross (push) Successful in 13s
web-screenshots / screenshots (push) Successful in 4m25s
ci / web (push) Successful in 1m6s
ci / rust-arm64 (push) Successful in 3m51s
flatpak / build-publish (push) Successful in 5m18s
ci / docs-site (push) Successful in 1m48s
deb / build-publish (push) Successful in 4m0s
deb / build-publish-client-arm64 (push) Successful in 1m45s
arch / build-publish (push) Successful in 8m9s
ci / rust (push) Successful in 8m20s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 2m50s
deb / build-publish-host (push) Successful in 5m8s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 4m1s
windows-host / package (push) Successful in 11m9s
windows-host / winget-source (push) Skipped
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 2m41s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 3m1s
release / apple (push) Successful in 26m25s
apple / screenshots (push) Successful in 20m53s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 20m21s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 19m39s

Patch release: 0.22.0 and 0.22.1 gave every default-configured Windows host a
controller no game could see. The pf-dualsense -> pf-gamepad package rename also
renamed a HARDWARE id, so PnP matched none of our models, fell through to the
devnode's synthesized USB ids and let Microsoft's inbox input.inf win — HidUsb
cannot start on a software-enumerated devnode, and without a start there is no
device interface to answer a channel proof. This cut carries that one-line
restore, the [Models]-vs-host guard test, and the Punktfunk display-name rebrand
across the Windows devices and firewall rules.

Windows hosts only; clients and Linux hosts are untouched.

Versions-only lock diff, hand-applied: the 30 workspace-member entries move
0.22.1 -> 0.22.2. Two sets of third-party crates deliberately share our version
space and are untouched — `base64` at 0.22.1, and the eight gtk-rs crates at
0.22.0 (cairo/gdk-pixbuf/gio/graphene/pango); a blanket sed would corrupt both,
so the bump matches on member name only. `cargo metadata --locked` exits 0 on
the pinned toolchain. Release notes in docs/releases/v0.22.2.md seed the release
body per the Model-1 flow.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 12:36:11 +02:00
co-authored by Claude Opus 5
parent 553676282a
commit 384a0adc83
3 changed files with 53 additions and 31 deletions
Generated
+30 -30
View File
@@ -947,7 +947,7 @@ dependencies = [
[[package]]
name = "cursor-probe"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"pf-capture",
@@ -1036,7 +1036,7 @@ dependencies = [
[[package]]
name = "display-disturb"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"windows 0.62.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -2221,7 +2221,7 @@ dependencies = [
[[package]]
name = "latency-probe"
version = "0.22.1"
version = "0.22.2"
[[package]]
name = "lazy_static"
@@ -2326,7 +2326,7 @@ dependencies = [
[[package]]
name = "libvpl-sys"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"bindgen",
"cmake",
@@ -2361,7 +2361,7 @@ checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "loss-harness"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"punktfunk-core",
]
@@ -2850,7 +2850,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pf-capture"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ashpd",
@@ -2871,7 +2871,7 @@ dependencies = [
[[package]]
name = "pf-client-core"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ash",
@@ -2896,7 +2896,7 @@ dependencies = [
[[package]]
name = "pf-clipboard"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ashpd",
@@ -2914,7 +2914,7 @@ dependencies = [
[[package]]
name = "pf-console-ui"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ash",
@@ -2935,7 +2935,7 @@ dependencies = [
[[package]]
name = "pf-encode"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ash",
@@ -2959,7 +2959,7 @@ dependencies = [
[[package]]
name = "pf-ffvk"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"ash",
"bindgen",
@@ -2968,7 +2968,7 @@ dependencies = [
[[package]]
name = "pf-frame"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"libc",
@@ -2980,7 +2980,7 @@ dependencies = [
[[package]]
name = "pf-gpu"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"pf-host-config",
@@ -2994,11 +2994,11 @@ dependencies = [
[[package]]
name = "pf-host-config"
version = "0.22.1"
version = "0.22.2"
[[package]]
name = "pf-inject"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ashpd",
@@ -3027,14 +3027,14 @@ dependencies = [
[[package]]
name = "pf-paths"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"tracing",
]
[[package]]
name = "pf-presenter"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ash",
@@ -3049,7 +3049,7 @@ dependencies = [
[[package]]
name = "pf-vdisplay"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ashpd",
@@ -3082,7 +3082,7 @@ dependencies = [
[[package]]
name = "pf-win-display"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"pf-paths",
@@ -3094,7 +3094,7 @@ dependencies = [
[[package]]
name = "pf-zerocopy"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ash",
@@ -3302,7 +3302,7 @@ dependencies = [
[[package]]
name = "punktfunk-cli"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"pf-client-core",
"punktfunk-core",
@@ -3313,7 +3313,7 @@ dependencies = [
[[package]]
name = "punktfunk-client-android"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"android_logger",
"jni",
@@ -3329,7 +3329,7 @@ dependencies = [
[[package]]
name = "punktfunk-client-linux"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"async-channel",
@@ -3346,7 +3346,7 @@ dependencies = [
[[package]]
name = "punktfunk-client-session"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"pf-client-core",
@@ -3361,7 +3361,7 @@ dependencies = [
[[package]]
name = "punktfunk-client-windows"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"async-channel",
"ffmpeg-next",
@@ -3381,7 +3381,7 @@ dependencies = [
[[package]]
name = "punktfunk-core"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"aes-gcm",
"bytes",
@@ -3413,7 +3413,7 @@ dependencies = [
[[package]]
name = "punktfunk-host"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"aes",
"aes-gcm",
@@ -3497,7 +3497,7 @@ dependencies = [
[[package]]
name = "punktfunk-probe"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"mdns-sd",
@@ -3511,7 +3511,7 @@ dependencies = [
[[package]]
name = "punktfunk-tray"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"anyhow",
"ksni",
@@ -3534,7 +3534,7 @@ checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea"
[[package]]
name = "pyrowave-sys"
version = "0.22.1"
version = "0.22.2"
dependencies = [
"bindgen",
"cmake",
+1 -1
View File
@@ -51,7 +51,7 @@ exclude = [
ndk = { path = "clients/android/native/vendor/ndk" }
[workspace.package]
version = "0.22.1"
version = "0.22.2"
edition = "2021"
rust-version = "1.82"
license = "MIT OR Apache-2.0"
+22
View File
@@ -0,0 +1,22 @@
Wire-compatible with 0.21.x and 0.22.x — nothing about streaming changed, and everything already paired keeps working. This release only touches Windows PCs you stream *to*; the apps on your phone, tablet, Mac and TV are unchanged, as are Linux hosts.
**If you stream to a Windows PC and use a controller, update that PC.** On 0.22.0 and 0.22.1 your controller worked everywhere in the app but no game on the PC ever saw it. Update using the Windows installer rather than replacing the program by hand — the repair includes the controller drivers themselves.
## Fixed
- **Controllers work again on Windows.** Your controller paired, the app responded to it, and a DualSense's touchpad could even still move the mouse pointer on the PC — but games saw no controller at all. Windows had been attaching one of its own built-in drivers to Punktfunk's virtual controller instead of Punktfunk's, and that driver cannot run on a controller that isn't physically plugged in, so the controller was created and then never started. Nothing you could change in the app worked around it.
This hit almost everybody, because it hit the controller type Punktfunk emulates by default. If you had gone into settings and explicitly chosen DualShock 4, Xbox 360, DualSense Edge or Steam Deck, yours kept working the whole time — only the default was broken. Both 0.22.0 and 0.22.1 are affected; 0.21.0 and earlier are not.
## Improved
- **Punktfunk is spelled Punktfunk on Windows.** The virtual display, controllers, mouse and firewall entries Punktfunk creates all announced themselves in lower case. They now carry the proper name — in Device Manager, in your monitor list, and in Windows Firewall. Purely cosmetic, and it appears once the updated drivers install.
## Under the hood (for developers)
- The controller regression was a one-line hardware-id slip. `560e663a` renamed the driver *package* `pf-dualsense``pf-gamepad` and its message asserted the four hardware ids were untouched — but `WinDsIdentity::dualsense()` was renamed along with it, so the host began advertising `pf_gamepad`, which `pf_gamepad.inx` does not declare (it still binds `root\pf_dualsense` / `pf_dualsense` / `pf_dualshock4` / `pf_dualsenseedge` / `pf_steamdeck` — deliberately, as the contract with already-installed systems). PnP matched none of our models, fell through to the USB ids the same devnode synthesizes for the DualSense identity (`USB\VID_054C&PID_0CE6`, `USB\Class_03`), and Microsoft's inbox `input.inf` won on signature. `HidUsb` then bound a software-enumerated devnode with no USB port behind it and could not start — `CM_PROB_FAILED_START`. Without a start, hidclass never enumerates the collection PDO, so there is no device interface, so the devnode cannot answer a channel proof, and the gamepad channel's v3 delivery gate correctly refused to hand over the shared input section. Every layer downstream behaved exactly as designed.
- Measured against a clean install, all four identities served by the one `pf_gamepad.inf`: DualSense (`pf_gamepad`) → `input.inf`/`HidUsb`, failed start; DualShock 4 (`pf_dualshock4`), Edge (`pf_dualsenseedge`) and the virtual mouse (`pf_mouse`) → our package, attached. `devgen /add /hardwareid "root\pf_dualsense"` binds our INF with no problem code.
- A new `hwid_matches_inf` test parses `pf_gamepad.inx`'s `[Models]` section and asserts every hardware id the host puts on a pad devnode is declared there, with a vacuity check on the parse so a shape change fails loudly rather than passing empty. `DS4_HWID` / `DECK_HWID` exist so the test pins the same constants the create paths use.
- Why the installer and not a binary swap: re-creating a software device with a known instance id revives the existing devnode with its previously-bound driver and never re-ranks against the driver store. Instance ids did not change, so a PC still holding a stale virtual pad bound to `input.inf` would revive `input.inf` even with the correct hardware id. `driver install --gamepad` sweeps those devnodes; replacing the host executable alone does not.
- The rename covers the four driver INFs' `[Strings]`, every `SwDeviceProfile` description, `pf-mouse`'s HID manufacturer and product strings, pf-vdisplay's IddCx endpoint names, the EDID `0xFC` display-name descriptor (one byte — `Edid::generate_with` recomputes both block checksums), and the netsh rule names. Left in lower case on purpose, because they are identities rather than display names: the `SwDeviceCreate` enumerator (it *is* the `SWD\PUNKTFUNK\…` instance-id path), `%ProgramData%\punktfunk`, the `CN=punktfunk-driver` cert subject, and `install.rs`' already-lowercased device probes. netsh, `Get-NetFirewallRule -DisplayName` and PowerShell's `-match` are case-insensitive, so the delete paths still reap what earlier releases created.
- No wire, ABI or driver-protocol changes: wire protocol 2, C ABI 13, Windows virtual-gamepad channel 3, virtual-display driver protocol 6 — identical to 0.22.0 and 0.22.1.