home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / windows3 / mtlabsnd.zip / SFHEADER.H < prev    next >
Text File  |  1993-04-26  |  3KB  |  120 lines

  1. # define SIZEOF_BSD_HEADER 1024
  2. # define SF_MAGIC 107364
  3. # define SF_LINK 107414
  4. # define SF_SHORT sizeof(short)
  5. # define SF_FLOAT sizeof(float)
  6. # define SF_BUFSIZE    (16*1024)
  7. # define SF_MAXCHAN    4
  8. # define MAXCOMM 512
  9. # define MINCOMM 256
  10.  
  11. /* Codes for sfcode */
  12. # define SF_END 0
  13. # define SF_MAXAMP 1
  14. # define SF_COMMENT 2
  15. # define SF_LINKCODE 3
  16.  
  17. typedef struct sfcode {
  18.     short    code;
  19.     short    bsize;
  20. } SFCODE;
  21.  
  22. typedef struct sfmaxamp {
  23.     float    value[SF_MAXCHAN];
  24.     long    samploc[SF_MAXCHAN];
  25.     long    timetag;
  26. } SFMAXAMP;
  27.  
  28. typedef struct sfcomment {
  29.     char     comment[MAXCOMM];
  30. } SFCOMMENT;
  31.  
  32. typedef struct sflink {
  33.     char     reality[50];
  34.     int     startsamp;
  35.     int    endsamp;
  36. } SFLINK;
  37.  
  38. struct sfinfo {    
  39.     int      sf_magic;
  40.     float      sf_srate;
  41.     int      sf_chans;
  42.     int      sf_packmode;
  43.     char      sf_codes;
  44. } ;
  45.  
  46. typedef union sfheader {
  47.     struct  sfinfo sfinfo;
  48.     char    filler[SIZEOF_BSD_HEADER];
  49. } SFHEADER;
  50.  
  51. static SFCODE    ampcode = {
  52. SF_MAXAMP,
  53. sizeof(SFMAXAMP) + sizeof(SFCODE)
  54. };
  55.  
  56. # define sfchans(x) (x)->sfinfo.sf_chans
  57. # define sfmagic(x) (x)->sfinfo.sf_magic
  58. # define sfsrate(x) (x)->sfinfo.sf_srate
  59. # define sfclass(x) (x)->sfinfo.sf_packmode
  60. # define sfbsize(x) ((x)->st_size - sizeof(SFHEADER))
  61. # define sfcodes(x) (x)->sfinfo.sf_codes
  62.  
  63. # define ismagic(x) ((x)->sfinfo.sf_magic == SF_MAGIC)
  64. # define islink(x)  ((x)->sfinfo.sf_magic == SF_LINK)
  65.  
  66. # define sfmaxamp(mptr,chan) (mptr)->value[chan]
  67. # define sfmaxamploc(mptr,chan) (mptr)->samploc[chan]
  68. # define sfmaxamptime(x) (x)->timetag
  69. # define ismaxampgood(x,s) (sfmaxamptime(x) + 2  >= (s)->st_mtime)
  70.  
  71. # define sfcomm(x,n) (x)->comment[n]
  72.  
  73. # define realname(x) (x)->reality
  74. # define startsmp(x) (x)->startsamp
  75. # define endsmp(x) (x)->endsamp
  76. # define sfoffset(x,h) ((x)->startsamp * sfchans(h) * sfclass(h))
  77. # define sfendset(x,h) ((x)->endsamp * sfchans(h) * sfclass(h))
  78.  
  79. # define sflseek(x,y,z) lseek(x,(z != 0) ? y : ((y) + sizeof(SFHEADER)),z)
  80. # define rheader(x,y) read(x,(char *) y,sizeof(SFHEADER)) != sizeof(SFHEADER)
  81.  
  82. #define readopensf(name,fd,sfh,sfst,prog,result) \
  83. if ((fd = open(name, 0))  < 0) {  \
  84.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  85.     result = -1;  \
  86. } \
  87. else if (stat(name,&sfst)){ \
  88.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  89.     result = -1;  \
  90. } \
  91. else if (rheader(fd,&sfh)){ \
  92.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  93.     result = -1;  \
  94. } \
  95. else if (!ismagic(&sfh)){ \
  96.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  97.     result = -1;  \
  98. } \
  99. else result = 0;
  100.  
  101. #define rwopensf(name,fd,sfh,sfst,prog,result,code) \
  102. if ((fd = open(name, code))  < 0) {  \
  103.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  104.     result = -1;  \
  105. } \
  106. else if (rheader(fd,&sfh)){ \
  107.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  108.     result = -1;  \
  109. } \
  110. else if (!ismagic(&sfh)){ \
  111.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  112.     result = -1;  \
  113. } \
  114. else if (stat(name,&sfst)){ \
  115.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  116.     result = -1;  \
  117. } \
  118. else result = 0;
  119.  
  120.