wiremix on Slackware - a console PipeWire mixer for the audiod audio hub
Find a file
Anagnostakis Ioannis 7d76678259 Update
Signed-off-by: Anagnostakis Ioannis <elahistos@yahoo.gr>
2026-07-09 21:53:31 +03:00
0.11.0-vendor.tar.gz first commit 2026-07-09 21:33:05 +03:00
audiod-wiremix.toml first commit 2026-07-09 21:33:05 +03:00
cargo-config.toml first commit 2026-07-09 21:33:05 +03:00
doinst.sh first commit 2026-07-09 21:33:05 +03:00
README.md Update 2026-07-09 21:53:31 +03:00
slack-desc first commit 2026-07-09 21:33:05 +03:00
vendor.json first commit 2026-07-09 21:33:05 +03:00
wiremix-0.11.0.tar.gz first commit 2026-07-09 21:33:05 +03:00
wiremix.jpg first commit 2026-07-09 21:33:05 +03:00
wiremix.SlackBuild first commit 2026-07-09 21:33:05 +03:00

wiremix + audiod - a console PipeWire mixer and Bluetooth audio hub

This package builds wiremix, a fast terminal (TUI) mixer for PipeWire, packaged to pair with audiod. Together they give you a complete, keyboard-driven audio and Bluetooth control surface that runs entirely in a virtual terminal - no X, no Wayland, no desktop required.

Boot to a console, log in on tty2, and you have: PipeWire running, Bluetooth speakers and phones connected, several sources mixed together and sent to every output at once, and a live mixer with volume sliders and peak meters - all from text.


wiremix audiod


Table of contents

  1. What the combination gives you
  2. How wiremix and audiod fit together
  3. What wiremix is
  4. Requirements
  5. Building the package
  6. Installing
  7. First-time setup: the config file
  8. Using it on a tty - step by step
  9. Worked example: a party box on tty2
  10. Keybindings
  11. Command-line options
  12. Credits & license

What the combination gives you

audiod and wiremix have separate, complementary jobs. audiod runs and manages the per-user PipeWire stack (and adds a Bluetooth "hub" layer); wiremix is the mixer you drive it with. Put together on a console, you get:

  • A working PipeWire session in a bare tty. audiod brings up pipewire, wireplumber, and pipewire-pulse in the right order for your console login, so audio is ready the moment you have a shell - no desktop needed. wiremix connects straight to it.

  • One-command Bluetooth, from the terminal. With audiod's hub layer you scan a numbered list and connect a speaker or phone by number (audioctl hub scan), pair a phone with a PIN in a bounded window (audioctl hub pair), and drive a connected phone's playback over AVRCP (audioctl hub play|pause|next|prev) - no MAC-typing, no GUI.

  • Sound everywhere at once. audiod's combine sink (audioctl hub combine) sums any number of sources and mirrors the result to every output - internal speakers, every HDMI port, and multiple Bluetooth speakers simultaneously.

  • A live mixer for all of it. wiremix shows every sink, source, and stream with a volume slider, mute, default-device marker, and a peak meter, so you can balance the whole room - push a far Bluetooth speaker past 100%, trim an HDMI, mute what you want silent - and see audio flowing to each output.

The net effect is a console-native PipeWire + Bluetooth audio manager: speakers, phones, a multi-output mix, and a full mixer, all controlled with the keyboard from a text login.


How wiremix and audiod fit together

        ┌──────────────────────────────────────────────┐
        │  audiod  (elogind-driven session manager)     │
        │  • starts & supervises pipewire / wireplumber │
        │    / pipewire-pulse for your login            │
        │  • hub layer via audioctl:                    │
        │      - Bluetooth: scan, pair, connect, media  │
        │      - combine sink: sound to every output    │
        │      - network audio                          │
        └───────────────────────┬──────────────────────┘
                                │ a running PipeWire instance,
                                │ present even on a bare tty
                                ▼
        ┌──────────────────────────────────────────────┐
        │  wiremix  (your TUI mixer)                     │
        │  • connects to that PipeWire instance         │
        │  • sinks / sources / streams, with sliders    │
        │  • set volume, mute, default, route; peaks    │
        └──────────────────────────────────────────────┘

audiod provides and manages the audio stack; wiremix is how you see and adjust it. audiod also creates the things wiremix then displays - the combine sink appears in wiremix as a selectable default output, each connected Bluetooth speaker as its own output with its own slider, and each phone or app streaming in as a playback stream.


What wiremix is

wiremix is a small, fast TUI mixer for PipeWire, written in Rust and inspired by ncpamixer. It speaks to PipeWire directly through libpipewire, so it needs no graphical session. Its tabs are:

  • Playback - apps currently producing sound (browser, mpv, a phone over Bluetooth).
  • Recording - apps capturing audio.
  • Output - sinks: speakers, HDMI, Bluetooth speakers, and virtual sinks such as audiod's hub_combined.
  • Input - sources: microphones, line-in, Bluetooth mic.
  • Configuration - device profiles.

Each row has a volume slider, mute toggle, a default marker, and an optional peak meter.


Requirements

  • Slackware-current (built and tested on Slackware64-current, x86_64).
  • audiod - https://forge.slackware.nl/rizitis/audiod. Recommended companion: it manages the PipeWire stack for your session and provides the audioctl hub Bluetooth/combine commands used throughout this guide.
  • PipeWire - pipewire, wireplumber, pipewire-pulse.
  • bluez with bluetoothd running and a powered adapter, for the Bluetooth features (driven via audioctl hub).
  • Build-time: rust and cargo (with cargo auditable), pkg-config, and the PipeWire headers. The SlackBuild builds fully offline from a vendored crate tarball.

Building the package

