Skip to main content

pulsemixer

CLI and curses mixer for PulseAudio

Requirements

  • Python >= 3.3
  • PulseAudio >= 1.0

Installation

Pulsemixer is a self-sufficient single-file python app that doesn't require any extra libraries. You can simply download pulsemixer manually, do chmod +x ./pulsemixer and put it anywhere you want.

Below are some more convenient ways to install pulsemixer:

curl
curl https://raw.githubusercontent.com/GeorgeFilipkin/pulsemixer/master/pulsemixer > pulsemixer && chmod +x ./pulsemixer
pip
pip install pulsemixer

Interactive mode

Interactive mode is used if no arguments are given (except --color and --server)

Image of 1 Image of 2

Interactive controls:

 j k   ↑ ↓               Navigation
 h l   ← →               Change volume
 H L   Shift←  Shift→    Change volume by 10
 1 2 3 .. 8 9 0          Set volume to 10%-100%
 m                       Mute/Unmute
 Space                   Lock/Unlock channels
 Enter                   Context menu
 F1 F2 F3                Change modes
 Tab   Shift Tab         Next/Previous mode
 Mouse click             Select device or mode
 Mouse wheel             Volume change
 Esc q                   Quit

Via context menu it is possible to set-default-sink, set-default-source, move-sink-input, move-source-output, suspend-sink, suspend-source, set-sink-port, set-source-port, kill-client, kill-sink-input, kill-source-output, set-card-profile. See man pactl for details on these features.

CLI

Usage of pulsemixer:
  -h, --help            show this help message and exit
  -v, --version         print version
  -l, --list            list everything
  --list-sources        list sources
  --list-sinks          list sinks
  --id ID               specify ID, default sink is used if no ID specified
  --get-volume          get volume for ID
  --set-volume n        set volume for ID
  --set-volume-all n:n  set volume for ID, for every channel
  --change-volume +-n   change volume for ID
  --max-volume n        set volume to n if volume is higher than n
  --get-mute            get mute for ID
  --mute                mute ID
  --unmute              unmute ID
  --toggle-mute         toggle mute for ID
  --server              choose the server to connect to
  --color n             0 no color, 1 color currently selected, 2 full-color
  --no-mouse            disable mouse support
  --create-config       generate configuration file

CLI examples

Pulsemixer follows PulseAudio's terminology:

  • Sink - an output device.
  • Source - an input device.
  • Sink input - a stream that is connected to an output device, i.e. an input for a sink.
  • Source output - a stream that is connected to an input device, i.e. an output of a source.
