WIP: fix(audio): support up to 64 microphone devices #751

Draft
Phishinabowl wants to merge 2 commits from Phishinabowl/Longshot:fix/microphone-device-limit into main
First-time contributor

Type: fix · Risk: low · Tested on: Windows and Ubuntu 24.04 WSL2 native fixtures; RTX 3080 RC4 integration play-test · Needs: native Linux build and real microphone validation; request T-9DPF submitted, awaiting maintainer approval

Why

PCs with many physical or virtual recording endpoints can have their preferred microphone omitted from Longshot's selector. Both the host and menu stop listing devices at 16. This affects setups using audio-routing software such as Voicemeeter or VB-Audio Matrix, even when Windows lists the missing device normally.

Raise both limits to 64 so those devices can be selected explicitly. Searches of the public issue tracker for microphone, mic, audio input and 64 devices did not identify a directly matching issue among the returned results.

How to reproduce

Seen on: Windows desktop with a Ryzen 9 5900XT, RTX 3080 and approximately 28 recording endpoints, including VB-Audio Matrix devices. Exact OS build and GPU driver were not recorded for the original report.
Settings and switches: Default microphone selection initially; no special switch is required.
Steps: With more than 16 recording endpoints, open the Insert menu, then Gameplay → Microphone on upstream RC4/current main. Cycle through the named devices and look for an endpoint beyond the first 16.
Expected: The desired recording endpoint is available by name.
Actual: The selector omits endpoints after the first 16. Default may still work if Windows routes it to the intended endpoint.

What changed

The host and menu now retain up to 64 recording endpoints. Selection by name, Default, Off and missing-device fallback keep their existing behavior.

Published source: implementation 22eb623fe0b6a2abcd1b78d485d6535a4ccfc691, documentation/test records ee8ab5f05d7447bf3b5c111adc29561c24a5551f, based on main a00c485c71f50d3e698985d91a3f72edfb1ea020.

  • Host: raise MAX_DEVICES from 16 to 64 in host/nn_audio_in.c so enumeration and device recovery use the expanded list.
  • Menu: raise kMaxMics from 16 to 64 in gpu/vk/vk_menu.cpp so the selector can display every endpoint the host retains.
  • Tests: extend tests/test_audio_in.py with a 70-endpoint fixture covering an endpoint at index 23, the final supported endpoint at index 63, truncation at 64, disconnect/reconnect under a new ID, retained selection by name and Default.
  • Documentation: describe the shared 64-endpoint limit in README.md and docs/development.md; add fifteen identified fixture/suite run records under docs/tested/ and a scoped guide-image review in docs/images/guide/source-review-microphone-device-limit.md.

This PR contains the device-limit fix, its tests and supporting documentation. The microphone menu move, output selector, test button, meter and gain controls are separate changes.

Existing guide screenshots remain unchanged. The only published Longshot settings image shows Graphics, while this selector is on Gameplay. The limit change adds no row, label, layout or help-text change. The screenshot review records this decision and the existing upstream fingerprint drift; no PNG or capture/review fingerprint is refreshed. New high-index entries are demonstrated by the failing/passing regression rather than a replacement of an unaffected guide image. No pixel-equivalence or fresh-render claim is made.

Measurements

Verdict: After one warm-up of each variant, two interleaved main/fix pairs on each platform gave identical correctness results: main fails at the expanded-list boundary in 2/2 measured runs; the fix passes 55 native input-stream cases and the menu fixture in 2/2. This holds on Windows and Ubuntu WSL2. The full Windows suite separately completed with 537 passed, 21 failed and 35 skipped; 20 failures reproduce on main, and the remaining control-tool test passed on both main and an isolated topic-branch rerun.

Baseline: the failing control uses unchanged production sources exported from main 9e6f231d with this PR's new test copied into the source snapshot. The passing runs measured implementation snapshot ed097a30. The published PR head is ee8ab5f0; its three implementation/test files are byte-identical to that measured snapshot, verified by an empty scoped Git diff. The final rebase adds only upstream's release-workflow skill (a00c485c) and our supporting docs/run records; no executable input changed, so the measured regression and suite evidence remain applicable. Historical run records retain the commits actually tested. In-game feedback comes from an RC4 integration build containing other audio changes and is supplementary evidence, not an isolated current-main play-test.

