Radiophonia v0.8.2: A Real Graphic Equaliser, on Every Platform
Published: 20 August 2026

v0.8.2 is the release that gives Radiophonia a real graphic equaliser — one that actually shapes the audio, on every platform.
For a radio app, an equaliser sounds like a small thing. It isn’t. Live internet radio streams are a moving target: they change bitrate, they start mid-audio-frame, they drop and reconnect, and they arrive over a localhost proxy that the platform player treats as an ordinary file. Getting a 10-band curve to apply to that — in real time, on every platform, without stalling the stream or corrupting a recording — turned out to be the most involved piece of audio work in the project. This release ships it, end to end.
A Real-Time Graphic Equaliser (Premium)
The equaliser is reachable from Now Playing and from Settings → Equaliser (in the Playback section), and it is gated behind the Premium entitlement.
The UX leads with presets — Flat, Bass, Vocal, Treble, Small Speakers, Headphones — because most people want a sensible starting point, not a lab bench. Underneath, there are per-band sliders (±12 dB) for the power users who want to carve their own curve, and a user-tuned curve is saved as Custom. Your band gains and active preset persist across launches.
What makes this genuinely cross-platform is that each backend gets the treatment that fits it:
- Android — ExoPlayer’s band layout is device-dependent, so the app reads the actual band centres at runtime and maps each preset onto them by log-frequency interpolation. It never assumes a fixed band count.
- Windows / Linux — media_kit’s minimal libmpv build ships only the single-band
equalizerfilter, so the curve is expressed as a chained set of single-band FFmpegequalizerfilters (one per active band) and applied at player construction. Changing the filter chain mid-stream stalls libmpv on a live source, so the curve is applied when the player is (re)built. - iOS / macOS — the headline fix, covered below.
The equaliser is applied at the player layer only. Recordings tee the clean upstream stream, so your saved tracks are never EQ-tinted — the effect is a listening preference, not a master-bus commit.
The Equaliser Now Actually Processes Audio on iPhone, iPad & Mac
This is the fix that made the feature real on Apple hardware. On iOS and macOS the equaliser had been UI-only: the previous AVPlayer tap path couldn’t reach live radio streams, so moving the sliders did nothing.
v0.8.2 introduces a new AVAudioEngine streaming pipeline — URLSession → AudioFileStream → AudioConverter → AVAudioPlayerNode → AVAudioUnitEQ — that is now the sole renderer for live http(s) streams and applies the 10-band curve to the actual decoded audio in real time. Pausing now hard-stops the stream (zero background fetching). Android, Windows and Linux were already served by the earlier phase and are unaffected.
Three stubborn edge cases came with that new renderer, and all three are fixed:
- Previously-silent stations now play through the EQ. Some live streams begin mid-audio-frame (1.FM Deep House, Radio Caroline) and the decoder could never lock onto them, leaving playback silent. The renderer now aligns to a valid audio frame sync (MP3 or AAC ADTS) before parsing — a generic fix for any station affected by the same condition.
- Channel-hopping no longer goes silent. Rapidly switching stations (‹ ›) reliably restarts audio. The renderer binds to the current stream’s proxy URL and resynchronises its parser on any decode discontinuity, instead of going permanently silent until a full stop-then-play.
- The lifecycle contract is now load-bearing and tested. The effect re-binds and re-applies your persisted gains on every player construction and recreation — including the iOS three-minute background-resume rebuild — funnelled through a single player-construction path and covered by unit tests.
Quieter by Default
A few defaults have been tuned to be less intrusive, without losing the capability:
- Tuning sound volume reduced — the continuous tuning tone now plays at 50% of normal playback volume (down from 70%).
- Sound effects off by default — UI sounds for button presses and achievement unlocks are disabled on first launch; opt in via Settings → Sound effects.
- Continue on Bluetooth disconnect off by default — playback now pauses when headphones or Bluetooth output disconnects unless you explicitly enable it in Settings → Playback.
And the tuning tone now correctly respects the “Sound effects” toggle — disabling sound effects silences it too.
Under the Hood
- Google Play Billing Library 8.0.0 —
in_app_purchasebumped to ^3.3.0 andin_app_purchase_androidto 0.5.2 to meet Google Play’s August 2026 minimum-version requirement. - Portable AppImage build — the Linux AppImage no longer bundles system libraries (libstdc++, libgcc, etc.) that caused GLIBC version conflicts. Only app-specific libraries are bundled, so the AppImage now runs on virtually any 64-bit Linux distribution (requires only GLIBC 2.2.5).
- Downsampled media-notification artwork — station artwork fed to the media notification, lock screen and Android Auto MediaSession is now decoded at a 256×256 target instead of full source resolution, cutting peak bitmap memory and resolving two of three Google Play “BitmapFactory without downsampling” findings.
Also Fixed
A batch of reliability and correctness fixes round out the release:
- Badges no longer re-celebrate on sign-in — restored stats, history and favourites no longer re-trigger achievements you already earned; badge evaluation is suspended for the duration of the sign-in sync and resumed once the cloud badge state is merged in.
- Achievements no longer re-unlock on a fresh install — badge state now syncs to Firestore, so a clean install restores your earned badges instead of re-unlocking (and re-celebrating) them.
- Variety Pack achievement fixed — it now counts only the primary tag per station, so you must listen to three genuinely different genres.
- Duplicate badge unlock prevention — an explicit guard skips any badge that is already unlocked.
- Bluetooth routing — connecting a new output device (e.g. turning on earbuds) now routes audio to it, and a call that lands while playback is already paused no longer auto-resumes the radio when it ends.
- More robust Premium purchase — the store purchase path now grants the entitlement locally if you buy while signed out (so a purchase is never lost), and retries the product lookup once if it hadn’t loaded at launch, with a clearer error message when the product is genuinely unavailable.
What’s Next
The equaliser is the foundation for a broader audio-shaping story. Out of scope for this release — but on the horizon — are the libVLC Windows-HLS fallback and web equalisation.
v0.8.2 is available now for Android, Windows, macOS and Linux. Premium unlocks the equaliser, unlimited song history, the radio alarm clock, the local media player, CSV export and voice commands — a one-time purchase, no subscription.