home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Sound / SoX / Source / util.c < prev    next >
C/C++ Source or Header  |  1999-07-18  |  6KB  |  300 lines

  1. /*
  2.  * July 5, 1991
  3.  * Copyright 1991 Lance Norskog And Sundry Contributors
  4.  * This source code is freely redistributable and may be used for
  5.  * any purpose.  This copyright notice must be maintained. 
  6.  * Lance Norskog And Sundry Contributors are not responsible for 
  7.  * the consequences of using this software.
  8.  */
  9.  
  10. #include "st.h"
  11. #include "version.h"
  12. #include "patchlvl.h"
  13. #include <string.h>
  14. #include <ctype.h>
  15. #include <signal.h>
  16.  
  17. #ifdef __STDC__
  18. #include <stdarg.h>
  19. #else
  20. #include <varargs.h>
  21. #endif
  22.  
  23. /*
  24.  * util.c.
  25.  * Incorporate Jimen Ching's fixes for real library operation: Aug 3, 1994.
  26.  * Redo all work from scratch, unfortunately.
  27.  * Separate out all common variables used by effects & handlers,
  28.  * and utility routines for other main programs to use.
  29.  */
  30.  
  31.  
  32. EXPORT float volume = 1.0;    /* expansion coefficient */
  33. EXPORT int dovolume = 0;
  34.  
  35. EXPORT float amplitude = 1.0;    /* Largest sample so far */
  36.  
  37. EXPORT int writing = 0;    /* are we writing to a file? */
  38.  
  39. /* export flags */
  40. EXPORT int verbose = 0;    /* be noisy on stderr */
  41. EXPORT int summary = 0;    /* just print summary of information */
  42.  
  43. EXPORT char *myname;
  44.  
  45. EXPORT int soxpreview = 0;    /* preview mode */
  46.  
  47.  
  48. void
  49. #if    defined(__STDC__)
  50. report(char *fmt, ...)
  51. #else
  52. report(va_alist) 
  53. va_dcl
  54. #endif
  55. {
  56.     va_list args;
  57. #if    !defined(__STDC__)
  58.     char *fmt;
  59. #endif
  60.  
  61.     if (! verbose)
  62.         return;
  63.     fprintf(stderr, "%s: ", myname);
  64. #if    !defined(__STDC__)
  65.     va_start(args);
  66.     fmt = va_arg(args, char *);
  67. #else
  68.     va_start(args, fmt);
  69. #endif
  70.     vfprintf(stderr, fmt, args);
  71.     va_end(args);
  72.     fprintf(stderr, "\n");
  73. }
  74.  
  75.  
  76. void
  77. #if    defined(__STDC__)
  78. warn(char *fmt, ...)
  79. #else
  80. warn(va_alist) 
  81. va_dcl
  82. #endif
  83. {
  84.     va_list args;
  85. #if    !defined(__STDC__)
  86.     char *fmt;
  87. #endif
  88.  
  89.     fprintf(stderr, "%s: ", myname);
  90. #if    !defined(__STDC__)
  91.     va_start(args);
  92.     fmt = va_arg(args, char *);
  93. #else
  94.     va_start(args, fmt);
  95. #endif
  96.     vfprintf(stderr, fmt, args);
  97.     va_end(args);
  98.     fprintf(stderr, "\n");
  99. }
  100.  
  101. void
  102. #if    defined(__STDC__)
  103. fail(char *fmt, ...)
  104. #else
  105. fail(va_alist) 
  106. va_dcl
  107. #endif
  108. {
  109.     va_list args;
  110. #if    !defined(__STDC__)
  111.     char *fmt;
  112. #endif
  113.     extern void cleanup();
  114.  
  115.     fprintf(stderr, "%s: ", myname);
  116.  
  117. #if    !defined(__STDC__)
  118.     va_start(args);
  119.     fmt = va_arg(args, char *);
  120. #else
  121.     va_start(args, fmt);
  122. #endif
  123.     vfprintf(stderr, fmt, args);
  124.     va_end(args);
  125.     fprintf(stderr, "\n");
  126.     cleanup();
  127.     exit(2);
  128. }
  129.  
  130.  
  131. int strcmpcase(s1, s2)
  132. char *s1, *s2;
  133. {
  134.     while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
  135.         s1++, s2++;
  136.     return *s1 - *s2;
  137. }
  138.  
  139. /*
  140.  * Check that we have a known format suffix string.
  141.  */
  142. void
  143. gettype(formp)
  144. ft_t formp;
  145. {
  146.     char **list;
  147.     int i;
  148.  
  149.     if (! formp->filetype)
  150. fail("Must give file type for %s file, either as suffix or with -t option",
  151. formp->filename);
  152.     for(i = 0; formats[i].names; i++) {
  153.         for(list = formats[i].names; *list; list++) {
  154.             char *s1 = *list, *s2 = formp->filetype;
  155.             if (! strcmpcase(s1, s2))
  156.                 break;    /* not a match */
  157.         }
  158.         if (! *list)
  159.             continue;
  160.         /* Found it! */
  161.         formp->h = &formats[i];
  162.         return;
  163.     }
  164.     if (! strcmpcase(formp->filetype, "snd")) {
  165.         verbose = 1;
  166.         report("File type '%s' is used to name several different formats.", formp->filetype);
  167.         report("If the file came from a Macintosh, it is probably");
  168.         report("a .ub file with a sample rate of 11025 (or possibly 5012 or 22050).");
  169.         report("Use the sequence '-t .ub -r 11025 file.snd'");
  170.         report("If it came from a PC, it's probably a Soundtool file.");
  171.         report("Use the sequence '-t .sndt file.snd'");
  172.         report("If it came from a NeXT, it's probably a .au file.");
  173.         fail("Use the sequence '-t .au file.snd'\n");
  174.     }
  175.     fail("File type '%s' of %s file is not known!",
  176.         formp->filetype, formp->filename);
  177. }
  178.  
  179. /*
  180.  * Check that we have a known effect name.
  181.  */
  182. void
  183. geteffect(effp)
  184. eff_t effp;
  185. {
  186.     int i;
  187.  
  188.     for(i = 0; effects[i].name; i++) {
  189.         char *s1 = effects[i].name, *s2 = effp->name;
  190.         while(*s1 && *s2 && (tolower(*s1) == tolower(*s2)))
  191.             s1++, s2++;
  192.         if (*s1 || *s2)
  193.             continue;    /* not a match */
  194.         /* Found it! */
  195.         effp->h = &effects[i];
  196.         return;
  197.     }
  198.     /* Guido Van Rossum fix */
  199.     fprintf(stderr, "%s: Known effects: ",myname);
  200.     for (i = 1; effects[i].name; i++)
  201.         fprintf(stderr, "%s ", effects[i].name);
  202.     fprintf(stderr, "\n");
  203.     fail("Effect '%s' is not known!", effp->name);
  204. }
  205.  
  206. /*
  207.  * File format routines 
  208.  */
  209.  
  210. void copyformat(ft, ft2)
  211. ft_t ft, ft2;
  212. {
  213.     int noise = 0, i;
  214.     double factor;
  215.  
  216.     if (ft2->info.rate == 0) {
  217.         ft2->info.rate = ft->info.rate;
  218.         noise = 1;
  219.     }
  220.     if (ft2->info.size == -1) {
  221.         ft2->info.size = ft->info.size;
  222.         noise = 1;
  223.     }
  224.     if (ft2->info.style == -1) {
  225.         ft2->info.style = ft->info.style;
  226.         noise = 1;
  227.     }
  228.     if (ft2->info.channels == -1) {
  229.         ft2->info.channels = ft->info.channels;
  230.         noise = 1;
  231.     }
  232.     if (ft2->comment == NULL) {
  233.         ft2->comment = ft->comment;
  234.         noise = 1;
  235.     }
  236.     /* 
  237.      * copy loop info, resizing appropriately 
  238.      * it's in samples, so # channels don't matter
  239.      */
  240.     factor = (double) ft2->info.rate / (double) ft->info.rate;
  241.     for(i = 0; i < NLOOPS; i++) {
  242.         ft2->loops[i].start = ft->loops[i].start * factor;
  243.         ft2->loops[i].length = ft->loops[i].length * factor;
  244.         ft2->loops[i].count = ft->loops[i].count;
  245.         ft2->loops[i].type = ft->loops[i].type;
  246.     }
  247.     /* leave SMPTE # alone since it's absolute */
  248.     ft2->instr = ft->instr;
  249. }
  250.  
  251. void cmpformats(ft, ft2)
  252. ft_t ft, ft2;
  253. {
  254. }
  255.  
  256. /* check that all settings have been given */
  257. void checkformat(ft) 
  258. ft_t ft;
  259. {
  260.     if (ft->info.rate == 0)
  261.         fail("Sampling rate for %s file was not given\n", ft->filename);
  262.     if ((ft->info.rate < 100) || (ft->info.rate > 50000L))
  263.         fail("Sampling rate %lu for %s file is bogus\n", 
  264.             ft->info.rate, ft->filename);
  265.     if (ft->info.size == -1)
  266.         fail("Data size was not given for %s file\nUse one of -b/-w/-l/-f/-d/-D", ft->filename);
  267.     if (ft->info.style == -1 && ft->info.size != FLOAT)
  268.         fail("Data style was not given for %s file\nUse one of -s/-u/-U/-A", ft->filename);
  269.     /* it's so common, might as well default */
  270.     if (ft->info.channels == -1)
  271.         ft->info.channels = 1;
  272.     /*    fail("Number of output channels was not given for %s file",
  273.             ft->filename); */
  274. }
  275.  
  276. static ft_t ft_queue[2];
  277.  
  278. void
  279. sigint(s)
  280. int s;
  281. {
  282.     if (s == SIGINT) {
  283.     if (ft_queue[0])
  284.         ft_queue[0]->file.eof = 1;
  285.     if (ft_queue[1])
  286.         ft_queue[1]->file.eof = 1;
  287.     }
  288. }
  289.  
  290. void
  291. sigintreg(ft)
  292. ft_t ft;
  293. {
  294.     if (ft_queue[0] == 0)
  295.     ft_queue[0] = ft;
  296.     else
  297.     ft_queue[1] = ft;
  298.     signal(SIGINT, sigint);
  299. }
  300.