The SlackBuild expects, in its own directory:

  • wiremix-$VERSION.tar.gz - the wiremix source tarball.
  • $VERSION-vendor.tar.gz - the pre-vendored crates (for an offline build).
  • cargo-config.toml - points cargo at the vendored sources.
  • wiremix.SlackBuild, slack-desc, doinst.sh, audiod-wiremix.toml.

Then build:

git clone https://forge.slackware.nl/rizitis/wiremix.git
cd wiremix
bash wiremix.SlackBuild

This runs cargo build --offline --release and produces a package in /tmp:

/tmp/wiremix-0.11.0-x86_64-2_FRG.txz

The package installs:

  • /usr/bin/wiremix - the mixer binary.
  • /usr/share/wiremix/wiremix.toml - the stock config (not tuned for audiod).
  • /usr/doc/wiremix-0.11.0/ - upstream README, licenses, this SlackBuild, and wiremix.toml (tuned for audiod).

Installing

installpkg /tmp/wiremix-0.11.0-x86_64-2_FRG.txz

On install you'll see a reminder to copy the config into your home directory (next section).


First-time setup: the config file

wiremix reads its config from ~/.config/wiremix/wiremix.toml. The package ships a ready-made one - copy it into place for your user:

mkdir -p ~/.config/wiremix
cp /usr/doc/wiremix-0.11.0/wiremix.toml ~/.config/wiremix/wiremix.toml

That config is tuned for the audiod hub and a console:

  • starts on the output tab (you balance speakers, not per-app streams);
  • enables peak meters so you can see audio reach every output;
  • raises the volume ceiling and turns the guard off, so a distant Bluetooth speaker can be pushed past 100% to fill a room;
  • uses a lighter 30 fps and keyboard-only input, ideal for a bare tty.

You can edit it freely; anything you don't set uses wiremix's built-in defaults.


Using it on a tty - step by step

Everything here is done as your normal user on a console (for example tty2, with no X running). Switch to a free VT with Ctrl+Alt+F2 and log in.

1. Confirm the audio stack is up (audiod manages this):

audioctl status
#   pipewire       : running
#   wireplumber    : running
#   pipewire-pulse : running

2. Confirm you hold the hub (needed for Bluetooth and combine):

audioctl hub status
#   HUB_MODE : yes
#   you      : member (allowed); OWNER (holds card+BT)

3. Connect a Bluetooth speaker or phone - from the terminal:

audioctl hub scan
# Scanning for 8s...
# Found devices:
#    1) HONOR 400 Pro   [CC:62:...]  (paired)
#    2) BT Speaker      [41:42:...]  (paired)
#    3) AKAI ABTS-21H   [F5:E2:...]  (new)
# Connect which number (Enter to cancel)? 3

Pick a number to connect. Choosing an already-connected device offers to disconnect it. For a brand-new speaker, put it in pairing mode (blinking) first. To pair a phone with a PIN, open a pairing window instead:

audioctl hub pair            # box is discoverable for ~120s; confirm on the phone

4. Mirror sound to every output:

audioctl hub combine         # creates hub_combined and makes it the default sink

5. Open the mixer:

wiremix

You land on the output tab. You'll see hub_combined (marked default) together with the internal speaker, the HDMI outputs, and any Bluetooth speakers

  • each with its own slider and a live peak meter. Play something (a browser, or a phone streaming over Bluetooth) and watch every output's meter move together.

6. Balance the room: move between outputs with the arrow keys, adjust each one's volume independently, mute what you want, and press d on hub_combined if you ever need to re-assert it as the default. Press q to quit.

7. Control a connected phone without touching it:

audioctl hub play            # or: pause | next | prev  (AVRCP to the phone)

That's the whole loop - stack, Bluetooth, combine, mixer - done from a text login.


Worked example: a party box on tty2

A real session on an HP OMEN 16 running Slackware64-current, logged in on a bare tty2 with no graphical environment at all:

  • audiod started the full PipeWire stack at console-login time.
  • audioctl hub combine created hub_combined, set as the default sink.
  • A phone over Bluetooth and a local browser both played into it; the combine sink summed the two.
  • The mix went to the internal Speaker, three HDMI outputs, and a Bluetooth speaker at the same time.
  • wiremix showed it all live: hub_combined (party mix → all speakers) marked default, each output with its own slider (Speaker 77%, BT Speaker 71%, HDMI 100%…), every peak meter moving in unison.

A text login on a second virtual terminal, running a multi-source, multi-room audio session with a live mixer - driven entirely from the keyboard.


Keybindings

Inside wiremix (keyboard-first, ideal for a tty):

↑ / k        move up                 ← / h    volume down
↓ / j        move down               → / l    volume up
Tab          next tab                m        mute / unmute
Shift+Tab    previous tab            d        set as default device
=            set exact volume        c        route a stream to another sink
09          quick volume (5 = 50%)  q / Esc  quit

On the output tab with the audiod hub, the two you'll use most are d (make hub_combined the default) and the arrow keys (balance each speaker independently).


Command-line options

Override the config per run:

wiremix -v output              # start on a specific tab
wiremix -T output playback     # which tabs are shown, and their order
wiremix -p auto                # peak meters: off | mono | auto
wiremix -m 200                 # max volume percent
wiremix --no-mouse             # keyboard-only (good on a tty)
wiremix -r pipewire-0          # choose the PipeWire remote (default socket)
wiremix -h                     # full help

Please read wiremix for complete configs and commands.

Credits & license

  • wiremix is by Thomas Sowell - https://github.com/tsowell/wiremix. Upstream copyright and its dual MIT / Apache-2.0 license apply to the program itself (see LICENSE-MIT and LICENSE-APACHE in the docs directory).

Built for Slackware-current. Audio, Bluetooth, and a full mixer - in a bare terminal.