Added lin2lin, findmax, findfactor and fintfit routines
diff --git a/Modules/audioop.c b/Modules/audioop.c
index f8810d3..92152b9 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -271,6 +271,46 @@
 }
 
 static object *
+audioop_rms2(self, args)
+    object *self;
+    object *args;
+{
+    signed char *cp1, *cp2;
+    int len1, len2, size, val1, val2;
+    int i;
+    float sum_squares = 0.0;
+
+    if ( !getargs(args, "(s#s#i)", &cp1, &len1, &cp2, &len2, &size) )
+      return 0;
+    if ( size != 1 && size != 2 && size != 4 ) {
+	err_setstr(AudioopError, "Size should be 1, 2 or 4");
+	return 0;
+    }
+    if ( len1 != len2 ) {
+	err_setstr(AudioopError, "Samples should be same size");
+	return 0;
+    }
+    for ( i=0; i<len1; i+= size) {
+	if ( size == 1 ) {
+	    val1 = (int)*CHARP(cp1, i);
+	    val2 = (int)*CHARP(cp2, i);
+	} else if ( size == 2 ) {
+	    val1 = (int)*SHORTP(cp1, i);
+	    val2 = (int)*SHORTP(cp2, i);
+	} else if ( size == 4 ) {
+	    val1 = (int)*LONGP(cp1, i);
+	    val2 = (int)*LONGP(cp2, i);
+	}
+	sum_squares += (float)val1*(float)val2;
+    }
+    if ( len1 == 0 )
+      val1 = 0;
+    else
+      val1 = (int)sqrt(sum_squares / (float)(len1/size));
+    return newintobject(val1);
+}
+
+static object *
 audioop_avgpp(self, args)
     object *self;
     object *args;
@@ -731,6 +771,11 @@
 	return 0;
     }
     
+    str = newsizedstringobject(NULL, len/size);
+    if ( str == 0 )
+      return 0;
+    ncp = (signed char *)getstringvalue(str);
+
     /* Decode state, should have (value, step) */
     if ( state == None ) {
 	/* First time, it seems. Set defaults */
@@ -739,11 +784,6 @@
     } else if ( !getargs(state, "(ii)", &valprev, &step) )
       return 0;
 
-    str = newsizedstringobject(NULL, len/size);
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-
     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);
@@ -861,6 +901,11 @@
 	return 0;
     }
     
+    str = newsizedstringobject(NULL, len/(size*2));
+    if ( str == 0 )
+      return 0;
+    ncp = (signed char *)getstringvalue(str);
+
     /* Decode state, should have (value, step) */
     if ( state == None ) {
 	/* First time, it seems. Set defaults */
@@ -870,11 +915,6 @@
     } else if ( !getargs(state, "(ii)", &valpred, &index) )
       return 0;
 
-    str = newsizedstringobject(NULL, len/(size*2));
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-
     step = stepsizeTable[index];
     bufferstep = 1;
 
@@ -1048,6 +1088,7 @@
     { "maxpp", audioop_maxpp },
     { "avgpp", audioop_avgpp },
     { "rms", audioop_rms },
+    { "rms2", audioop_rms2 },
     { "cross", audioop_cross },
     { "mul", audioop_mul },
     { "add", audioop_add },