Skip to content

feat: add AUDIO_INPUT protocol crate - #1645

Merged
Marc-André Moreau (mamoreau-devolutions) merged 8 commits into
masterfrom
copilot/rdpeai-crate
Aug 12, 2026
Merged

Marc-André Moreau (mamoreau-devolutions) merged 8 commits into
masterfrom
copilot/rdpeai-crate

Conversation

@mamoreau-devolutions

Copy link
Copy Markdown
Contributor

Introduce ironrdp-rdpeai for 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 in ironrdp-testsuite-core. Capture backends and ActiveX wiring land in a follow-up stacked PR.

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.
Register the new AUDIO_INPUT crate scope in PR title validation and the commit-scope skill.
@mamoreau-devolutions Marc-André Moreau (mamoreau-devolutions) changed the title feat(rdpeai): add AUDIO_INPUT protocol crate feat: add AUDIO_INPUT protocol crate Aug 12, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread crates/ironrdp-rdpsnd/src/pdu/mod.rs
Comment thread crates/ironrdp-rdpeai/src/pdu.rs Outdated
Comment thread crates/ironrdp-rdpeai/src/client.rs Outdated
Comment thread crates/ironrdp-rdpeai/src/client.rs Outdated
Comment thread crates/ironrdp-rdpeai/src/client.rs
Comment thread crates/ironrdp-testsuite-core/tests/rdpeai/client.rs Outdated
Comment thread crates/ironrdp-testsuite-core/tests/rdpeai/client.rs
@github-actions github-actions Bot added risk/unknown Risk could not be determined automatically; needs maintainer-level scrutiny scope/core Touches the core architectural tier scope/tooling Build, CI, release, or developer tooling size/XL Size: up to 1299 counted lines and 49 files; exceeds L in either measure labels Aug 12, 2026
Keep the lockfile matching the protocol-only crate PR so CI lock checks stay clean until capture wiring lands.
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.
Satisfy clippy::std_instead_of_core under -D warnings in CI.
@mamoreau-devolutions
Marc-André Moreau (mamoreau-devolutions) merged commit 50fa88b into master Aug 12, 2026
41 checks passed
@mamoreau-devolutions
Marc-André Moreau (mamoreau-devolutions) deleted the copilot/rdpeai-crate branch August 12, 2026 20:46
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

1 inactive deployment
llm-providers — b2ef1e9f Deployed Aug 12, 2026 by mamoreau-devolutions via Classify pull request #1734
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-review A human reviewer is the current next actor risk/unknown Risk could not be determined automatically; needs maintainer-level scrutiny scope/core Touches the core architectural tier scope/tooling Build, CI, release, or developer tooling size/XL Size: up to 1299 counted lines and 49 files; exceeds L in either measure

Development

Successfully merging this pull request may close these issues.

2 participants