A modern, simple system tray application for controlling PipeWire audio server settings on Linux.
- ποΈ Dynamic Sample Rate Control - Automatically detects hardware-supported sample rates
- π§ Buffer Size Management - Adjust quantum/buffer size for latency optimization
- πΎ Persistent Settings - Automatically saves and restores your preferences
- π₯οΈ Desktop Integration - System tray icon compatible with Wayland and X11
- π Hardware Detection - Queries connected DACs for supported capabilities
- π§ͺ Fully Tested - Comprehensive test suite with pytest
- π¦ Modern Packaging - Standard Python package with pyproject.toml
- Python: 3.10 or higher
- PipeWire: Audio server with
pw-metadata,pw-dump, andwpctlutilities - PyQt6: Qt6 bindings for Python
- Linux: Any distribution with system tray support
wget -qO /tmp/install.sh https://raw.githubusercontent.com/apapamarkou/pipewire-controller/main/install && bash /tmp/install.shThis will automatically:
- Detect your Linux distribution (Arch, Debian/Ubuntu, Fedora, openSUSE)
- Install required system dependencies
- Install pipewire-controller via pipx
- Create an autostart desktop entry
wget -qO /tmp/uninstall.sh https://raw.githubusercontent.com/apapamarkou/pipewire-controller/main/uninstall && bash /tmp/uninstall.shpipx install pipewire-controllergit clone https://github.com/apapamarkou/pipewire-controller.git
cd pipewire-controller
pip install .git clone https://github.com/apapamarkou/pipewire-controller.git
cd pipewire-controller
pip install -e ".[dev]"Arch Linux / Manjaro / Garuda:
sudo pacman -S python-pyqt6 pipewire wireplumberFedora / RHEL:
sudo dnf install python3-pyqt6 pipewire pipewire-utilsDebian / Ubuntu / Mint:
sudo apt install python3-pyqt6 pipewire pipewire-bin wireplumberopenSUSE:
sudo zypper install python3-qt6 pipewire pipewire-toolsAfter installation, simply run:
~/.local/bin/pipewire-controllerOr as a Python module:
python -m pipewire_controllerTo start automatically on login, create a desktop entry:
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/pipewire-controller.desktop << EOF
[Desktop Entry]
Type=Application
Name=PipeWire Controller
Exec=pipewire-controller
Icon=audio-card
Terminal=false
Categories=AudioVideo;Audio;
EOFSettings are stored in ~/.config/pipewire-controller/settings.json:
{
"samplerate": 48000,
"buffer_size": 512
}pipewire-controller/
βββ src/pipewire_controller/
β βββ engine.py # PipeWire logic (no GUI dependencies)
β βββ core/ # Legacy modules (deprecated)
β βββ ui/ # PyQt6 interface components
β βββ utils/ # Configuration & process management
βββ tests/ # Pytest test suite
βββ pyproject.toml # Package configuration
βββ README.md
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=src/pipewire_controller --cov-report=html# Format code
black src/ tests/
# Lint code
ruff check src/ tests/- Hardware Detection: Engine queries PipeWire via
pw-dumpto detect connected audio devices and their supported sample rates - Logic Layer:
PipewireEngineclass handles all PipeWire interactions without GUI dependencies - Dynamic UI: System tray populates menu with only hardware-supported rates
- Settings Application: Engine uses
pw-metadatato apply sample rate and buffer size changes - Persistence: Settings saved to JSON and reapplied on startup
Ensure your desktop environment supports system tray icons:
- GNOME: Install
gnome-shell-extension-appindicator - KDE Plasma: Built-in support
- i3/Sway: Use
waybarori3status
Install PipeWire utilities:
# Check if installed
which pw-metadata pw-dump wpctl
# Install if missing (Arch example)
sudo pacman -S pipewire wireplumberCheck permissions on config directory:
ls -la ~/.config/pipewire-controller/Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Write tests for new functionality
- Ensure tests pass (
pytest) - Format code (
black src/ tests/) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow PEP 8
- Use type hints where appropriate
- Write docstrings for public APIs
- Keep functions focused and testable
Special thanks to:
- @ItzSelenux - Contributions and testing
- @Axel-Erfurt - UI improvements
- PipeWire Team - For the excellent audio server
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Author: Andrianos Papamarkou
Repository: https://github.com/apapamarkou/pipewire-controller
