Skip to content

feat(windows): add managed VB-CABLE virtual microphone - #26

Merged
Horuse merged 30 commits into
Horuse:mainfrom
RedRatInHat:feat/windows-vb-cable-integration
Aug 22, 2026
Merged

Horuse merged 30 commits into
Horuse:mainfrom
RedRatInHat:feat/windows-vb-cable-integration

Conversation

@DeadMorose777

@DeadMorose777 DeadMorose777 commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

What this adds

This PR adds Windows virtual microphone support through VB-Audio VB-CABLE.

The audio route is:

Splitwave pipeline
-> Speaker node using CABLE Input
-> VB-CABLE
-> CABLE Output selected as a microphone in another app

This makes processed Splitwave audio available to Discord, OBS, browsers, games, and conference applications. Windows uses the existing Speaker node and WASAPI output path. There is no separate virtual microphone node or audio engine.

User flow

  1. Open Virtual devices.
  2. Install the virtual microphone if VB-CABLE is missing.
  3. Restart Windows if requested.
  4. Select CABLE Input in a Speaker node.
  5. Select CABLE Output as the microphone in the target app.

Splitwave checks the installation when the page opens and after the app regains focus.

Screenshots

Before installation

Virtual devices page before installation

Installing

VB-CABLE installation in progress

Ready

VB-CABLE ready after installation

Speaker node using CABLE Input

Speaker node routed to CABLE Input

These screenshots were captured from the packaged application on the clean Windows 11 test VM.

Driver handling

Splitwave downloads VB-CABLE from the official VB-Audio host and verifies the archive hash and installer signature before running it.

Existing VB-CABLE installations remain external and are never claimed or removed by Splitwave.

If Splitwave installed the package, the interactive app uninstaller can offer to remove it. Keeping the driver is the default. Updates and silent uninstall preserve it. Removal is limited to the exact managed driver package.

Installation failures now include a structured error code, message, and vendor exit code where available. The UI shows a useful message while full details remain in the application log.

Validation

The complete flow was tested using the packaged NSIS build on a clean Windows 11 Enterprise LTSC VM, build 26100:

  • clean state with no VB-CABLE package or endpoints;
  • installation from the Virtual devices page;
  • detection of CABLE Input and CABLE Output;
  • Ready state before and after reboot;
  • Speaker node routed to CABLE Input;
  • interactive Splitwave uninstall;
  • confirmed removal of the managed VB-CABLE package;
  • final reboot with no remaining package, endpoints, devices, or ownership record;
  • Windows audio services still running after removal.

Automated checks:

  • 24 Windows cable tests passed;
  • cargo check passed;
  • Rust formatting passed;
  • bun run check completed with 0 errors;
  • the unsigned NSIS installer built successfully.

GitHub Actions validation:

Both runs passed, including the Windows application and NSIS builds.

Developed and manually tested on Windows 11. Linux and macOS were not manually tested. Their virtual device backends and real-time audio paths were not changed.

on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
@DeadMorose777
DeadMorose777 requested a review from Horuse as a code owner August 17, 2026 14:13
@DeadMorose777
DeadMorose777 force-pushed the feat/windows-vb-cable-integration branch from 2133479 to 843db0e Compare August 17, 2026 16:32
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
Treat an exact new package as successful even when the vendor setup returns a nonzero code, fall back to the signed device description when SetupAPI omits FriendlyName, and keep raw helper exit codes out of user-facing errors.

on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
Expose Virtual microphone beside output nodes, detect its status on intent, show setup or restart guidance only when needed, and remove the Windows management page and manual refresh workflow.

on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
Add the approved node-first concept and a screenshot captured from the locally installed release build for PR validation.

on-behalf-of: @RedRatInHat <alexpacuk@redratinhat.com>
@DeadMorose777 DeadMorose777 reopened this Aug 17, 2026
@Horuse

Horuse commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Hi, I'm really glad you decided to contribute to this repository, but there are quite a few things I don't understand and that need to change.

  1. Please delete the docs folder. Please don't commit slop documentation.
  2. uninstallWindowsVirtualCable is dead code. The method is declared in the frontend and the command exists in Rust, but nothing calls it - uninstalling is only reachable through the uninstaller. And the only call site always passes { confirmed: true }, so the confirmation effectively never works. Either add a real UI path for uninstalling, or remove the dead code. If the command stays, the confirmation shouldn't live on the client side.
  3. I don't really understand why you added a UX concept instead of photos of the actual implemented modal and node. If you already built a release locally, attach real product screenshots rather than concept art.
  4. I don't understand why you built a separate modal to install virtual devices on Windows when we already have the /virtual-devices route, where this could be done in roughly the same way it is on Linux and macOS.
  5. You added a button in the Sidebar shaped like a node that opens a modal, and I don't understand this at all - it creates a false impression. At first I thought you'd added a separate virtual-devices node that filters virtual devices out of speaker and shows them only there, but after reading the code I realized it's just a button, not a node.
  6. You added a new Windows CI workflow, but it never passed and is failing - it looks like you never even ran it. This is the main blocker.
  7. You made a bunch of changes that aren't even visible. For example, /virtual-devices was changed, but you hid it on Windows in favor of the modal - and the page just redirects to /. As a result, the instruction in the README ("open Virtual devices") doesn't work on Windows.
  8. I built your branch (Windows 11) and tried to install the virtual microphone: it told me "The virtual microphone could not be installed. Splitwave preserved the current Windows audio configuration." There's no useful information in the app logs about the error - just a generic exit_code=1, and it's impossible to tell what actually went wrong.