Hardware: Windows desktop; native fixtures use fake SDL/menu state and no GPU. Supplementary RC4 gameplay used an RTX 3080 and Ryzen 9 5900XT; its original test log does not record the OS build, GPU driver or RAM.
Scene: game-free native host/menu fixtures on Windows and Linux; supplementary manual device-selection testing in the RC4 integration build.
Method: LLVM-MinGW on Windows and GCC/G++ 13.3.0 on Ubuntu 24.04.5 WSL2 compiled the host and extracted menu fixtures with warnings treated as errors. On each platform, run one main and one fix warm-up, excluded from results, then main → fix → main → fix sequentially on the same PC with unchanged compiler flags and fake-SDL inputs. Source hashes match the previously validated sources. Correctness is pass/fail, not a performance metric. Elapsed medians below are diagnostic only: the failing control exits before the complete passing test, so they cannot establish speed or overhead. No FPS or memory benchmark was taken.
How to reproduce: run python -I -B tests/test_audio_in.py --cc clang --cxx clang++ with the LLVM-MinGW binaries and runtime DLLs on PATH. For the failing control, run the same new test with unchanged current-main production sources. Run python -I -B tests/run_all.py --jobs 4 for the full suite.

Check Before: main @ 9e6f231d After: measured topic @ ed097a30
Host/menu endpoint capacity, source inspection 16 / 16 64 / 64
Windows, measured runs 1 / 2 Boundary failure / boundary failure; native exit 43 both 55 host cases + menu pass / 55 host cases + menu pass
Ubuntu 24.04.5 WSL2, measured runs 1 / 2 Boundary failure / boundary failure; native exit 43 both 55 host cases + menu pass / 55 host cases + menu pass
Windows elapsed median, diagnostic only 0.3984 s 0.9328 s
Ubuntu WSL2 elapsed median, diagnostic only 0.6515 s 1.3041 s

Each measured main invocation printed the following assertion, then the Python driver reported the native fixture's nonzero exit status 43 (driver exit 1). Both measured fix invocations on each platform printed the two PASS lines below (driver exit 0). Temporary-path tracebacks are omitted from this excerpt.

the expanded list and its boundary
PASS: 55 input stream cases (device list, open, start, silence, a shared microphone, capacity, a lost one and its retries, a quiet one, named ones, a stand-in, stop, close)
PASS: the Microphone row keeps its choice by name, and tells the host (including more than sixteen devices)

Flags and settings

No flags, menu rows or ini keys are added. The existing Microphone selector's fixed endpoint capacity changes.

Flag What it is Before this PR After this PR Effect Helps / doesn't help / untested Recommendation
Microphone endpoint capacity Internal host/menu limit, not a user switch 16 endpoints 64 endpoints Lists and resolves more named microphones Helps PCs with over 16 endpoints; Windows/Linux native boundary/default/reconnect fixtures pass; Linux real-device capture untested 64 for everyone; retain the existing Default selection

Testing

Tested: Implementation snapshot ed097a30, based on main 9e6f231d. LLVM-MinGW: unchanged main fails the new regression; the fix passes 55 native host cases and the menu fixture. git diff --check passes, and git range-diff confirmed the first rebase preserved the original patch. Final published head ee8ab5f0 is based on current main a00c485c; an empty scoped diff verifies that host input source, menu source and the microphone test remain identical to the measured snapshot. The full Windows game-free runner completed: 537 passed, 21 failed, 35 skipped in 287 seconds. Rerunning its 21 failed checks on unmodified main gave 20 failures and one pass. The one passing check, test_longshot_ctl.py, then also passed in isolation on the measured topic (48 seconds); its full-run failure read an empty receipt file. No new reproducible failure remains observed from this patch. Supplementary microphone selection feedback comes from an RC4 integration build with additional audio changes.

The following 20 checks fail on both this branch and unmodified main in the same environment: test_fpx_sticky.py, test_cpp_preflight.py, test_appimage_player_build.py, test_cpm_discovery.py, test_crash_dialog.py, test_env_on.py, test_lift_cleanup_error.py, test_linux_preflight.py, test_make_game_cache.py, test_make_game_prepare.py, test_missing_nup.py, test_oot_state_tap.py, test_options_budget_once.py, test_readback_late.py, test_release.py, test_spawn_emit.py, test_tested_configurations.py, test_vk_pgo.py, test_walk_key.py, and test_work_lock.py. These include Windows fixture/cleanup failures, toolchain/environment limitations, and source assertions; they are not all classified as upstream production bugs. The 35 skips are the runner's default Windows/platform rules, including GPU/game-dependent and Linux-only checks. No skipped check is counted as a pass.

