You could access this page securely.

mpg123 - Fast console MPEG Audio Player and decoder library

The mpg123 distribution contains a real time MPEG 1.0/2.0/2.5 audio player/decoder for layers 1,2 and 3 (most commonly MPEG 1.0 layer 3 aka MP3), as well as re-usable decoding and output libraries. Among others, it works on GNU/Linux, MacOSX, the BSDs, Solaris, AIX, HPUX, SGI Irix, OS/2 and Cygwin or plain MS Windows (not all more exotic platforms tested regularily, but patches welcome). You may jump to the non-exhaustive list of features.

It is free software licensed under LGPL 2.1 .

Note that nowadays, the mpg123 decoder core can work with floating point or integer math and with some tuning between accuracy and performance at build-time, using assembly optimizations for several platforms, depending on your build configuration. There is detection and selection of assembly optimisations on x86, x86-64, and ARM at program runtime. It's fast, it's high-quality. Just use it;-)

Top News

  • build:
    • Fix --disable-8bit.
    • Fall back to generic decoder if no yasm for MSVC (bug 346).
    • Fix some pedantic compiler warnings, avoid breaking libtool wrappers.
  • mpg123:
    • Fix verbose position printout for new resampling outside libmpg123 (where output rate differs from decoding rate).
  • libsyn123:
    • Fix reconfiguration of resampler to avoid double free when reducing decimator stages to zero (bug 350). Thanks to Youngseok Choi for reporting this fuzzed issue.

Head over to the download section for getting your hands on the release.

  • Fix build --with-network=internal only (configure logic error, bug 348).
  • Fix OS/2 build with getaddrinfo() (which may support IPv6 eventually, thanks to Dave Yeo).

Head over to the download section for getting your hands on the release.

  • Fix largefile aliases for the case of a largefile-insensitive build that still does define _FILE_OFFSET_BITS from the outside (sys/feature_tests.h on Illumos).

Head over to the download section for getting your hands on the release.

  • mpg123:
    • Finally make terminal control work on Windows, for real. Building it was broken in 1.30.x.
    • The --control / -C switch will make mpg123 abort now if terminal control cannot be enabled.
    • Revert to internal network code for plain HTTP to ensure continued support for original shoutcast servers that do not talk proper HTTP. External backends are built at the same time and can be enforced using --network .
    • Try-witout-port for internal network code is gone. We do not need to keep each ancient hack for specific hosts.
    • Handle redirections independently of the backend behind net123.
    • Set proxy environment variables when --proxy is specified, for net123 backends to use.
    • Continue reading for long commands in generic control, avoiding unnecessary unfinished command errors.
    • Change error message from 'unknown command' to 'unknown command with arguments' to avoid confusion why 'help foo' is unknown, as opposed to 'help'.
    • Reduce CPU load while just waiting for terminal input (thanks to bolshoytoster on github).
    • Condense terminal control help output and excessive vertical whitespace in printouts (inspired by Volkmar Klatt).
    • Fix interaction of pause (looping) with buffer, adding --pauseloop to set the loop interval.
    • Numeric option arguments are strictly checked now for conversion errors. This also catches -devbuffer, which was interpretd as -d 0 before. This also applies to out123.
  • libout123:
    • Add same interruption handling to out123_write() as to unintr_write(), adding EAGAIN to fix bug 342 (thanks to Steffen Nurpmeso) for certain ALSA setups.
    • Add --devbuffer support to win32 output and change default to 0.25 seconds.
    • Fix race condition to deadlock on buffer_sync_param() where parameters after the command byte got read as more commands. This got triggered easily by using the pause key in terminal mode with buffer (which was discouraged before because of buffer flushing). Generally, changing parameters with active buffer process was dangerous since libout123 entered the scene.
  • some build fixes for compiler pickyness
  • Disable largefile renames also for non-sensitive POSIX systems (in some distant future, the alias symbols could go away, then … bug 330).
  • Fix Android NDK x86 builds with GLOBAL_VAR_PTR use in assembly (bug 345).

Head over to the download section for getting your hands on the release.

For older news see the news archive

ISO MPEG compliance

This is a rough log of an automated compliance test on the mpg123 webserver (Xeon E3, GNU/Linux), using the test bitstreams from the ISO MPEG reference set. At least the floating point output should really be close enough to the reference.

