/**************************************************
 *
 * 8SVX.c
 *
 *   IFF-8SVX file manipulation code
 *
 *    Copyright(c), 1990, 1991 Lloyd B. Eldred
 *                           & Fredrick R Homan
 **************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "fi_IFF.h"

extern UBYTE VERBOSE, TERSE,COMMENT;  /* Yuck, global variables... */

void IFF_8SVX(picfile,size)
FILE *picfile;
LONG size;

{
   union chunk_ID{
       char text_ID[4];
       LONG long_ID;} chunk;
   LONG ch_size,offset;

   if(!TERSE) printf("    8SVX (8-Bit Sample Voice) chunk \n");
   if(TERSE) printf("8SVX  ");
   offset=0;
   
   while(offset <= size-8){
      IFF_ID(picfile,chunk.text_ID);
      ch_size = IFF_size(picfile);
      offset += (8+ch_size+is_odd(ch_size));
      
      switch(chunk.long_ID){
         case ID_VHDR :
            IFF_VHDR(picfile,ch_size);
            break;
         case ID_NAME :
            IFF_NAME(picfile,ch_size);
            break;
         case ID_copyright :
            IFF_copyright(picfile,ch_size);
            break;
         case ID_AUTH :
            IFF_AUTH(picfile,ch_size);
            break;
         case ID_ANNO :
            IFF_ANNO(picfile,ch_size);
            break;
         case ID_BODY :
            IFF_BODY(picfile,ch_size);
            break;
         case ID_ATAK :
            IFF_ATAK(picfile,ch_size);
            break;
         case ID_RLSE :
            IFF_RLSE(picfile,ch_size);
            break;
         case ID_CHAN :
            IFF_CHAN(picfile,ch_size);
            break;
         case ID_PAN :
            IFF_PAN(picfile,ch_size);
            break;
         default:
            if(VERBOSE) printf(
               "   Inappropriate sub chunk for 8SVX: %4s\n",chunk.text_ID);
            IFF_GotoEnd(picfile,ch_size);
         } /* end of switch */
      }/* end of while */
   
   IFF_GotoEnd(picfile,size-offset);
   if(VERBOSE) printf("    End of 8SVX.\n");
   
} /* end of IFF_8SVX */

/************************************************************/
/* Useful chunks for 8SVX Sampled sounds                    */
/************************************************************/

void IFF_VHDR(picfile,size)
FILE *picfile;
LONG size;

{
   unsigned char c1,c2,c3,c4;
   ULONG oneShotHiSamples,repeatHiSamples,samplesPerHiCycle;
   UWORD samplesPerSec;
   UBYTE ctOctave,sCompression;
   LONG volume;
   
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   
   oneShotHiSamples = (ULONG)makelong(c1,c2,c3,c4);

   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   
   repeatHiSamples = (ULONG)makelong(c1,c2,c3,c4);
      
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   
   samplesPerHiCycle = (ULONG)makelong(c1,c2,c3,c4);

   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   
   samplesPerSec = (UWORD)c2 + (UWORD)(c1<<8);			

   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   
   ctOctave = (UBYTE)c1;
   sCompression = (UBYTE)c2;
   
   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
   fi_getc(picfile,&c3);
   fi_getc(picfile,&c4);
   
	volume = makelong(c1,c2,c3,c4);
	volume = (volume * 100) / 65536;
	
   if(VERBOSE){		
         printf("      VHDR (Voice 8 Header) chunk.\n");
         printf("        One Shot Hi-samples : %d\n",oneShotHiSamples);
         printf("        Repeat   Hi-samples : %d\n",repeatHiSamples);
         printf("        Samples per Hi-cycle: %d\n",samplesPerHiCycle);
         printf("        Samples per second  : %d\n",samplesPerSec);
         printf("        # of octaves        : %d\n",ctOctave);
         if(sCompression == 0)
            printf("        No compression used\n");
         else if(sCompression == 1)
            printf("        Fibonacci-delta compression used\n");
         else
            printf("        Unknown compression technique used\n");
			printf("        Volume (percent)    : %d\n",volume);
      }
   else if(TERSE) printf(" %d   %d\n",samplesPerSec,volume);
   else if(!COMMENT){  /* i.e. Normal mode */
         printf("        Samples per second  : %d\n",samplesPerSec);
         printf("        # of octaves        : %d\n",ctOctave);
			printf("        Volume (percent)    : %d\n",volume);
   }
   IFF_GotoEnd(picfile,size-20);
   
} /* end of IFF_VHDR */

void IFF_ATAK(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      ATAK (Envelope Attack Data) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_ATAK */

void IFF_RLSE(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      RLSE (Envelope Release Data) chunk.\n");

   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_RLSE */

void IFF_CHAN(picfile,size)
FILE *picfile;
LONG size;

{
   LONG sampletype;
   
   if(VERBOSE) printf("      CHAN (Stereo Channel) chunk.\n");
   
/* use our chunk size reader to read a LONG */

   sampletype = IFF_size(picfile);
   
   switch(sampletype){
      case 4L:
         if(VERBOSE) printf("         Right channel sound.\n");
         break;
      case 2L:
         if(VERBOSE) printf("         Left channel sound.\n");
         break;
      case 6L:
         if(VERBOSE) printf("         Stereo sound.\n");
         break;
      default:
         if(VERBOSE) printf(
            "         Channel information not understood\n");   
      } /* end of switch */
            
   IFF_GotoEnd(picfile,size-4);
      
} /* end of IFF_CHAN */

void IFF_PAN(picfile,size)
FILE *picfile;
LONG size;

{
   LONG sposition;
   float lvol,rvol;
   
   if(VERBOSE) printf("      PAN (Stereo Pan) chunk.\n");
   
/* use IFF_size to read a LONG */

   sposition = IFF_size(picfile);
      
   lvol = sposition / 65536.0;
   
   rvol = 1.0 - lvol;
   
   lvol *= 100.;
   rvol *= 100.;
   
   if(VERBOSE) printf("        Left  channel volume = %g %%\n"
                        "        Right channel volume = %g %%\n",
                        lvol,rvol);
                        
   IFF_GotoEnd(picfile,size-4);
      
} /* end of IFF_PAN */
