home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Sound
/
SoX
/
Source
/
sfircam.h
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-18
|
7KB
|
219 lines
/* SFHEADER.H */
/* definitions and structures needed for manipulating soundfiles.
*/
#define SIZEOF_HEADER 1024
#define SF_BUFSIZE (16*1024) /* used only in play */
#define SF_MAXCHAN 4
#define MAXCOMM 512
#define MINCOMM 256
#define SF_MAGIC1 0144
#define SF_MAGIC2 0243
/* Definition of SF_MACHINE and SF_MAGIC
*
* Note that SF_MAGIC always has SF_MAGIC1 as its first byte, SF_MAGIC2 as its
* second, SF_MACHINE as its third, and zero as its fourth. Separate define's
* are needed because byte order is different on different machines.
*/
#define SF_VAX 1
#define SF_SUN 2
#define SF_MIPS 3
#define SF_NEXT 4
#ifdef vax
#define SF_MACHINE SF_VAX
#define SF_MAGIC ((LONG)(SF_MAGIC1 | SF_MAGIC2 << 8 | SF_MACHINE << 16))
#endif
#ifdef sun
#define SF_MACHINE SF_SUN
#define SF_MAGIC ((LONG)(SF_MAGIC1 << 24 | SF_MAGIC2 << 16 | SF_MACHINE << 8))
#endif
#ifdef mips
#define SF_MACHINE SF_MIPS
#define SF_MAGIC ((LONG)(SF_MAGIC1 | SF_MAGIC2 << 8 | SF_MACHINE << 16))
#endif
#ifdef NeXT
#define SF_MACHINE SF_NEXT
#define SF_MAGIC ((LONG)(SF_MAGIC1 << 24 | SF_MAGIC2 << 16 | SF_MACHINE << 8))
#endif
/* Packing modes, as stored in the SFHEADER.sf_packmode field
*
* For each packing mode, the lower-order short is the number of bytes per
* sample, and for backward compatibility, SF_SHORT and SF_FLOAT have
* high-order short = 0 so overall they're the bytes per sample, but that's not
* true for all SF_'s. Thus while the "sfclass" macro still returns a unique
* ID for each packing mode, the new "sfsamplesize" macro should be used to get
* the bytes per sample.
*
* Note that SF_X == SFMT_X in most, but not all, cases, because MIT changed
* SFMT_FLOAT and we kept SF_FLOAT for compatibility with existing sound files.
*
* Possible values of sf_packmode:
*/
#define SF_CHAR ((LONG) sizeof(char))
#define SF_ALAW ((LONG) sizeof(char) | 0x10000)
#define SF_ULAW ((LONG) sizeof(char) | 0x20000)
#define SF_SHORT ((LONG) sizeof(short))
#define SF_LONG ((LONG) sizeof(LONG) | 0x40000)
#define SF_FLOAT ((LONG) sizeof(float))
/* For marking data after fixed section of soundfile header -- see man (3carl)
* sfcodes and defintions of SFCODE and related structures, below.
*/
#define SF_END 0 /* Meaning no more information */
#define SF_MAXAMP 1 /* Meaning maxamp follows */
#define SF_COMMENT 2 /* code for "comment line" */
#define SF_PVDATA 3
#define SF_AUDIOENCOD 4
#define SF_CODMAX 4
/*
* DEFINITION OF SFHEADER FORMAT
*
* The first four bytes are the magic information for the sound file. They
* can be accessed, via a union, either as a structure of four unsigned bytes
* sf_magic1, sf_magic2, sf_machine, sf_param, or as the single long sf_magic.
* sf_magic is for backward compatibility; it should be SF_MAGIC as defined
* above.
*/
typedef union sfheader {
struct sfinfo {
union magic_union {
struct {
unsigned char sf_magic1; /* byte 1 of magic */
unsigned char sf_magic2; /* 2 */
unsigned char sf_machine; /* 3 */
unsigned char sf_param; /* 4 */
} _magic_bytes;
LONG sf_magic; /* magic as a 4-byte long */
} magic_union;
float sf_srate;
LONG sf_chans;
LONG sf_packmode;
char sf_codes;
} sfinfo;
char filler[SIZEOF_HEADER];
} SFHEADER;
/*
* Definition of SFCODE and related data structs
*
* Two routines in libbicsf/sfcodes.c, getsfcode() and putsfcode()
* are used to insert additionnal information into a header
* or to retreive such information. See man sfcodes.
*
* 10/90 pw
* These routines are now part of libcarl/sfcodes.c
*/
typedef struct sfcode {
short code;
short bsize;
} SFCODE;
typedef struct Sfmaxamp {
float value[SF_MAXCHAN];
LONG samploc[SF_MAXCHAN];
LONG timetag;
} SFMAXAMP;
typedef struct sfcomment {
char comment[MAXCOMM];
} SFCOMMENT;
typedef struct { /* this code written by pvanal */
short frameSize;
short frameIncr;
} SFPVDATA;
typedef struct { /* ditto */
short encoding;
short grouping;
} SFAUDIOENCOD;
/*
* DEFINITION OF MACROS TO GET HEADER INFO
* x is a pointer to SFHEADER
*
* For backward compatibility in MIT Csound code, sfmagic(x) still provides
* access to the first long of SFHEADER x. It can be compared to SF_MAGIC,
* which is defined machine-dependently (above) to always be the right four
* bytes in the right order.
*
* sfclass(x) returns one of SF_SHORT, SF_FLOAT etc. defined above, while
* sfsamplesize(x) returns just the bytes per object, the lower-order short of
* sf_packmode.
*/
#define sfmagic(x) ((x)->sfinfo.magic_union.sf_magic)
#define sfmagic1(x) ((x)->sfinfo.magic_union._magic_bytes.sf_magic1)
#define sfmagic2(x) ((x)->sfinfo.magic_union._magic_bytes.sf_magic2)
#define sfmachine(x) ((x)->sfinfo.magic_union._magic_bytes.sf_machine)
#define sfparam(x) ((x)->sfinfo.magic_union._magic_bytes.sf_param)
#define sfsrate(x) ((x)->sfinfo.sf_srate)
#define sfchans(x) ((x)->sfinfo.sf_chans)
#define sfclass(x) ((x)->sfinfo.sf_packmode)
#define sfsamplesize(x) ((size_t) ((x)->sfinfo.sf_packmode & 0xFFFF))
#define sfbsize(x) ((x)->st_size - sizeof(SFHEADER))
#define sfcodes(x) ((x)->sfinfo.sf_codes)
/*
* Macros for testing soundfiles
*/
/* True if soundfile and good arch */
#define ismagic(x) ((sfmagic1(x) == SF_MAGIC1) && \
(sfmagic2(x) == SF_MAGIC2) && \
(sfmachine(x) == SF_MACHINE))
/* True if soundfile */
#define isforeignmagic(x) ((sfmagic1(x) == SF_MAGIC1) && \
(sfmagic2(x) == SF_MAGIC2))
/* True if soundfile */
#define issoundfile(x) ((sfmagic1(x) == SF_MAGIC1) && \
(sfmagic2(x) == SF_MAGIC2))
/* True if soundfile and foreign arch */
#define isforeignsoundfile(x) ((sfmagic1(x) == SF_MAGIC1) && \
(sfmagic2(x) == SF_MAGIC2) && \
(sfmachine(x) != SF_MACHINE))
/* True if foreign arch */
#define isforeign(x) (sfmachine(x) != SF_MACHINE)
/*
* The macros for opening soundfiles have been rewritten as C routines.
* In order to preserve compatibility, we supply the following new macros
*/
#define readopensf(name,fd,sfh,sfst,prog,result) \
result = (fd = openrosf(name, &sfh, &sfst, prog)) < 0 ? fd : 0;
#define freadopensf(name,fp,sfh,sfst,prog,result) \
result = fopenrosf(name, &fp, &sfh, &sfst, prog);
#define wropensf(name,fd,sfh,prog,result) \
result = (fd = openwosf(name, &sfh, prog)) < 0 ? fd : 0;
#define rdwropensf(name,fd,sfh,sfst,prog,result) \
result = (fd = openrwsf(name, &sfh, &sfst, prog)) < 0 ? fd : 0;
/*
* Definition of macro to get MAXAMP and COMMENT info
*
* sfm is ptr to SFMAXAMP
* sfst is the address of a stat struct
*/
#define sfmaxamp(mptr,chan) (mptr)->value[chan]
#define sfmaxamploc(mptr,chan) (mptr)->samploc[chan]
#define sfmaxamptime(x) (x)->timetag
#define ismaxampgood(x,s) (sfmaxamptime(x) >= (s)->st_mtime)
#define sfcomm(x,n) (x)->comment[n]