Build the Windows client against the MSVC ABI while retaining clang
language support. Use vcpkg for ANGLE and libsamplerate, and build
MsQuic with its bundled static OpenSSL.
Build MsQuic's component archives instead of flattening Windows import
libraries into the monolithic archive. Use the static OpenSSL archives
supplied by the active MinGW toolchain while retaining Schannel for MSVC
and QuicTLS for Linux.
Let the active compiler locate its target root and use the restricted
ntdll import library. Provide GCC-compatible byte interlocked
operations, expose native XDP calls, and suppress expected compatibility
warnings.
Replace the single-owner PCM queues with one shared LGMP SPMC stream.
Give each admitted client reliable state and an independent playback
cursor, while clients without clock authority resample locally.
Extend the audio protocol with per-client epochs and barriers.
Keep capture exclusive and bound authority backpressure so slow
secondary readers cannot affect the disciplined low-latency path.
Add LGProtocol as a pinned submodule and consume its KVMFR protocol
definitions throughout the client, host, IDD, OBS, and profiler.
Keep Looking Glass framebuffer helpers local while removing duplicated
protocol headers and migrating users to KVMFR-scoped types.
Report guest HID keyboard LED state from LGInput to LGIdd and
publish it with the LGMP input endpoint status.
Forward SPICE modifier updates through the same provider state so evdev
can synchronize physical keyboard LEDs across transport changes and
reconnects.
Bump the versioned pipe and KVMFR input status contracts for the new
feedback state.
Accept earlier LGMP input status versions without LED feedback so the
client retains input while the guest driver is being upgraded.
Advance LGMP to the stream polling fallback implementation.
The new API combines short spins with bounded exponential backoff and
resets on observed progress. Notification callbacks remain advisory, so
plain shared-memory transports keep making progress without doorbells.
Advance LGMP to the new separately versioned stream transport. This
provides fixed-slot, epoch-bound SPSC lanes without changing the
existing broadcast queue ABI.
Use reliable draining for clipboard and input payloads, and retain
transport-neutral notification hooks for a later doorbell backend.
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.
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.
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.
Keep warnings fatal for the GUI dependencies except for two known
issues in generated wrapper sources: an unused cimgui conversion helper
and cimplot's invalid internal FormatSpec conversion.
Scope the exceptions to their respective generated translation units so
warnings in ImGui, ImPlot, and the remaining wrappers stay fatal.
Replace the rotating D3D12 copy queues with two framebuffer-bound
recording slots on one physical COPY queue. Keep allocator, command
list, query range, callback state, and fence target independent per
slot.
Submit source waits, execution, and signaling on the shared timeline.
Track framebuffer ownership through completion and serialize LGMP
publication around the last successfully published frame.
Drive playback timing from audio sample positions instead of packet
arrival cadence. Use SPICE multimedia timestamps to anchor streams,
detect discontinuities, and estimate the long-term source rate. Ignore
their coarse phase corrections when steering the playback buffer.
Measure the device clock independently and wait for it to stabilize
before enabling a bounded, slew-limited phase controller. Align startup
buffering from logical producer and consumer positions so backend
startup reserves do not become persistent latency.
Size the buffer from the backend period, measured delivery jitter, and
resampler delay. Update PipeWire and PulseAudio to report their actual
startup requirements and presentation latency. Default to a 10 ms
device period with 4 ms of additional buffering, and make detailed
synchronization diagnostics opt-in through audio:debug.
This reduces startup and steady-state latency while compensating for
physical and virtual device clock drift without reacting to transport
jitter or SPICE timestamp quantization.