Regarding the method: This is comparing mpg123's output (with gapless code deactivated) from reference bitstreams to the reference output. A simple RMS error measure is employed, relative to full scale, just summing over mono or stereo data indiscriminently. This is my interpretation of the rules... maximum allowed RMS=8.80967e-06, maximum signal difference 6.10352e-05.

compliance test for mpg123-1.32.0-dev+20230607022201 on Linux x86_64
First decoder in this list will be tested first, then generic: 
Supported decoders: AVX x86-64 generic generic_dither

Testing default decoder...

==== Layer 1 ====
--> 16 bit signed integer output
fl1.bit:	RMS=4.364373e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl2.bit:	RMS=4.353138e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl3.bit:	RMS=4.348759e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl4.bit:	RMS=4.403421e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl5.bit:	RMS=4.323446e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl6.bit:	RMS=4.389602e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl7.bit:	RMS=3.826083e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl8.bit:	RMS=4.362205e-06 (PASS) maxdiff=7.629395e-06 (PASS)
--> 32 bit integer output
fl1.bit:	RMS=1.967634e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl2.bit:	RMS=1.971686e-08 (PASS) maxdiff=1.117587e-07 (PASS)
fl3.bit:	RMS=2.002386e-08 (PASS) maxdiff=1.341105e-07 (PASS)
fl4.bit:	RMS=1.902169e-08 (PASS) maxdiff=1.266599e-07 (PASS)
fl5.bit:	RMS=3.655859e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl6.bit:	RMS=3.069318e-08 (PASS) maxdiff=1.629815e-07 (PASS)
fl7.bit:	RMS=1.768833e-08 (PASS) maxdiff=8.940697e-08 (PASS)
fl8.bit:	RMS=1.857219e-08 (PASS) maxdiff=8.428469e-08 (PASS)
--> 24 bit integer output
fl1.bit:	RMS=4.096055e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl2.bit:	RMS=4.156199e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl3.bit:	RMS=4.126996e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl4.bit:	RMS=4.100406e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl5.bit:	RMS=4.574976e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl6.bit:	RMS=3.920292e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl7.bit:	RMS=4.186568e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl8.bit:	RMS=4.104751e-08 (PASS) maxdiff=1.192093e-07 (PASS)
--> 32 bit floating point output
fl1.bit:	RMS=1.967635e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl2.bit:	RMS=1.971679e-08 (PASS) maxdiff=1.117587e-07 (PASS)
fl3.bit:	RMS=2.002391e-08 (PASS) maxdiff=1.341105e-07 (PASS)
fl4.bit:	RMS=1.902160e-08 (PASS) maxdiff=1.266599e-07 (PASS)
fl5.bit:	RMS=3.655860e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl6.bit:	RMS=3.069316e-08 (PASS) maxdiff=1.629815e-07 (PASS)
fl7.bit:	RMS=1.768828e-08 (PASS) maxdiff=8.940697e-08 (PASS)
fl8.bit:	RMS=1.857223e-08 (PASS) maxdiff=8.428469e-08 (PASS)

