feat(rdpsnd): carry the capture timestamp on waves and surface wave confirms - #1720
Open
Marynych Oleksandr (maryny4) wants to merge 1 commit into
Open
feat(rdpsnd): carry the capture timestamp on waves and surface wave confirms#1720Marynych Oleksandr (maryny4) wants to merge 1 commit into
Marynych Oleksandr (maryny4) wants to merge 1 commit into
Conversation
Marynych Oleksandr (maryny4)
temporarily deployed
to
llm-providers
August 20, 2026 14:59 — with
GitHub Actions
Inactive
Marynych Oleksandr (maryny4)
force-pushed
the
feat/rdpsnd-wave-timestamp
branch
from
August 20, 2026 15:04
a0c7919 to
1b998b3
Compare
Marynych Oleksandr (maryny4)
temporarily deployed
to
llm-providers
August 20, 2026 15:05 — with
GitHub Actions
Inactive
…onfirms MS-RDPEA 2.2.3.10 has the client echo a wave's wTimeStamp back in the Wave Confirm PDU once it consumed, cancelled or dropped that block, which is how a server measures how long the client held the data. The server hardcoded that field to zero for both Wave and Wave2, so the echo carried nothing and the confirm was only logged, never delivered - an embedder chasing an audio/video offset had no way to tell "the delay is on my side of the socket" from "the client is buffering". Waves now carry the low bits of the same capture time the 32-bit dwAudioTimeStamp gets, and RdpsndServerHandler gains a defaulted wave_confirm method that receives the block number and the echoed timestamp, so a handler that timestamps its own captures can compute the round trip. Existing handlers are unaffected.
Marynych Oleksandr (maryny4)
force-pushed
the
feat/rdpsnd-wave-timestamp
branch
from
August 20, 2026 16:51
1b998b3 to
ffb057e
Compare
Marynych Oleksandr (maryny4)
temporarily deployed
to
llm-providers
August 20, 2026 16:52 — with
GitHub Actions
Inactive
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
MS-RDPEA 2.2.3.10 has the client echo a wave's
wTimeStampback in the Wave Confirm PDU once it consumed, cancelled or dropped that block, which is how a server measures how long the client held the data. The server hardcoded that field to zero for both Wave and Wave2, and the confirm was only logged, never delivered to the handler — so an embedder chasing an audio/video offset has no way to tell "the delay is on my side of the socket" from "the client is buffering".Waves now carry the low bits of the same capture time the 32-bit
dwAudioTimeStampgets, so both fields describe one instant, andRdpsndServerHandlergains a defaultedwave_confirm(block_no, timestamp)that receives the echo. Existing handlers are unaffected.This came out of an audio-lag investigation in a downstream server (MuNeNiCK/hypr-rdp#46): on a healthy setup the server side shows nothing — zero stale-wave drops, a send queue of 0 bytes, confirms arriving at ~90/s — but there is no way to quantify the client-side half of the path, because the one field the spec reserves for it is always zero.
Covered by two tests in
ironrdp-testsuite-core: a wave carries the low bits of a capture time past the 16-bit range, and a Wave Confirm reaches the handler with its block number and echoed timestamp.