ref: 64ec5ace8d13790782adc96a723752fd05bc0b88
parent: c54d56076b1c4b554de63bd5f5186f3e3f723c1c
author: cbagwell <cbagwell>
date: Mon Apr 23 10:27:09 EDT 2001
It was mentioned that fade and trim and DOS ^M's in the file. Ran through dos2unix to make sure.
--- a/src/fade.c
+++ b/src/fade.c
@@ -1,323 +1,323 @@
-/* This code is based in skel.c
- * Written by Chris Bagwell (cbagwell@sprynet.com) - March 16, 1999
- * Non-skel parts written by
- * Ari Moisio <armoi@sci.fi> Aug 29 2000.
- *
- * Copyright 1999 Chris Bagwell And Sundry Contributors
- * This source code is freely redistributable and may be used for
- * any purpose. This copyright notice must be maintained.
- * Chris Bagwell And Sundry Contributors are not responsible for
- * the consequences of using this software.
- */
-
-/* Time resolution one millisecond */
-#define TIMERES 1000
-/* Fade curves */
-#define FADE_QUARTER 'q' /* Quarter of sine wave, 0 to pi/2 */
-#define FADE_HALF 'h' /* Half of sine wave, pi/2 to 1.5 * pi
- * scaled so that -1 means no output
- * and 1 means 0 db attenuation. */
-#define FADE_LOG 'l' /* Logarithmic curve. Fades -100 db
- * in given time. */
-#define FADE_TRI 't' /* Linear slope. */
-#define FADE_PAR 'p' /* Inverted parabola. */
-
-#include <math.h>
-#include "st.h"
-
-/* Private data for fade file */
-typedef struct fadestuff
-{ /* These are measured as samples */
- ULONG in_start, in_stop, out_start, out_stop, samplesdone;
- char in_fadetype, out_fadetype;
- int endpadwarned;
-} *fade_t;
-
-#define FADE_USAGE "Usage: fade [ type ] fade-in-length [ stop-time [ fade-out-length ] ]\nTimes in seconds.\nFade type one of q, h, t, l or p.\n"
-
-/* prototypes */
-static double fade_gain(ULONG index, ULONG range, char fadetype);
-
-/*
- * Process options
- *
- * Don't do initialization now.
- * The 'info' fields are not yet filled in.
- */
-
-int st_fade_getopts(effp, n, argv)
-eff_t effp;
-int n;
-char **argv;
-{
-
- fade_t fade = (fade_t) effp->priv;
- double t_double;
- char t_char;
- int t_argno;
-
- if (n < 1 || n > 4)
- { /* Wrong number of arguments. */
- st_fail(FADE_USAGE);
- return(ST_EOF);
- }
-
- /* because sample rate is unavailable at this point we convert time
- * values to seconds * TIMERES and convert them to samples later.
- */
-
- if (sscanf(argv[0], "%1[qhltp]", &t_char))
- {
- fade->in_fadetype = t_char;
- fade->out_fadetype = t_char;
-
- argv++;
- n--;
- }
- else
- {
- /* No type given. */
- fade->in_fadetype = 'l';
- fade->out_fadetype = 'l';
- }
-
- t_double = st_parsetime(argv[0]);
- if (t_double >= 0)
- { /* got something numerical */
- /* Don't support in_start. Its job is done by trim effect */
- fade->in_start = 0;
- fade->in_stop = t_double * TIMERES;
- }
- else
- { /* unnumeric value */
- st_fail(FADE_USAGE);
- return(ST_EOF);
- } /* endif numeric fade-in */
-
- fade->out_start = fade->out_stop = 0;
-
- for (t_argno = 1; t_argno < n && t_argno <= 3; t_argno++)
- { /* See if there is fade-in/fade-out times/curves specified. */
- t_double = st_parsetime(argv[t_argno]);
- if (t_double >= 0)
- {
- if (t_argno == 1)
- {
- fade->out_stop = t_double * TIMERES;
- /* Zero fade-out too */
- fade->out_start = fade->out_stop;
- }
- else
- {
- fade->out_start = fade->out_stop - t_double * TIMERES;
- }
- }
- else
- {
- st_fail(FADE_USAGE);
- return(ST_EOF);
- }
- } /* End for(t_argno) */
-
- /* Sanity check for fade times vs total time */
- if (fade->in_stop > fade->out_start && fade->out_start != 0)
- { /* Fades too long */
- st_fail("Fade: End of fade-in should not happen before beginning of fade-out");
- return(ST_EOF);
- } /* endif fade time sanity */
-
- return(ST_SUCCESS);
-}
-
-/*
- * Prepare processing.
- * Do all initializations.
- */
-void st_fade_start(effp)
-eff_t effp;
-{
- fade_t fade = (fade_t) effp->priv;
-
- /* converting time values to samples */
- fade->in_start = (double)fade->in_start * effp->ininfo.rate / TIMERES;
- fade->in_stop = (double)fade->in_stop * effp->ininfo.rate / TIMERES;
- fade->out_start = (double)fade->out_start * effp->ininfo.rate / TIMERES;
- fade->out_stop = (double)fade->out_stop * effp->ininfo.rate / TIMERES;
-
- /* If lead-in is required it is handled as negative sample numbers */
- fade->samplesdone = (fade->in_start < 0 ? fade->in_start :0);
-
- fade->endpadwarned = 0;
-}
-
-/*
- * Processed signed long samples from ibuf to obuf.
- * Return number of samples processed.
- */
-void st_fade_flow(effp, ibuf, obuf, isamp, osamp)
-eff_t effp;
-LONG *ibuf, *obuf;
-int *isamp, *osamp;
-{
- fade_t fade = (fade_t) effp->priv;
- /* len is total samples, chcnt counts channels */
- int len = 0, chcnt = 0, t_output = 0;
- LONG t_ibuf;
-
- len = ((*isamp > *osamp) ? *osamp : *isamp);
-
- *osamp = 0;
- *isamp = 0;
-
- for(; len; len--)
- {
- t_ibuf = (fade->samplesdone < 0 ? 0 : *ibuf);
-
- if ((fade->samplesdone >= fade->in_start) &&
- (fade->out_stop == 0 || fade->samplesdone < fade->out_stop))
- { /* something to generate output */
- if (fade->samplesdone < fade->in_stop)
- { /* fade-in phase, increase gain */
- *obuf = t_ibuf *
- fade_gain(fade->samplesdone - fade->in_start,
- fade->in_stop - fade->in_start,
- fade->in_fadetype);
- } /* endif fade-in */
-
- if (fade->samplesdone >= fade->in_stop &&
- (fade->out_start == 0 || fade->samplesdone < fade->out_start))
- { /* steady gain phase */
- *obuf = t_ibuf;
- } /* endif steady phase */
-
- if (fade->out_start != 0 && fade->samplesdone >= fade->out_start)
- { /* fade-out phase, decrease gain */
- *obuf = t_ibuf *
- fade_gain(fade->out_stop - fade->samplesdone,
- fade->out_stop - fade->out_start,
- fade->out_fadetype);
- } /* endif fade-out */
-
- t_output = 1;
- }
- else
- { /* No output generated */
- t_output = 0;
- } /* endif something to output */
-
- if (fade->samplesdone >= 0 )
- { /* Something to input */
- *isamp += 1;
- ibuf++;
- } /* endif something accepted as input */
-
- if (t_output)
- { /* Output generated, update pointers and counters */
- obuf++;
- *osamp += 1;
- } /* endif t_output */
-
- /* Process next channel */
- chcnt++;
- if (chcnt >= effp->ininfo.channels)
- { /* all channels of this sample processed */
- chcnt = 0;
- fade->samplesdone += 1;
- } /* endif all channels */
- } /* endfor */
-}
-
-/*
- * Drain out remaining samples if the effect generates any.
- */
-void st_fade_drain(effp, obuf, osamp)
-eff_t effp;
-LONG *obuf;
-int *osamp;
-{
- fade_t fade = (fade_t) effp->priv;
- int len, t_chan = 0;
-
- len = *osamp;
- *osamp = 0;
-
- if (fade->out_stop != 0 && fade->samplesdone < fade->out_stop &&
- !(fade->endpadwarned))
- { /* Warning about padding silence into end of sample */
- st_warn("Fade: warning: End time passed end-of-file. Padding with silence");
- fade->endpadwarned = 1;
- } /* endif endpadwarned */
-
- for (;len && (fade->out_stop != 0 &&
- fade->samplesdone < fade->out_stop); len--)
- {
- *obuf = 0;
- obuf++;
- *osamp += 1;
-
- t_chan++;
- if (t_chan >= effp->ininfo.channels)
- {
- fade->samplesdone += 1;
- t_chan = 0;
- } /* endif channels */
- } /* endfor */
-}
-
-/*
- * Do anything required when you stop reading samples.
- * (free allocated memory, etc.)
- */
-void st_fade_stop(effp)
-eff_t effp;
-{
- /* nothing to do */
-}
-
-/* Function returns gain value 0.0 - 1.0 according index / range ratio
-* and -1.0 if type is invalid
-* todo: to optimize performance calculate gain every now and then and interpolate */
-static double fade_gain(index, range, type)
-ULONG index, range;
-char type;
-{
- double retval = 0.0, findex = 0.0;
-
- findex = 1.0 * index / range;
-
- /* todo: are these really needed */
- findex = (findex < 0 ? 0.0 : findex);
- findex = (findex > 1.0 ? 1.0 : findex);
-
- switch (type)
- {
- case FADE_TRI : /* triangle */
- retval = findex;
- break;
-
- case FADE_QUARTER : /* quarter of sinewave */
- retval = sin(findex * M_PI / 2);
- break;
-
- case FADE_HALF : /* half of sinewave... eh cosine wave */
- retval = (1 - cos(findex * M_PI )) / 2 ;
- break;
-
- case FADE_LOG : /* logaritmic */
- /* 5 means 100 db attenuation. */
- /* todo: should this be adopted with bit depth */
- retval = pow(0.1, (1 - findex) * 5);
- break;
-
- case FADE_PAR : /* inverted parabola */
- retval = (1 - (1 - findex) * (1 - findex));
- break;
-
- /* todo: more fade curves? */
- default : /* Error indicating wrong fade curve */
- retval = -1.0;
- break;
- } /* endswitch */
-
- return retval;
-}
+/* This code is based in skel.c
+ * Written by Chris Bagwell (cbagwell@sprynet.com) - March 16, 1999
+ * Non-skel parts written by
+ * Ari Moisio <armoi@sci.fi> Aug 29 2000.
+ *
+ * Copyright 1999 Chris Bagwell And Sundry Contributors
+ * This source code is freely redistributable and may be used for
+ * any purpose. This copyright notice must be maintained.
+ * Chris Bagwell And Sundry Contributors are not responsible for
+ * the consequences of using this software.
+ */
+
+/* Time resolution one millisecond */
+#define TIMERES 1000
+/* Fade curves */
+#define FADE_QUARTER 'q' /* Quarter of sine wave, 0 to pi/2 */
+#define FADE_HALF 'h' /* Half of sine wave, pi/2 to 1.5 * pi
+ * scaled so that -1 means no output
+ * and 1 means 0 db attenuation. */
+#define FADE_LOG 'l' /* Logarithmic curve. Fades -100 db
+ * in given time. */
+#define FADE_TRI 't' /* Linear slope. */
+#define FADE_PAR 'p' /* Inverted parabola. */
+
+#include <math.h>
+#include "st.h"
+
+/* Private data for fade file */
+typedef struct fadestuff
+{ /* These are measured as samples */
+ ULONG in_start, in_stop, out_start, out_stop, samplesdone;
+ char in_fadetype, out_fadetype;
+ int endpadwarned;
+} *fade_t;
+
+#define FADE_USAGE "Usage: fade [ type ] fade-in-length [ stop-time [ fade-out-length ] ]\nTimes in seconds.\nFade type one of q, h, t, l or p.\n"
+
+/* prototypes */
+static double fade_gain(ULONG index, ULONG range, char fadetype);
+
+/*
+ * Process options
+ *
+ * Don't do initialization now.
+ * The 'info' fields are not yet filled in.
+ */
+
+int st_fade_getopts(effp, n, argv)
+eff_t effp;
+int n;
+char **argv;
+{
+
+ fade_t fade = (fade_t) effp->priv;
+ double t_double;
+ char t_char;
+ int t_argno;
+
+ if (n < 1 || n > 4)
+ { /* Wrong number of arguments. */
+ st_fail(FADE_USAGE);
+ return(ST_EOF);
+ }
+
+ /* because sample rate is unavailable at this point we convert time
+ * values to seconds * TIMERES and convert them to samples later.
+ */
+
+ if (sscanf(argv[0], "%1[qhltp]", &t_char))
+ {
+ fade->in_fadetype = t_char;
+ fade->out_fadetype = t_char;
+
+ argv++;
+ n--;
+ }
+ else
+ {
+ /* No type given. */
+ fade->in_fadetype = 'l';
+ fade->out_fadetype = 'l';
+ }
+
+ t_double = st_parsetime(argv[0]);
+ if (t_double >= 0)
+ { /* got something numerical */
+ /* Don't support in_start. Its job is done by trim effect */
+ fade->in_start = 0;
+ fade->in_stop = t_double * TIMERES;
+ }
+ else
+ { /* unnumeric value */
+ st_fail(FADE_USAGE);
+ return(ST_EOF);
+ } /* endif numeric fade-in */
+
+ fade->out_start = fade->out_stop = 0;
+
+ for (t_argno = 1; t_argno < n && t_argno <= 3; t_argno++)
+ { /* See if there is fade-in/fade-out times/curves specified. */
+ t_double = st_parsetime(argv[t_argno]);
+ if (t_double >= 0)
+ {
+ if (t_argno == 1)
+ {
+ fade->out_stop = t_double * TIMERES;
+ /* Zero fade-out too */
+ fade->out_start = fade->out_stop;
+ }
+ else
+ {
+ fade->out_start = fade->out_stop - t_double * TIMERES;
+ }
+ }
+ else
+ {
+ st_fail(FADE_USAGE);
+ return(ST_EOF);
+ }
+ } /* End for(t_argno) */
+
+ /* Sanity check for fade times vs total time */
+ if (fade->in_stop > fade->out_start && fade->out_start != 0)
+ { /* Fades too long */
+ st_fail("Fade: End of fade-in should not happen before beginning of fade-out");
+ return(ST_EOF);
+ } /* endif fade time sanity */
+
+ return(ST_SUCCESS);
+}
+
+/*
+ * Prepare processing.
+ * Do all initializations.
+ */
+void st_fade_start(effp)
+eff_t effp;
+{
+ fade_t fade = (fade_t) effp->priv;
+
+ /* converting time values to samples */
+ fade->in_start = (double)fade->in_start * effp->ininfo.rate / TIMERES;
+ fade->in_stop = (double)fade->in_stop * effp->ininfo.rate / TIMERES;
+ fade->out_start = (double)fade->out_start * effp->ininfo.rate / TIMERES;
+ fade->out_stop = (double)fade->out_stop * effp->ininfo.rate / TIMERES;
+
+ /* If lead-in is required it is handled as negative sample numbers */
+ fade->samplesdone = (fade->in_start < 0 ? fade->in_start :0);
+
+ fade->endpadwarned = 0;
+}
+
+/*
+ * Processed signed long samples from ibuf to obuf.
+ * Return number of samples processed.
+ */
+void st_fade_flow(effp, ibuf, obuf, isamp, osamp)
+eff_t effp;
+LONG *ibuf, *obuf;
+int *isamp, *osamp;
+{
+ fade_t fade = (fade_t) effp->priv;
+ /* len is total samples, chcnt counts channels */
+ int len = 0, chcnt = 0, t_output = 0;
+ LONG t_ibuf;
+
+ len = ((*isamp > *osamp) ? *osamp : *isamp);
+
+ *osamp = 0;
+ *isamp = 0;
+
+ for(; len; len--)
+ {
+ t_ibuf = (fade->samplesdone < 0 ? 0 : *ibuf);
+
+ if ((fade->samplesdone >= fade->in_start) &&
+ (fade->out_stop == 0 || fade->samplesdone < fade->out_stop))
+ { /* something to generate output */
+ if (fade->samplesdone < fade->in_stop)
+ { /* fade-in phase, increase gain */
+ *obuf = t_ibuf *
+ fade_gain(fade->samplesdone - fade->in_start,
+ fade->in_stop - fade->in_start,
+ fade->in_fadetype);
+ } /* endif fade-in */
+
+ if (fade->samplesdone >= fade->in_stop &&
+ (fade->out_start == 0 || fade->samplesdone < fade->out_start))
+ { /* steady gain phase */
+ *obuf = t_ibuf;
+ } /* endif steady phase */
+
+ if (fade->out_start != 0 && fade->samplesdone >= fade->out_start)
+ { /* fade-out phase, decrease gain */
+ *obuf = t_ibuf *
+ fade_gain(fade->out_stop - fade->samplesdone,
+ fade->out_stop - fade->out_start,
+ fade->out_fadetype);
+ } /* endif fade-out */
+
+ t_output = 1;
+ }
+ else
+ { /* No output generated */
+ t_output = 0;
+ } /* endif something to output */
+
+ if (fade->samplesdone >= 0 )
+ { /* Something to input */
+ *isamp += 1;
+ ibuf++;
+ } /* endif something accepted as input */
+
+ if (t_output)
+ { /* Output generated, update pointers and counters */
+ obuf++;
+ *osamp += 1;
+ } /* endif t_output */
+
+ /* Process next channel */
+ chcnt++;
+ if (chcnt >= effp->ininfo.channels)
+ { /* all channels of this sample processed */
+ chcnt = 0;
+ fade->samplesdone += 1;
+ } /* endif all channels */
+ } /* endfor */
+}
+
+/*
+ * Drain out remaining samples if the effect generates any.
+ */
+void st_fade_drain(effp, obuf, osamp)
+eff_t effp;
+LONG *obuf;
+int *osamp;
+{
+ fade_t fade = (fade_t) effp->priv;
+ int len, t_chan = 0;
+
+ len = *osamp;
+ *osamp = 0;
+
+ if (fade->out_stop != 0 && fade->samplesdone < fade->out_stop &&
+ !(fade->endpadwarned))
+ { /* Warning about padding silence into end of sample */
+ st_warn("Fade: warning: End time passed end-of-file. Padding with silence");
+ fade->endpadwarned = 1;
+ } /* endif endpadwarned */
+
+ for (;len && (fade->out_stop != 0 &&
+ fade->samplesdone < fade->out_stop); len--)
+ {
+ *obuf = 0;
+ obuf++;
+ *osamp += 1;
+
+ t_chan++;
+ if (t_chan >= effp->ininfo.channels)
+ {
+ fade->samplesdone += 1;
+ t_chan = 0;
+ } /* endif channels */
+ } /* endfor */
+}
+
+/*
+ * Do anything required when you stop reading samples.
+ * (free allocated memory, etc.)
+ */
+void st_fade_stop(effp)
+eff_t effp;
+{
+ /* nothing to do */
+}
+
+/* Function returns gain value 0.0 - 1.0 according index / range ratio
+* and -1.0 if type is invalid
+* todo: to optimize performance calculate gain every now and then and interpolate */
+static double fade_gain(index, range, type)
+ULONG index, range;
+char type;
+{
+ double retval = 0.0, findex = 0.0;
+
+ findex = 1.0 * index / range;
+
+ /* todo: are these really needed */
+ findex = (findex < 0 ? 0.0 : findex);
+ findex = (findex > 1.0 ? 1.0 : findex);
+
+ switch (type)
+ {
+ case FADE_TRI : /* triangle */
+ retval = findex;
+ break;
+
+ case FADE_QUARTER : /* quarter of sinewave */
+ retval = sin(findex * M_PI / 2);
+ break;
+
+ case FADE_HALF : /* half of sinewave... eh cosine wave */
+ retval = (1 - cos(findex * M_PI )) / 2 ;
+ break;
+
+ case FADE_LOG : /* logaritmic */
+ /* 5 means 100 db attenuation. */
+ /* todo: should this be adopted with bit depth */
+ retval = pow(0.1, (1 - findex) * 5);
+ break;
+
+ case FADE_PAR : /* inverted parabola */
+ retval = (1 - (1 - findex) * (1 - findex));
+ break;
+
+ /* todo: more fade curves? */
+ default : /* Error indicating wrong fade curve */
+ retval = -1.0;
+ break;
+ } /* endswitch */
+
+ return retval;
+}