If you want to understand the source I suggest the following file order:

  - First read "mpp.h"

  - Never read parts within #ifdef USE_ASM

  - the most important from the unreadable "profile.h" is that

      # define START()
      # define ENTER(x)
      # define NEXT(x,n)
      # define LEAVE(x)
      # define REPORT()

    are dummy functions in release versions.

  - now read "wave_out.c", it's for writing WAVE file and easy to understand.

  - synth.c/synthtab.c are the subband synthesizer, 32 subband signals are
    merged to one PCM signal. This is pure mathematics, so take literature
    about subband encoding to understand this.

  - Read "huffsv7.c" and "huffsv46.c", this code builds the decoding tables
    used in "decode.c". This code also uses functions in "tools.c".

  - Read "tools.c" try to understand "huff*.c".

  - Read "requant.c".

  - Now read the bitstream decoder in "decode.c".

  - "mppdec.c" is the frontend for all this functions so you can call the
    decoder from the command line.
    Start from main(), Decode_File(), Decode() and go back the call tree.

  - Read last "id3tag.c"

  - you don't need to read "profile.c" and "dump.c". It's for developing
    only.