==== Layer 2 ====
--> 16 bit signed integer output
fl10.bit:	RMS=3.512100e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl11.bit:	RMS=3.837267e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl12.bit:	RMS=3.901071e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl13.bit:	RMS=4.379583e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl14.bit:	RMS=4.112578e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl15.bit:	RMS=4.388568e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl16.bit:	RMS=4.147495e-06 (PASS) maxdiff=7.688999e-06 (PASS)
--> 32 bit integer output
fl10.bit:	RMS=1.777418e-08 (PASS) maxdiff=8.475035e-08 (PASS)
fl11.bit:	RMS=1.789150e-08 (PASS) maxdiff=9.685755e-08 (PASS)
fl12.bit:	RMS=1.780872e-08 (PASS) maxdiff=8.940697e-08 (PASS)
fl13.bit:	RMS=1.760690e-08 (PASS) maxdiff=4.470348e-08 (PASS)
fl14.bit:	RMS=3.361258e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl15.bit:	RMS=2.414684e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl16.bit:	RMS=1.924891e-08 (PASS) maxdiff=1.192093e-07 (PASS)
--> 24 bit integer output
fl10.bit:	RMS=4.086103e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl11.bit:	RMS=4.098320e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl12.bit:	RMS=4.095125e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl13.bit:	RMS=4.108581e-08 (PASS) maxdiff=5.960464e-08 (PASS)
fl14.bit:	RMS=4.444728e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl15.bit:	RMS=4.098525e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl16.bit:	RMS=4.146825e-08 (PASS) maxdiff=1.192093e-07 (PASS)
--> 32 bit floating point output
fl10.bit:	RMS=1.777416e-08 (PASS) maxdiff=8.475035e-08 (PASS)
fl11.bit:	RMS=1.789151e-08 (PASS) maxdiff=9.685755e-08 (PASS)
fl12.bit:	RMS=1.780868e-08 (PASS) maxdiff=8.940697e-08 (PASS)
fl13.bit:	RMS=1.760693e-08 (PASS) maxdiff=4.470348e-08 (PASS)
fl14.bit:	RMS=3.361258e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl15.bit:	RMS=2.414676e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl16.bit:	RMS=1.924847e-08 (PASS) maxdiff=1.192093e-07 (PASS)

==== Layer 3 ====
--> 16 bit signed integer output
compl.bit:	RMS=4.300912e-06 (PASS) maxdiff=7.688999e-06 (PASS)
--> 32 bit integer output
compl.bit:	RMS=2.104434e-08 (PASS) maxdiff=1.881272e-07 (PASS)
--> 24 bit integer output
compl.bit:	RMS=4.170551e-08 (PASS) maxdiff=2.384186e-07 (PASS)
--> 32 bit floating point output
compl.bit:	RMS=2.104434e-08 (PASS) maxdiff=1.881272e-07 (PASS)

==== Layer 3 intensity stereo ====
   (no official reference, comparing to mpg123 generic 24 bit)
--> 16 bit signed integer output
drumshort08kHz.bit:	RMS=4.348691e-06 (PASS) maxdiff=7.629395e-06 (PASS)
drumshort24kHz.bit:	RMS=4.365981e-06 (PASS) maxdiff=7.688999e-06 (PASS)
drumshort48kHz.bit:	RMS=4.375106e-06 (PASS) maxdiff=8.106232e-06 (PASS)
mono-is-ms.bit:	RMS=4.389831e-06 (PASS) maxdiff=7.688999e-06 (PASS)
--> 32 bit integer output
drumshort08kHz.bit:	RMS=3.281180e-08 (PASS) maxdiff=1.043081e-07 (PASS)
drumshort24kHz.bit:	RMS=3.282391e-08 (PASS) maxdiff=1.192093e-07 (PASS)
drumshort48kHz.bit:	RMS=4.068793e-08 (PASS) maxdiff=6.854534e-07 (PASS)
mono-is-ms.bit:	RMS=3.511104e-08 (PASS) maxdiff=2.197921e-07 (PASS)
--> 24 bit integer output
drumshort08kHz.bit:	RMS=3.600636e-09 (PASS) maxdiff=5.960464e-08 (PASS)
drumshort24kHz.bit:	RMS=2.518008e-09 (PASS) maxdiff=1.192093e-07 (PASS)
drumshort48kHz.bit:	RMS=2.917921e-08 (PASS) maxdiff=7.152557e-07 (PASS)
mono-is-ms.bit:	RMS=1.635551e-08 (PASS) maxdiff=1.788139e-07 (PASS)
--> 32 bit floating point output
drumshort08kHz.bit:	RMS=3.281174e-08 (PASS) maxdiff=1.043081e-07 (PASS)
drumshort24kHz.bit:	RMS=3.282395e-08 (PASS) maxdiff=1.192093e-07 (PASS)
drumshort48kHz.bit:	RMS=4.068791e-08 (PASS) maxdiff=6.854534e-07 (PASS)
mono-is-ms.bit:	RMS=3.511108e-08 (PASS) maxdiff=2.197921e-07 (PASS)

==== Overall result ====
PASS (limited or full)

Now the generic decoder:

==== Layer 1 ====
--> 16 bit signed integer output
fl1.bit:	RMS=4.364373e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl2.bit:	RMS=4.353138e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl3.bit:	RMS=4.348759e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl4.bit:	RMS=4.403421e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl5.bit:	RMS=4.323446e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl6.bit:	RMS=4.389641e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl7.bit:	RMS=3.826083e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl8.bit:	RMS=4.362205e-06 (PASS) maxdiff=7.629395e-06 (PASS)
--> 32 bit integer output
fl1.bit:	RMS=1.977733e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl2.bit:	RMS=1.980311e-08 (PASS) maxdiff=1.117587e-07 (PASS)
fl3.bit:	RMS=2.006633e-08 (PASS) maxdiff=1.341105e-07 (PASS)
fl4.bit:	RMS=1.911986e-08 (PASS) maxdiff=1.266599e-07 (PASS)
fl5.bit:	RMS=4.047884e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl6.bit:	RMS=3.178246e-08 (PASS) maxdiff=1.639128e-07 (PASS)
fl7.bit:	RMS=1.775744e-08 (PASS) maxdiff=1.043081e-07 (PASS)
fl8.bit:	RMS=1.866297e-08 (PASS) maxdiff=8.195639e-08 (PASS)
--> 24 bit integer output
fl1.bit:	RMS=4.119282e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl2.bit:	RMS=4.184623e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl3.bit:	RMS=4.153068e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl4.bit:	RMS=4.118697e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl5.bit:	RMS=4.816338e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl6.bit:	RMS=4.047773e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl7.bit:	RMS=4.191854e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl8.bit:	RMS=4.106042e-08 (PASS) maxdiff=1.192093e-07 (PASS)
--> 32 bit floating point output
fl1.bit:	RMS=1.977741e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl2.bit:	RMS=1.980280e-08 (PASS) maxdiff=1.117587e-07 (PASS)
fl3.bit:	RMS=2.006633e-08 (PASS) maxdiff=1.341105e-07 (PASS)
fl4.bit:	RMS=1.911983e-08 (PASS) maxdiff=1.266599e-07 (PASS)
fl5.bit:	RMS=4.047868e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl6.bit:	RMS=3.178251e-08 (PASS) maxdiff=1.639128e-07 (PASS)
fl7.bit:	RMS=1.775792e-08 (PASS) maxdiff=1.043081e-07 (PASS)
fl8.bit:	RMS=1.866297e-08 (PASS) maxdiff=8.195639e-08 (PASS)

==== Layer 2 ====
--> 16 bit signed integer output
fl10.bit:	RMS=3.512100e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl11.bit:	RMS=3.837267e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl12.bit:	RMS=3.901071e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl13.bit:	RMS=4.379583e-06 (PASS) maxdiff=7.629395e-06 (PASS)
fl14.bit:	RMS=4.112596e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl15.bit:	RMS=4.388557e-06 (PASS) maxdiff=7.688999e-06 (PASS)
fl16.bit:	RMS=4.147495e-06 (PASS) maxdiff=7.688999e-06 (PASS)
--> 32 bit integer output
fl10.bit:	RMS=1.788206e-08 (PASS) maxdiff=8.195639e-08 (PASS)
fl11.bit:	RMS=1.798147e-08 (PASS) maxdiff=1.005828e-07 (PASS)
fl12.bit:	RMS=1.791770e-08 (PASS) maxdiff=8.568168e-08 (PASS)
fl13.bit:	RMS=1.770191e-08 (PASS) maxdiff=4.470348e-08 (PASS)
fl14.bit:	RMS=4.111211e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl15.bit:	RMS=2.477557e-08 (PASS) maxdiff=1.639128e-07 (PASS)
fl16.bit:	RMS=1.970979e-08 (PASS) maxdiff=1.490116e-07 (PASS)
--> 24 bit integer output
fl10.bit:	RMS=4.102704e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl11.bit:	RMS=4.113184e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl12.bit:	RMS=4.107583e-08 (PASS) maxdiff=1.192093e-07 (PASS)
fl13.bit:	RMS=4.127499e-08 (PASS) maxdiff=5.960464e-08 (PASS)
fl14.bit:	RMS=4.977907e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl15.bit:	RMS=4.145519e-08 (PASS) maxdiff=1.788139e-07 (PASS)
fl16.bit:	RMS=4.171672e-08 (PASS) maxdiff=1.788139e-07 (PASS)
--> 32 bit floating point output
fl10.bit:	RMS=1.788201e-08 (PASS) maxdiff=8.195639e-08 (PASS)
fl11.bit:	RMS=1.798150e-08 (PASS) maxdiff=1.005828e-07 (PASS)
fl12.bit:	RMS=1.791763e-08 (PASS) maxdiff=8.568168e-08 (PASS)
fl13.bit:	RMS=1.770194e-08 (PASS) maxdiff=4.470348e-08 (PASS)
fl14.bit:	RMS=4.111203e-08 (PASS) maxdiff=1.490116e-07 (PASS)
fl15.bit:	RMS=2.477554e-08 (PASS) maxdiff=1.639128e-07 (PASS)
fl16.bit:	RMS=1.970946e-08 (PASS) maxdiff=1.490116e-07 (PASS)

