]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
compress: Avoid PARA_ABS and PARA_MAX in inner loop.
authorAndre Noll <maan@systemlinux.org>
Tue, 2 Apr 2013 15:02:09 +0000 (15:02 +0000)
committerAndre Noll <maan@systemlinux.org>
Sun, 21 Apr 2013 13:39:32 +0000 (15:39 +0200)
These macros are type-safe and evaluate their arguments only once.
However, they are also slow. For the compress filter we are dealing
with ints and unsigned ints only, so the additional checks performed
by the macros only slow things down. Getting rid of the macros reduces
the running time of

para_filter -f compress < foo.wav > /dev/null

by approximately 8%.

compress_filter.c

index 04377b752a89cf83ba33532e4d24542e9d06a064..cf55985cbb6b2abc82a290a50f3d401420bdc078 100644 (file)
@@ -75,8 +75,11 @@ next_buffer:
                op = para_malloc(length);
        for (i = 0; i < length / 2; i++) {
                /* be careful in that heat, my dear */
                op = para_malloc(length);
        for (i = 0; i < length / 2; i++) {
                /* be careful in that heat, my dear */
-               int sample = *ip++, adjusted_sample = (PARA_ABS(sample) *
-                       pcd->current_gain) >> gain_shift;
+               int sample = *ip++, adjusted_sample;
+
+               adjusted_sample = sample > 0? sample : -sample;
+               adjusted_sample *= pcd->current_gain;
+               adjusted_sample >>= gain_shift;
                if (adjusted_sample > 32767) { /* clip */
                        PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
                                sample, adjusted_sample);
                if (adjusted_sample > 32767) { /* clip */
                        PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
                                sample, adjusted_sample);
@@ -84,8 +87,8 @@ next_buffer:
                        pcd->current_gain = (3 * pcd->current_gain +
                                (1 << pcd->conf->inertia_arg)) / 4;
                        pcd->peak = 0;
                        pcd->current_gain = (3 * pcd->current_gain +
                                (1 << pcd->conf->inertia_arg)) / 4;
                        pcd->peak = 0;
-               } else
-                       pcd->peak = PARA_MAX(pcd->peak, adjusted_sample);
+               } else if (adjusted_sample > pcd->peak)
+                       pcd->peak = adjusted_sample;
                op[i] = sample >= 0? adjusted_sample : -adjusted_sample;
                if (++pcd->num_samples & mask)
                        continue;
                op[i] = sample >= 0? adjusted_sample : -adjusted_sample;
                if (++pcd->num_samples & mask)
                        continue;