
/*
 * Copyright 1992, 1993, 1994, by Jutta Degener and Carsten Bormann,
 * Technische Universitaet Berlin.  See the accompanying file "COPYRIGHT"
 * for details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
 */

How to get started:

   Edit the Makefile.

	You should configure a few machine-dependencies and what
	compiler you want to use.

  	The code works both with ANSI and K&R-C.  Use
	-DNeedFunctionPrototypes to compile with, or
	-UNeedFunctionPrototypes to compile without, function
	prototypes in the header files.
 
   Make addtst

	The "add" program that will be compiled and run checks whether
	the basic math functions of the gsm library work with your
	compiler.  If it prints anything to stderr, complain (to us).

   Edit inc/config.h.

   Make

   	Local versions of the gsm library and the "compress"-like filters
	toast, untoast and tcat will be generated.

   	If the compilation aborts because of a missing function,
	declaration, or header file, see if there's something in
	inc/config.h to work around it.  If not, complain.

   Try it

	Grab an audio file from somewhere (raw u-law or Sun .au is fine, 
    	linear 16-bit in host byte order will do), copy it, toast it,
	untoast it, and listen to the result.
    
	If it doesn't sound anything like the original, read the manual.
	If it still doesn't sound anything like the original, complain.


Installation

   You can install the gsm library interface, or the toast binaries,
   or both.

   Edit the Makefile
	
	Fill in the directories where you want to install the
	library, header files, manual pages, and binaries.

	Turn off the installation of one half of the distribution
	(i.e., gsm library or toast binaries) by not setting the
	corresponding directory root Makefile macro.


   make install

	will install the programs "toast" with two links named
	"tcat" and "untoast", and the gsm library "libgsm.a" with
	a "gsm.h" header file, and their respective manual pages.


Optimizing

   This code was developed on a machine without an integer
   multiplication instruction, where we obtained the fastest result by
   replacing some of the integer multiplications with floating point
   multiplications.

   Another possibility is the use of a lookup table; you can turn on
   this feature by replacing -DUSE_FLOAT_MUL by -DUSE_TABLE_MUL.

   If your machine does multiply integers fast, define neither.



Bug Reports

   Please direct bug reports to jutta@cs.tu-berlin.de and
   cabo@cs.tu-berlin.de .


Good luck,

   Jutta Degener,
   Carsten Bormann
