shithub: sox

Download patch

ref: dd388d7b9611a79af627c010a3e6173e199019a3
parent: f946c5325bca769ee6b2b0f69bd62843a551f9fb
author: cbagwell <cbagwell>
date: Fri Apr 2 20:32:59 EST 1999

Adding swap effect

--- /dev/null
+++ b/src/swap.c
@@ -1,0 +1,143 @@
+/*
+ * swap - effect to swap ordering of channels in multi-channel audio.
+ *
+ * Written by Chris Bagwell (cbagwell@sprynet.com) - March 16, 1999
+ *
+  * 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.
+ */
+
+
+#include "st.h"
+
+/* Private data for SKEL file */
+typedef struct swapstuff {
+    int		order[4];
+} *swap_t;
+
+/*
+ * Process options
+ *
+ * Don't do initialization now.
+ * The 'info' fields are not yet filled in.
+ */
+void swap_getopts(effp, n, argv) 
+eff_t effp;
+int n;
+char **argv;
+{
+    swap_t swap = (swap_t) effp->priv;
+
+    swap->order[0] = swap->order[1] = swap->order[2] = swap->order[3] = 0;
+    if (n)
+    {
+	if (n != 4)
+	{
+	    fail("Usage: swap [1 2 3 4]");
+	}
+	else
+	{
+	    sscanf(argv[0],"%d",&swap->order[0]);
+	    sscanf(argv[1],"%d",&swap->order[1]);
+	    sscanf(argv[2],"%d",&swap->order[2]);
+	    sscanf(argv[3],"%d",&swap->order[3]);
+	}
+    }
+}
+
+/*
+ * Prepare processing.
+ * Do all initializations.
+ */
+swap_start(effp)
+eff_t effp;
+{
+    if (effp->outinfo.channels == 1)
+	fail("Can't swap channels on mono data.");
+}
+
+/*
+ * Processed signed long samples from ibuf to obuf.
+ * Return number of samples processed.
+ */
+
+void swap_flow(effp, ibuf, obuf, isamp, osamp)
+eff_t effp;
+LONG *ibuf, *obuf;
+int *isamp, *osamp;
+{
+    swap_t swap = (swap_t) effp->priv;
+    int len, done;
+
+    switch (effp->outinfo.channels)
+    {
+    case 2:
+	/* Length to process will be buffer length / 2 since we
+	 * work with two samples at a time.
+	 */
+	len = ((*isamp > *osamp) ? *osamp : *isamp) / 2;
+	for(done = 0; done < len; done++)
+	{
+	    obuf[0] = ibuf[1];
+	    obuf[1] = ibuf[0];
+	    /* Advance buffer by 2 samples */
+	    obuf += 2;
+	}
+	
+	*isamp = len * 2;
+	*osamp = len * 2;
+	
+	break;
+	
+    case 4:
+	/* If nothing set then default to the following order */
+	if (!swap->order[0] && !swap->order[1] &&
+	    !swap->order[2] && !swap->order[3])
+	{
+	    swap->order[0] = 1;
+	    swap->order[1] = 0;
+	    swap->order[2] = 3;
+	    swap->order[3] = 2;
+	}
+	/* Length to process will be buffer length / 4 since we
+	 * work with four samples at a time.
+	 */
+	len = ((*isamp > *osamp) ? *osamp : *isamp) / 4;
+	for(done = 0; done < len; done++)
+	{
+	    obuf[0] = ibuf[swap->order[0]];
+	    obuf[1] = ibuf[swap->order[1]];
+	    obuf[2] = ibuf[swap->order[2]];
+	    obuf[3] = ibuf[swap->order[3]];
+	    /* Advance buffer by 2 samples */
+	    obuf += 4;
+	}
+	*isamp = len * 4;
+	*osamp = len * 4;
+	
+	break;
+}
+
+/*
+ * Drain out remaining samples if the effect generates any.
+ */
+
+void swap_drain(effp, obuf, osamp)
+LONG *obuf;
+int *osamp;
+{
+	*osamp = 0;
+}
+
+/*
+ * Do anything required when you stop reading samples.  
+ *	(free allocated memory, etc.)
+ */
+void swap_stop(effp)
+eff_t effp;
+{
+	/* nothing to do */
+}