compress.c: Simplify volume adjusting code.
authorAndre Noll <maan@systemlinux.org>
Sat, 9 Feb 2008 19:32:36 +0000 (20:32 +0100)
committerAndre Noll <maan@systemlinux.org>
Sat, 9 Feb 2008 19:32:36 +0000 (20:32 +0100)
There's no need to distinguish the cases sample > 0 and
sample < 0. Work with its absolute value instead and get
rid of some similar code in the hot path.

Also print a log message in case clipping occurs.

compress.c

index 1ea4110..579a6ab 100644 (file)
@@ -51,30 +51,18 @@ static ssize_t compress(char *inbuf, size_t inbuf_len, struct filter_node *fn)
                /* be careful in that heat, my dear */
                int sample = *ip++, adjusted_sample;
 
-               if (sample > 0) {
-                       adjusted_sample = (sample * pcd->current_gain)
-                               >> gain_shift;
-                       if (unlikely(adjusted_sample > 32767)) {
-                               adjusted_sample = 32767;
-                               pcd->current_gain = (3 * pcd->current_gain +
-                                       (1 << pcd->conf->inertia_arg)) / 4;
-                               pcd->peak = 0;
-                       } else
-                               if (adjusted_sample > pcd->peak)
-                                       pcd->peak = adjusted_sample;
-               } else {
-                       adjusted_sample = -((-sample * pcd->current_gain)
-                               >> gain_shift);
-                       if (unlikely(adjusted_sample < -32768)) {
-                               adjusted_sample = -32768;
-                               pcd->current_gain = (3 * pcd->current_gain +
-                                       (1 << pcd->conf->inertia_arg)) / 4;
-                               pcd->peak = 0;
-                       } else
-                               if (-adjusted_sample > pcd->peak)
-                                       pcd->peak = -adjusted_sample;
-               }
-               *op++ = adjusted_sample;
+               adjusted_sample = (PARA_ABS(sample) * pcd->current_gain)
+                       >> gain_shift;
+               if (unlikely(adjusted_sample > 32767)) { /* clip */
+                       PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
+                               sample, adjusted_sample);
+                       adjusted_sample = 32767;
+                       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);
+               *op++ = sample >= 0? adjusted_sample : -adjusted_sample;
                if (likely(++pcd->num_samples & mask))
                        continue;
                if (pcd->peak < pcd->conf->target_level_arg) {
@@ -84,10 +72,9 @@ static ssize_t compress(char *inbuf, size_t inbuf_len, struct filter_node *fn)
                        if (pcd->current_gain > pcd->min_gain + 1)
                                pcd->current_gain -= 2;
                }
-//             PARA_DEBUG_LOG("gain: %lu, peak: %d\n", pcd->current_gain,
-//                     pcd->peak);
+               PARA_DEBUG_LOG("gain: %lu, peak: %d\n", pcd->current_gain,
+                       pcd->peak);
                pcd->peak = 0;
-//             PARA_INFO_LOG("sample: %lu\n", ABS(sample));
        }
        fn->loaded += length;
        return length;