Tested on Linux: Ubuntu 24.04.5 WSL2, Python 3.12.3, GCC/G++ 13.3.0. The identical new regression fails on unchanged main at the expanded-list boundary (fixture exit 43), then passes all 55 native host cases and the menu fixture on the rebased fix. Both compile with warnings treated as errors; SDL and device events are fake.

Interleaved confirmation: Windows and Linux each completed one excluded warm-up per variant and two measured main/fix pairs. All four measured main controls failed for the expected boundary assertion; all four measured fix runs passed the host and menu checks. The published implementation/test files still match ed097a30; supporting docs/run records are now committed. Individual run records identify each platform, pair, variant and result. All 25 documentation-record validation tests passed in WSL.

Not tested: An isolated current-main game build/play-test, full Linux host/game build or real-device capture, real 64-endpoint hardware, memory/timing overhead, and the 35 runner-skipped checks. Baseline failures remain unresolved; the suite is not entirely green.

Must be tested:

  • Native Linux, normal SDL audio backend: build the PR using the development guide, run tests/test_audio_in.py, and check Gameplay → Microphone with Off, Default and a named microphone; enable the game's microphone input where it reads the mic, expecting a successful build, passing fixtures, silence with Off, and actual input with Default/the chosen microphone. Unplug/reconnect the chosen device if supported, expecting default fallback and recovery of the saved selection (Test Farm: @Beanstalk linux, build and real microphone/default/named-device regression). Report distro, SDL backend, tested commit, device setup and the result. With more than 16 real endpoints available, also check a high-index device; this hardware setup is optional because the 64-endpoint boundary is already covered by native fixtures.

Linux test request T-9DPF has been submitted through the project's test-request queue for this PR. It is waiting for a maintainer to add testing wanted before it can be claimed, because this PR is from a fork rather than an upstream collaborator. No tester or result is implied. Keep the PR WIP until the outstanding Linux evidence is in. A full local WSL game build is not required to ask another tester for that coverage.

Risks

What could break: Enumeration arrays become larger and high-endpoint setups perform more name comparisons. The limit remains finite: endpoints after the first 64 are still omitted. Existing duplicate-name and saved-name truncation behavior is unchanged. Resource cost has not been benchmarked.

Turning it off: Revert this focused commit; no runtime switch is introduced.

Compatibility: No save or options format change, no new ini keys, no renderer interface change or ABI bump, and no builder/tool dependency change. Existing selection remains name-based. The two production changes do not modify shader translation; shader/pipeline cache behavior is unchanged by this fix.

Checklist

Everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main (a00c485c, fetched 2026-11-15). The only upstream change since the measured base is a release-workflow skill; executable/test inputs are unchanged.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named). Full run completed; 20 baseline failures are named above, and the remaining intermittent check passed on a topic rerun. 35 platform skips are disclosed.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported. Two pairs per platform after warm-up; fake-SDL fixture inputs and compiler flags fixed. Elapsed medians are diagnostic only; correctness results are deterministic and no performance gain is claimed.
  • A file in docs/tested/ for each new measured run (format in docs/tested-configurations.md). Fifteen self-contained records include the eight measured interleaved invocations, initial Windows/Linux controls and passing fixtures, full suite, main-baseline comparison and isolated retry. Warm-ups are logged separately and excluded from measurements.
  • A game-free test added for the fix, failing on main and passing here.
  • A check under tests/ that reads changed source updated in this PR, not weakened.
  • Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Windows and Linux host/menu fixture compilation passed; complete Linux host build and real-device evidence remain pending.
  • Docs updated. README/development guide describe the limit; the scoped source/image review explains why screenshots and provenance remain unchanged, without certifying unrelated upstream image drift.
