Developer Resources
DSP Plugins SDK
The official Passion Audio Player DSP Plugin SDK. Contains headers, reference structs, and build instructions. The authoritative starting point for writing any DSP plugin.
Download SDK →Sonique Visuals Delphi Template
Delphi/Pascal template for Sonique Visualization plugins. Covers the full vis API: init, render loop, PCM/FFT data consumption, and shutdown.
Download Template →Sonique Visuals with Text Template
Extended Delphi template for Sonique vis plugins that render on-screen text overlays. Demonstrates GDI text drawing within the Sonique vis window lifecycle.
Download Template →Psycho JM-DG with source
A complete Sonique visualisation plugin with full source code. Reacts to the audio waveform with colour-driven graphics — a real-world example to study and extend.
Download →Plugin API Reference
Complete documentation for all plugin types: input, output, DSP, visualisation, and general. Covers structs, callbacks, version negotiation, and thread safety.
Read Docs →Plugin Types
Input Plugin
Decode audio from a file format or stream. The player calls your plugin when it encounters a file extension you've registered. Return PCM frames on demand.
Output Plugin
Write decoded PCM to an audio device, network stream, or file. You control buffering, volume, pause/resume, and device enumeration.
DSP Plugin
Process PCM in real time: EQ, reverb, compressor, crossfeed, sample-rate conversion, or any other effect. Multiple DSP plugins can be chained.
Visualisation Plugin
Render a real-time visual driven by PCM or FFT data in a child window provided by the player. Compatible with the Sonique visualisation API.
General Plugin
Everything else: scrobblers, file taggers, hotkey managers, library scanners, Discord presence, remote control apps. Loaded at startup, runs for the session.
Skin
Full UI replacement via XML layout + bitmap assets. Every control, animation, and colour is under your control. Ships as a ZIP-based .pap-skin package.
Quick Start
The minimal boilerplate for a C input plugin. Export the PAP_GetPluginInfo function and the player will load your DLL automatically on startup.
// Passion Audio Player — Minimal Input Plugin
// Compile as a 32 or 64-bit Windows DLL
#include "pap_plugin.h"
static PAP_InputPlugin plugin = {
.version = PAP_PLUGIN_VERSION,
.description = "My Format Decoder",
.extensions = "myfmt;mf2",
.Open = MyFormat_Open,
.GetPCM = MyFormat_GetPCM,
.Seek = MyFormat_Seek,
.Close = MyFormat_Close,
.GetTags = MyFormat_GetTags,
};
__declspec(dllexport) PAP_InputPlugin* PAP_GetPluginInfo(void) {
return &plugin;
}
Developer FAQ
cdecl exports), and Go have all been used successfully by community members.
CoInitialize(NULL) on the main thread. If your plugin uses COM on a worker thread, you must call CoInitializeEx yourself on that thread and balance it with CoUninitialize before the thread exits. Never call CoUninitialize on the main thread from a plugin.
PAP_DSP_FormatChange callback before returning modified PCM. The player will re-negotiate with the output plugin. Changing both rate and channels simultaneously in a single block is supported from API version 4 onwards.