A complete multiformat player and internet-radio client for classic AmigaOS. MintAMP plays local audio, searches and streams internet radio, displays live metadata and station artwork, and outputs directly through Paula using audio.device — no AHI or sound card required.
MintAMP ships with ReAction/ClassAct, GadTools and command-line editions. Its fixed-point playback engine and modular decoders have separate 68030/68040 and dedicated 68060 builds for real classic hardware and emulators.
Build guide · Optimization status · Release recipe · CI builds · Decoder details
- Multiformat playback: MP3, AAC-LC/AAC+ ADTS, FLAC, Ogg Vorbis, classic WMA, PCM WAV and Amiga IFF-8SVX.
- Internet radio: direct HTTP/HTTPS streams, Radio Browser search, favourites, ICY title/artist updates and resilient reconnect handling.
- Workbench friendly: ReAction/ClassAct and GadTools interfaces, playlists, track information, ratings, artwork and iconification while playback continues.
- Classic output: direct Paula
audio.deviceplayback with configurable rate, quality, channel mode, buffering and reduced-work modes for slower systems. - CPU-aware decoders: dedicated 68060-safe multiply and hot-loop paths avoid instructions that the 68060 handles through software emulation.
- Modular distribution: matching AAC, FLAC, Ogg, WMA, WAV and IFF decoder modules are bundled with every release edition and CI artifact.
| Installed CPU | Release drawer | Notes |
|---|---|---|
| 68030 or 68040 | MintAMP-v1.3-68030 |
Established full-result m68k assembly paths. |
| 68060 | MintAMP-v1.3-68060 |
Dedicated 68060-safe and 68060-optimised player and decoder paths. |
Each drawer contains all three front ends:
| Program | Interface | Best for |
|---|---|---|
MintAMP |
ReAction/ClassAct | The full Workbench experience. |
MintAMP-GT |
GadTools | Systems without ReAction/ClassAct. |
amiga_mp3dec.fastexp |
Shell | Scripts, direct playback, testing and lower overhead. |
Keep the player and the decoder modules from the same CPU drawer together. In particular, do not use the 68030 decoder set on a real 68060: its full-result MULS.L instructions are software-emulated and can be dramatically slower.
Important
MintAMP 1.3 is a stable, complete application. It is no longer just a Helix MP3 port or decoder demonstration: local playback, both GUI editions, the CLI, modular codecs and direct internet radio are integrated release features.
Note
Some compatibility/debug names still contain exp or Experimental because they were named during development, including --exp-huff, --exp-poly, MP3SetExperimentalHuffman() and MP3SetExperimentalPolyphase(). Those names are retained to avoid breaking callers; they do not mean the release-enabled paths are untested. See Optimization and feature status.
| Area | Status | Notes |
|---|---|---|
| ReAction and GadTools applications | Stable | Local playback, playlists, radio search, metadata, artwork and iconification. |
| MP3, AAC, FLAC, Ogg, WAV and IFF | Stable | CPU-matched modules are included with the application. |
| HTTP/HTTPS internet radio | Stable | HTTPS requires AmiSSL; certificate verification is optional at build time. |
| 68030/68040 edition | Stable | Uses the established m68k assembly path. |
| 68060 edition | Stable, hardware tested | Dedicated MP3 and decoder optimisations tested on a real 68060 Amiga. |
| Classic WMA | Compatibility-limited | WMAv1/WMAv2 only; WMA Pro, Lossless and Voice are not supported. |
| HLS/M3U8 | Out of scope | MintAMP plays direct stream URLs. |
Development continues around performance, codec compatibility and UI polish, but those are improvements to a functioning player rather than missing foundations. Older development builds were named MiniAMP3/minimp3r; compatibility make targets remain where practical.
MintAMP ships as separate 68030/68040 and 68060 editions. A plain
make clean && make release builds only the default 68030 edition; use the
following complete recipe to build both release drawers:
make -f Makefile.amiga release-clean
make -f Makefile.amiga clean
make -f Makefile.amiga release \
CPU=30 \
RADIO=1 \
SSL=1 \
SSLCERTS=1 \
RELEASE_NAME=MintAMP-v1.3-68030
# Keep the first release drawer, but remove CPU-specific objects.
make -f Makefile.amiga clean
make -f Makefile.amiga release \
CPU=60 \
ASM60_GROUPS="lowrate060 huffman midside planars8" \
RADIO=1 \
SSL=1 \
SSLCERTS=1 \
RELEASE_NAME=MintAMP-v1.3-68060The clean between builds is required so 68030 objects are not reused in the
68060 edition. Do not run release-clean between them because it removes the
first completed drawer. The 68030 edition uses the established full assembly
path and also supports 68040; the 68060 edition uses only the selected
68060-safe optimisation groups. The same CPU value is passed to every
external decoder module. The recipe is also kept in
BUILD-RELEASE.txt.
MintAMP also includes a command-line edition named amiga_mp3dec.fastexp. It uses the same Paula playback engine and external decoder modules as the GUI editions, without the ReAction/GadTools interface, station browser or artwork code.
The CLI edition is useful for Shell scripts, direct file/URL playback, decoder testing and lower-overhead setups.
Build the local-media CLI:
make -f Makefile.amiga fast030Build it with HTTP radio support:
make -f Makefile.amiga radio030Build it with HTTP and HTTPS/AmiSSL radio support:
make -f Makefile.amiga sslradio030Example playback:
amiga_mp3dec.fastexp --play music.mp3
amiga_mp3dec.fastexp --play music.flac
amiga_mp3dec.fastexp --play music.ogg
amiga_mp3dec.fastexp --play sample.wav
amiga_mp3dec.fastexp --play sample.iff
amiga_mp3dec.fastexp --play "https://example.com/direct-stream"
Useful playback controls include --rate, --quality, --subband-cap, --mono, --stereo, --fake-stereo, --buffer-seconds, --volume and --fast-mem. Run the binary without arguments to display the complete option list.
The fast030 target name is retained for compatibility. The actual target CPU is selected with CPU=00, 20, 30, 40 or 60. MintAMP v1.3 release drawers are produced for the established 68030 path and a separately tuned 68060 path.
| Format | Status | Notes |
|---|---|---|
| MP3 | Working | Main supported format. Helix fixed-point decoder with m68k optimisation. Layer III in all three versions: MPEG-1 (32/44.1/48 kHz), MPEG-2 (16/22.05/24 kHz) and MPEG-2.5 (8/11.025/12 kHz). |
| AAC-LC ADTS | Working | External aac.decoder module. ADTS .aac streams/files only. |
| FLAC | Working | External flac.decoder module. Performance depends heavily on CPU, output rate and file complexity. |
| Ogg Vorbis | Working | External ogg.decoder using the fixed-point Tremor decoder and libogg. |
| WMA | Working (classic) | External wma.decoder for classic WMAv1/WMAv2 audio in ASF containers. WMA Pro, Lossless and Voice are not supported. |
| WAV | Working | External wav.decoder for uncompressed integer PCM WAV files with 8, 16, 24 or 32-bit samples, mono or stereo. |
| IFF-8SVX | Working | External iff.decoder for mono 8-bit samples, raw or Fibonacci-delta compressed. |
| HTTP MP3/AAC radio | Working | Direct http:// MP3 and ADTS AAC/AAC+ streams. ICY metadata supported where provided. |
| HTTPS MP3/AAC radio | Working with AmiSSL | Build with RADIO=1 SSL=1. Uses AmiSSL and classic-Amiga-specific teardown quarantine for stability. |
| HTTPS certificate verification | Optional | Add SSLCERTS=1 to use AmiSSL's installed CA certificates for peer/hostname verification. |
| Radio Browser search | Working | Used by the GUI radio search. |
| JPEG artwork | Working | picojpeg-compatible baseline decoder. |
| PNG artwork | Working | LodePNG decoder, compiled into both GUI editions. |
| WebP artwork | Working | Compact VP8/VP8L decoder for station artwork and favicons. |
| ICO artwork | Working | PNG-backed ICO and simple DIB-backed favicon entries. |
| SVG artwork | Working (subset) | Fixed-point svgdec.c renderer; see "Artwork notes" below. |
| HLS / M3U8 | Not supported | Out of scope currently. Direct stream URLs only. |
Radio support is enabled at build time with RADIO=1.
Plain HTTP radio:
make -f Makefile.amiga radio030HTTPS radio through AmiSSL:
make -f Makefile.amiga sslradio030ReAction/ClassAct GUI with HTTPS radio:
make -f Makefile.amiga sslguirGadTools GUI with HTTPS radio:
make -f Makefile.amiga sslguiBy default, HTTPS radio uses TLS transport but does not verify the remote certificate chain or hostname. This keeps HTTPS playback compatible with older or incomplete classic Amiga AmiSSL setups.
Add SSLCERTS=1 to enable certificate verification:
make -f Makefile.amiga sslguir SSLCERTS=1SSLCERTS=1 defines the certificate-verification path and tells MintAMP to use AmiSSL's installed CA certificate bundle. The Amiga-side AmiSSL install must have its current root certificates available, and the system clock must be sane, otherwise valid HTTPS streams may fail verification.
Useful certificate-verifying builds:
make -f Makefile.amiga sslradio030 SSLCERTS=1
make -f Makefile.amiga sslgui SSLCERTS=1
make -f Makefile.amiga sslguir SSLCERTS=1Without SSLCERTS=1, HTTPS radio still uses TLS transport, but certificate verification is disabled for compatibility with classic Amiga setups.
The current heavy debug build used for radio, artwork, AmiSSL and heap-guard testing is:
make -f Makefile.amiga guir RADIO=1 SSL=1 SSLCERTS=1 DEBUG=1 HEAPGUARD=1This enables:
- ReAction/ClassAct GUI build (
guir) - internet radio (
RADIO=1) - HTTPS/AmiSSL transport (
SSL=1) - AmiSSL certificate verification (
SSLCERTS=1) - verbose radio/AmiSSL/artwork diagnostics (
DEBUG=1) - MiniAMP heap guard instrumentation (
HEAPGUARD=1)
Use this for debugging only. It is intentionally noisier and heavier than a normal release build.
Plain HTTP MP3:
http://ice1.somafm.com/groovesalad-128-mp3
HTTPS MP3:
https://icecast.walmradio.com:8443/classic
Expected metadata includes station name, genre, bitrate, content type and live ICY StreamTitle updates where the station provides them.
Classic AmigaOS/AmiSSL teardown can be fragile when rapidly switching HTTPS streams from short-lived playback child tasks.
MintAMP therefore uses a conservative stability pattern for HTTPS radio:
- the probe path reuses a shared probe
SSL_CTXrather than creating/freeing one for every station probe - probe SSL objects are quarantined on dangerous close/EOF paths
- playback child tasks skip/quarantine
SSL_free(),SSL_CTX_free()and per-taskCleanupAmiSSL()during stream teardown
This intentionally leaks small per-session AmiSSL objects during the app run. That is a trade-off for runtime stability on classic AmigaOS: repeated station switching previously reproduced delayed Software Failure #80000008 crashes, while the quarantine path stopped the crash during repeated manual testing.
If you are changing the HTTPS radio code, do not remove this quarantine behaviour unless you have stress-tested repeated HTTPS station switching on the target AmigaOS/AmiSSL setup.
- Bebbo m68k Amiga GCC toolchain
m68k-amigaos-gccm68k-amigaos-nm- GNU Make
- Git with submodule support
- AmiSSL SDK headers for HTTPS radio builds
- AmiSSL root certificates for
SSLCERTS=1certificate verification - ReAction/ClassAct runtime classes for
MintAMP bsdsocket.libraryat runtime for radio
Check the toolchain:
which m68k-amigaos-gcc
which m68k-amigaos-nm
m68k-amigaos-gcc --version | head -3Full AmigaOS build instructions are in:
docs/building-amiga.md
That document covers:
- clean repo sync
- submodule sync
- FLAC decoder build and CPU-specific LPC restoration with
FLACASM=1 - AAC decoder build and CPU-aware m68k helpers (
AACASM=0selects the portable-C fallback) - Ogg Vorbis/Tremor decoder build and CPU-aware m68k helpers (
OGGASM=0selects the portable-C fallback) - WAV, IFF-8SVX and WMA decoder builds
- radio builds with
RADIO=1 - HTTPS/AmiSSL builds with
SSL=1 - certificate-verifying HTTPS builds with
SSLCERTS=1 - debug/heap-guard builds with
DEBUG=1 HEAPGUARD=1 - decoder entrypoint checks
- copying files to Amiga/WinUAE
- runtime tests
- Git hygiene
Each GitHub Actions CPU artifact contains amiga_mp3dec.fastexp together with
all six matching *.decoder modules, so a CI build can be tested on hardware
without rebuilding or mixing modules from another CPU edition.
From a clean checkout:
cd ~/Amiga-Programs/libhelix-mp3
git fetch origin --prune
git checkout master
git reset --hard origin/master
git clean -fd
git submodule sync --recursive
git submodule update --init --recursive
git submodule foreach --recursive 'git reset --hard && git clean -fd'
make -C decoders clean || true
find . -name "*.o" -delete
rm -f amiga_mp3dec.fastexp MintAMP MintAMP-GT
rm -f decoders/*.decoder decoders/*.decoder.map
make -C decoders flac
make -C decoders aac AACASM=1
make -C decoders ogg
make -C decoders wav
make -C decoders iff
make -C decoders wma
make -f Makefile.amiga sslguirUseful alternative builds:
make -f Makefile.amiga fast030 # CLI/local playback focused build
make -f Makefile.amiga radio030 # CLI/radio build without HTTPS
make -f Makefile.amiga sslradio030 # CLI/radio build with HTTPS/AmiSSL
make -f Makefile.amiga gui RADIO=1 # GadTools GUI with radio
make -f Makefile.amiga guir RADIO=1 # ReAction GUI with radio
make -f Makefile.amiga sslgui # GadTools GUI with HTTPS radio
make -f Makefile.amiga sslguir # ReAction GUI with HTTPS radio/artwork
make -f Makefile.amiga sslguir SSLCERTS=1 # ReAction HTTPS radio with AmiSSL cert verification
make -f Makefile.amiga guir RADIO=1 SSL=1 SSLCERTS=1 DEBUG=1 HEAPGUARD=1 # heavy debug buildVerify decoder module entrypoints:
for module in aac flac ogg wav iff wma; do
m68k-amigaos-nm -n "decoders/$module.decoder" | head -1
doneEvery module should start with:
00000000 T _DecoderModuleEntry
If anything appears before _DecoderModuleEntry, the module may crash when loaded.
Keep the player and decoder modules together.
Typical Amiga-side layout:
MintAMP/
MintAMP
MintAMP-GT
amiga_mp3dec.fastexp
decoders/
aac.decoder
flac.decoder
ogg.decoder
wma.decoder
wav.decoder
iff.decoder
Depending on the build target/front-end, the executable may be:
amiga_mp3dec.fastexp CLI/local and radio playback
MintAMP-GT GadTools GUI
MintAMP ReAction/ClassAct GUI
Local MP3:
amiga_mp3dec.fastexp --play test.mp3
AAC:
amiga_mp3dec.fastexp --play test.aac
FLAC:
amiga_mp3dec.fastexp --play test.flac
Ogg Vorbis:
amiga_mp3dec.fastexp --play test.ogg
Classic WMA in ASF:
amiga_mp3dec.fastexp --play test.wma
PCM WAV:
amiga_mp3dec.fastexp --play test.wav
Amiga IFF-8SVX:
amiga_mp3dec.fastexp --play test.iff
HTTP MP3 radio:
amiga_mp3dec.fastexp --play "http://ice1.somafm.com/groovesalad-128-mp3"
HTTPS MP3 radio:
amiga_mp3dec.fastexp --play "https://icecast.walmradio.com:8443/classic"
MintAMP's external decoder modules are:
| Module | Format / implementation |
|---|---|
aac.decoder |
Helix AAC through ESP8266Audio |
flac.decoder |
libfoxenflac |
ogg.decoder |
Xiph.Org Tremor and libogg |
wma.decoder |
Rockbox fixed-point libwma plus MintAMP's ASF demuxer |
wav.decoder |
MintAMP RIFF/PCM decoder |
iff.decoder |
MintAMP IFF-8SVX decoder |
Every external decoder module must export DecoderModuleEntry as its first real text symbol.
Required check:
for module in aac flac ogg wav iff wma; do
m68k-amigaos-nm -n "decoders/$module.decoder" | head -1
doneExpected for every module:
00000000 T _DecoderModuleEntry
This is important because the Amiga module loader expects to enter the decoder module at the correct offset. If compiler helper or library code appears before DecoderModuleEntry, the module can jump into the wrong code and crash.
AAC support currently targets AAC-LC ADTS files and streams.
The AAC decoder uses the decoders/esp8266audio submodule, with the AAC source under:
decoders/esp8266audio/src/libhelix-aac
The expected local symlink is:
decoders/aac -> esp8266audio/src/libhelix-aac
Build AAC normally:
make -C decoders aacBuild AAC with the m68k assembly helpers explicitly selected (they are enabled by default):
make -C decoders aac AACASM=1AACASM=1 selects m68k helper paths for:
AMIGA_M68K_ASM_AAC_HUFFMAN
AMIGA_M68K_ASM_AAC_DEQUANT
AMIGA_M68K_ASM_AAC_STEREO
AMIGA_M68K_ASM_AAC_IMDCT
The helpers are enabled by default. The 68020/030/040 path uses full-result
MULS.L; CPU=60 selects a bit-exact implementation made from hardware
two-operand MULS.L/MULU.L partial products instead, avoiding the emulated
register-pair form. The plain C fallback remains available with AACASM=0.
FLAC support is provided by flac.decoder.
Build:
make -C decoders flacThe existing AMIGA_M68K_ASM flag now selects a real LPC restoration helper.
CPU=20/30/40 uses hardware register-pair MULS.L and ADD/ADDX for each
predictor tap. CPU=60 uses exact hardware-only partial products and avoids the
emulated register-pair form. Use FLACASM=0 for the original portable-C path.
FLAC is heavier than MP3 and performance depends on CPU, file complexity, predictor order, output rate and playback settings.
Ogg Vorbis support is provided by ogg.decoder, using Xiph.Org's fixed-point Tremor decoder through Phil Schatzmann's Arduino port together with Xiph.Org libogg.
Build:
make -C decoders oggThe default build enables CPU-aware m68k fixed-point helpers. The 68020/68030/68040 path keeps Tremor's fast full-result register-pair MULS.L; the 68060 path uses exact hardware-only partial products so it does not fall into the 68060 software-emulation trap. Use OGGASM=0 to build the portable C path.
The WAV and IFF modules are compact decoders written for MintAMP:
wav.decoderaccepts uncompressed integer PCM WAV files with 8, 16, 24 or 32-bit samples, mono or stereoiff.decoderaccepts classic mono IFF-8SVX samples, both raw and Fibonacci-delta compressed
The WMA module accepts classic WMAv1 and WMAv2 codec streams in ASF containers. Its fixed-point codec core comes from Rockbox's libwma and is derived from FFmpeg; the ASF demuxer and MintAMP module integration are project-specific. WMA Pro, Lossless, Voice and other ASF-contained codecs are out of scope.
WMA's CPU-aware fixed-point helpers are enabled by default. CPU=20/30/40 uses the hardware full-result register-pair MULS.L; CPU=60 reconstructs the exact result with four hardware-only partial products. These primitives feed WMA's FFT, MDCT, complex multiplication and unrolled window loops. Use WMAASM=0 for the portable 64-bit-C fallback and A/B testing.
Build individually:
make -C decoders wav
make -C decoders iff
make -C decoders wmaBoth GUI editions can fetch and display station artwork where the station or Radio Browser metadata provides a usable image URL.
Supported artwork decode paths:
- JPEG through a small picojpeg-compatible baseline decoder; the original picojpeg API/design is by Rich Geldreich
- PNG through vendored LodePNG by Lode Vandevenne
- WebP through
webpdec.c, a compact VP8/VP8L implementation using portions of Google's libwebp reference decoder under its BSD licence - ICO favicon files, including PNG-backed entries and simple DIB-backed icons
- SVG through
svgdec.c, a fixed-point subset renderer designed for small classic-Amiga artwork
The SVG renderer supports the common paths, shapes, transforms, solid fills, simple strokes and limited gradient handling needed by station logos. It intentionally omits heavyweight browser features such as filters, external images, text layout, CSS stylesheets, masks and full animation. See svgdec.h and the source comments for the exact supported subset.
Artwork support is available in both GUI editions. The CLI build does not include or need the artwork decoders.
Do not commit generated files:
*.o
*.decoder
*.decoder.map
*.fastexp
MintAMP-GT
MintAMP
test audio files
*:Zone.Identifier
Before committing:
git status --shortRecommended final test checklist before pushing decoder/player changes:
MP3 local playback
AAC local playback
AAC TNS-heavy file
FLAC local playback
Ogg Vorbis local playback
WMA local playback
WAV local playback
IFF-8SVX local playback
HTTP MP3 radio playback
HTTPS MP3 radio playback
HTTPS certificate verification with SSLCERTS=1
Radio Browser search
ICY title/artist metadata updates
Station artwork display where provided
Stop on radio stream
Menus after stopping radio
Restart radio after stopping
Repeated manual HTTPS station switching
DecoderModuleEntry still at offset 0
MintAMP's Amiga port, GUI front-ends, decoder-module integration, internet radio, artwork integration and m68k optimisation are by Darren Banfi (boingball).
Audio decoder components:
- MP3: Helix fixed-point decoder from RealNetworks
- AAC: Helix AAC through ESP8266Audio by Earle F. Philhower III
- FLAC: libfoxenflac by Alexander Stoeckel
- Ogg Vorbis: Xiph.Org Tremor through Phil Schatzmann's Arduino port, together with Xiph.Org libogg
- WMA: Rockbox fixed-point libwma, derived from FFmpeg's WMA decoder
Artwork decoder components:
- JPEG: picojpeg-compatible decoder; picojpeg was created by Rich Geldreich
- PNG: LodePNG by Lode Vandevenne
- WebP: compact MintAMP implementation using portions of Google's libwebp reference decoder
The MintAMP-specific ASF/WMA integration, WAV/PCM and IFF-8SVX decoders, and ICO, SVG and compact WebP artwork handlers were developed with assistance from Anthropic Claude.
MintAMP combines components under several licences, including the Helix RPSL, LGPL, BSD-style and LodePNG terms. See the repository licence files and the included/submodule source trees for the complete terms. Third-party copyright and licence notices must be retained when redistributing binaries or source.