summaryrefslogtreecommitdiff
path: root/Modules/audioop.c
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1993-02-23 13:39:57 +0000
committerJack Jansen <jack.jansen@cwi.nl>1993-02-23 13:39:57 +0000
commite049243fb6962e4a3baa05e29a1bc9969bce4ac7 (patch)
tree121ebb3b0b8f00e30152a154502a6d5842085515 /Modules/audioop.c
parent5fffa4d0ff5af360b55b4bc8d977e719429a12e6 (diff)
downloadcpython-e049243fb6962e4a3baa05e29a1bc9969bce4ac7.tar.gz
Added audioop.reverse() which reverses an audio sample
Diffstat (limited to 'Modules/audioop.c')
-rw-r--r--Modules/audioop.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 385a2f9fea..bfc6fda28b 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -822,6 +822,45 @@ audioop_bias(self, args)
}
static object *
+audioop_reverse(self, args)
+ object *self;
+ object *args;
+{
+ signed char *cp;
+ unsigned char *ncp;
+ int len, size, val;
+ object *rv;
+ int i, j;
+
+ if ( !getargs(args, "(s#i)",
+ &cp, &len, &size) )
+ return 0;
+
+ if ( size != 1 && size != 2 && size != 4 ) {
+ err_setstr(AudioopError, "Size should be 1, 2 or 4");
+ return 0;
+ }
+
+ rv = newsizedstringobject(NULL, len);
+ if ( rv == 0 )
+ return 0;
+ ncp = (unsigned char *)getstringvalue(rv);
+
+ for ( i=0; i < len; i += size ) {
+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+
+ j = len - i - size;
+
+ if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
+ else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
+ else if ( size == 4 ) *LONGP(ncp, j) = (long)(val<<16);
+ }
+ return rv;
+}
+
+static object *
audioop_lin2lin(self, args)
object *self;
object *args;
@@ -1286,6 +1325,7 @@ static struct methodlist audioop_methods[] = {
{ "tomono", audioop_tomono },
{ "tostereo", audioop_tostereo },
{ "getsample", audioop_getsample },
+ { "reverse", audioop_reverse },
{ 0, 0 }
};