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.