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

  1.  
  2. /*
  3.  * July 5, 1991
  4.  * Copyright 1991 Lance Norskog And Sundry Contributors
  5.  * This source code is freely redistributable and may be used for
  6.  * any purpose.  This copyright notice must be maintained. 
  7.  * Lance Norskog And Sundry Contributors are not responsible for 
  8.  * the consequences of using this software.
  9.  */
  10.  
  11. /*
  12.  *  "split" effect by Lauren Weinstein (lauren@vortex.com); 2/94
  13.  *  Splits 1 channel file to 2 channels (stereo), or 4 channels (quad);
  14.  *  or splits a 2 channel file to 4 channels.
  15.  */
  16.  
  17. #include <math.h>
  18. #include "st.h"
  19.  
  20. /* Private data for split */
  21. typedef struct splitstuff {
  22.     int    rest;        /* bytes remaining in current block */
  23. } *split_t;
  24.  
  25. /*
  26.  * Process options
  27.  */
  28. void
  29. split_getopts(effp, n, argv) 
  30. eff_t effp;
  31. int n;
  32. char **argv;
  33. {
  34.     if (n)
  35.         fail("Split effect takes no options.");
  36. }
  37.  
  38. /*
  39.  * Prepare processing.
  40.  */
  41. void
  42. split_start(effp)
  43. eff_t effp;
  44. {
  45.     switch (effp->ininfo.channels) {
  46.         case 1:   /* 1 channel must split to 2 or 4 */
  47.             switch(effp->outinfo.channels) {
  48.                 case 2:
  49.                 case 4:
  50.                     return;
  51.             }
  52.             break;
  53.         case 2:      /* 2 channels must split to 4 */
  54.             switch(effp->outinfo.channels) {
  55.                 case 4:
  56.                     return;
  57.             }
  58.             break;
  59.     }
  60.     fail("Can't split %d channels into %d channels",
  61.         effp->ininfo.channels, effp->outinfo.channels);
  62. }
  63.  
  64. /*
  65.  * Process signed long samples from ibuf to obuf,
  66.  * isamp or osamp samples, whichever is smaller,
  67.  * while splitting into appropriate channels.
  68.  */
  69.  
  70. void split_flow(effp, ibuf, obuf, isamp, osamp)
  71. eff_t effp;
  72. LONG *ibuf, *obuf;
  73. int *isamp, *osamp;
  74. {
  75.     int len, done;
  76.  
  77.      switch(effp->ininfo.channels) {
  78.         case 1:  /* 1 input channel */
  79.             switch(effp->outinfo.channels) {
  80.                 case 2:  /* split to 2 channels */
  81.                     len = ((*isamp > *osamp/2) 
  82.                           ? *osamp/2 : *isamp);
  83.                     for(done = 0; done < len; done++) {
  84.                         obuf[0] = obuf[1] = *ibuf++;
  85.                         obuf += 2;
  86.                     }            
  87.                     *isamp = len;
  88.                     *osamp = len * 2;
  89.                     break;        
  90.                 case 4:  /* split to 4 channels */
  91.                     len = ((*isamp > *osamp/4) 
  92.                           ? *osamp/4 : *isamp);
  93.                     for(done = 0; done < len; done++) {
  94.                         obuf[0] = obuf[1] = obuf[2]
  95.                            = obuf[3] = *ibuf++;
  96.                         obuf += 4;
  97.                     }
  98.                     *isamp = len;
  99.                     *osamp = len * 4;
  100.                     break;
  101.             }
  102.             break;
  103.         case 2:  /* 2 input channels; split to 4 channels  */
  104.              /* We're using the same channel ordering  */
  105.              /* as in "avg.c"--sure hope it's correct! */
  106.             len = ((*isamp/2 > *osamp/4) 
  107.                   ? *osamp/4 : *isamp/2);
  108.             for(done = 0; done < len; done++) {
  109.                 obuf[0] = obuf[2] = ibuf[0];
  110.                 obuf[1] = obuf[3] = ibuf[1];
  111.                 ibuf += 2;
  112.                 obuf += 4;
  113.             }
  114.             *isamp = len;
  115.             *osamp = len * 2;
  116.             break;
  117.     }
  118. }
  119.  
  120. /*
  121.  * Do anything required when you stop reading samples.  
  122.  * Don't close input file! 
  123.  */
  124. void split_stop(effp)
  125. eff_t effp;
  126. {
  127.     /* nothing to do */
  128. }
  129.  
  130.  
  131.