************************************************************************ LAME API For a general outline of the code, see the file API. Also, main.c is a simple front end to libmp3lame.a The guts of the code are called from lame_encode_buffer(). lame_encode_buffer() handles buffering, resampling, filtering, and then calls lame_encode_frame() for each frame: lame_encode_frame(): l3psycho_anal() compute masking thresholds mdct_sub() compute MDCT coefficients iteration_loop() choose scalefactors (via iteration) which determine noise shapping, and choose best huffman tables for lossless compression III_formatBitstream format the bitstream and store in bit_buffer copy_buffer() make a copy of bit_buffer, to return to calling program write_buffer() optionally output bit_buffer to a file empty_buffer() mark bit_buffer as empty ************************************************************************ We are in the process of switching the whole code to FLOAT or FLOAT8, which ever is faster (defined in machine.h). Avoid using float or double, and instead use: FLOAT 4 byte floating point. FLOAT8 8 byte floating point (only when necessary) ************************************************************************ Initialization: LAME can be used as a library, and there are two kinds of static data: data that has to be initialized only once when the library is called, and data that has to be initialized every time you start encoding a new sample. These routines should be coded something like: #include "globalflags" void subroutine(void) { static int firstcall=1; if (firstcall) { firstcall=0; /* code that needs to be done only once when routine is loaded */ } if (gf.frameNum==0) { /* code that needs to be done before encoding each file/stream */ } } The frameNum==0 code only works for routines which are only called once per frame. More general code would be: #include "globalflags" void subroutine(void) { static int init=0; if (gf.frameNum==0 && !init) { /* code that needs to be done before encoding each file/stream */ init=1; } if (gf.frameNum>0) init=0; } ************************************************************************ Global flags For better or worse, there are many global flags in lame, in the 'gf' structure. The rules for adding a global flag are: 1. declair in struct gf in lame.h 2. default values must be set in lame_init() 3. include "globalflags.h" in routines that need access to these flags.