Newer
Older
Scratch / mobius / src / drivers / sound / au.c
/*****************************************************************************
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;
}