Honestly, I’m going to close this PR, because the amount of AI is fairly high and the feature in its current state doesn't work even on a clean Windows 11, and without meaningful diagnostics.

That said, I understand this is a lot of work, but in its current form I'm not ready to accept the PR: too much code I can't confidently support or understand and most importantly the feature doesn't work.

But if you'd like to take the idea to a working state, I'm open to you reopening the PR — but not before you address and respond to every point above. I'm happy to help with a step-by-step review once you've worked through them.

Thanks for your time and for the attempt - it's valuable even if the result isn't there yet.

*I liked this idea, so if you don’t want to carry on with it, or if you never manage to sort it all out, I might implement this feature myself in due course, taking into account all the issues I’ve mentioned

@Horuse Horuse closed this Aug 18, 2026
@DeadMorose777

Copy link
Copy Markdown
Contributor Author

Hi, I see how this happened. The feature grew beyond its original scope while I was iterating on the installation flow and UX.

The installation, detection, and routing logic worked on my machine, so I treated the flow as validated. That machine had accumulated VB-CABLE state during development, which made the result less representative than I expected.

I’ll work through the review comments and test the complete flow on a dedicated clean Windows 11 VM before publishing another revision or reopening the PR.

Thanks for testing it on a clean system - that exposed the gap in my validation.

Если будет удобно, - можем дальше перейти в переписке на какой-нибудь славянский язык, но можем продолжить и на английском.

@Horuse

Horuse commented Aug 18, 2026

Copy link
Copy Markdown
Owner

You can message me on Discord (horuse) to discuss whatever you like

@DeadMorose777

DeadMorose777 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

Hi @Horuse, reopen, please!
I went through the full review and tested the revised implementation on a fresh Windows 11 VM. The first version had only been tested on my development machine, which already contained VB-CABLE state. That hid several problems in the clean installation path.

Here is the status of each point:

  1. The docs folder and concept material have been removed. The new screenshots are real captures from the packaged application and are attached directly to the PR.

  2. The unused frontend and Tauri uninstall APIs have been removed. Removal is now available only through the interactive NSIS uninstaller. Confirmation happens there, and keeping VB-CABLE is the default.

  3. The concept image has been replaced with real screenshots of the Virtual devices page, installation state, Ready state, and Speaker node using CABLE Input.

  4. Windows now uses the existing /virtual-devices route. The separate installation modal has been removed.

  5. The node-shaped Sidebar button has been removed. Users route audio through the normal Speaker node.

  6. The Windows validation jobs are passing:

    They run Rust tests, build the Windows app, check the frontend, and build an unsigned NSIS installer.

  7. /virtual-devices is visible and functional on Windows again. The README instructions now match the implemented workflow.

  8. The elevated helper now returns a structured error code, message, and vendor exit code. Detailed failures are written to the app log instead of being reduced to a generic exit_code=1.

The clean VM test exposed a PowerShell policy problem in the signature verification helper and an unstable package identity after reboot. Both have been fixed.

I tested the packaged flow on Windows 11 Enterprise LTSC, build 26100: installation, endpoint detection, reboot, routing through CABLE Input, interactive uninstall, driver removal, and a final reboot. No VB-CABLE package, endpoint, device, or Splitwave ownership record remained after removal. The Windows audio services were still running.

Local Windows cable tests pass 24/24, cargo check and formatting pass, bun run check reports 0 errors, and the NSIS installer builds successfully.

Linux and macOS were not manually tested. Their virtual device backends and real-time audio paths were not changed.

GitHub is not giving me a Reopen button for this PR, so I cannot reopen it from the fork side. Could you reopen it when you have a moment? The branch is updated and ready for the PR checks.

@Horuse Horuse reopened this Aug 19, 2026
@Horuse

Horuse commented Aug 19, 2026

Copy link
Copy Markdown
Owner

Hello, thank you for your work! Judging by the screenshots, everything looks good and blends in well with the overall interface. I’ll be taking a closer look at the changes you’ve made shortly and testing your pull request on Windows, macOS and Linux to avoid any potential issues! This may take some time

@Horuse

Horuse commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Hi, I’ve checked it and everything’s working, but there are these two issues: the first one really needs to be fixed, whilst the second is a last resort.

  1. The VB-Audio distribution terms state: in order to legally include their installer without purchasing a commercial licence, we are obliged to use at least their exact wording. The domain must be visible as text, and their call for support must be included.

    Please update the text beneath the button to match this verbatim version from their website:

    The origin of VB-CABLE : www.vb-cable.com.
    VB-CABLE is a donationware, all participations are welcome.

  2. There is no time limit on downloading the driver, running the installer and waiting for it to complete. If the VB-Audio website freezes or the installer ‘hangs’ - the programme will display ‘Installing…’ indefinitely, and there is nothing you can do about it until you close the application. A timeout needs to be added

@Horuse
Horuse merged commit f7235ce into Horuse:main Aug 22, 2026
4 checks passed
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.

2 participants