Add GSM full rate codec to LCR's source repository
[lcr.git] / libgsmfr / src / toast_audio.c
diff --git a/libgsmfr/src/toast_audio.c b/libgsmfr/src/toast_audio.c
new file mode 100644 (file)
index 0000000..f090f23
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_audio.c,v 1.6 1995/03/07 21:21:24 jutta Exp $ */
+
+#include       "toast.h"
+
+/*  toast_audio -- functions to manipulate SunOS audio files.
+ *
+ *  This is reverse engineered from our present soundfiles
+ *  and in no way portable, durable or aesthetically pleasing.
+ */
+
+extern FILE    * in,     * out;
+extern char    * inname;
+extern char    * progname;
+
+extern int     (*output) P((gsm_signal *)),
+               (*input ) P((gsm_signal *));
+
+extern int     alaw_input   P((gsm_signal *)),
+               ulaw_input   P((gsm_signal *)),
+               linear_input P((gsm_signal *));
+
+extern int     ulaw_output P((gsm_signal *));
+
+static int put_u32 P2((f, u), FILE * f, unsigned long u)
+{
+       /*  Write a 32-bit unsigned value msb first. 
+        */
+       if (  putc( (char)((u>>24) & 0x0FF), f) == EOF
+          || putc( (char)((u>>16) & 0x0FF), f) == EOF
+          || putc( (char)((u>> 8) & 0x0FF), f) == EOF
+          || putc( (char)( u      & 0x0FF), f) == EOF) return -1;
+
+       return 0;
+}
+
+static int get_u32 P2((f, up), FILE * f, unsigned long * up)
+{
+       /*  Read a 32-bit unsigned value msb first.
+        */
+       int             i;
+       unsigned long   u;
+
+       if (                                  (i = getc(f)) == EOF
+          || ((u =        (unsigned char)i), (i = getc(f)) == EOF)
+          || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
+          || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
+       *up =       (u<<8)|(unsigned char)i;
+       return 0;
+}
+
+int audio_init_input P0()
+{
+       unsigned long   len, enc;       /* unsigned 32 bits     */
+
+       if (  fgetc(in) != '.' 
+          || fgetc(in) != 's'
+          || fgetc(in) != 'n'
+          || fgetc(in) != 'd'
+          || get_u32( in, &len )
+          || get_u32( in, &enc )       /* skip this */
+          || get_u32( in, &enc )) {
+               fprintf(stderr, 
+       "%s: bad (missing?) header in Sun audio file \"%s\";\n\
+       Try one of -u, -a, -l instead (%s -h for help).\n",
+                       progname, inname ? inname : "stdin", progname);
+               return -1;
+       }
+
+       switch (enc) {
+       case 1: input = ulaw_input;     break;
+       case 2: input = alaw_input;     break;
+       case 3: input = linear_input;   break;
+       default:
+               fprintf(stderr,
+"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
+                       progname, enc, inname);
+               input = ulaw_input;
+               break;
+       }
+
+       while (len > 4*4)
+               if (getc(in) == EOF) {
+                       fprintf(stderr, 
+                       "%s: EOF in header of Sun audio file \"%s\";\n\
+                       Try one of -u, -a, -l instead (%s -h for help).\n",
+                               progname, inname ? inname : "stdin", progname);
+                       return -1;
+               }
+               else len--;
+
+       return 0;
+}
+
+int audio_init_output P0()
+{
+       if (  fputs(".snd", out) == EOF
+          || put_u32(out, 32)
+          || put_u32(out, ~(unsigned long)0)
+          || put_u32(out, 1)
+          || put_u32(out, 8000)
+          || put_u32(out, 1)
+          || put_u32(out, 0)
+          || put_u32(out, 0)) return -1;
+
+       return 0;
+}
+