The delivery engine of the Capullo Audio Platform. An Android library that decodes whatever a source resolves through ExoPlayer, tees the PCM into a Snapcast FIFO, and broadcasts time-synced audio on the LAN with a bundled web player.
Namespace tech.capullo.audio · Gradle 9.6.1 · Kotlin 2.3.10 · AGP 9.1.0 · Media3 1.9.0.
Where this sits: see Platform shape.
| Package | Contents |
|---|---|
player |
FifoAudioBufferSink + FifoRenderersFactory - the ExoPlayer tee → 44100/16/2 FIFO chain |
snapcast |
SnapserverProcess, SnapclientProcess, SnapcontrolPlugin, JSON-RPC, discovery, NSD |
| (root) | CapulloAudioEngine - the public facade wiring source → player → snapserver → control plugin |
assets/webui |
the bundled Snapcast web player (index.html) |
api→capullo-audio-contracts(the SPI). The engine speaks onlyMediaSourceProvider/NowPlaying/PlaybackController- it knows nothing about radio or Telegram, and never depends on acapullo-source-*library: sources are siblings, not a layer underneath.implementation→lib-snapcast-android(prebuilt native.so), Media3.- The FFmpeg decoder (
lib-media3-ffmpeg-android) is reflection-loaded byDefaultRenderersFactorywhen present on the app classpath - not a compile dependency here.
- Artwork moved to the app. The old plugin downloaded artwork from a URL / read an art file
itself. The engine's
SnapcontrolPluginnow emitsNowPlaying.artworkBase64verbatim - the source/app is responsible for producing base64 artwork (and may setextras["artExtension"]). SnapserverProcess.STREAM_NAMEis hardcoded"name=QuantumCast"- parameterize per app before Telecloud consumes the engine.CapulloAudioEnginecovers the broadcast core. Still to wire (see its KDoc): prefetch feedback (onQueueAdvanced), snapclient/listen-in mode, and app-owned Service concerns (notifications, watchdog, buffering UI).
./gradlew :capullo-audio:assembleRelease # library AAR
./gradlew :app:assembleDebug # harness APK (bundles the snapcast .so)Requires the Android SDK. Contracts resolves from jitpack by default; for local co-development,
check it out beside this repo and settings.gradle.kts substitutes it via a composite build.
Copyright 2026 capullo-tech. Licensed under GPLv3 - see LICENSE (integrates GPLv3 Snapcast via lib-snapcast-android; substantially derived from RadioCapullo).