]> code.delx.au - pulseaudio/commitdiff
echo-cancel: keep frame_size a power of 2
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 31 Aug 2010 16:04:33 +0000 (18:04 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 2 Sep 2010 15:31:37 +0000 (17:31 +0200)
The speex echo canceler prefers a power of 2 for the frame size. Round down the
ideal frame_size to the nearest power of two. This makes sure we don't create
more than the requested frame_size_ms latency while still providing a power of 2
to the speex echo canceller.

src/modules/module-echo-cancel.c

index 4d44bf73ab1849064258535905ccb580a3d33f8b..d6c2ca1442b8a0ba1c4d3625177b14b5125e7999 100644 (file)
@@ -1269,7 +1269,7 @@ int pa__init(pa_module*m) {
     pa_source_new_data source_data;
     pa_sink_new_data sink_data;
     pa_memchunk silence;
-    int framelen, rate;
+    int framelen, rate, y;
     uint32_t frame_size_ms, filter_size_ms;
     uint32_t adjust_time_sec;
 
@@ -1323,6 +1323,13 @@ int pa__init(pa_module*m) {
     u->frame_size_ms = frame_size_ms;
     rate = ss.rate;
     framelen = (rate * frame_size_ms) / 1000;
+
+    /* framelen should be a power of 2, round down to nearest power of two */
+    y = 1 << ((8 * sizeof (int)) - 2);
+    while (y > framelen)
+      y >>= 1;
+    framelen = y;
+
     u->blocksize = framelen * pa_frame_size (&ss);
     pa_log_debug ("Using framelen %d, blocksize %lld, channels %d, rate %d", framelen, (long long) u->blocksize,
         ss.channels, ss.rate);