Skip to content

feat(mic): client microphone passthrough (Steam Streaming Microphone) rebased onto v1.17.0 - #1

Closed
Akikazehub wants to merge 7 commits into
masterfrom
feat/mic
Closed

feat(mic): client microphone passthrough (Steam Streaming Microphone) rebased onto v1.17.0#1
Akikazehub wants to merge 7 commits into
masterfrom
feat/mic

Conversation

@Akikazehub

Copy link
Copy Markdown
Owner

Client microphone passthrough (Steam Streaming Microphone)

Ports the Steam Streaming Microphone client-mic passthrough from PR #293 (vladbogun1:feat/mic) onto this fork for local CI builds.

What it does

Receives an Opus-encoded microphone stream from a compatible Moonlight client over the encrypted control stream (0x3003), decodes + jitter-buffers it, and renders it into the Steam Streaming Microphone virtual render endpoint so host apps (Discord, etc.) can read it as a normal mic input.

Build

  • Manual Windows-only workflow: mic-ci (windows only) (unsigned installer)
  • Trigger via Actions → mic-ci → Run workflow, or:
    gh workflow run "mic-ci (windows only)" -R Akikazehub/Vibepollo --ref feat/mic
    

Credit: original mic work by @xenstalker02; rebase by @vladbogun1.

vladbogun1 and others added 7 commits June 28, 2026 23:56
…ring

Port of xenstalker02/Vibepollo Steam Streaming Microphone passthrough onto
newest Nonary/Vibepollo base (v1.17.0). This checkpoint adds the standalone
mic engine files and wires them into the Windows build. Shared-file hunks
(stream.cpp routing, platform/windows/audio.cpp WASAPI) still to port.

New files (copied from xen/master):
- src/platform/windows/mic_write.{cpp,h}
- src/platform/windows/vibepollo_vmic.{cpp,h}

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Hand-merged xenstalker02/Vibepollo mic passthrough onto the newest Nonary
base (v1.17.0). Mic-only changes; rebranding/installer/playnite churn dropped.

Resolved via git apply --3way + manual conflict resolution:
- config.{h,cpp}: mic_sink / mic_capture_device / mic_buffer_ms / mic_buffer_packets
  (kept install_steam_drivers, unlike xen)
- stream.{h,cpp}: 0x3003 mic packet type, session_t::mic jitter-buffer state,
  init_mic_passthrough(), IDX_MIC_AUDIO_DATA handler via server->map(),
  get_mic_status(); kept v1.17.0 decode_control_packet/control_packet_view_t model
- platform/common.h: audio_control_t mic interface (switch_capture_to,
  snapshot_capture_defaults, restore_capture_from, restore_default_render_if_virtual,
  init/release_mic_redirect_device) with safe non-Windows defaults
- platform/windows/audio.cpp: WASAPI capture-switch + render-restore; region-4
  reconstructed to keep v1.17.0 jthread pending-restore + add xen render guard,
  adapted to 2-arg reset_default_device_impl
- new files: platform/windows/mic_write.{cpp,h} (WASAPI render to Steam Streaming
  Microphone) + vibepollo_vmic.{cpp,h}; wired into windows.cmake
- nvhttp/audio.cpp: kept v1.17.0 (HDR + safe parsing)

Web UI mic status card (confighttp) intentionally deferred — not needed for the
audio path. Builds unsigned via mic-ci.yml (workflow_dispatch, Windows only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
stream.cpp teardown used xen-only proc::is_placebo_app() and
system_tray::update_tray_idle() (absent in v1.17.0). Revert to v1.17.0's
update_tray_pausing/stopped. Non-mic churn pulled in by full-file 3way.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…dio.cpp

xen mic code used unqualified to_utf8/from_utf8 (resolved via a using-decl in
xen's tree); v1.17.0 needs explicit utf_utils:: qualification.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-Werror=cpp made the 'include winsock2.h before windows.h' warning fatal;
mmdeviceapi.h/Audioclient.h pull windows.h. Mirrors v1.17.0 audio.cpp order.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Akikazehub

Copy link
Copy Markdown
Owner Author

Closing in favor of a new design.

feat/mic (control-stream 0x3003) is useful as a prototype, but it is not symmetric with the host→client audio path (UDP/RTP + Opus + optional FEC). We will re-implement client microphone as a real uplink media channel with capability advertisement in /serverinfo, instead of piggybacking on the ENet control stream.

Tracking: new branch feat/mic-uplink-rtp (forthcoming).

@Akikazehub Akikazehub closed this Jul 27, 2026
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