Crescendo

June 17, 2026

Crescendo is a proprietary audio playback engine built for Apple platforms using AVFoundation along with ability to play large number of audio formats using FFmpeg and parsing audio file metadata using TagLib.

Crescendo
Crescendo

Overview

Crescendo was developed as a necessity for Petrichor where I was building a music player but a core component of any music player, a media playback backend, was still a third-party library, and that held me back from adding new features that app needed. So I paused development of Petrichor for roughly 3 months to focus on building a music playback engine that has everything that Petrichor needs today, as well as things I’d add to the player in near future, while ensuring that engine can evolve as fast as my player demands.

Crescendo Architecture
Crescendo Architecture

The engine uses AVFoundation and is written entirely in Swift with its API being main-actor-isolated and follows a conventional Audio-to-PCM pipeline for playback. On a high-level, engine uses a Decoder Router to automatically select between CoreAudio and FFmpeg depending on incoming audio format, be it a local file or a network stream. Beyond playing music, it unlocks a whole set of powerful features like;

  • Internet Radio streaming (ICY & HLS)
  • Pre-buffering audio on slow data sources (eg; NAS)
  • AirPlay 2
  • Spatial Audio
  • Metadata reading (using TagLib)

Additionally, it also includes a capable DSP-chain for audio customizations like;

  • 10-band Equalizer
  • Stereo Widening
  • Reverb (based on Freeverb)
  • Cross-fading and gapless playback
  • ReplayGain
  • Playback speed and pitch controls
  • Apple Audio Units

Crescendo itself is proprietary to keep Petrichor at an advantage while aking away the complexity of media playback from the player codebase. Given that Petrichor is still open source under MIT license, Crescendo is made its dependency via open source binary distribution repo CrescendoKit, where the shims and build script for FFmpeg and TagLib are also available under MIT license.

View Source on GitHub