diff --git a/crates/punktfunk-host/src/audio/windows/minted.rs b/crates/punktfunk-host/src/audio/windows/minted.rs index 1fa2a82f..e837b432 100644 --- a/crates/punktfunk-host/src/audio/windows/minted.rs +++ b/crates/punktfunk-host/src/audio/windows/minted.rs @@ -318,19 +318,21 @@ const WFX_F32_2CH_48K: [u8; 40] = [ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, // KSDATAFORMAT_SUBTYPE_IEEE_FLOAT ]; -/// The capture pin's one format: 1 ch / 48 kHz / 32-bit float, mask 0x4 (FRONT_CENTER). -const WFX_F32_1CH_48K: [u8; 40] = [ +/// The PCM16 leg of the stereo set — the pad program's measured coherence rule: the DEVICE +/// format is 16-bit PCM, the mix/host formats float (a float device-format was part of the +/// incoherent sets that made endpoints unopenable). +const WFX_PCM16_2CH_48K: [u8; 40] = [ 0xfe, 0xff, // wFormatTag = WAVE_FORMAT_EXTENSIBLE - 0x01, 0x00, // nChannels = 1 + 0x02, 0x00, // nChannels = 2 0x80, 0xbb, 0x00, 0x00, // nSamplesPerSec = 48000 0x00, 0xee, 0x02, 0x00, // nAvgBytesPerSec = 192000 0x04, 0x00, // nBlockAlign = 4 - 0x20, 0x00, // wBitsPerSample = 32 + 0x10, 0x00, // wBitsPerSample = 16 0x16, 0x00, // cbSize = 22 - 0x20, 0x00, // wValidBitsPerSample = 32 - 0x04, 0x00, 0x00, 0x00, // dwChannelMask = SPEAKER_FRONT_CENTER - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, - 0x71, // KSDATAFORMAT_SUBTYPE_IEEE_FLOAT + 0x10, 0x00, // wValidBitsPerSample = 16 + 0x03, 0x00, 0x00, 0x00, // dwChannelMask = FL | FR + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, + 0x71, // KSDATAFORMAT_SUBTYPE_PCM ]; /// Best-effort: write the role's display name — plus, on the mic RENDER, the mono format set — @@ -349,37 +351,36 @@ fn stamp_identity(endpoint_id: &str, role: Role, capture: bool) { value: pe::StampValue::Str("Punktfunk"), }, ]; - // Format stamps pin each mic-pair side to ITS pin's one supported format — measured: the - // render pin is stereo-only and the capture pin mono-only (stamping either differently - // makes the endpoint unopenable, 0x88890008 on every Initialize). These stamps exist to - // HEAL endpoints an earlier build of this branch mis-stamped, and to keep the pair pinned - // against drift; they cannot fix the raw crossing (see [`minted_ids`]). + // The mic pair gets ONE coherent stereo format set on BOTH endpoints, in the exact + // PCM16-device/float-mix split the pad program's stamp bisect proved the driver accepts + // (its first "unopenable endpoint" and "format can't be changed" verdicts were both + // incoherent-stamp artifacts — this branch re-derived the same false verdicts before the + // pad recipe was re-applied). Both sides identical: the driver moves one stream between + // the two endpoints, and the octave-low voice was the two sides DISAGREEING (stereo + // render default vs mono capture default). `capture` steers nothing today — kept so a + // per-direction split stays one edit away. + let _ = capture; if role == Role::Mic { - let wfx: &'static [u8; 40] = if capture { - &WFX_F32_1CH_48K - } else { - &WFX_F32_2CH_48K - }; stamps.extend([ pe::Stamp { label: "device-format", key: pe::PKEY_DEVICE_FORMAT, - value: pe::StampValue::Format(wfx), + value: pe::StampValue::Format(&WFX_PCM16_2CH_48K), }, pe::Stamp { label: "mix-format-2", key: pe::PKEY_MIX_FORMAT_2, - value: pe::StampValue::Format(wfx), + value: pe::StampValue::Format(&WFX_F32_2CH_48K), }, pe::Stamp { label: "mix-format-3", key: pe::PKEY_MIX_FORMAT_3, - value: pe::StampValue::Format(wfx), + value: pe::StampValue::Format(&WFX_F32_2CH_48K), }, pe::Stamp { label: "host-format", key: pe::PKEY_HOST_FORMAT, - value: pe::StampValue::Format(wfx), + value: pe::StampValue::Format(&WFX_F32_2CH_48K), }, ]); }