**Type:** fix · **Risk:** low · **Tested on:** Windows and Ubuntu 24.04 WSL2 native fixtures; RTX 3080 RC4 integration play-test · **Needs:** native Linux build and real microphone validation; request T-9DPF submitted, awaiting maintainer approval ## Why PCs with many physical or virtual recording endpoints can have their preferred microphone omitted from Longshot's selector. Both the host and menu stop listing devices at 16. This affects setups using audio-routing software such as Voicemeeter or VB-Audio Matrix, even when Windows lists the missing device normally. Raise both limits to 64 so those devices can be selected explicitly. Searches of the public issue tracker for microphone, mic, audio input and 64 devices did not identify a directly matching issue among the returned results. ## How to reproduce **Seen on:** Windows desktop with a Ryzen 9 5900XT, RTX 3080 and approximately 28 recording endpoints, including VB-Audio Matrix devices. Exact OS build and GPU driver were not recorded for the original report. **Settings and switches:** Default microphone selection initially; no special switch is required. **Steps:** With more than 16 recording endpoints, open the Insert menu, then Gameplay → Microphone on upstream RC4/current main. Cycle through the named devices and look for an endpoint beyond the first 16. **Expected:** The desired recording endpoint is available by name. **Actual:** The selector omits endpoints after the first 16. Default may still work if Windows routes it to the intended endpoint. ## What changed The host and menu now retain up to 64 recording endpoints. Selection by name, Default, Off and missing-device fallback keep their existing behavior. Published source: implementation `22eb623fe0b6a2abcd1b78d485d6535a4ccfc691`, documentation/test records `ee8ab5f05d7447bf3b5c111adc29561c24a5551f`, based on main `a00c485c71f50d3e698985d91a3f72edfb1ea020`. - Host: raise `MAX_DEVICES` from 16 to 64 in `host/nn_audio_in.c` so enumeration and device recovery use the expanded list. - Menu: raise `kMaxMics` from 16 to 64 in `gpu/vk/vk_menu.cpp` so the selector can display every endpoint the host retains. - Tests: extend `tests/test_audio_in.py` with a 70-endpoint fixture covering an endpoint at index 23, the final supported endpoint at index 63, truncation at 64, disconnect/reconnect under a new ID, retained selection by name and Default. - Documentation: describe the shared 64-endpoint limit in `README.md` and `docs/development.md`; add fifteen identified fixture/suite run records under `docs/tested/` and a scoped guide-image review in `docs/images/guide/source-review-microphone-device-limit.md`. This PR contains the device-limit fix, its tests and supporting documentation. The microphone menu move, output selector, test button, meter and gain controls are separate changes. Existing guide screenshots remain unchanged. The only published Longshot settings image shows Graphics, while this selector is on Gameplay. The limit change adds no row, label, layout or help-text change. The screenshot review records this decision and the existing upstream fingerprint drift; no PNG or capture/review fingerprint is refreshed. New high-index entries are demonstrated by the failing/passing regression rather than a replacement of an unaffected guide image. No pixel-equivalence or fresh-render claim is made. ## Measurements **Verdict:** After one warm-up of each variant, two interleaved main/fix pairs on each platform gave identical correctness results: main fails at the expanded-list boundary in 2/2 measured runs; the fix passes 55 native input-stream cases and the menu fixture in 2/2. This holds on Windows and Ubuntu WSL2. The full Windows suite separately completed with 537 passed, 21 failed and 35 skipped; 20 failures reproduce on main, and the remaining control-tool test passed on both main and an isolated topic-branch rerun. Baseline: the failing control uses unchanged production sources exported from main `9e6f231d` with this PR's new test copied into the source snapshot. The passing runs measured implementation snapshot `ed097a30`. The published PR head is `ee8ab5f0`; its three implementation/test files are byte-identical to that measured snapshot, verified by an empty scoped Git diff. The final rebase adds only upstream's release-workflow skill (`a00c485c`) and our supporting docs/run records; no executable input changed, so the measured regression and suite evidence remain applicable. Historical run records retain the commits actually tested. In-game feedback comes from an RC4 integration build containing other audio changes and is supplementary evidence, not an isolated current-main play-test. Hardware: Windows desktop; native fixtures use fake SDL/menu state and no GPU. Supplementary RC4 gameplay used an RTX 3080 and Ryzen 9 5900XT; its original test log does not record the OS build, GPU driver or RAM. Scene: game-free native host/menu fixtures on Windows and Linux; supplementary manual device-selection testing in the RC4 integration build. Method: LLVM-MinGW on Windows and GCC/G++ 13.3.0 on Ubuntu 24.04.5 WSL2 compiled the host and extracted menu fixtures with warnings treated as errors. On each platform, run one main and one fix warm-up, excluded from results, then main → fix → main → fix sequentially on the same PC with unchanged compiler flags and fake-SDL inputs. Source hashes match the previously validated sources. Correctness is pass/fail, not a performance metric. Elapsed medians below are diagnostic only: the failing control exits before the complete passing test, so they cannot establish speed or overhead. No FPS or memory benchmark was taken. How to reproduce: run `python -I -B tests/test_audio_in.py --cc clang --cxx clang++` with the LLVM-MinGW binaries and runtime DLLs on PATH. For the failing control, run the same new test with unchanged current-main production sources. Run `python -I -B tests/run_all.py --jobs 4` for the full suite. | Check | Before: main @ 9e6f231d | After: measured topic @ ed097a30 | |---|---|---| | Host/menu endpoint capacity, source inspection | 16 / 16 | 64 / 64 | | Windows, measured runs 1 / 2 | Boundary failure / boundary failure; native exit 43 both | 55 host cases + menu pass / 55 host cases + menu pass | | Ubuntu 24.04.5 WSL2, measured runs 1 / 2 | Boundary failure / boundary failure; native exit 43 both | 55 host cases + menu pass / 55 host cases + menu pass | | Windows elapsed median, diagnostic only | 0.3984 s | 0.9328 s | | Ubuntu WSL2 elapsed median, diagnostic only | 0.6515 s | 1.3041 s | Each measured main invocation printed the following assertion, then the Python driver reported the native fixture's nonzero exit status 43 (driver exit 1). Both measured fix invocations on each platform printed the two PASS lines below (driver exit 0). Temporary-path tracebacks are omitted from this excerpt. ```text the expanded list and its boundary ``` ```text PASS: 55 input stream cases (device list, open, start, silence, a shared microphone, capacity, a lost one and its retries, a quiet one, named ones, a stand-in, stop, close) PASS: the Microphone row keeps its choice by name, and tells the host (including more than sixteen devices) ``` ### Flags and settings No flags, menu rows or ini keys are added. The existing Microphone selector's fixed endpoint capacity changes. | Flag | What it is | Before this PR | After this PR | Effect | Helps / doesn't help / untested | Recommendation | |---|---|---|---|---|---|---| | Microphone endpoint capacity | Internal host/menu limit, not a user switch | 16 endpoints | 64 endpoints | Lists and resolves more named microphones | Helps PCs with over 16 endpoints; Windows/Linux native boundary/default/reconnect fixtures pass; Linux real-device capture untested | 64 for everyone; retain the existing Default selection | ## Testing **Tested:** Implementation snapshot `ed097a30`, based on main `9e6f231d`. LLVM-MinGW: unchanged main fails the new regression; the fix passes 55 native host cases and the menu fixture. `git diff --check` passes, and `git range-diff` confirmed the first rebase preserved the original patch. Final published head `ee8ab5f0` is based on current main `a00c485c`; an empty scoped diff verifies that host input source, menu source and the microphone test remain identical to the measured snapshot. The full Windows game-free runner completed: 537 passed, 21 failed, 35 skipped in 287 seconds. Rerunning its 21 failed checks on unmodified main gave 20 failures and one pass. The one passing check, `test_longshot_ctl.py`, then also passed in isolation on the measured topic (48 seconds); its full-run failure read an empty receipt file. No new reproducible failure remains observed from this patch. Supplementary microphone selection feedback comes from an RC4 integration build with additional audio changes. The following 20 checks fail on both this branch and unmodified main in the same environment: `test_fpx_sticky.py`, `test_cpp_preflight.py`, `test_appimage_player_build.py`, `test_cpm_discovery.py`, `test_crash_dialog.py`, `test_env_on.py`, `test_lift_cleanup_error.py`, `test_linux_preflight.py`, `test_make_game_cache.py`, `test_make_game_prepare.py`, `test_missing_nup.py`, `test_oot_state_tap.py`, `test_options_budget_once.py`, `test_readback_late.py`, `test_release.py`, `test_spawn_emit.py`, `test_tested_configurations.py`, `test_vk_pgo.py`, `test_walk_key.py`, and `test_work_lock.py`. These include Windows fixture/cleanup failures, toolchain/environment limitations, and source assertions; they are not all classified as upstream production bugs. The 35 skips are the runner's default Windows/platform rules, including GPU/game-dependent and Linux-only checks. No skipped check is counted as a pass. **Tested on Linux:** Ubuntu 24.04.5 WSL2, Python 3.12.3, GCC/G++ 13.3.0. The identical new regression fails on unchanged main at the expanded-list boundary (fixture exit 43), then passes all 55 native host cases and the menu fixture on the rebased fix. Both compile with warnings treated as errors; SDL and device events are fake. **Interleaved confirmation:** Windows and Linux each completed one excluded warm-up per variant and two measured main/fix pairs. All four measured main controls failed for the expected boundary assertion; all four measured fix runs passed the host and menu checks. The published implementation/test files still match `ed097a30`; supporting docs/run records are now committed. Individual run records identify each platform, pair, variant and result. All 25 documentation-record validation tests passed in WSL. **Not tested:** An isolated current-main game build/play-test, full Linux host/game build or real-device capture, real 64-endpoint hardware, memory/timing overhead, and the 35 runner-skipped checks. Baseline failures remain unresolved; the suite is not entirely green. **Must be tested:** - Native Linux, normal SDL audio backend: build the PR using the development guide, run `tests/test_audio_in.py`, and check Gameplay → Microphone with Off, Default and a named microphone; enable the game's microphone input where it reads the mic, expecting a successful build, passing fixtures, silence with Off, and actual input with Default/the chosen microphone. Unplug/reconnect the chosen device if supported, expecting default fallback and recovery of the saved selection (Test Farm: @Beanstalk linux, build and real microphone/default/named-device regression). Report distro, SDL backend, tested commit, device setup and the result. With more than 16 real endpoints available, also check a high-index device; this hardware setup is optional because the 64-endpoint boundary is already covered by native fixtures. Linux test request **T-9DPF** has been submitted through the project's test-request queue for this PR. It is waiting for a maintainer to add `testing wanted` before it can be claimed, because this PR is from a fork rather than an upstream collaborator. No tester or result is implied. Keep the PR WIP until the outstanding Linux evidence is in. A full local WSL game build is not required to ask another tester for that coverage. ## Risks **What could break:** Enumeration arrays become larger and high-endpoint setups perform more name comparisons. The limit remains finite: endpoints after the first 64 are still omitted. Existing duplicate-name and saved-name truncation behavior is unchanged. Resource cost has not been benchmarked. **Turning it off:** Revert this focused commit; no runtime switch is introduced. **Compatibility:** No save or options format change, no new ini keys, no renderer interface change or ABI bump, and no builder/tool dependency change. Existing selection remains name-based. The two production changes do not modify shader translation; shader/pipeline cache behavior is unchanged by this fix. ## Checklist ### Everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [x] Rebased on current `main` (`a00c485c`, fetched 2026-11-15). The only upstream change since the measured base is a release-workflow skill; executable/test inputs are unchanged. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). Full run completed; 20 baseline failures are named above, and the remaining intermittent check passed on a topic rerun. 35 platform skips are disclosed. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported. Two pairs per platform after warm-up; fake-SDL fixture inputs and compiler flags fixed. Elapsed medians are diagnostic only; correctness results are deterministic and no performance gain is claimed. - [x] A file in `docs/tested/` for each new measured run (format in `docs/tested-configurations.md`). Fifteen self-contained records include the eight measured interleaved invocations, initial Windows/Linux controls and passing fixtures, full suite, main-baseline comparison and isolated retry. Warm-ups are logged separately and excluded from measurements. - [x] A game-free test added for the fix, failing on `main` and passing here. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. - [ ] Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Windows and Linux host/menu fixture compilation passed; complete Linux host build and real-device evidence remain pending. - [x] Docs updated. README/development guide describe the limit; the scoped source/image review explains why screenshots and provenance remain unchanged, without certifying unrelated upstream image drift.
Raise the host and menu device limits together. Add regression cases for high-index selection, the 64-device boundary, disconnect/reconnect and the system default.

