/* * July 5, 1991 * Copyright 1991 Lance Norskog And Sundry Contributors * This source code is freely redistributable and may be used for * any purpose. This copyright notice must be maintained. * Lance Norskog And Sundry Contributors are not responsible for * the consequences of using this software. */ /* * Sound Tools sources header file. */ #include /* * Handler structure for each format. */ typedef struct format { char **names; /* file type names */ int (*startread)(); int (*read)(); int (*stopread)(); int (*startwrite)(); int (*write)(); int (*stopwrite)(); } format_t; extern format_t formats[]; /* Signal parameters */ struct signalinfo { int rate; /* sampling rate */ int size; /* word length of data */ int style; /* format of sample numbers */ int channels; /* number of sound channels */ }; /* Pipe parameters */ struct pipeinfo { FILE *pout; /* Output file */ FILE *pin; /* Input file */ }; /* * Format information for input and output files. */ #define PRIVSIZE 50 struct soundstream { struct signalinfo info; /* signal specifications */ char swap; /* do byte- or word-swap */ char seekable; /* can seek on this file */ char *filename; /* file name */ char *filetype; /* type of file */ FILE *fp; /* File stream pointer */ format_t *h; /* format struct for this file */ char priv[PRIVSIZE]; /* format's private data area */ }; extern struct soundstream informat, outformat; typedef struct soundstream *ft_t; /* Size field */ #define BYTE 1 #define WORD 2 #define LONG 4 #define FLOAT 5 #define DOUBLE 6 #define IEEE 7 /* IEEE 80-bit floats. Is it necessary? */ /* Style field */ #define UNSIGNED 1 /* unsigned linear: Sound Blaster */ #define SIGN2 2 /* signed linear 2's comp: Mac */ #define ULAW 3 /* U-law signed logs: US telephony, SPARC */ #define ALAW 4 /* A-law signed logs: non-US telephony */ extern char *sizes[], *styles[]; /* * Handler structure for each effect. */ typedef struct { char *name; /* effect name */ int flags; /* this and that */ int (*getopts)(); /* process arguments */ int (*start)(); /* start off effect */ int (*flow)(); /* do a buffer */ int (*drain)(); /* drain out at end */ int (*stop)(); /* finish up effect */ } effect_t; extern effect_t effects[]; #define EFF_CHAN 1 /* Effect can mix channels up/down */ #define EFF_RATE 2 /* Effect can alter data rate */ #define EFF_MCHAN 4 /* Effect can handle multi-channel */ struct effect { char *name; /* effect name */ struct signalinfo ininfo; /* input signal specifications */ struct signalinfo outinfo; /* output signal specifications */ effect_t *h; /* effects driver */ char priv[PRIVSIZE]; /* private area for effect */ }; typedef struct effect *eff_t; #ifdef __STDC__ #define P1(x) x #define P2(x,y) x, y #define P3(x,y,z) x, y, z #define P4(x,y,z,w) x, y, z, w #else #define P1(x) #define P2(x,y) #define P3(x,y,z) #define P4(x,y,z,w) #endif /* Utilities to read and write shorts and longs little-endian and big-endian */ unsigned short rlshort(P1(ft_t ft)); /* short little-end */ unsigned short rbshort(P1(ft_t ft)); /* short big-end */ unsigned short wlshort(P2(ft_t ft, unsigned int us)); /* short little-end */ unsigned short wbshort(P2(ft_t ft, unsigned int us)); /* short big-end */ unsigned long rllong(P1(ft_t ft)); /* long little-end */ unsigned long rblong(P1(ft_t ft)); /* long big-end */ unsigned long wllong(P2(ft_t ft, unsigned long ul)); /* long little-end */ unsigned long wblong(P2(ft_t ft, unsigned long ul)); /* long big-end */ /* Read and write words and longs in "machine format". Swap if indicated. */ unsigned short rshort(P1(ft_t ft)); unsigned short wshort(P2(ft_t ft, unsigned int us)); unsigned long rlong(P1(ft_t ft)); unsigned long wlong(P2(ft_t ft, unsigned long ul)); /* Utilities to byte-swap values */ unsigned short swapw(P1(unsigned int us)); /* Swap short */ unsigned long swapl(P1(unsigned long ul)); /* Swap long */ #ifdef SYSV #define bcopy(from, to, len) memcpy(to, from, len) #define index strchr #define rindex strrchr #endif #ifdef AMIGA # ifdef AMIGA_MC68881 # include /* get FPU header */ # endif AMIGA_MC68881 # ifndef va_dcl # define va_dcl int va_alist; # endif ~va_dcl # include /* for the memmove stuff next line */ # define bcopy(from, to, len) memmove(to, from, len) # define index strchr # define rindex strrchr #endif AMIGA typedef unsigned int u_i; typedef unsigned long u_l; typedef unsigned short u_s; #define MAXRATE 50*1024 /* maximum sample rate */ #ifdef unix /* Some wacky processors don't have arithmetic down shift, so do divs */ #define LEFT(datum, bits) (datum << bits) /* Most compilers will turn this into a shift if they can, don't worry */ #define RIGHT(datum, bits) (datum / (1L << bits)) #else /* x86 & 68k PC's have arith shift ops and dumb compilers */ #define LEFT(datum, bits) (datum << bits) #define RIGHT(datum, bits) (datum >> bits) #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifdef unix #define READBINARY "r" #define WRITEBINARY "w" #else #define READBINARY "rb" #define WRITEBINARY "wb" #endif