Case Study

Live Audio Visualizer Plugin

An OBS-native audio visualizer plugin built in C++ with FFT-driven band analysis and multiple rendering modes for live production scenes.

C++OBS Plugin APICMakeFFT DSPReal-time Rendering
GitHub repository ↗

Role

Systems and graphics engineer

Timeline

2025 - Present

Organization

Open-source

Status

Released

Technical Context

OBS plugins are not a typical web development environment. Source plugins are expected to integrate directly with libobs interfaces, use C++ APIs, and respect OBS threading behavior for audio callbacks, source updates, and per-frame rendering. A visualizer plugin has to be responsive enough for live streaming while staying stable inside the compositor pipeline.

This project targets that exact constraint surface: capture audio from a selected OBS audio source, transform it into frequency-domain signal features, and render configurable graphics modes in real time as a custom OBS source.

Implementation

The core implementation attaches an audio capture callback to the selected source and writes mixed mono samples into a ring buffer. On render, the plugin pulls a window from that buffer, applies a Hann window, runs FFT magnitude analysis, and computes band values with log-style mapping and configurable frequency coverage. The current code supports bass-focused through full-spectrum views via selectable freq_range behavior.

Smoothing and peak decay are handled explicitly to reduce jitter while preserving movement. Visual parameters such as sensitivity, bar width, spacing, and shape are exposed through OBS properties. Rendering supports multiple display modes, including normal bars, mirrored center-out bars, and radial forms, with optional gradients and background color control.

All drawing occurs through OBS graphics APIs in the plugin render callback, which keeps the output native to OBS scene composition. Build and packaging are handled through CMake-based workflows and release automation for Windows artifacts, with platform-specific build instructions for macOS and Linux.

Challenges

One major challenge is balancing responsiveness with signal stability. Raw FFT output fluctuates frame to frame, so the plugin uses smoothing and peak logic to produce readable motion without introducing lag that would feel disconnected from the source audio.

Another challenge is plugin reliability in user environments. OBS users install plugins in different layouts, and locale/resource file placement matters. The project documentation and release process account for those details so non-technical users can install successfully without rebuilding from source.

A third challenge is mode diversity inside a single render path. Supporting vertical, mirrored, and radial output while keeping settings coherent required a rendering design that shares DSP state but branches cleanly on geometry. The result is a plugin that remains flexible for creators while still fitting OBS's strict plugin model.