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.
Advertise signed and floating-point 32-bit formats across mono,
stereo, quad, surround, 5.1, and 7.1 at every supported rate.
Carry sample encoding through the broker and LGMP protocol so integer
and floating-point streams remain distinct.
Expand packet, shared-memory, and ring capacity for eight-channel
32-bit audio.
Advertise optional audio mediation separately from runtime driver
availability, then negotiate ownership through the existing LGMP
client-control path.
Define fixed playback and capture stream records for packed PCM,
endpoint state, clock feedback, and targeted descriptor discovery.
Keep the LGMP queue table, recovery sidecar, and submodule unchanged.
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.
Carry DATA and FILE_DATA only through the duplex SPSC streams. Keep LGMP
queues for control and status. Remove grants, commits, ACKs, and
queue-payload transport negotiation.
Poll adaptively while ownership or release is active. Preserve FIFO
release and graceful draining. Quarantine payloads crossed by a newer
OFFER or CLEAR, and retire data-plane state on detach.
Carry every input activation and report through its client-bound SPSC
stream. Keep the LGMP queue only for status publication and subscriber
discovery, removing transport selection and the queue-report fallback.
Retain graceful endpoint draining when a subscriber disappears and use
bounded adaptive polling while streams are active. The IDD polling setup
remains compatible with the project’s current C++ language mode.
Extend input status with eight exported client-to-host stream
endpoints, matching the maximum number of LGMP clients.
Publish each endpoint descriptor, client binding, epoch, and lifecycle
flags. Require every input activation to keep its ordered records on a
single transport.
Retain the queue transport as a fallback and bump the input and
KVMFR protocol versions for the expanded status layout.
Replace the single 1 MiB clipboard slot with a four-record 256 KiB
window while retaining a 1 MiB logical file-read limit.
Advertise transport capabilities and duplex stream descriptors in the
clipboard status. Make each claim select one data plane for its entire
owner generation so control and payload ordering cannot be mixed.
Bump the clipboard, KVMFR, and Helper mapping versions for the new
wire layouts and shared-memory geometry.
Add a transport-neutral wire copy of the LGMP stream descriptor for
embedding in KVMFR subsystem status records.
Keep the common protocol independent of LGMP headers and assert the
field offsets and total size at both C and C++ integration points.
Normalize absolute event deadlines with division and remainder, and widen
millisecond conversion before multiplying. This prevents multi-second
waits from producing EINVAL or wrapping to shorter delays.
Define a fixed, protocol-independent recovery ABI in the final 64 KiB
of IVSHMEM.
Provide crash-safe multi-client requests and coherent producer status.
Exclude the region from LGMP allocation and frame capacity so future
protocol mismatches retain a stable control path.
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.
Bump KVMFR to version 28 and attach generation, epoch, and deadline
identities to cadence deliveries and their timing records.
Accept phase corrections only for the exact completed publication. Keep
VM and client clocks independent by exchanging relative phase errors.
Make submission, completion, and work-estimate accounting best effort
so scheduler state cannot delay GPU submission or frame publication.
Copy imported IVSHMEM frames into renderer-owned textures before
acknowledging their LGMP messages. Hold each lease until its copy fence
signals, and protect selected snapshots until rendering completes.
Track independent delivery lanes, drain acknowledgements on the frame
thread, and recover stale queue subscriptions after host timeouts.
Expand ImGui window damage to include its border and round both logical
window bounds and framebuffer-scaled bounds outward.
This prevents a one-pixel strip of stale desktop content when an
overlay window is resized at fractional positions or display scales.
Use calibrated copy-queue timestamps to separate source and effect
waits from the actual framebuffer copy.
Exclude producer readiness waits from client import timing so the
same interval is not counted in both Copy and Import.