ref: b4e5bf240085d7fa7078556a1842b47a1cd1bdf1
parent: c694b451670e3c54ce38844504bd59c3944507bd
author: cbagwell <cbagwell>
date: Sun Sep 11 13:53:10 EDT 2005
Allow "swap 1 1" to work.
--- a/src/swap.c
+++ b/src/swap.c
@@ -15,7 +15,8 @@
/* Private data for SKEL file */
typedef struct swapstuff {
- int order[4];
+ int order[4];
+ int def_opts;
} *swap_t;
/*
@@ -31,45 +32,28 @@
swap->order[0] = swap->order[1] = swap->order[2] = swap->order[3] = 0;
if (n)
{
- if (n != 2 && n != 4)
- {
- st_fail("Usage: swap [1 2 | 1 2 3 4]");
- return (ST_EOF);
- }
- else if (n == 2)
- {
- sscanf(argv[0],"%d",&swap->order[0]);
- sscanf(argv[1],"%d",&swap->order[1]);
- }
- 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]);
- }
-
- /* Some basic error checking */
- if (swap->order[0] < 1 || swap->order[0] > 4)
- swap->order[0] = 1;
- if (swap->order[1] < 1 || swap->order[1] > 4)
- swap->order[1] = 1;
-
- /* If 2 and 3 weren't specified, this logic still forces
- * it to equal 0 (our default)
- */
- if (swap->order[2] < 1 || swap->order[2] > 4)
- swap->order[2] = 1;
- if (swap->order[3] < 1 || swap->order[3] > 4)
- swap->order[3] = 1;
-
- /* Convert to array offsets */
- swap->order[0]--;
- swap->order[1]--;
- swap->order[2]--;
- swap->order[3]--;
-
+ swap->def_opts = 0;
+ if (n != 2 && n != 4)
+ {
+ st_fail("Usage: swap [1 2 | 1 2 3 4]");
+ return (ST_EOF);
+ }
+ else if (n == 2)
+ {
+ sscanf(argv[0],"%d",&swap->order[0]);
+ sscanf(argv[1],"%d",&swap->order[1]);
+ }
+ 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]);
+ }
}
+ else
+ swap->def_opts = 1;
+
return (ST_SUCCESS);
}
@@ -83,36 +67,51 @@
if (effp->outinfo.channels == 1)
{
- st_fail("Can't swap channels on mono data.");
- return (ST_EOF);
+ st_fail("Can't swap channels on mono data.");
+ return (ST_EOF);
}
if (effp->outinfo.channels == 2)
{
- if (swap->order[2] || swap->order[3])
+ if (swap->def_opts)
{
- st_fail("invalid swap channel options used");
+ swap->order[0] = 2;
+ swap->order[1] = 1;
}
- if (swap->order[0] != 0 && swap->order[0] != 1)
- st_fail("invalid swap channel options used");
- if (swap->order[1] != 0 && swap->order[1] != 1)
- st_fail("invalid swap channel options used");
+
+ if (swap->order[2] || swap->order[3])
+ {
+ st_fail("invalid swap channel options used");
+ }
+ if (swap->order[0] != 1 && swap->order[0] != 2)
+ st_fail("invalid swap channel options used");
+ if (swap->order[1] != 1 && swap->order[1] != 2)
+ st_fail("invalid swap channel options used");
+
+ /* Convert to array offsets */
+ swap->order[0]--;
+ swap->order[1]--;
}
if (effp->outinfo.channels == 4)
{
- if (!swap->order[2] && !swap->order[3])
- st_fail("invalid swap channel options used");
- }
+ if (swap->def_opts)
+ {
+ swap->order[0] = 2;
+ swap->order[1] = 1;
+ swap->order[2] = 4;
+ swap->order[3] = 3;
+ }
- /* 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;
+ if (!swap->order[2] && !swap->order[3])
+ st_fail("invalid swap channel options used");
+
+ /* Convert to array offsets */
+ swap->order[0]--;
+ swap->order[1]--;
+ swap->order[2]--;
+ swap->order[3]--;
+
}
return (ST_SUCCESS);
@@ -131,43 +130,43 @@
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[swap->order[0]];
- obuf[1] = ibuf[swap->order[1]];
- /* Advance buffer by 2 samples */
- ibuf += 2;
- obuf += 2;
- }
-
- *isamp = len * 2;
- *osamp = len * 2;
-
- break;
-
+ /* 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[swap->order[0]];
+ obuf[1] = ibuf[swap->order[1]];
+ /* Advance buffer by 2 samples */
+ ibuf += 2;
+ obuf += 2;
+ }
+
+ *isamp = len * 2;
+ *osamp = len * 2;
+
+ break;
+
case 4:
- /* 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 */
- ibuf += 4;
- obuf += 4;
- }
- *isamp = len * 4;
- *osamp = len * 4;
-
- break;
+ /* 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 */
+ ibuf += 4;
+ obuf += 4;
+ }
+ *isamp = len * 4;
+ *osamp = len * 4;
+
+ break;
}
return (ST_SUCCESS);
}
@@ -178,16 +177,16 @@
int st_swap_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp)
{
- *osamp = 0;
- return (ST_SUCCESS);
+ *osamp = 0;
+ return (ST_SUCCESS);
}
/*
* Do anything required when you stop reading samples.
- * (free allocated memory, etc.)
+ * (free allocated memory, etc.)
*/
int st_swap_stop(eff_t effp)
{
- /* nothing to do */
+ /* nothing to do */
return (ST_SUCCESS);
}