home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3593 / sfheader.h < prev    next >
C/C++ Source or Header  |  1991-07-07  |  5KB  |  194 lines

  1. #ifdef NeXT
  2. /* put NeXTsoundfile header in front, copy needed information to it, and just use offset to read/write header */
  3. #include <sound/soundstruct.h>
  4. #include <sys/stat.h>
  5. # define SIZEOF_NeXT_HEADER 28
  6. # define SIZEOF_BSD_HEADER 1024
  7. #else
  8. # define SIZEOF_BSD_HEADER 1024
  9. #endif NeXT
  10. # define SF_MAGIC 107364
  11. # define SF_LINK 107414
  12. # define SF_SHORT sizeof(short)
  13. # define SF_FLOAT sizeof(float)
  14. # define SF_BUFSIZE    (16*1024)
  15. # define SF_MAXCHAN    4
  16. # define MAXCOMM 512
  17. # define MINCOMM 256
  18.  
  19. /* Codes for sfcode */
  20. # define SF_END 0
  21. # define SF_MAXAMP 1
  22. # define SF_COMMENT 2
  23. # define SF_LINKCODE 3
  24.  
  25. typedef struct sfcode {
  26.     short    code;
  27.     short    bsize;
  28. } SFCODE;
  29.  
  30. typedef struct sfmaxamp {
  31.     float    value[SF_MAXCHAN];
  32.     long    samploc[SF_MAXCHAN];
  33.     long    timetag;
  34. } SFMAXAMP;
  35.  
  36. typedef struct sfcomment {
  37.     char     comment[MAXCOMM];
  38. } SFCOMMENT;
  39.  
  40. typedef struct sflink {
  41.     char     reality[50];
  42.     int     startsamp;
  43.     int    endsamp;
  44. } SFLINK;
  45.  
  46. struct sfinfo {    
  47. #ifdef NeXT
  48.     SNDSoundStruct NeXTheader;
  49. #endif NeXT
  50.     int      sf_magic;
  51.     float      sf_srate;
  52.     int      sf_chans;
  53.     int      sf_packmode;
  54.     char      sf_codes;
  55. } ;
  56.  
  57. typedef union sfheader {
  58.     struct  sfinfo sfinfo;
  59.     char    filler[SIZEOF_BSD_HEADER];
  60. } SFHEADER;
  61.  
  62. static SFCODE    ampcode = {
  63. SF_MAXAMP,
  64. sizeof(SFMAXAMP) + sizeof(SFCODE)
  65. };
  66.  
  67. # define sfchans(x) (x)->sfinfo.sf_chans
  68. # define sfmagic(x) (x)->sfinfo.sf_magic
  69. # define sfsrate(x) (x)->sfinfo.sf_srate
  70. # define sfclass(x) (x)->sfinfo.sf_packmode
  71. # define sfbsize(x) ((x)->st_size - sizeof(SFHEADER))
  72. # define sfcodes(x) (x)->sfinfo.sf_codes
  73.  
  74. # define ismagic(x) ((x)->sfinfo.sf_magic == SF_MAGIC)
  75. # define islink(x)  ((x)->sfinfo.sf_magic == SF_LINK)
  76.  
  77. # define sfmaxamp(mptr,chan) (mptr)->value[chan]
  78. # define sfmaxamploc(mptr,chan) (mptr)->samploc[chan]
  79. # define sfmaxamptime(x) (x)->timetag
  80. # define ismaxampgood(x,s) (sfmaxamptime(x) + 2  >= (s)->st_mtime)
  81.  
  82. # define sfcomm(x,n) (x)->comment[n]
  83.  
  84. # define realname(x) (x)->reality
  85. # define startsmp(x) (x)->startsamp
  86. # define endsmp(x) (x)->endsamp
  87. # define sfoffset(x,h) ((x)->startsamp * sfchans(h) * sfclass(h))
  88. # define sfendset(x,h) ((x)->endsamp * sfchans(h) * sfclass(h))
  89.  
  90. # define sflseek(x,y,z) lseek(x,(z != 0) ? y : ((y) + sizeof(SFHEADER)),z)
  91. # define rheader(x,y) read(x,(char *) y,sizeof(SFHEADER)) != sizeof(SFHEADER)
  92.  
  93. #ifdef NeXT
  94. # define wheader(x,y) Nwheader(x,y)
  95. #else
  96. # define wheader(x,y) write(x,(char *) y,sizeof(SFHEADER)) != sizeof(SFHEADER)
  97. #endif NeXT
  98.  
  99. #define readopensf(name,fd,sfh,sfst,prog,result) \
  100. if ((fd = open(name, 0))  < 0) {  \
  101.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  102.     result = -1;  \
  103. } \
  104. else if (stat(name,&sfst)){ \
  105.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  106.     result = -1;  \
  107. } \
  108. else if (rheader(fd,&sfh)){ \
  109.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  110.     result = -1;  \
  111. } \
  112. else if (!ismagic(&sfh)){ \
  113.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  114.     result = -1;  \
  115. } \
  116. else result = 0;
  117.  
  118. #define rwopensf(name,fd,sfh,sfst,prog,result,code) \
  119. if ((fd = open(name, code))  < 0) {  \
  120.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  121.     result = -1;  \
  122. } \
  123. else if (rheader(fd,&sfh)){ \
  124.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  125.     result = -1;  \
  126. } \
  127. else if (!ismagic(&sfh)){ \
  128.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  129.     result = -1;  \
  130. } \
  131. else if (stat(name,&sfst)){ \
  132.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  133.     result = -1;  \
  134. } \
  135. else result = 0;
  136.  
  137. #ifdef NeXT
  138. #define drwopensf(name,fd,sfh,sfst,prog,result,code) \
  139. if ((fd = open(name, code))  < 0) {  \
  140.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  141.     result = -1;  \
  142. } \
  143. else if ((result = DoubleHeader(fd,&sfh)) < 0){ \
  144.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  145.     result = -1;  \
  146. } \
  147. else if (stat(name,&sfst)){ \
  148.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  149.     result = -1;  \
  150. };
  151. #endif NeXT
  152.  
  153. /* an addition to the family -- one that allows the creation of a new file
  154. */
  155. #ifdef NeXT
  156. #define newopensf(name,fd,sfh,sfst,prog,result,code,mode) \
  157. if ((fd = open(name, code, mode))  < 0) {  \
  158.     fprintf(stderr,"%s: cannot open file %s for R/W\n",prog,name); \
  159.     result = -1;  \
  160. } \
  161. else if ((result = DoubleHeader(fd,&sfh)) < 0){ \
  162.     fprintf(stderr,"%s: cannot read header from %s . \n",prog,name); \
  163.     result = -1;  \
  164. } \
  165. else if (stat(name,&sfst)){ \
  166.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  167.     result = -1;  \
  168. } \
  169. else result = 0;
  170. #else
  171. #define newopensf(name,fd,sfh,sfst,prog,result,code,mode) \
  172. if ((fd = open(name, code, mode))  < 0) {  \
  173.     fprintf(stderr,"%s: cannot open file %s for R/W\n",prog,name); \
  174.     result = -1;  \
  175. } \
  176. else if (rheader(fd,&sfh)){ \
  177.     fprintf(stderr,"%s: cannot read header from %s . writing...\n",prog,name); \
  178.     if(wheader(fd, &sfh)){  \
  179.         fprintf(stderr,"%s: cannot write header to %s\n",prog,name); \
  180.         result = -1;  \
  181.     } \
  182. } \
  183. else if (!ismagic(&sfh)){ \
  184.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  185.     result = -1;  \
  186. } \
  187. else if (stat(name,&sfst)){ \
  188.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  189.     result = -1;  \
  190. } \
  191. else result = 0;
  192. #endif NeXT
  193.  
  194.