www.pudn.com > Voice_ADPCM.rar > SGICAUDI.C
/* ** sgicaudio - Simple AIFF file compressor. ** ** Needs libaf, which is in the Digital Media developers option. */ #include#include #include #include "adpcm.h" #define NFRAMES 8000 struct adpcm_state astate; short ibuf[NFRAMES]; char obuf[NFRAMES/2]; main(argc, argv) int argc; char **argv; { AFfilehandle af; FILE *of; long fmt, width; long count; if ( argc < 2 || argc > 3 ) { fprintf(stderr, "Usage: %s aifffile [adpcmfile]\n", argv[0]); exit(1); } /* ** Open input file and check format */ if ( (af = AFopenfile(argv[1], "r", NULL)) == 0 ) { perror(argv[1]); exit(1); } AFgetsampfmt(af, AF_DEFAULT_TRACK, &fmt, &width); if ( AFgetchannels(af, AF_DEFAULT_TRACK) != 1 || fmt != AF_SAMPFMT_TWOSCOMP || width != 16 ) { fprintf(stderr, "%s: %s: only 16bit mono integer files supported\n", argv[0], argv[1]); exit(1); } if ( AFgetrate(af, AF_DEFAULT_TRACK) != 8000.0 ) fprintf(stderr, "%s: %s: WARNING: not 8Khz\n", argv[0], argv[1]); /* ** Open output file */ if ( argc == 3 ) { if ( (of=fopen(argv[2], "w")) == 0 ) { perror(argv[2]); exit(1); } } else { of = stdout; } /* ** Copy loop */ while (1) { count = AFreadframes(af, AF_DEFAULT_TRACK, ibuf, NFRAMES); if ( count <= 0 ) break; if ( count & 1 ) { ibuf[count] = ibuf[count-1]; count++; } adpcm_coder(ibuf, obuf, count, &astate); fwrite(obuf, 1, (count+1)/2, of); } fclose(of); AFclosefile(af); exit(0); }