Skip to content

Add remote microphone passthrough (Steam Streaming Microphone)#247

Open
logabell wants to merge 8 commits into
Nonary:masterfrom
logabell:feature/microphone-passthrough
Open

Add remote microphone passthrough (Steam Streaming Microphone)#247
logabell wants to merge 8 commits into
Nonary:masterfrom
logabell:feature/microphone-passthrough

Conversation

@logabell
Copy link
Copy Markdown

@logabell logabell commented May 22, 2026

Hello,

I didn't realize until this was submitted that xenstalker02 already submitted a similar PR. Looks like that one was based on my previous apollo fork. I know that this will require a separate client to work properly. Enabling this feature is a toggle within audio settings. I plan on maintaining Moonlight-qt / Artemis forks for compatibility, which are tested and work now.

Out of transparency, this PR was created with gpt-5.5 xhigh and reviewed with the new Composer 2.5 model.

Summary

  • Adds host-side remote microphone passthrough on Windows using the Steam Streaming Microphone render/capture pair (Opus decode, WASAPI write, session lifecycle in stream.cpp).
  • Requires encrypted microphone transport during RTSP setup; plaintext mic fallback is rejected for the session.
  • Adds stream_mic / mic_backend configuration, GET /api/audio-debug, and a Remote Microphone panel on the Troubleshooting page.
  • Includes Windows source-build fixups introduced on this branch as I ran into compiling issues with the new steam_mic additions. (FetchContent variables, npm web-ui wiring)

Client requirement

End-to-end mic passthrough needs compatible client builds with microphone redirection support:

Usage / Testing

  • Enable feature in Vibepollo audio settings
  • Launch a session from a mic-enabled Moonlight client; verify audio reaches host apps via Microphone (Steam Streaming Microphone)
  • Open Troubleshooting tab in Vibepollo console to see live status of audio input and confirm capture/decode/render stages update during an active session

logabell added 8 commits May 21, 2026 21:48
Use BOOST_MIN_VERSION and BOOST_FETCH_VERSION consistently in find_package and FetchContent after the partial rename on this branch. Set NPM from node.exe and npm-cli.js on Windows so the web-ui target invokes npm correctly.
Expose audio_control_t helpers needed by the mic backend factory and rename apollo_vmic to vibepollo_vmic for upstream branding.
Move Remote Microphone below the action cards, poll audio-debug less aggressively when idle, stop logging those requests, and remove the loading placeholder.
@logabell logabell changed the title Add remote microphone passthrough (Windows / Steam Streaming Microphone) Add remote microphone passthrough (Steam Streaming Microphone) May 22, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 020069266e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +65 to +69
find_file(NPM_CLI npm-cli.js
PATHS
"${CMAKE_PREFIX_PATH}"
"C:/msys64/ucrt64/lib/node_modules/npm/bin"
REQUIRED)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Restore npm lookup for standard Windows Node installs

Avoid hard-failing on npm-cli.js discovery in only CMAKE_PREFIX_PATH and C:/msys64/...: with a typical Node installer (C:\Program Files\nodejs), npm-cli.js lives under node_modules/npm/bin and this find_file() call does not search that nested path, so CMake configure fails before any build starts on many Windows hosts. This regresses source builds that previously worked via find_program(NPM npm).

Useful? React with 👍 / 👎.

Comment on lines +624 to +626
if (inserted && pending_packets.size() > max_queued_packets) {
pending_packets.erase(pending_packets.begin());
trimmed_packet_queue = true;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Make mic jitter-buffer trimming sequence-wrap aware

Do not evict packets with pending_packets.erase(pending_packets.begin()) on a std::map<uint16_t,...> sequence key: once 16-bit RTP sequence numbers wrap, the numerically smallest key is often the newest packet, so overflow trimming drops fresh audio and keeps stale packets. Under jitter/backlog conditions around wrap time, this can cause sustained microphone dropouts and misordered playout.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant