/***************************************************************************** common routines for .au files .au sub-formats: 1=8-bit u-law 2=8-bit linear 3=16-bit linear 27=A-law (not implemented) *****************************************************************************/ #include <string.h> /* memcmp() */ #include <stdio.h> /* FILE, EOF, fread(), fgetc() */ #include "sound.h" /* soundinfo */ /* byte offsets in .au file header */ #define AU_HDR_MAGIC 0 #define AU_HDR_HDRLEN 4 #define AU_HDR_DATALEN 8 #define AU_HDR_FMT 12 #define AU_HDR_RATE 16 #define AU_HDR_CHAN 20 #define AU_HDR_SIZE 24 /***************************************************************************** *****************************************************************************/ int au_validate(sound_info_t *info, unsigned sub_type) { unsigned char buffer[AU_HDR_SIZE]; unsigned long hdr_len; fseek(info->infile, 0, SEEK_SET); if(fread(buffer, 1, AU_HDR_SIZE, info->infile) != AU_HDR_SIZE) return -1; if(memcmp(buffer + AU_HDR_MAGIC, ".snd", 4)) return -1; /* get data and header lengths */ hdr_len = read_be32(buffer + AU_HDR_HDRLEN); info->bytes_left = read_be32(buffer + AU_HDR_DATALEN); /* coding */ if(read_be32(buffer + AU_HDR_FMT) != sub_type) return -1; info->rate = read_be32(buffer + AU_HDR_RATE); info->channels = read_be32(buffer + AU_HDR_CHAN); /* skip rest of header */ for(hdr_len -= AU_HDR_SIZE; hdr_len != 0; hdr_len--) { if(fgetc(info->infile) == EOF) return -1; } return 0; }