Add GSM full rate codec to LCR's source repository
[lcr.git] / libgsmfr / Makefile
diff --git a/libgsmfr/Makefile b/libgsmfr/Makefile
new file mode 100644 (file)
index 0000000..0ddac90
--- /dev/null
@@ -0,0 +1,494 @@
+# Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technische
+# Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+# details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+# Machine- or installation dependent flags you should configure to port
+
+SASR   = -DSASR
+######### Define SASR if >> is a signed arithmetic shift (-1 >> 1 == -1)
+
+# MULHACK = -DUSE_FLOAT_MUL
+######### Define this if your host multiplies floats faster than integers,
+######### e.g. on a SPARCstation.
+
+# FAST = -DFAST
+######### Define together with USE_FLOAT_MUL to enable the GSM library's
+######### approximation option for incorrect, but good-enough results.
+
+# LTP_CUT      = -DLTP_CUT
+LTP_CUT        =
+######### Define to enable the GSM library's long-term correlation 
+######### approximation option---faster, but worse; works for
+######### both integer and floating point multiplications.
+######### This flag is still in the experimental stage.
+
+WAV49  = -DWAV49
+# WAV49        =
+######### Define to enable the GSM library's option to pack GSM frames 
+######### in the style used by the WAV #49 format.  If you want to write
+######### a tool that produces .WAV files which contain GSM-encoded data,
+######### define this, and read about the GSM_OPT_WAV49 option in the
+######### manual page on gsm_option(3).
+
+# Choose a compiler.  The code works both with ANSI and K&R-C.
+# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to
+# compile without, function prototypes in the header files.
+#
+# You can use the -DSTUPID_COMPILER to circumvent some compilers'
+# static limits regarding the number of subexpressions in a statement.
+
+# CC           = cc
+# CCFLAGS      = -c -DSTUPID_COMPILER
+
+# CC           = /usr/lang/acc
+# CCFLAGS      = -c -O
+
+CC             = gcc -ansi -pedantic
+CCFLAGS        = -c -O2 -DNeedFunctionPrototypes=1
+
+LD             = $(CC)
+
+# LD           = gcc
+# LDFLAGS      =
+
+
+# If your compiler needs additional flags/libraries, regardless of
+# the source compiled, configure them here.
+
+# CCINC        = -I/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1/include
+######### Includes needed by $(CC)
+
+# LDINC        = -L/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1
+######### Library paths needed by $(LD)
+
+# LDLIB        = -lgcc
+######### Additional libraries needed by $(LD)
+
+
+# Where do you want to install libraries, binaries, a header file
+# and the manual pages?
+#
+# Leave INSTALL_ROOT empty (or just don't execute "make install") to
+# not install gsm and toast outside of this directory.
+
+INSTALL_ROOT   =
+
+# Where do you want to install the gsm library, header file, and manpages?
+#
+# Leave GSM_INSTALL_ROOT empty to not install the GSM library outside of
+# this directory.
+
+GSM_INSTALL_ROOT = $(INSTALL_ROOT)
+GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib
+GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc
+GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3
+
+
+# Where do you want to install the toast binaries and their manpage?
+#
+# Leave TOAST_INSTALL_ROOT empty to not install the toast binaries outside
+# of this directory.
+
+TOAST_INSTALL_ROOT       = $(INSTALL_ROOT)
+TOAST_INSTALL_BIN = $(TOAST_INSTALL_ROOT)/bin
+TOAST_INSTALL_MAN = $(TOAST_INSTALL_ROOT)/man/man1
+
+#  Other tools
+
+SHELL          = /bin/sh
+LN             = ln
+BASENAME       = basename
+AR             = ar
+ARFLAGS                = cr
+RMFLAGS                = -f
+FIND           = find
+COMPRESS       = compress
+COMPRESSFLAGS  = 
+# RANLIB       = true
+RANLIB         = ranlib
+
+#
+#    You shouldn't have to configure below this line if you're porting.
+# 
+
+
+# Local Directories
+
+ROOT   = .
+ADDTST = $(ROOT)/add-test
+TST    = $(ROOT)/tst
+MAN    = $(ROOT)/man
+BIN    = $(ROOT)/bin
+SRC    = $(ROOT)/src
+LIB    = $(ROOT)/lib
+TLS    = $(ROOT)/tls
+INC    = $(ROOT)/inc
+
+# Flags
+
+# DEBUG        = -DNDEBUG
+######### Remove -DNDEBUG to enable assertions.
+
+CFLAGS = $(CCFLAGS) $(SASR) $(DEBUG) $(MULHACK) $(FAST) $(LTP_CUT) \
+       $(WAV49) $(CCINC) -I$(INC)
+######### It's $(CC) $(CFLAGS)
+
+LFLAGS = $(LDFLAGS) $(LDINC)
+######### It's $(LD) $(LFLAGS)
+
+
+# Targets
+
+LIBGSM = $(LIB)/libgsm.a
+
+TOAST  = $(BIN)/toast
+UNTOAST        = $(BIN)/untoast
+TCAT   = $(BIN)/tcat
+
+# Headers
+
+GSM_HEADERS =  $(INC)/gsm.h
+
+HEADERS        =       $(INC)/proto.h          \
+               $(INC)/unproto.h        \
+               $(INC)/config.h         \
+               $(INC)/private.h        \
+               $(INC)/gsm.h            \
+               $(INC)/toast.h          \
+               $(TLS)/taste.h
+
+# Sources
+
+GSM_SOURCES =  $(SRC)/add.c            \
+               $(SRC)/code.c           \
+               $(SRC)/debug.c          \
+               $(SRC)/decode.c         \
+               $(SRC)/long_term.c      \
+               $(SRC)/lpc.c            \
+               $(SRC)/preprocess.c     \
+               $(SRC)/rpe.c            \
+               $(SRC)/gsm_destroy.c    \
+               $(SRC)/gsm_decode.c     \
+               $(SRC)/gsm_encode.c     \
+               $(SRC)/gsm_explode.c    \
+               $(SRC)/gsm_implode.c    \
+               $(SRC)/gsm_create.c     \
+               $(SRC)/gsm_print.c      \
+               $(SRC)/gsm_option.c     \
+               $(SRC)/short_term.c     \
+               $(SRC)/table.c
+
+TOAST_SOURCES = $(SRC)/toast.c                 \
+               $(SRC)/toast_lin.c      \
+               $(SRC)/toast_ulaw.c     \
+               $(SRC)/toast_alaw.c     \
+               $(SRC)/toast_audio.c
+
+SOURCES        =       $(GSM_SOURCES)          \
+               $(TOAST_SOURCES)        \
+               $(ADDTST)/add_test.c    \
+               $(TLS)/sour.c           \
+               $(TLS)/ginger.c         \
+               $(TLS)/sour1.dta        \
+               $(TLS)/sour2.dta        \
+               $(TLS)/bitter.c         \
+               $(TLS)/bitter.dta       \
+               $(TLS)/taste.c          \
+               $(TLS)/sweet.c          \
+               $(TST)/cod2lin.c        \
+               $(TST)/cod2txt.c        \
+               $(TST)/gsm2cod.c        \
+               $(TST)/lin2cod.c        \
+               $(TST)/lin2txt.c
+
+# Object files
+
+GSM_OBJECTS =  $(SRC)/add.o            \
+               $(SRC)/code.o           \
+               $(SRC)/debug.o          \
+               $(SRC)/decode.o         \
+               $(SRC)/long_term.o      \
+               $(SRC)/lpc.o            \
+               $(SRC)/preprocess.o     \
+               $(SRC)/rpe.o            \
+               $(SRC)/gsm_destroy.o    \
+               $(SRC)/gsm_decode.o     \
+               $(SRC)/gsm_encode.o     \
+               $(SRC)/gsm_explode.o    \
+               $(SRC)/gsm_implode.o    \
+               $(SRC)/gsm_create.o     \
+               $(SRC)/gsm_print.o      \
+               $(SRC)/gsm_option.o     \
+               $(SRC)/short_term.o     \
+               $(SRC)/table.o
+
+TOAST_OBJECTS =        $(SRC)/toast.o          \
+               $(SRC)/toast_lin.o      \
+               $(SRC)/toast_ulaw.o     \
+               $(SRC)/toast_alaw.o     \
+               $(SRC)/toast_audio.o
+
+OBJECTS =       $(GSM_OBJECTS) $(TOAST_OBJECTS)
+
+# Manuals
+
+GSM_MANUALS =  $(MAN)/gsm.3            \
+               $(MAN)/gsm_explode.3    \
+               $(MAN)/gsm_option.3     \
+               $(MAN)/gsm_print.3
+
+TOAST_MANUALS =        $(MAN)/toast.1
+
+MANUALS        =       $(GSM_MANUALS) $(TOAST_MANUALS) $(MAN)/bitter.1
+
+# Other stuff in the distribution
+
+STUFF =        ChangeLog                       \
+               INSTALL                 \
+               MACHINES                \
+               MANIFEST                \
+               Makefile                \
+               README                  \
+               $(ADDTST)/add_test.dta  \
+               $(TLS)/bitter.dta       \
+               $(TST)/run
+
+
+# Install targets
+
+GSM_INSTALL_TARGETS =  \
+               $(GSM_INSTALL_LIB)/libgsm.a             \
+               $(GSM_INSTALL_INC)/gsm.h                \
+               $(GSM_INSTALL_MAN)/gsm.3                \
+               $(GSM_INSTALL_MAN)/gsm_explode.3        \
+               $(GSM_INSTALL_MAN)/gsm_option.3         \
+               $(GSM_INSTALL_MAN)/gsm_print.3
+
+TOAST_INSTALL_TARGETS =        \
+               $(TOAST_INSTALL_BIN)/toast              \
+               $(TOAST_INSTALL_BIN)/tcat               \
+               $(TOAST_INSTALL_BIN)/untoast            \
+               $(TOAST_INSTALL_MAN)/toast.1
+
+
+# Default rules
+
+.c.o:
+               $(CC) $(CFLAGS) $?
+               @-mv `$(BASENAME) $@` $@ > /dev/null 2>&1
+
+# Target rules
+
+all:           $(LIBGSM) $(TOAST) $(TCAT) $(UNTOAST)
+               @-echo $(ROOT): Done.
+
+tst:           $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/test-result
+               @-echo tst: Done.
+
+addtst:                $(ADDTST)/add $(ADDTST)/add_test.dta
+               $(ADDTST)/add < $(ADDTST)/add_test.dta > /dev/null
+               @-echo addtst: Done.
+
+misc:          $(TLS)/sweet $(TLS)/bitter $(TLS)/sour $(TLS)/ginger    \
+                       $(TST)/lin2txt $(TST)/cod2txt $(TST)/gsm2cod
+               @-echo misc: Done.
+
+install:       toastinstall gsminstall
+               @-echo install: Done.
+
+
+# The basic API: libgsm
+
+$(LIBGSM):     $(LIB) $(GSM_OBJECTS)
+               -rm $(RMFLAGS) $(LIBGSM)
+               $(AR) $(ARFLAGS) $(LIBGSM) $(GSM_OBJECTS)
+               $(RANLIB) $(LIBGSM)
+
+
+# Toast, Untoast and Tcat -- the compress-like frontends to gsm.
+
+$(TOAST):      $(BIN) $(TOAST_OBJECTS) $(LIBGSM)
+               $(LD) $(LFLAGS) -o $(TOAST) $(TOAST_OBJECTS) $(LIBGSM) $(LDLIB)
+
+$(UNTOAST):    $(BIN) $(TOAST)
+               -rm $(RMFLAGS) $(UNTOAST)
+               $(LN) $(TOAST) $(UNTOAST)
+
+$(TCAT):       $(BIN) $(TOAST)
+               -rm $(RMFLAGS) $(TCAT)
+               $(LN) $(TOAST) $(TCAT)
+
+
+# The local bin and lib directories
+
+$(BIN):
+               if [ ! -d $(BIN) ] ; then mkdir $(BIN) ; fi
+
+$(LIB):
+               if [ ! -d $(LIB) ] ; then mkdir $(LIB) ; fi
+
+
+# Installation
+
+gsminstall:
+               -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then      \
+                       make $(GSM_INSTALL_TARGETS) ;   \
+               fi
+
+toastinstall:
+               -if [ x"$(TOAST_INSTALL_ROOT)" != x ]; then     \
+                       make $(TOAST_INSTALL_TARGETS);  \
+               fi
+
+gsmuninstall:
+               -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then      \
+                       rm $(RMFLAGS) $(GSM_INSTALL_TARGETS) ;  \
+               fi
+
+toastuninstall:
+               -if [ x"$(TOAST_INSTALL_ROOT)" != x ] ; then    \
+                       rm $(RMFLAGS) $(TOAST_INSTALL_TARGETS); \
+               fi
+
+$(TOAST_INSTALL_BIN)/toast:    $(TOAST)
+               -rm $@
+               cp $(TOAST) $@
+               chmod 755 $@
+
+$(TOAST_INSTALL_BIN)/untoast:  $(TOAST_INSTALL_BIN)/toast
+               -rm $@
+               ln $? $@
+
+$(TOAST_INSTALL_BIN)/tcat:     $(TOAST_INSTALL_BIN)/toast
+               -rm $@
+               ln $? $@
+
+$(TOAST_INSTALL_MAN)/toast.1:  $(MAN)/toast.1
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm.3:      $(MAN)/gsm.3
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_option.3:       $(MAN)/gsm_option.3
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_explode.3:      $(MAN)/gsm_explode.3
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_print.3:        $(MAN)/gsm_print.3
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_INC)/gsm.h:      $(INC)/gsm.h
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+$(GSM_INSTALL_LIB)/libgsm.a:   $(LIBGSM)
+               -rm $@
+               cp $? $@
+               chmod 444 $@
+
+
+# Distribution
+
+dist:          gsm-1.0.tar.Z
+               @echo dist: Done.
+
+gsm-1.0.tar.Z: $(STUFF) $(SOURCES) $(HEADERS) $(MANUALS)
+               (       cd $(ROOT)/..;                          \
+                       tar cvf - `cat $(ROOT)/gsm-1.0/MANIFEST \
+                               | sed '/^#/d'`                  \
+               ) | $(COMPRESS) $(COMPRESSFLAGS) > $(ROOT)/gsm-1.0.tar.Z
+
+# Clean
+
+uninstall:     toastuninstall gsmuninstall
+               @-echo uninstall: Done.
+
+semi-clean:
+               -rm $(RMFLAGS)  */*.o                   \
+                       $(TST)/lin2cod $(TST)/lin2txt   \
+                       $(TST)/cod2lin $(TST)/cod2txt   \
+                       $(TST)/gsm2cod                  \
+                       $(TST)/*.*.*
+               -$(FIND) . \( -name core -o -name foo \) \
+                       -print | xargs rm $(RMFLAGS)
+
+clean: semi-clean
+               -rm $(RMFLAGS) $(LIBGSM) $(ADDTST)/add          \
+                       $(TOAST) $(TCAT) $(UNTOAST)     \
+                       $(ROOT)/gsm-1.0.tar.Z
+
+
+# Two tools that helped me generate gsm_encode.c and gsm_decode.c,
+# but aren't generally needed to port this.
+
+$(TLS)/sweet:  $(TLS)/sweet.o $(TLS)/taste.o
+               $(LD) $(LFLAGS) -o $(TLS)/sweet \
+                       $(TLS)/sweet.o $(TLS)/taste.o $(LDLIB)
+
+$(TLS)/bitter: $(TLS)/bitter.o $(TLS)/taste.o
+               $(LD) $(LFLAGS) -o $(TLS)/bitter \
+                       $(TLS)/bitter.o $(TLS)/taste.o $(LDLIB)
+
+# A version of the same family that Jeff Chilton used to implement
+# the WAV #49 GSM format.
+
+$(TLS)/ginger: $(TLS)/ginger.o $(TLS)/taste.o
+               $(LD) $(LFLAGS) -o $(TLS)/ginger \
+                       $(TLS)/ginger.o $(TLS)/taste.o $(LDLIB)
+
+$(TLS)/sour:   $(TLS)/sour.o $(TLS)/taste.o
+               $(LD) $(LFLAGS) -o $(TLS)/sour \
+                       $(TLS)/sour.o $(TLS)/taste.o $(LDLIB)
+
+# Run $(ADDTST)/add < $(ADDTST)/add_test.dta to make sure the
+# basic arithmetic functions work as intended.
+
+$(ADDTST)/add: $(ADDTST)/add_test.o
+               $(LD) $(LFLAGS) -o $(ADDTST)/add $(ADDTST)/add_test.o $(LDLIB)
+
+
+# Various conversion programs between linear, text, .gsm and the code
+# format used by the tests we ran (.cod).  We paid for the test data,
+# so I guess we can't just provide them with this package.  Still,
+# if you happen to have them lying around, here's the code.
+# 
+# You can use gsm2cod | cod2txt independently to look at what's
+# coded inside the compressed frames, although this shouldn't be
+# hard to roll on your own using the gsm_print() function from
+# the API.
+
+
+$(TST)/test-result:    $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/run
+                       ( cd $(TST); ./run ) 
+
+$(TST)/lin2txt:                $(TST)/lin2txt.o $(LIBGSM)
+                       $(LD) $(LFLAGS) -o $(TST)/lin2txt \
+                               $(TST)/lin2txt.o $(LIBGSM) $(LDLIB)
+
+$(TST)/lin2cod:                $(TST)/lin2cod.o $(LIBGSM)
+                       $(LD) $(LFLAGS) -o $(TST)/lin2cod \
+                               $(TST)/lin2cod.o $(LIBGSM) $(LDLIB)
+
+$(TST)/gsm2cod:                $(TST)/gsm2cod.o $(LIBGSM)
+                       $(LD) $(LFLAGS) -o $(TST)/gsm2cod \
+                               $(TST)/gsm2cod.o $(LIBGSM) $(LDLIB)
+
+$(TST)/cod2txt:                $(TST)/cod2txt.o $(LIBGSM)
+                       $(LD) $(LFLAGS) -o $(TST)/cod2txt \
+                               $(TST)/cod2txt.o $(LIBGSM) $(LDLIB)
+
+$(TST)/cod2lin:                $(TST)/cod2lin.o $(LIBGSM)
+                       $(LD) $(LFLAGS) -o $(TST)/cod2lin \
+                               $(TST)/cod2lin.o $(LIBGSM) $(LDLIB)