← BACK TO OPEN SOURCE

Audio Splitter: Play Audio Through Multiple Speakers in Windows

I built this because Windows only sends audio to one output device at a time, leaving extra speakers sitting silent. This tool plays system sound across laptop, aux, HDMI, and Bluetooth speakers together with adjustable delay to keep them in sync.

Watch the film narrated, with sound: every speaker you own, playing in sync.
Read the transcript

This is Audio Splitter, a small open source tool I built.

Windows only plays sound through one device at a time. Every other speaker in the room sits silent.

And if you do send sound to several, the Bluetooth speaker echoes behind the wired ones.

So I built a tool that captures the sound once, and fans it out live to every speaker, each delayed just enough to stay in sync.

No virtual audio driver to install, no reboot, and no paid software.

The problem

Windows only ever sends system audio to one output device at a time. If you have laptop speakers, wired desktop speakers, monitor speakers, and a Bluetooth speaker in the same room, you cannot use them together without extra software. When you do send sound to multiple outputs, differences in hardware lag make Bluetooth speakers echo noticeably behind wired connections. You end up with either silent hardware or out-of-sync audio.

What it does

  • Plays system audio across multiple speakers at once, including laptop, aux, HDMI, and Bluetooth outputs.
  • Provides a desktop control panel with a master on/off switch, volume sliders, and live latency sliders.
  • Applies latency adjustments immediately during playback so you can tune sync by ear without restarting.
  • Includes a Music mode that synchronizes all outputs and a Video mode that skips high-latency speakers to keep video in sync.
  • Supports global keyboard shortcuts: Ctrl+Alt+K for the control panel, Ctrl+Alt+B to toggle mirroring, and Ctrl+Alt+M to switch modes.
  • Scans and adds newly connected WASAPI playback devices through an Add a speaker button.

How it works

Audio Splitter directs Windows audio through a silent virtual audio device (a software-only sound endpoint), captures that stream using WASAPI loopback (a Windows feature for recording playing audio), and copies it to separate queues for each physical speaker. A dedicated writer thread for each output drains its queue through a first-in, first-out delay buffer (a holding queue that releases sound after a set time) sized to that device's hold-back time before sending sound to the endpoint. By delaying each output by the slowest device's latency (delay in milliseconds) minus its own latency, all speakers emit sound at the exact same instant.

Delay buffers adjust dynamically whenever settings change in settings.json, allowing real-time tuning while audio plays. The tool communicates directly with Windows Core Audio endpoints to bypass older audio interfaces that drop sound on HDMI or laptop outputs, and resamples streams per output to match hardware sample rates without audio clicks.

Get started

  1. Clone and set up

    git clone https://github.com/ddivyanshsharmaa/audio-splitter
    cd audio-splitter
    .\setup.ps1

    Creates a virtual environment (an isolated Python setup), installs dependencies, and creates desktop shortcuts.

  2. List available devices

    .\venv\Scripts\python.exe .\list_devices.py

    Find the name of your silent virtual sink and physical audio outputs.

  3. Configure initial outputs

    Set VIRTUAL_SINK_NAME and your initial OUTPUTS list in config.py.

  4. Verify physical audio

    .\venv\Scripts\python.exe .\device_check.py

    Plays a tone through each speaker one at a time, then all together.

  5. Open control panel

    Press Ctrl+Alt+K or launch the Audio Splitter desktop shortcut.

macOS and Linux (beta)

Audio Splitter now also has macOS and Linux versions with the same speaker control panel. They are in beta: built and checked with automated tests, but not yet tested on real Mac or Linux hardware.

git clone --branch main https://github.com/ddivyanshsharmaa/audio-splitter
cd audio-splitter
bash setup.sh
bash launch.sh list
bash launch.sh

On a Mac, install BlackHole 2ch first and allow Microphone access for the launching terminal or Python if macOS asks. This captures BlackHole's audio input; it does not open the physical microphone. Start with a real speaker selected in System Settings > Sound > Output, and add only real speakers to the panel. On Linux, use a running PulseAudio or PipeWire-Pulse session with pactl and paplay. Run as your logged-in desktop user, without sudo. Global hotkeys are not installed automatically on either platform.

The full steps, Windows-config migration instructions and known limits are in the README.

Requirements

  • Windows 10/11
  • Python 3.10+
  • A genuine silent virtual audio device to use as the routing point (such as Speakers (SW Audio) or a free virtual audio cable like VB-CABLE)
  • macOS (beta): Python 3.10+ with Tk support and the free BlackHole 2ch virtual audio driver
  • Linux (beta): Python 3.10+, Tk, venv support, PulseAudio or PipeWire-Pulse, and pactl with JSON and get-default-sink support; paplay for diagnostic tones

Questions

Why do my laptop speakers stay silent when headphones are plugged in?

Many laptops mute their internal speakers in hardware whenever a 3.5mm jack is occupied. No software can override this hardware jack-sensing (a physical switch inside the port).

Why does audio lag behind the picture when watching video with a Bluetooth speaker?

In Music mode, every speaker is delayed to match the slowest speaker. Switching to Video mode (Ctrl+Alt+M) sets aside speakers lagging over 50 ms so remaining audio stays aligned with the video.

How do I calibrate sync between wired and Bluetooth speakers?

Play audio with a sharp repeated beat and adjust the latency sliders in the control panel. If a speaker sounds late relative to the others, raise its slider; if it sounds early, lower its slider.

Why does the Windows taskbar volume slider not affect secondary speakers?

Once a device is not the Windows default output, the taskbar volume slider stops controlling it. Use the per-device volume sliders inside the Audio Splitter control panel to adjust endpoints directly.