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

  1.  
  2. /*
  3.  * June 1, 1992
  4.  * Copyright 1992 Guido van Rossum 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.  * Guido van Rossum And Sundry Contributors are not responsible for 
  8.  * the consequences of using this software.
  9.  */
  10.  
  11. /*
  12.  * "reverse" effect, uses a temporary file created by tmpfile().
  13.  */
  14.  
  15. #include <math.h>
  16. #include <stdio.h>
  17.  
  18. #ifdef HAVE_UNISTD_H
  19. #include <unistd.h>    /* For SEEK_* defines if not found in stdio */
  20. #endif
  21.  
  22. #include "st.h"
  23.  
  24. IMPORT FILE *tmpfile();
  25.  
  26. /* Private data */
  27. typedef struct reversestuff {
  28.     FILE *fp;
  29.     LONG pos;
  30.     int phase;
  31. } *reverse_t;
  32.  
  33. #define WRITING 0
  34. #define READING 1
  35.  
  36. /*
  37.  * Process options: none in our case.
  38.  */
  39.  
  40. void reverse_getopts(effp, n, argv) 
  41. eff_t effp;
  42. int n;
  43. char **argv;
  44. {
  45.     if (n)
  46.         fail("Reverse effect takes no options.");
  47. }
  48.  
  49. /*
  50.  * Prepare processing: open temporary file.
  51.  */
  52.  
  53. void reverse_start(effp)
  54. eff_t effp;
  55. {
  56.     reverse_t reverse = (reverse_t) effp->priv;
  57.     reverse->fp = tmpfile();
  58.     if (reverse->fp == NULL)
  59.         fail("Reverse effect can't create temporary file\n");
  60.     reverse->phase = WRITING;
  61. }
  62.  
  63. /*
  64.  * Effect flow: a degenerate case: write input samples on temporary file,
  65.  * don't generate any output samples.
  66.  */
  67.  
  68. void reverse_flow(effp, ibuf, obuf, isamp, osamp)
  69. eff_t effp;
  70. LONG *ibuf, *obuf;
  71. int *isamp, *osamp;
  72. {
  73.     reverse_t reverse = (reverse_t) effp->priv;
  74.  
  75.     if (reverse->phase != WRITING)
  76.         fail("Internal error: reverse_flow called in wrong phase");
  77.     if (fwrite((char *)ibuf, sizeof(LONG), *isamp, reverse->fp)
  78.         != *isamp)
  79.         fail("Reverse effect write error on temporary file\n");
  80.     *osamp = 0;
  81. }
  82.  
  83. /*
  84.  * Effect drain: generate the actual samples in reverse order.
  85.  */
  86.  
  87. void reverse_drain(effp, obuf, osamp)
  88. eff_t effp;
  89. LONG *obuf;
  90. int *osamp;
  91. {
  92.     reverse_t reverse = (reverse_t) effp->priv;
  93.     int len, nbytes;
  94.     register int i, j;
  95.     LONG temp;
  96.  
  97.     if (reverse->phase == WRITING) {
  98.         fflush(reverse->fp);
  99.         fseek(reverse->fp, 0L, SEEK_END);
  100.         reverse->pos = ftell(reverse->fp);
  101.         if (reverse->pos % sizeof(LONG) != 0)
  102.             fail("Reverse effect finds odd temporary file\n");
  103.         reverse->phase = READING;
  104.     }
  105.     len = *osamp;
  106.     nbytes = len * sizeof(LONG);
  107.     if (reverse->pos < nbytes) {
  108.         nbytes = reverse->pos;
  109.         len = nbytes / sizeof(LONG);
  110.     }
  111.     reverse->pos -= nbytes;
  112.     fseek(reverse->fp, reverse->pos, SEEK_SET);
  113.     if (fread((char *)obuf, sizeof(LONG), len, reverse->fp) != len)
  114.         fail("Reverse effect read error from temporary file\n");
  115.     for (i = 0, j = len-1; i < j; i++, j--) {
  116.         temp = obuf[i];
  117.         obuf[i] = obuf[j];
  118.         obuf[j] = temp;
  119.     }
  120.     *osamp = len;
  121. }
  122.  
  123. /*
  124.  * Close and unlink the temporary file.
  125.  */
  126. void reverse_stop(effp)
  127. eff_t effp;
  128. {
  129.     reverse_t reverse = (reverse_t) effp->priv;
  130.  
  131.     fclose(reverse->fp);
  132. }
  133.  
  134.