toast_audio.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3. * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
  4. * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5. */
  6. /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_audio.c,v 1.6 1995/03/07 21:21:24 jutta Exp $ */
  7. #include "toast.h"
  8. /* toast_audio -- functions to manipulate SunOS audio files.
  9. *
  10. * This is reverse engineered from our present soundfiles
  11. * and in no way portable, durable or aesthetically pleasing.
  12. */
  13. extern FILE * in, * out;
  14. extern char * inname;
  15. extern char * progname;
  16. extern int (*output) P((gsm_signal *)),
  17. (*input ) P((gsm_signal *));
  18. extern int alaw_input P((gsm_signal *)),
  19. ulaw_input P((gsm_signal *)),
  20. linear_input P((gsm_signal *));
  21. extern int ulaw_output P((gsm_signal *));
  22. static int put_u32 P2((f, u), FILE * f, unsigned long u)
  23. {
  24. /* Write a 32-bit unsigned value msb first.
  25. */
  26. if ( putc( (char)((u>>24) & 0x0FF), f) == EOF
  27. || putc( (char)((u>>16) & 0x0FF), f) == EOF
  28. || putc( (char)((u>> 8) & 0x0FF), f) == EOF
  29. || putc( (char)( u & 0x0FF), f) == EOF) return -1;
  30. return 0;
  31. }
  32. static int get_u32 P2((f, up), FILE * f, unsigned long * up)
  33. {
  34. /* Read a 32-bit unsigned value msb first.
  35. */
  36. int i;
  37. unsigned long u;
  38. if ( (i = getc(f)) == EOF
  39. || ((u = (unsigned char)i), (i = getc(f)) == EOF)
  40. || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
  41. || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
  42. *up = (u<<8)|(unsigned char)i;
  43. return 0;
  44. }
  45. int audio_init_input P0()
  46. {
  47. unsigned long len, enc; /* unsigned 32 bits */
  48. if ( fgetc(in) != '.'
  49. || fgetc(in) != 's'
  50. || fgetc(in) != 'n'
  51. || fgetc(in) != 'd'
  52. || get_u32( in, &len )
  53. || get_u32( in, &enc ) /* skip this */
  54. || get_u32( in, &enc )) {
  55. fprintf(stderr,
  56. "%s: bad (missing?) header in Sun audio file \"%s\";\n\
  57. Try one of -u, -a, -l instead (%s -h for help).\n",
  58. progname, inname ? inname : "stdin", progname);
  59. return -1;
  60. }
  61. switch (enc) {
  62. case 1: input = ulaw_input; break;
  63. case 2: input = alaw_input; break;
  64. case 3: input = linear_input; break;
  65. default:
  66. fprintf(stderr,
  67. "%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
  68. progname, enc, inname);
  69. input = ulaw_input;
  70. break;
  71. }
  72. while (len > 4*4)
  73. if (getc(in) == EOF) {
  74. fprintf(stderr,
  75. "%s: EOF in header of Sun audio file \"%s\";\n\
  76. Try one of -u, -a, -l instead (%s -h for help).\n",
  77. progname, inname ? inname : "stdin", progname);
  78. return -1;
  79. }
  80. else len--;
  81. return 0;
  82. }
  83. int audio_init_output P0()
  84. {
  85. if ( fputs(".snd", out) == EOF
  86. || put_u32(out, 32)
  87. || put_u32(out, ~(unsigned long)0)
  88. || put_u32(out, 1)
  89. || put_u32(out, 8000)
  90. || put_u32(out, 1)
  91. || put_u32(out, 0)
  92. || put_u32(out, 0)) return -1;
  93. return 0;
  94. }