// the find
andrewrk/libgroove
streaming audio processing library
A C library for decoding, mixing, and encoding audio playlists, built as the backend for Andrew Kelley's Groove Basin music player. It targets anyone building a music player, audio streaming server, or batch audio-processing tool (tag editing, loudness scanning, fingerprinting) who wants ffmpeg-grade format support without writing their own decode/resample pipeline.
The sink abstraction is the real design win — raw/player/encoder/loudness/fingerprint/waveform sinks all sit on top of one reference-counted buffer primitive, so adding a new consumer (say, a visualizer) doesn't require touching the playlist or decode logic. EBU R128 loudness scanning with ReplayGain-compatible output is a genuinely useful, non-trivial feature most audio libraries don't bother implementing correctly. The smooth-mode/exact-mode split shows real engineering thought about the tradeoff between gapless playback and matching device parameters exactly, rather than picking one and hand-waving the other.
The dependency chain is brittle: a specific ffmpeg build (with non-default flags), libebur128 compiled against speex specifically for true-peak support, libsoundio, and chromaprint — any version mismatch across these and the build or runtime behavior breaks in ways that are hard to debug. There's no test suite in the tree, which is a real liability for a library doing manual reference counting across C buffers. The project has been effectively dormant since Kelley moved on to Zig full-time; a March 2024 push on a repo with this little recent history reads more like a dependency bump than active maintenance, so anyone adopting it is on their own for bug fixes. Documentation is a bare doxygen API reference — no architectural overview beyond the README, so understanding sink lifecycle and threading model means reading the source.