/*
	These routines provide limited IFF support for FutureSound.
	They will read and write single octave one-shot sounds.

	Additional octave and repeat support may be added later.

	Based on the "8SVX" IFF 8-Bit Sampled Voice document dated
	Febuary 7, 1985.

	Routines:

		ULONG SizeIFF(Filename)
		char *Filename;		File to open 

			returns size of sample or 0 if error.


		UWORD ReadIFF(Filename,Buffer)
		char *Filename;		File to read
		BYTE *Buffer;       Buffer to read sample into

			returns the record rate;

	Dan Lovy    May 1986

	Modified for use with FutureSound auxiliary routines - June 1986
		by Ralph Hebb 
*/

/* for comments see IFF spec,  I'm too tired to type them in now */

#include "stdio.h"
#include "exec/types.h"
#include "SoundErrors.h"

typedef LONG Fixed;

#define Unity 0x10000L
#define sCmpNone		0
#define sCmpFibDelta	1

typedef struct {
	ULONG	oneShotHiSamples,	/* # samples in the high octave 1-shot part */
			repeatHiSamples,	/* # samples in the high octave repeat part */
			samplesPerHiCycle;	/* # samples/cycle in high octave, else 0   */
	UWORD	samplesPerSec;		/* data sampling rate */
	UBYTE	ctOctave,			/* number of octaves of waveforms */
			sCompression;		/* data compression technique used */
	Fixed	volume;				/* playback volume from 0 to Unity */

	} Voice8Header;

ULONG SizeIFF(Filename)
char *Filename;		/* File to open */
/* returns size of sample or 0 if error. */
{
	FILE *fp;
	char *ckname = "    ";
	LONG dummy;
	Voice8Header Header;

	if (fp = fopen(Filename,"r"))
	{
		fread(ckname,4,1,fp);
		if (strcmp(ckname,"FORM")==0)
		{
			fread(ckname,4,1,fp);	/* not a mistake! */
			fread(ckname,4,1,fp);
			if (strcmp(ckname,"8SVX")==0)
			{
				get_to("VHDR",fp);
				fread(&dummy,sizeof(LONG),1,fp);
				fread(&Header,sizeof(Header),1,fp);
				fclose(fp);
				return(Header.oneShotHiSamples+
					   Header.repeatHiSamples);
			}
			else
			{
				fclose(fp);
				return(0);		
			}
		}
		else
		{
			fclose(fp);
			return(0);		
		}
	}
	else
	{
		return(0);
	}
}

UWORD ReadIFF(Filename,IFFBuf0)
char *Filename;		/* File to read */
BYTE *IFFBuf0;			/* Buffer to read sample into */
/* returns the record rate */
{
	FILE *fp;
	char *ckname = "    ";
	LONG dummy;
	Voice8Header Header;

	if (fp = fopen(Filename,"r"))
	{
		fread(ckname,4,1,fp);
		if (strcmp(ckname,"FORM")==0)
		{
			fread(ckname,4,1,fp);	/* not a mistake! */
			fread(ckname,4,1,fp);
			if (strcmp(ckname,"8SVX")==0)
			{
				get_to("VHDR",fp);
				fread(&dummy,sizeof(LONG),1,fp);
				fread(&Header,sizeof(Header),1,fp);
				get_to("BODY",fp);
				fread(&dummy,sizeof(LONG),1,fp);							
				fread(IFFBuf0,Header.oneShotHiSamples+
					  Header.repeatHiSamples,1,fp);
				fclose(fp);
				return(Header.samplesPerSec);
			}
			else
			{
				fclose(fp);
				return(Error(IFF_ERROR,Filename));		
			}
		}
		else
		{
			fclose(fp);
			return(Error(IFF_ERROR,Filename));		
		}
	}
	else
	{
		return(Error(OPEN_ERROR,Filename));
	}
} 

/* this routine walks through the iff file looking for chunks */
get_to(ckname,fp)
char *ckname;
FILE *fp;
{
	char *ckcheck = "    ";
	int  skip,i,dummy;

	while(!feof(fp))
	{
		fread(ckcheck,4,1,fp);
		if (strcmp(ckname,ckcheck)==0)
		{
			return(1);
		}
		fread(&skip,sizeof(LONG),1,fp);
		for (i=0; i<skip; i++)
		{
			fread(&dummy,1,1,fp);
		}
	}
}
