Short:        FLAC decoder library (68020+/060/080)
Author:       Renaud Schweingruber, David Reid (dr_flac)
Uploader:     renaud schweingruber protonmail com (Renaud Schweingruber)
Type:         util/libs
Version:      1.1 (2.11.2026)
Requires:     68020
Architecture: m68k-amigaos >= 3.0
Distribution: Aminet

flacdec.library 1.1
===================

A shared library that decodes FLAC (Free Lossless Audio Codec) to
16-bit PCM for AmigaOS 3, bit for bit what the reference decoder
gives. Inside is dr_flac by David Reid, with its decoding loops
(LPC prediction, Rice residuals, stereo output) rewritten in 68020
assembler and tuned for the Apollo 68080.

Programs that use it: AmiPlexAmp (Plex client), and yours: the
interface is five functions (see Developer/).

Three builds
------------

  Libs/flacdec.library      any 68020 or better. On a 68060 use the
                            68060 build: the 24-bit prediction here
                            needs an instruction that 68060.library
                            has to emulate
  Libs/flacdec.library.060  68060 only (and 68080, for testing); the
                            same prediction from 16-bit multiplies.
                            Checked on a 68080 only: it has not run
                            on a real 68060 yet
  Libs/flacdec.library.080  Apollo 68080 (Vampire) only; refuses to
                            open on another CPU. With the FPU on, the
                            prediction of 24-bit files runs on it,
                            bit for bit the same

Copy one of them to LIBS:flacdec.library.

Speed on a Vampire V4 (68080, 99 MHz), CPU time in % of real time,
decoding only:

                              68080 build   68020 build
  44.1 kHz / 16-bit stereo       4.9 %         4.9 %
  96 kHz / 24-bit stereo        12.6 %        13.9 %
  88.2 kHz / 24-bit, verbatim    2.3 %         2.4 %

Formats: 4 to 32 bits per sample (16-bit output), 1 to 8 channels,
any sample rate, native FLAC (not Ogg FLAC). CRCs are not checked.
Not decoded: 32-bit stereo frames with a side channel, which has 33
bits. Decoding stops at the first such frame.
Seeking is supported. Input comes from a file or from your own I/O
hook (for example a file that is still being downloaded). Several
programs and tasks can decode at the same time. The 68020 build does
not use the FPU; the 68080 build uses it when it is on (checked for
every subframe: the V4 can switch it off). The 68060 build does not
use the FPU either.

For programmers
---------------

  Developer/doc/flacdec.doc               the autodoc
  Developer/include/libraries/flacdec.h   structures and constants
  Developer/include/clib, proto, inline   prototypes, GCC inlines
  Developer/fd/flacdec_lib.fd

  struct FLACDecInfo info;
  APTR dec = FLACDecOpenFile("song.flac", &info);
  LONG n;
  while ((n = FLACDecRead(dec, buffer, 4096)) > 0)
      ... n frames of info.fdi_Channels interleaved WORDs ...
  FLACDecClose(dec);

The functions use up to about 4.6 KB of the caller's stack: call them
with at least 8 KB free.

Tested
------

Against ffmpeg's decoder: 23 files (CD and 96 kHz/24-bit music,
ffmpeg compression levels 0 to 12, LPC orders up to 32, mono, 48 kHz,
every stereo mode, wasted bits), whole decodes and seeks at 7
positions each, both builds; the read hook; the stack use. The FPU
prediction against the integer one on 1152 cases and under constant
interrupts. Since 1.1 also synthetic files against their known samples:
verbatim subframes from 4 to 32 bits, residuals mixing Rice and unencoded
partitions. All three builds gave the same results on a 68080, the
68060 prediction also against a model on 13772 cases.

License
-------

flacdec.library is free to use and to redistribute in this unchanged
archive. (C) 2026 Renaud Schweingruber. dr_flac by David Reid is
public domain (or MIT-0), https://github.com/mackron/dr_libs.

History
-------

1.1  Verbatim subframes in assembler, 7 times faster. The prediction
     runs once per subframe instead of once per partition, the library
     is 5 KB smaller. 16-bit files that do not need the 64-bit
     prediction no longer use it, and its loops are 2 to 3 cycles per
     sample shorter (68020 build: up to 11 % faster on 16-bit files, 5 %
     on 96 kHz/24-bit; 68080 build: up to 5 %). New 68060 build. 32-bit files from libFLAC 1.4 now decode (they gave no
     samples). The output is unchanged for everything that decoded before.
1.0  First release.
