home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Sound / SoX / Source / cut.c < prev    next >
C/C++ Source or Header  |  1999-07-18  |  2KB  |  117 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.  * Sound Tools cut effect file.
  13.  *
  14.  * Pull loop #n from a looped sound file.
  15.  * Not finished, don't use it yet.
  16.  */
  17.  
  18. #include <math.h>
  19. #include "st.h"
  20.  
  21. /* Private data for SKEL file */
  22. typedef struct cutstuff {
  23.     int    which;            /* Loop # to pull */
  24.     int    where;            /* current sample # */
  25.     ULONG start;            /* first wanted sample */
  26.     ULONG end;            /* last wanted sample + 1 */
  27. } *cut_t;
  28.  
  29. /*
  30.  * Process options
  31.  */
  32. void cut_getopts(effp, n, argv) 
  33. eff_t effp;
  34. int n;
  35. char **argv;
  36. {
  37.     cut_t cut = (cut_t) effp->priv;
  38.  
  39.     /* parse it */
  40.     cut->which = 0;    /* for now */
  41. }
  42.  
  43. /*
  44.  * Prepare processing.
  45.  */
  46. void cut_start(effp)
  47. eff_t effp;
  48. {
  49.     cut_t cut = (cut_t) effp->priv;
  50.     /* nothing to do */
  51.  
  52.     cut->where = 0;
  53.     cut->start = effp->loops[0].start;
  54.     cut->end = effp->loops[0].start + effp->loops[0].length;
  55. }
  56.  
  57. /*
  58.  * Processed signed long samples from ibuf to obuf.
  59.  * Return number of samples processed.
  60.  */
  61.  
  62. void cut_flow(effp, ibuf, obuf, isamp, osamp)
  63. eff_t effp;
  64. LONG *ibuf, *obuf;
  65. int *isamp, *osamp;
  66. {
  67.     cut_t cut = (cut_t) effp->priv;
  68.     int len, done;
  69.     
  70.     len = ((*isamp > *osamp) ? *osamp : *isamp);
  71.     if ((cut->where + len <= cut->start) ||
  72.             (cut->where >= cut->end)) {
  73.         *isamp = len;
  74.         *osamp = 0;
  75.         cut->where += len;
  76.         return;
  77.     }
  78.     *isamp = len;        /* We will have processed all inputs */
  79.     if (cut->where < cut->start) {
  80.         /* skip */
  81.         ibuf += cut->start - cut->where;
  82.         len -= cut->start - cut->where;
  83.     }
  84.     if (cut->where + len >= cut->end) {
  85.         /* shorten */
  86.         len = cut->end - cut->where;
  87.     }
  88.     for(done = 0; done < len; done++) {
  89.         *obuf++ = *ibuf++;
  90.     }
  91.     *osamp = len;
  92. }
  93.  
  94. /*
  95.  * Drain out remaining samples if the effect generates any.
  96.  */
  97.  
  98. void cut_drain(effp, obuf, osamp)
  99. eff_t effp;
  100. LONG *obuf;
  101. int *osamp;
  102. {
  103.     *osamp = 0;
  104. }
  105.  
  106. /*
  107.  * Do anything required when you stop reading samples.  
  108.  *    (free allocated memory, etc.)
  109.  */
  110. void cut_stop(effp)
  111. eff_t effp;
  112. {
  113.     /* nothing to do */
  114. }
  115.  
  116.  
  117.