$ pulsemixer --list
Sink:          ID: sink-1, Name: Built-in Stereo, Mute: 0, Channels: 2, Volumes: ['60%', '60%'], Default
Sink:          ID: sink-3, Name: HDMI Audio (HDMI 2), Mute: 0, Channels: 2, Volumes: ['50%', '50%']
Sink input:    ID: sink-input-663, Name: Firefox, Mute: 0, Channels: 2, Volumes: ['60%', '60%']
Sink input:    ID: sink-input-686, Name: mocp, Mute: 0, Channels: 2, Volumes: ['60%', '60%']
Source:        ID: source-1, Name: HDMI Audio (HDMI 2), Mute: 0, Channels: 2, Volumes: ['100%', '100%']
Source:        ID: source-2, Name: Built-in Stereo, Mute: 0, Channels: 2, Volumes: ['40%', '40%'], Default
Source output: ID: source-output-7, Name: arecord, Mute: 0, Channels: 1, Volumes: ['40%]

Print volume of the default sink, decrease by 5, print new volume:

$ pulsemixer --get-volume --change-volume -5 --get-volume
60 60
55 55

Toggle mute of source-1, print mute status:

$ pulsemixer --id source-1 --toggle-mute --get-mute
1

Set volume of sink-input-663 to 50, then set volume of sink-3 to 10 (left channel) and 30 (right channel):

$ pulsemixer --id sink-input-663 --set-volume 50 --id sink-3 --set-volume-all 10:30

Increase volume of sink-input-686 by 10 but don't get past 100:

$ pulsemixer --id sink-input-686 --change-volume +10 --max-volume 100

Configuration

Optional. The config file will not be created automatically. Do pulsemixer --create-config or copy-paste it from here.

;; Goes into ~/.config/pulsemixer.cfg, $XDG_CONFIG_HOME respected
;; Everything that starts with "#" or ";" is a comment
;; For the option to take effect simply uncomment it

[general]
step = 1
step-big = 10
; server =

[keys]
;; To bind "special keys" such as arrows see "Key constant" table in
;; https://docs.python.org/3/library/curses.html#constants
; up        = k, KEY_UP, KEY_PPAGE
; down      = j, KEY_DOWN, KEY_NPAGE
; left      = h, KEY_LEFT
; right     = l, KEY_RIGHT
; left-big  = H, KEY_SLEFT
; right-big = L, KEY_SRIGHT
; top       = g, KEY_HOME
; bottom    = G, KEY_END
; mode1     = KEY_F1
; mode2     = KEY_F2
; mode3     = KEY_F3
; next-mode = KEY_TAB
; prev-mode = KEY_BTAB
; mute      = m
; lock      = ' '  ; 'space', quotes are stripped
; quit      = q, KEY_ESC

[ui]
; hide-unavailable-profiles = no
; hide-unavailable-ports = no
; color = 2    ; same as --color, 0 no color, 1 color currently selected, 2 full-color
; mouse = yes

[style]
;; Pulsemixer will use these characters to draw interface
;; Single characters only
; bar-top-left       = ┌
; bar-left-mono      = ╶
; bar-top-right      = ┐
; bar-right-mono     = ╴
; bar-bottom-left    = └
; bar-bottom-right   = ┘
; bar-on             = ▮
; bar-on-muted       = ▯
; bar-off            = -
; arrow              = ' '
; arrow-focused      = ─
; arrow-locked       = ─
; default-stream     = *
; info-locked        = L
; info-unlocked      = U
; info-muted         = M  ; 🔇
; info-unmuted       = M  ; 🔉

[renames]
;; Changes stream names in interactive mode, regular expression are supported
;; https://docs.python.org/3/library/re.html#regular-expression-syntax
; 'default name example' = 'new name'
; '(?i)built-in .* audio' = 'Audio Controller'
; 'AudioIPC Server' = 'Firefox'

The old environment variable PULSEMIXER_BAR_STYLE is still supported. To change the volume bar's appearance in (e.g.) zsh without creating the config file:

export PULSEMIXER_BAR_STYLE="╭╶╮╴╰╯◆◇· ──"

See also

python-pulse-control - Python high-level interface and ctypes-based bindings for PulseAudio.

Metadata

Release files for pulsemixer 1.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pulsemixer 1.5.1
File Size Uploaded Provenance Actions
pulsemixer-1.5.1.tar.gz 23.0 kB Without provenance Details for pulsemixer-1.5.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pulsemixer 1.5.1
File Interpreter ABI Platform Actions
pulsemixer-1.5.1-py3-none-any.whl Python 3 none any Details for pulsemixer-1.5.1-py3-none-any.whl

Total release size: 45.1 kB

Release files / pulsemixer-1.5.1.tar.gz

Download URL pulsemixer-1.5.1.tar.gz
Size 23.0 kB
Tags Source
SHA-256 checksum
How to use checksums
11dad404a3a658d5741169194e438177061ee6e4fcb9b0ed2c9c248caacdadd5
BLAKE2b-256 checksum
How to use checksums
2e0dc29d2f97691b85e7b59dc66f3fdced0df2e581b73220a89cfe881d743b4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.40.0 CPython/3.7.3

Release files / pulsemixer-1.5.1-py3-none-any.whl

Download URL pulsemixer-1.5.1-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5537b5f52717325ebc5358a95db965bbc2c1ae1e4e240c25e2d920acf8e0e160
BLAKE2b-256 checksum
How to use checksums
7044c52c47954e43dd70b226c552553b8788262b2a82741a9a3ae778a588173a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.40.0 CPython/3.7.3

Security for pulsemixer 1.5.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page