Validation on RC4: 55 native input-stream cases and the microphone menu fixture passed with LLVM-MinGW; git diff --check passed. Physical-device behavior in a rebuilt RC4 game remains untested.

Assisted-by: OpenAI Codex
docs(audio): record microphone device-limit validation
Some checks reported errors
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Guide screenshots / Guide images and local UI source review (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 15s
Website / Website on Cloudflare (pull_request_target) Has been skipped
beanstalk/approval approved by llun (reviewed)
beanstalk/linux 0/1 pass, 1 error
ee8ab5f05d
Document the shared 64-endpoint capacity and preserve the existing guide images with a scoped source review. Add Windows and Linux regression records, including repeated interleaved controls and passing fixes, with known test limitations.

Validation: 25 tested-configuration checks passed in WSL; git diff --check passed. Native regression and full-suite results are recorded with their measured commits.

Assisted-by: OpenAI Codex
Author
First-time contributor

@Beanstalk linux: Please verify a native Linux build and real microphone capture for this 16-to-64 endpoint fix. Test request T-9DPF is already submitted in the project queue.

Build PR head ee8ab5f0 using the development guide and run tests/test_audio_in.py. Then check Gameplay → Microphone with Off, Default and a named device while the game's microphone mode is actively reading. Expect a successful build, passing fixtures, silence with Off, and real input with Default/the chosen microphone. If supported, unplug/reconnect the chosen device and check default fallback and recovery. An existing setup with more than 16 recording endpoints would provide additional high-index coverage, but is optional.

Please report the tested commit, distro, SDL/audio backend, device setup and results. Windows and WSL2 native fixtures already reproduce the expected main failure and pass two interleaved pairs with the fix. Real Linux audio capture remains untested; this PR stays WIP pending that evidence.

Maintainer: please add testing wanted so the existing request can be claimed. The request tool reports that fork-contributor requests wait for this approval.

@Beanstalk linux: Please verify a native Linux build and real microphone capture for this 16-to-64 endpoint fix. Test request **T-9DPF** is already submitted in the project queue. Build PR head `ee8ab5f0` using the development guide and run `tests/test_audio_in.py`. Then check Gameplay → Microphone with Off, Default and a named device while the game's microphone mode is actively reading. Expect a successful build, passing fixtures, silence with Off, and real input with Default/the chosen microphone. If supported, unplug/reconnect the chosen device and check default fallback and recovery. An existing setup with more than 16 recording endpoints would provide additional high-index coverage, but is optional. Please report the tested commit, distro, SDL/audio backend, device setup and results. Windows and WSL2 native fixtures already reproduce the expected main failure and pass two interleaved pairs with the fix. Real Linux audio capture remains untested; this PR stays WIP pending that evidence. Maintainer: please add **`testing wanted`** so the existing request can be claimed. The request tool reports that fork-contributor requests wait for this approval.
Member

@Phishinabowl only members of BigBeans can start the farm. One of them can approve this request by reacting 👍 to it.

@Phishinabowl only members of `BigBeans` can start the farm. One of them can approve this request by reacting 👍 to it.
Member

Beanstalk test farm

Commit ee8ab5f · tier reviewed · approved by llun (👍 on Phishinabowl's request) · dashboard

What will be tested · AI plan (gpt-6.1-terra)

This plan builds the PR and main on Linux and runs a short Kokiri Forest gameplay smoke test, taking about 12 minutes per tester plus build time. It checks that gameplay starts and fails on a crash or failure to reach the expected map. The farm cannot run the requested Python fixture, select microphone devices, supply controlled audio, or test disconnect and recovery, so this plan does not establish real microphone capture or the 64-device fix.

  • Where: linux (1 report).
  • kokiri-smoke: from a new save, then measure forest for 10 s (after 5 s warm-up); 1 run on each side.
  • Measured: crashes.
  • The PR fails if: it crashes.
  • Time: about 13 min of game runs per tester (2 game starts), plus the two builds.

Done. Comment @Beanstalk to run it again.

Target Reports Crash Frame p99 (ms) vs main VRAM peak (MB) vs main Result
linux · 1: linux+nvidia+nvidia-proprietary+dgpu NVIDIA GeForce RTX 4070, 615.71.9 1/1 1 none — — error

Measurements · linux

Verdict: could not be judged on linux (1/1 report).

Hardware: 1: linux+nvidia+nvidia-proprietary+dgpu NVIDIA GeForce RTX 4070, 615.71.9 AMD Ryzen 7 5800X3D 8-Core Processor, 63 GB RAM
Scene: kokiri-smoke, from a new save; each cell's settings and switches as the table names them
Method: the Beanstalk test farm: main and this PR built and run on the same PC in one session, game starts alternating (ABBA); kokiri-smoke: 1 game start a side, forest 10 s after 5 s warm-up; each number the median of the runs, then of 1 report
How to reproduce: the farm's plan above (@Beanstalk on this PR runs it again)

Nothing was measured: no metric came back.

Flags and settings

None: the plan varied no setting, switch or build option.

Markdown for the PR description
## Measurements

**Verdict:** could not be judged on linux (1/1 report).

Hardware: 1: linux+nvidia+nvidia-proprietary+dgpu `NVIDIA GeForce RTX 4070, 615.71.9` `AMD Ryzen 7 5800X3D 8-Core Processor, 63 GB RAM`  
Scene: kokiri-smoke, from a new save; each cell's settings and switches as the table names them  
Method: the Beanstalk test farm: main and this PR built and run on the same PC in one session, game starts alternating (ABBA); kokiri-smoke: 1 game start a side, forest 10 s after 5 s warm-up; each number the median of the runs, then of 1 report  
How to reproduce: the farm's plan above (`@Beanstalk` on this PR runs it again)

Nothing was measured: no metric came back.

### Flags and settings

None: the plan varied no setting, switch or build option.
<!-- beanstalk:sticky --> ### Beanstalk test farm Commit `ee8ab5f` · tier **reviewed** · approved by llun (👍 on Phishinabowl's request) · [dashboard](https://beanstalk.magicbean.dev/prs/751) **What will be tested** · AI plan (`gpt-6.1-terra`) This plan builds the PR and main on Linux and runs a short Kokiri Forest gameplay smoke test, taking about 12 minutes per tester plus build time. It checks that gameplay starts and fails on a crash or failure to reach the expected map. The farm cannot run the requested Python fixture, select microphone devices, supply controlled audio, or test disconnect and recovery, so this plan does not establish real microphone capture or the 64-device fix. - **Where:** linux (1 report). - **kokiri-smoke:** from a new save, then measure forest for 10 s (after 5 s warm-up); 1 run on each side. - **Measured:** crashes. - **The PR fails if:** it crashes. - **Time:** about 13 min of game runs per tester (2 game starts), plus the two builds. Done. Comment `@Beanstalk` to run it again. | Target | Reports | Crash | Frame p99 (ms) vs main | VRAM peak (MB) vs main | Result | | --- | --- | --- | --- | --- | --- | | linux · 1: linux+nvidia+nvidia-proprietary+dgpu `NVIDIA GeForce RTX 4070, 615.71.9` | 1/1 [1](https://beanstalk.magicbean.dev/reports/rp_f4802f1a59caacba) | none | — | — | error | #### Measurements · linux **Verdict:** could not be judged on linux (1/1 report). Hardware: 1: linux+nvidia+nvidia-proprietary+dgpu `NVIDIA GeForce RTX 4070, 615.71.9` `AMD Ryzen 7 5800X3D 8-Core Processor, 63 GB RAM` Scene: kokiri-smoke, from a new save; each cell's settings and switches as the table names them Method: the Beanstalk test farm: main and this PR built and run on the same PC in one session, game starts alternating (ABBA); kokiri-smoke: 1 game start a side, forest 10 s after 5 s warm-up; each number the median of the runs, then of 1 report How to reproduce: the farm's plan above (`@Beanstalk` on this PR runs it again) Nothing was measured: no metric came back. ### Flags and settings None: the plan varied no setting, switch or build option. <details><summary>Markdown for the PR description</summary> ```markdown ## Measurements **Verdict:** could not be judged on linux (1/1 report). Hardware: 1: linux+nvidia+nvidia-proprietary+dgpu `NVIDIA GeForce RTX 4070, 615.71.9` `AMD Ryzen 7 5800X3D 8-Core Processor, 63 GB RAM` Scene: kokiri-smoke, from a new save; each cell's settings and switches as the table names them Method: the Beanstalk test farm: main and this PR built and run on the same PC in one session, game starts alternating (ABBA); kokiri-smoke: 1 game start a side, forest 10 s after 5 s warm-up; each number the median of the runs, then of 1 report How to reproduce: the farm's plan above (`@Beanstalk` on this PR runs it again) Nothing was measured: no metric came back. ### Flags and settings None: the plan varied no setting, switch or build option. ``` </details>
Some checks reported errors
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Guide screenshots / Guide images and local UI source review (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 15s
Website / Website on Cloudflare (pull_request_target) Has been skipped
beanstalk/approval approved by llun (reviewed)
beanstalk/linux 0/1 pass, 1 error
This pull request is marked as a work in progress.
Some workflows are waiting to be reviewed.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'fix/microphone-device-limit:Phishinabowl-fix/microphone-device-limit'
git switch 'Phishinabowl-fix/microphone-device-limit'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!751
No description provided.