Audio visualization on KDE desktop background using libvisual
desktop applicationUtilityapt install kde-desktop-background-libvisualLibVisual Desktop Background is an application that renders audio visualizations directly on the KDE desktop background using the libvisual library. It supports various visualization plugins including fractals, waveforms, and spectrum analyzers. Features: * Real-time audio visualization on desktop background * Support for multiple libvisual plugins (13 included) * Optional projectM support (4,188+ Milkdrop-compatible presets) * PulseAudio integration for audio input * Qt-based control panel with system tray integration * Automatic plugin switching with configurable intervals * Persistent configuration storage The application runs as a background daemon and can be controlled through a system tray interface, making it easy to customize the visualization experience without interrupting your workflow. For enhanced visualization quality with thousands of presets, install the suggested projectM packages (libprojectm3 and projectm-data).
Audio-reactive wallpaper plugin for KDE Plasma 6. Renders real-time visualizations on the desktop background, driven by live microphone or audio input via PulseAudio/PipeWire.

▶️ Watch here: https://vhsky.cz/w/vnuNcJBrdng6z1J6Em1NED
Version 1.1.5
| # | Name | Description |
|---|---|---|
| 0 | Spectrum Analyzer | 64-bar FFT spectrum, height and color driven by frequency magnitude |
| 1 | Waveform | Full-screen dual sine wave, amplitude tracks audio peak |
| 2 | Lissajous | XY oscilloscope Lissajous figures, reactive to bass/treble |
| 3 | Circular Burst | 50 concentric circles pulsing with frequency bands |
| 4 | Circular Spectrum | 64 radial bars arranged in a circle |
| 5 | Plasma | 8 animated colored blobs with sine-driven motion |
| 6 | Starfield | 120 stars flying outward from center, speed scales with peak |
| 7 | Fireworks | Particle bursts spawned on bass beats |
| 8 | Matrix Rain | Falling green characters, speed driven by treble |
| 9 | DNA Helix | Two intertwined sine strands with connecting rungs |
| 10 | Particle Storm | 150 particles orbiting in audio-reactive paths |
| 11 | Ripple Effect | Expanding concentric rings, radius and opacity driven by bass |
| 12 | Tunnel Vision | Rotating nested rectangles converging to center |
| 13 | Spiral Galaxy | 200 dots in three rotating spiral arms |
| 14 | Lightning | Recursive jagged bolts spawned on peaks |
| 15 | Mandelbrot Zoom | GPU-rendered Mandelbrot set, zoom and iterations driven by audio |
| 16 | Geometric Dance | Five rotating polygons (triangle→octagon), scale with audio |
| 17 | Audio Bars 3D | FFT bars rendered in perspective projection |
| 18 | Kaleidoscope | 8-segment radially mirrored animated pattern |
| 19 | ProjectM Visualizer | Milkdrop-compatible GPU presets via libprojectM (4 000+ presets) |
Type 19 renders Milkdrop-compatible GPU presets via libprojectM. It requires an OpenGL/EGL backend — which is the default under KDE Plasma on Wayland.
Install presets (Debian/Ubuntu):
sudo apt install projectm-data libprojectm-dev
Default preset path: /usr/share/projectM/presets. Additional preset packs (4 000+) can be placed in any directory and selected in the config dialog. The config dialog lets you pick a preset, enable shuffle, and set the display duration.
On rare Vulkan-only setups, set QSG_RHI_BACKEND=opengl before starting plasmashell. Under standard KDE Plasma + Wayland (EGL) no extra configuration is needed.
sudo apt install cmake qt6-base-dev qt6-declarative-dev \
libkf6coreaddons-dev libkf6i18n-dev \
libkf6package-dev plasma-workspace-dev \
libpulse-dev libfftw3-dev \
pipewire-pulse pulseaudio-utils
# Optional: ProjectM visualization (type 19)
sudo apt install libprojectm-dev projectm-data
sudo dnf install cmake qt6-qtbase-devel qt6-qtdeclarative-devel \
kf6-kcoreaddons-devel kf6-ki18n-devel \
kf6-kpackage-devel plasma-workspace-devel \
pulseaudio-libs-devel fftw-devel pipewire-pulseaudio
# Optional: ProjectM visualization (type 19)
sudo dnf install projectM-devel
sudo pacman -S cmake qt6-base qt6-declarative \
kcoreaddons ki18n kpackage plasma-workspace \
libpulse fftw pipewire-pulse
git clone https://github.com/VitexSoftware/kde-desktop-background-libvisual
cd kde-desktop-background-libvisual/plasma-wallpapers/org.kde.libvisual
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX="$HOME/.local"
make -j"$(nproc)"
sudo make install
Restart Plasma to load the plugin:
killall plasmashell && plasmashell &
sudo apt install debhelper devscripts
./build_deb.sh
sudo dpkg -i ../kde-desktop-background-libvisual_*.deb
The configuration panel appears below the selector. From there you can:
The level meter in the config dialog reads from the real PulseAudio/PipeWire backend. When a device with no microphone connected is selected (e.g. onboard audio without a mic plugged in), the meter shows −60 dB (silence). It updates in real time as you switch devices or plug in a microphone.
# Full build, install, and diagnostic check
./test.sh
# Config UI and schema validation
bash test_config.sh
# AudioVisualizer QML module install check
bash test_qml_module.sh
# System diagnostics (plugin files, symbols, PulseAudio sources)
./diagnostics.sh
# or quick mode (skip ldd / journal):
./diagnostics.sh --quick
Verify the audio services are running:
systemctl --user status pipewire pipewire-pulse
If pipewire-pulse is inactive, start it:
systemctl --user start pipewire-pulse
Check available capture sources (monitors are expected to be absent from this list):
pactl list short sources | grep -v monitor
If the list is empty, no capture device is connected or the driver is not loaded:
# PipeWire view — look for nodes with media.class = Audio/Source
pw-cli list-objects Node | grep -A5 'Audio/Source'
# ALSA view
arecord -l
Select the correct device in the wallpaper configuration dialog and check the level meter.
./diagnostics.sh --quick
journalctl --user -n 100 | grep -i libvisual
killall plasmashell && plasmashell &
The Mandelbrot visualization requires a compiled GLSL shader (mandelbrot.frag.qsb). This is built automatically when Qt6 ShaderTools is available. Check:
ls ~/.local/share/plasma/wallpapers/org.kde.libvisual/contents/shaders/
If mandelbrot.frag.qsb is missing, install qt6-shader-baker and rebuild.
The plugin uses the native libpulse async API and works transparently with both PulseAudio and PipeWire. No detection or switching logic is needed: when PipeWire is running, its pipewire-pulse service implements the full PulseAudio protocol and exposes PipeWire nodes as PA sources.
PipeWire / PulseAudio
│
pa_threaded_mainloop ←── owns its own OS thread
│
pa_context → pa_stream (PA_STREAM_START_CORKED)
│
streamReadCb() callback — PA thread
├─ normalize int16 → float
├─ compute RMS → dB level
├─ run FFTW r2c FFT → 256-bin spectrum
└─ QMetaObject::invokeMethod(Qt::QueuedConnection)
│
onAudioProcessed() — Qt main thread
└─ emit spectrumChanged / levelChanged / …
│
QML binding updates
All shared data (spectrum, waveform, decibels, level) is protected by a QMutex. Property getters lock the mutex before reading; the PA callback locks it only for the final move-assignment.
getInputSources() opens a separate non-threaded pa_mainloop, connects a pa_context, and calls pa_context_get_source_info_list(). Sources with monitor_of_sink != PA_INVALID_INDEX are filtered out so only real capture devices appear in the device selector. This replaces the former pactl subprocess.
# Verify PipeWire services are running
systemctl --user status pipewire pipewire-pulse
# List nodes as seen by PipeWire (all audio objects)
pw-cli list-objects Node | grep -A3 'media.class.*Source'
# Same view via PulseAudio compat layer
pactl list sources short | grep -v monitor
If pipewire-pulse is not active, libpulse connections fail and the meter stays at −60 dB. Start it with:
systemctl --user start pipewire-pulse
plasma-wallpapers/org.kde.libvisual/
├── audiovisualizer.cpp/h # Async libpulse capture + FFTW backend (QML element)
├── plugin.cpp/h # Plasma wallpaper plugin entry point (KPluginFactory)
├── CMakeLists.txt # Build system
├── metadata.json # KPackage metadata
└── contents/
├── config/main.xml # KConfig schema (all settings with defaults)
└── ui/
├── main.qml # Wallpaper rendering – all 20 visualization types
└── config.qml # Configuration dialog – device picker, level meter, preview
GPL-3.0-or-later — see LICENSE
./test.sh to verify the buildThis package may not be indexed in our database yet. Please try again later or check the package repository directly.