--- rockbox/apps/codecs/libspeex/math_approx.c	2006-07-21 18:18:52.000000000 +0200
+++ rockbox/apps/codecs/libspeex/math_approx.c	2006-07-21 20:06:33.000000000 +0200
@@ -104,7 +104,8 @@
    return rt;
 }
 
-  int fastSqrt(int x) {
+  static int intSqrt(int x) {
+    int xn;
    static int sqrt_table[256] = {
      0,    16,  22,  27,  32,  35,  39,  42,  45,  48,  50,  53,  55,  57,
      59,   61,  64,  65,  67,  69,  71,  73,  75,  76,  78,  80,  81,  83,
@@ -130,58 +131,82 @@
       if (x >= 0x1000000) {
         if (x >= 0x10000000) {
           if (x >= 0x40000000) {
-            return (sqrt_table[x >> 24] << 8);
+            xn = sqrt_table[x >> 24] << 8;
           } else {
-            return (sqrt_table[x >> 22] << 7);
+            xn = sqrt_table[x >> 22] << 7;
           }
-        } else if (x >= 0x4000000) {
-          return (sqrt_table[x >> 20] << 6);
         } else {
-          return (sqrt_table[x >> 18] << 5);
+          if (x >= 0x4000000) {
+            xn = sqrt_table[x >> 20] << 6;
+          } else {
+            xn = sqrt_table[x >> 18] << 5;
+          }
         }
-      } else if (x >= 0x100000) {
-        if (x >= 0x400000) {
-          return (sqrt_table[x >> 16] << 4);
+
+        xn = (xn + 1 + (x / xn)) >> 1;
+        xn = (xn + 1 + (x / xn)) >> 1;
+        return ((xn * xn) > x) ? --xn : xn;
+      } else {
+        if (x >= 0x100000) {
+          if (x >= 0x400000) {
+            xn = sqrt_table[x >> 16] << 4;
+          } else {
+            xn = sqrt_table[x >> 14] << 3;
+          }
         } else {
-          return (sqrt_table[x >> 14] << 3);
+          if (x >= 0x40000) {
+            xn = sqrt_table[x >> 12] << 2;
+          } else {
+            xn = sqrt_table[x >> 10] << 1;
+          }
         }
-      } else if (x >= 0x40000) {
-        return (sqrt_table[x >> 12] << 2);
-      } else {
-        return (sqrt_table[x >> 10] << 1);
+
+        xn = (xn + 1 + (x / xn)) >> 1;
+
+        return ((xn * xn) > x) ? --xn : xn;
       }
-    } else if (x >= 0x100) {
-      if (x >= 0x1000) {
-        if (x >= 0x4000) {
-          return (sqrt_table[x >> 8]);
+    } else {
+      if (x >= 0x100) {
+        if (x >= 0x1000) {
+          if (x >= 0x4000) {
+            xn = (sqrt_table[x >> 8]) + 1;
+          } else {
+            xn = (sqrt_table[x >> 6] >> 1) + 1;
+          }
         } else {
-          return (sqrt_table[x >> 6] >> 1);
+          if (x >= 0x400) {
+            xn = (sqrt_table[x >> 4] >> 2) + 1;
+          } else {
+            xn = (sqrt_table[x >> 2] >> 3) + 1;
+          }
         }
-      } else if (x >= 0x400) {
-        return (sqrt_table[x >> 4] >> 2);
+
+        return ((xn * xn) > x) ? --xn : xn;
       } else {
-        return (sqrt_table[x >> 2] >> 3);
+        if (x >= 0) {
+          return sqrt_table[x] >> 4;
+        }
       }
-    } else if (x >= 0) {
-      return sqrt_table[x] >> 4;
     }
+    
     return -1;
   }
 
 float spx_sqrtf(float arg)
 {
-	if((int)arg==0)
+	if(arg==0.0)
 		return 0.0;
-	else if((int)arg==1)
+	else if(arg==1.0)
 		return 1.0;
-	else if((int)arg==2)
+	else if(arg==2.0)
 		return 1.414;
 	else if(arg==3.27)
 		return 1.8083;
-	//printf("Sqrt:%d:%d:%d\n",arg,(fastSqrt((int)(arg*2500)))/50,(float)spx_sqrt((spx_word32_t)arg));
+	//printf("Sqrt:%f:%f:%f\n",arg,(((float)intSqrt((int)(arg*10000)))/100)+0.0055,(float)spx_sqrt((spx_word32_t)arg));
 	//return ((float)fastSqrt((int)(arg*2500)))/50;
-	
-	return (float)spx_sqrt((spx_word32_t)arg);
+	//LOGF("Sqrt:%d:%d\n",arg,(intSqrt((int)(arg*2500)))/50);
+	return (((float)intSqrt((int)(arg*10000)))/100)+0.0055;//(float)spx_sqrt((spx_word32_t)arg);
+	//return 1;
 }
 
 
