Treat autoCapture as keyboard ownership while the pointer is inside the
guest viewport. Predict the next local position for both absolute and
relative motion, then release the keyboard before the pointer crosses
an edge.
Keep capture, focus, and deferred evdev transitions consistent while
retaining the latest local position as the prediction baseline.
X11's legacy guest-position synchronization warps the host cursor to
delayed guest updates. With absolute input this feeds old positions back
through cooked motion and pulls the cursor away from window edges.
Skip display-server guest synchronization when the active input is
absolute. Relative input and explicit uncapture alignment are unchanged.
Normal input now uses absolute positioning, so retaining the XI pointer
grab after capture leaves no later path to release it.
Always release the grab so leaving the window works again and the
uncapture path can align the host cursor to the guest position.
Replay held keys after focus enters the client window.
Track modifiers and lock LEDs for cooked and grabbed raw input.
Handle external XKB indicator changes while the window stays focused.
Make cooked mouse input independent of keyboard focus.
Preserve button state across pointer leave events.
Match Wayland event order, wheel steps, and raw motion delivery.
Update PureSpice so microphone delivery cannot hold audio backend
shutdown behind a busy socket. Record packets now use a bounded
nonblocking write with framing-safe failure handling.
Rework audio provider and backend lifecycles so playback and capture
callbacks quiesce without blocking real-time threads. Move activation,
teardown, controls, retries, and diagnostics onto bounded workers.
Harden USB audio cadence, feedback, and capture recovery.
Preserve source clocks through recording and pace packets from the
device clock. Bound queues, waits, conversion buffers, and packet sizes.
Make PipeWire and PulseAudio stream control thread-safe and recoverable.
Correct latency clock domains, coalesce rate updates, preserve recent
capture under overload, and keep logging outside real-time callbacks.
Add a composite UAC2 microphone function with its own clock so
recording and playback can use independent sample rates.
Packetize asynchronous capture through usbredir, follow the host
capture clock, and preserve the newest frames across stalls.
Reconfigure active recording without another permission prompt and
fix lost PipeWire capture wakeups.
Treat a negative provider-controlled playback ring as a timeline
discontinuity rather than carrying its underrun debt.
Rebase to the normal low-water target and reset feedback correction so
guest stalls resume at low latency instead of discarding audio for
seconds.
Sample the playback ring graph at its original 40 Hz rate so its
1,200 entries continue to represent 30 seconds of history.
Keep packet processing and asynchronous USB feedback at full rate.
Advertise an asynchronous UAC2 OUT endpoint with explicit feedback so
Windows paces USB audio from the host playback clock.
Drive feedback from measured backend consumption plus the existing
buffer phase controller. Preserve the local and backend resampler paths
for providers without active feedback.
Keep audio diagnostics in the correct clock domains, report ring and
backend latency separately, and avoid hot-path feedback wakeups.
We can not support 32-bit because Windows is buggy:
The exact Windows 11 mmsys.cpl from build 26100.8737 populates Speaker
Setup testing against hard-coded speaker masks and for each calls
IKsFormatSupport::IsFormatSupported() using 24 hard-coded PCM formats.
These formats do not include 32-bit in 32-bit, consequently, every one
of the wizard’s format probes fails and it inserts zero channel-list
entries.
It does however test for 24-bit in 32-bit which passes, however this
exposes another breakage due to an inconsistency inside Windows
usbaudio2.sys
For bSubslotSize = 4, bBitResolution = 24, Windows does this:
1. It publishes a KS range whose minimum and maximum bit depths are both
taken from bBitResolution, so the range says 24-bit.
2. It correctly constructs the actual stream format as:
wBitsPerSample = 32, wValidBitsPerSample = 24
3. KS range intersection rejects that 24-in-32 format because its
container is 32 bits while the published range says 24.
4. A packed 24-bit candidate passes range intersection, but the
subsequent exact stream check rejects it because it uses a three-byte
container while USB advertises four bytes.
Therefore no format can pass both checks. That exactly explains:
* USB Device Tree Viewer seeing 24-bit device ranges.
* The MMDevice endpoint exposing no usable formats.
* Windows being unable to start playback.
I verified this in the exact Windows 10.0.26100.8737 driver:
* KSPin::AddDataRange stores bBitResolution into both KS bit-depth
bounds.
* MiniportWave::DataRangeIntersection tests those bounds.
* WaveFormatInfo::IsMatchingStreamFormat separately compares both the
container width and valid-bit count.
Add an opt-in USB audio fallback and connect the emulator to an
available PureSpice USBREDIR channel.
Keep transport-provided audio in priority and serialize USB parser
processing and teardown on the PureSpice thread.
Add a fixed-format USB Audio Class 2 playback device for the
client-side USB redirection bridge.
Advertise stereo 48 kHz IEEE float audio and handle enumeration,
configuration, alternate settings, clock requests, and isochronous data.
Add a serialized bridge between PureSpice USB redirection channels and
libusbredirparser.
Claim one channel and stream borrowed fragments directly through the
parser without packet allocations. Provide an atomic device plug request
for later audio integration.
Route clipboard exchange through a provider interface. Connected
transports take priority while SPICE remains the fallback.
Track asynchronous X11 and Wayland transfers by request, preserving
clipboard ownership across provider changes.
Use PureSpice clipboard status notifications for capability and
lifecycle updates.
Route audio through a provider interface. Connected transports take
priority while SPICE remains the fallback.
Carry explicit sample formats, rates, channel layouts, and source clocks
through playback and recording. Add optional presentation clock feedback
for active synchronization.
Initialize the previous ImGui frame timestamp before rendering
overlays. Without this, the first DeltaTime equals host uptime.
Recent ImGui versions track background and foreground draw-list
activity using float time. At long host uptimes its precision can span
multiple display frames, preventing those lists from being reset and
submitting translucent overlay commands more than once.
Remove confinement handshake expectations now that Wayland advertises
functional warp support. Verify immediate viewport transitions and cursor
alignment when capture is released.
Previously, we only aligned the mouse in the client when the cursor is
visible. This wasn't a problem because the cursor position in the guest
took precedence and we only used relative input.
Since we now have absolute input, the absolute position of the cursor in
the client matters at all times when we exit capture, so we always call
`core_alignToGuest` now.
We don't need any of that weird grabPointer stuff now that we have absolute
input. Deleting this will allow Wayland to advertise warp support without
doing any of the nasty confining stuff on grab/release.
Remove the persistent confined-pointer workaround that emulated cursor
warping on Wayland. Normal pointer motion now uses absolute input only.
Create relative and locked pointer objects only during capture. Preserve
the request across pointer capability changes, and suppress relative
events until the compositor confirms the lock.
On uncapture, publish the current absolute position instead of trying to
warp the host cursor.
Map the remaining Linux mouse buttons through Wayland and evdev.
Use one X11 translation for cooked and raw press and release events.
Ignore unsupported horizontal scrolling and extended SPICE buttons.
Use the LGMP input queue when the host advertises transport input,
while preserving SPICE fallback through the existing input abstraction.
Claim input lazily, publish ordered full-state keyboard and mouse
reports without blocking rendering, and keep the owner lease alive.
Reserve queue capacity for discrete transitions, coalesce only motion
under pressure, and release ownership safely during idle and disconnect.
Keep the Linux-to-HID map in the client and update LGMP to the
nonblocking data-send API required by the input worker.
Expose a Consumer Control HID report for the system volume usages that
Windows does not handle through the Keyboard/Keypad usage page.
Translate the existing mute and volume keyboard usages at the LGInput
boundary, preserve normal keyboard state, and force a neutral consumer
report across resets and HID device reactivation.
Move named pipe writes off the LGMP input worker so a stalled LGInput
endpoint cannot block queue draining or lease maintenance.
Coalesce motion only under queue pressure while preserving mode, button,
wheel, and keyboard transitions. Reset HID state after discontinuities
and carry all 32 mouse button bits through the pipe and HID reports.
Add an optional input transport and a dedicated LGMP receiver that
validates source ownership, generations, ordered sequences, and leases.
Poll input outside the 10 ms control timer. Forward mouse and keyboard
state through the LGInput pipe, and neutralize the endpoint before
ownership changes or transport failures can leave input held.
Reserve a dedicated LGMP queue for low-latency input reports and
endpoint status. Bump KVMFR for the new feature and define ordered
ownership messages with full-state mouse and keyboard payloads.
Use a 32-bit physical button mask so future HID buttons do not require
another wire format change.
Introduce LG_InputOps and route keyboard and mouse input through the
active video transport when it provides an input backend.
Keep SPICE as the fallback and force it while the SPICE display is
active. Add atomic shared/exclusive locking for safe backend changes.