The LAME API

This is the simple interface to the encoding part of libmp3lame.so.
The library also contains routines for adding id3 tags and 
mp3 decoding.  These routines are not fully documented,
but you can figure them out by looking at "include/lame.h" and the
example frontend encoder/decoder source code in frontend/main.c

All of these steps should be done for every MP3 to be encoded.


=========================================================================

1. (optional) Get the version number of the encoder, if you are interested.  
   void get_lame_version(char *strbuf, size_t buflen, const char *prefix);


2. Error messages.  By default, LAME will write error messages to
stderr using vfprintf().  For GUI applications, this is often a problem
and you need to set your own error message handlers:

   lame_set_errorf(gfp,error_handler_function);
   lame_set_debugf(gfp,error_handler_function);
   lame_set_msgf(gfp,error_handler_function);
  
See lame.h for details.


3. Initialize the encoder.  sets default for all encoder parameters.

   #include "lame.h"
   lame_global_flags *gfp;
   gfp = lame_init();

The default (if you set nothing) is a  J-Stereo, 44.1khz
128kbps CBR mp3 file at quality 5.  Override various default settings 
as necessary, for example:

   lame_set_num_channels(gfp,2);
   lame_set_in_samplerate(gfp,44100);
   lame_set_brate(gfp,128);
   lame_set_mode(gfp,1);
   lame_set_quality(gfp,2);   /* 2=high  5 = medium  7=low */ 


See lame.h for the complete list of options.  Note that there are
some lame_set_*() calls not documented in lame.h.  These functions
are experimental and for testing only.  They may be removed in
the future.



4. Set more internal configuration based on data provided above,
   as well as checking for problems.  Check that ret_code >= 0.

   ret_code = lame_init_params(gfp);



5. Encode some data.  input pcm data, output (maybe) mp3 frames.
This routine handles all buffering, resampling and filtering for you.
The required mp3buffer_size can be computed from num_samples, 
samplerate and encoding rate, but here is a worst case estimate:
mp3buffer_size (in bytes) = 1.25*num_samples + 7200.
num_samples = the number of PCM samples in each channel.  It is
not the sum of the number of samples in the L and R channels.

The return code = number of bytes output in mp3buffer.  This can be 0.
If it is <0, an error occured.  

   int lame_encode_buffer(lame_global_flags *gfp,
         short int leftpcm[], short int rightpcm[],
         int num_samples,char *mp3buffer,int  mp3buffer_size);


There are also routines for various types of input  
(float, long, interleaved, etc).  See lame.h for details.


6. lame_encode_flush will flush the buffers and may return a 
final few mp3 frames.  mp3buffer should be at least 7200 bytes.
return code = number of bytes output to mp3buffer.  This can be 0.

int lame_encode_flush(lame_global_flags *,char *mp3buffer, int mp3buffer_size);


7.  Write the Xing VBR/INFO tag to mp3 file.  

void lame_mp3_tags_fid(lame_global_flags *,FILE* fid);

This adds a valid mp3 frame which contains information about the
bitstream some players may find usefull.  It is used for CBR,ABR and
VBR.  The routine will attempt to rewind the output stream to the
beginning.  If this is not possible, (for example, you are encoding to
stdout) you should specifically disable the tag by calling
lame_set_bWriteVbrTag(gfp,0) in step 3 above, and call
lame_mp3_tags_fid() with fid=NULL.  If the rewind fails and
the tag was not disabled, the first mp3 frame in the bitstream
will be all 0's.



8. free the internal data structures.

void lame_close(lame_global_flags *); 