==== Layer 3 ====
--> 16 bit signed integer output
compl.bit:	RMS=4.300914e-06 (PASS) maxdiff=7.688999e-06 (PASS)
--> 32 bit integer output
compl.bit:	RMS=2.147540e-08 (PASS) maxdiff=1.750886e-07 (PASS)
--> 24 bit integer output
compl.bit:	RMS=4.202659e-08 (PASS) maxdiff=1.788139e-07 (PASS)
--> 32 bit floating point output
compl.bit:	RMS=2.147539e-08 (PASS) maxdiff=1.750886e-07 (PASS)

==== Layer 3 intensity stereo ====
   (no official reference, comparing to mpg123 generic 24 bit)
--> 16 bit signed integer output
drumshort08kHz.bit:	RMS=4.348733e-06 (PASS) maxdiff=7.748604e-06 (PASS)
drumshort24kHz.bit:	RMS=4.366053e-06 (PASS) maxdiff=7.808208e-06 (PASS)
drumshort48kHz.bit:	RMS=4.375036e-06 (PASS) maxdiff=7.748604e-06 (PASS)
mono-is-ms.bit:	RMS=4.389819e-06 (PASS) maxdiff=7.629395e-06 (PASS)
--> 32 bit integer output
drumshort08kHz.bit:	RMS=3.685351e-08 (PASS) maxdiff=4.172325e-07 (PASS)
drumshort24kHz.bit:	RMS=3.893594e-08 (PASS) maxdiff=7.450581e-07 (PASS)
drumshort48kHz.bit:	RMS=3.389556e-08 (PASS) maxdiff=2.607703e-07 (PASS)
mono-is-ms.bit:	RMS=3.372314e-08 (PASS) maxdiff=8.940697e-08 (PASS)
--> 24 bit integer output
drumshort08kHz.bit:	RMS=2.297661e-08 (PASS) maxdiff=4.172325e-07 (PASS)
drumshort24kHz.bit:	RMS=2.677607e-08 (PASS) maxdiff=7.748604e-07 (PASS)
drumshort48kHz.bit:	RMS=1.460054e-08 (PASS) maxdiff=2.384186e-07 (PASS)
mono-is-ms.bit:	RMS=9.138218e-09 (PASS) maxdiff=5.960464e-08 (PASS)
--> 32 bit floating point output
drumshort08kHz.bit:	RMS=3.685353e-08 (PASS) maxdiff=4.172325e-07 (PASS)
drumshort24kHz.bit:	RMS=3.893599e-08 (PASS) maxdiff=7.450581e-07 (PASS)
drumshort48kHz.bit:	RMS=3.389551e-08 (PASS) maxdiff=2.607703e-07 (PASS)
mono-is-ms.bit:	RMS=3.372002e-08 (PASS) maxdiff=8.940697e-08 (PASS)

==== Overall result ====
PASS (limited or full)

Depending on what integer quality mode you choose at compile time (and the decoder in use), the 16bit output can vary between PASS and LIMITED for fully or limited accuracy compliance. But keep in mind: For the integer output, you have to give +-1 for rounding... that's what I append to any integer number read from some measurement device anyway, by default. That minimum possible deviation already brings the output close (or over) the border of full compliance... that really does not mean that the output sounds bad! It shall be noted that a measure to improve subjective quality, namely the dithering before rounding to integers, can also increase the theoretical decoding error.

