Repository navigation
feat: add AUDIO_INPUT protocol crate - #1645
Merged
Marc-André Moreau (mamoreau-devolutions) merged 8 commits intoAug 12, 2026
Merged
Conversation
Introduce ironrdp-rdpeai with MS-RDPEAI PDUs and the client DVC state machine, plus a shared AudioFormat negotiation helper on ironrdp-rdpsnd. Package the crate as unpublished with tests in ironrdp-testsuite-core, and register the rdpeai commit scope.
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 17:34 — with
GitHub Actions
Inactive
Copilot started reviewing on behalf of
Marc-André Moreau (mamoreau-devolutions)
August 12, 2026 17:34
Register the new AUDIO_INPUT crate scope in PR title validation and the commit-scope skill.
Marc-André Moreau (mamoreau-devolutions)
had a problem deploying
to
llm-providers
August 12, 2026 17:38 — with
GitHub Actions
Error
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 17:40 — with
GitHub Actions
Inactive
Contributor
There was a problem hiding this comment.
Pull request overview
Adds workspace-internal MS-RDPEAI audio-input protocol support.
Changes:
- Adds AUDIO_INPUT PDUs, negotiation, and DVC client handling.
- Adds shared audio-format matching logic.
- Adds tests and workspace metadata.
Reviewed changes
Copilot reviewed 13 out of 14 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
.agents/skills/commit-scope/SKILL.md |
Adds the rdpeai commit scope. |
Cargo.lock |
Records the new crate and dependency edges. |
crates/ironrdp-rdpeai/Cargo.toml |
Defines the internal crate. |
crates/ironrdp-rdpeai/README.md |
Documents crate capabilities. |
crates/ironrdp-rdpeai/src/client.rs |
Implements the DVC client and capture abstraction. |
crates/ironrdp-rdpeai/src/lib.rs |
Exposes modules and shared audio types. |
crates/ironrdp-rdpeai/src/pdu.rs |
Implements AUDIO_INPUT PDUs. |
crates/ironrdp-rdpsnd/src/pdu/mod.rs |
Adds format-negotiation matching. |
crates/ironrdp-testsuite-core/Cargo.toml |
Adds the test dependency. |
crates/ironrdp-testsuite-core/tests/main.rs |
Registers RDPEAI tests. |
crates/ironrdp-testsuite-core/tests/rdpeai/client.rs |
Tests client negotiation and failures. |
crates/ironrdp-testsuite-core/tests/rdpeai/mod.rs |
Defines the RDPEAI test module. |
crates/ironrdp-testsuite-core/tests/rdpeai/pdu.rs |
Tests PDU round trips and packet sizing. |
Keep the lockfile matching the protocol-only crate PR so CI lock checks stay clean until capture wiring lands.
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 17:48 — with
GitHub Actions
Inactive
Marc-André Moreau (mamoreau-devolutions)
force-pushed
the
copilot/rdpeai-crate
branch
from
August 12, 2026 17:58
7b92f5c to
8ba7f8e
Compare
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 17:59 — with
GitHub Actions
Inactive
Keep Open capture WAVEFORMATEX separate from initialFormat encoding, reuse the Open Data PDU size on FormatChange, size packets as nChannels*2*FramesPerPacket, ignore out-of-sequence Version PDUs, and require nAvgBytesPerSec/nBlockAlign only for non-PCM negotiation.
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 18:40 — with
GitHub Actions
Inactive
Satisfy clippy::std_instead_of_core under -D warnings in CI.
Marc-André Moreau (mamoreau-devolutions)
temporarily deployed
to
llm-providers
August 12, 2026 18:49 — with
GitHub Actions
Inactive
Marc-André Moreau (mamoreau-devolutions)
merged commit Aug 12, 2026
50fa88b
into
master
41 checks passed
Marc-André Moreau (mamoreau-devolutions)
deleted the
copilot/rdpeai-crate
branch
August 12, 2026 20:46
This was referenced Aug 12, 2026
This was referenced Aug 14, 2026
Greg Lamberson (glamberson)
added a commit
to lamco-admin/IronRDP
that referenced
this pull request
Sep 11, 2026
ironrdp-rdpeai only had a client processor (PR Devolutions#1645); the PDU layer (pdu.rs) was already bidirectional, but nothing drove the server side of the MS-RDPEAI state machine. RdpeaiServer fills that gap, mirroring RdpeaiClient's structure and the RdpdrServer precedent (PR Devolutions#1783): sends Version on channel start and Formats once the client replies, automatically; exposes open()/change_format() for the consuming application to call once it wants to record; and delivers decoded audio to an injected RdpeaiServerBackend. Out-of-sequence, unrecognized, and mismatched PDUs are logged and ignored rather than treated as errors, per MS-RDPEAI 3.1.5's explicit MUST-ignore requirement. change_format() honors 3.3.5.3.1's SHOULD NOT for AAC formats when the client only advertised protocol version 1. 14 new tests in ironrdp-testsuite-core cover the full handshake, open failure/retry, format-change round trip and the AAC/V1 skip rule, out-of-sequence handling, and channel close. ironrdp-server integration (a factory trait plus attach_channels wiring, matching RdpeiServerFactory's shape) is a separate follow-up, same split RdpdrServer took.
Greg Lamberson (glamberson)
added a commit
to lamco-admin/IronRDP
that referenced
this pull request
Sep 11, 2026
ironrdp-rdpeai only had a client processor (PR Devolutions#1645); the PDU layer (pdu.rs) was already bidirectional, but nothing drove the server side of the MS-RDPEAI state machine. RdpeaiServer fills that gap, mirroring RdpeaiClient's structure and the RdpdrServer precedent (PR Devolutions#1783): sends Version on channel start and Formats once the client replies, automatically; exposes open()/change_format() for the consuming application to call once it wants to record; and delivers decoded audio to an injected RdpeaiServerBackend. Out-of-sequence, unrecognized, and mismatched PDUs are logged and ignored rather than treated as errors, per MS-RDPEAI 3.1.5's explicit MUST-ignore requirement. change_format() honors 3.3.5.3.1's SHOULD NOT for AAC formats when the client only advertised protocol version 1. 14 new tests in ironrdp-testsuite-core cover the full handshake, open failure/retry, format-change round trip and the AAC/V1 skip rule, out-of-sequence handling, and channel close. ironrdp-server integration (a factory trait plus attach_channels wiring, matching RdpeiServerFactory's shape) is a separate follow-up, same split RdpdrServer took.
This branch was previously deployed
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.
Introduce
ironrdp-rdpeaifor MS-RDPEAI (AUDIO_INPUT) PDUs and client handler, plus the shared RDPSND format matching helper used during negotiation.The crate is workspace-internal (
publish = false) with unit coverage inironrdp-testsuite-core. Capture backends and ActiveX wiring land in a follow-up stacked PR.