In the end, RMS values in the order of 10 to the power of -5 should sound just fine. To get 16bit output to PASS, you usually need to enable proper rounding using the --enable-int-quality configure flag, which is on by default since some time now. On a specific (older) system, you might consider turning that off for possibly a slight performance gain.

For comparisong with other decoders (as well as older incarnations of the mpg123 engine), have a read of the Underbit compliance tests. Actually, my testing method follows that example, including their quoting of ISO MPEG rules.

Regression tests

This is output from the rudimentary regression test suite (which should eventually merge several approaches we had on testing in the past), working on the periodic snapshot:

cc -Os  -I/tmp/mpg123-svn.JQ40u/prefix/include  -c -o helpers.o helpers.c
CC 2859531_id3_tag_not_skipped_when_NO_ID3V2_is_defined.bin
CC 2950218_extra_samples_seek_last_frame.bin
CC basic_resync.bin
CC bug201_another_one.bin
CC bug201_wrong_frame_buffer.bin
CC chomp_strings.bin
CC custom_io.bin
CC frame_seek_weirdness.bin
CC freeformat.bin
CC less_bytes_after_seek2.bin
CC less_bytes_after_seek.bin
CC more_bytes_on_second_decode.bin
CC out123_errorlist.bin
out123_errorlist.c:1:10: fatal error: out123.h: No such file or directory
    1 | #include 
      |          ^~~~~~~~~~
compilation terminated.
make: *** [Makefile:63: out123_errorlist.bin] Error 1

Build tests

Testing some build setups and looking at libmpg123 size.

Testing builds ...
config:
build default: PASS libmpg123.so=260K mpg123=139K
config: --disable-shared
build static: PASS libmpg123.a=383K mpg123=456K
config: --disable-8bit
build just no 8 bit: PASS libmpg123.so=252K mpg123=139K
config: --disable-buffer --disable-feeder
config: --disable-messages --disable-moreinfo
config: --disable-feature_report --disable-network
config: --disable-icy --disable-id3v2 --disable-ntom
config: --disable-8bit --disable-16bit --disable-32bit
config: --disable-layer1 --disable-layer2
config: --enable-runtime-tables --disable-downsample
config: --disable-equalizer --disable-ieeefloat
build minimal mpg123: PASS libmpg123.so=123K mpg123=114K
config: --disable-buffer --disable-feeder
config: --disable-messages --disable-moreinfo
config: --disable-feature_report --disable-network
config: --disable-icy --disable-id3v2 --disable-ntom
config: --disable-8bit --disable-16bit --disable-32bit
config: --disable-layer1 --disable-layer2
config: --enable-runtime-tables --disable-downsample
config: --disable-equalizer --disable-ieeefloat
config: --disable-string
build minimal libmpg123: PASS libmpg123.so=115K mpg123=114K
config: --disable-buffer --disable-feeder
config: --disable-messages --disable-moreinfo
config: --disable-feature_report --disable-network
config: --disable-icy --disable-id3v2 --disable-ntom
config: --disable-8bit --disable-16bit --disable-32bit
config: --disable-layer1 --disable-layer2
config: --enable-runtime-tables --disable-downsample
config: --disable-equalizer --disable-ieeefloat
config: --disable-string --with-cpu=generic
build minimal generic libmpg123: PASS libmpg123.so=99K mpg123=114K

Needed computing power

A test (GNU/Linux OS) with 0.60-beta2 showed 3 % to 4 % CPU usage on decoding high quality VBR MP3 with a pentiumII laptop with 366MHz, while a pentium 100MHz can easily handle two mpg123 instances in realtime (plus the mixing daemon that works on decoded data). Well, and more recently, A Core2Duo P8600 core can do 500 times realtime decoding (a track nearly five minutes long decoded in half a second).

Also, we have reports from such devices as nintendo DS or Sony PSP, or various embedded systems...

Michael said once upon a time

Plays Layer 3 in stereo on an AMD-486-120Mhz or (of course) a faster machine.

Just for info: mpg123 plays an average 128bps stream, with about 66% in full quality on an AMD 486-133MHz machine.

Hopefully valid HTML! Valid CSS!