]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
compress: Apply damping later.
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 23 Jul 2018 08:52:14 +0000 (10:52 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 2 Sep 2018 15:42:54 +0000 (17:42 +0200)
This changes the algorithm of the compress filter to apply the right
shift defined by the --damp argument *after* the peak value of the
current block has been computed. This makes damping orthogonal to
the dynamic volume adjustments.

However, we increase the downshift so that the initial value of the
gain multiplier results in a right shift by one. Hence the expected
peak value is 16384, so make this the default target gain.

compress_filter.c
m4/lls/filter_cmd.suite.m4

index f98fb413b2498311d25299fe9dfabfcad87af823..0c76fd785123a83bd1b7fb660ecb6157da2a47eb 100644 (file)
@@ -48,8 +48,7 @@ static int compress_post_select(__a_unused struct sched *s, void *context)
        size_t length, i;
        int16_t *ip, *op;
        uint32_t inertia = U32_OPTVAL(INERTIA, fn->lpr);
-       unsigned gain_shift = inertia + U32_OPTVAL(DAMP, fn->lpr),
-               mask = (1U << U32_OPTVAL(BLOCKSIZE, fn->lpr)) - 1U;
+       unsigned mask = (1U << U32_OPTVAL(BLOCKSIZE, fn->lpr)) - 1U;
        //inplace = false;
 next_buffer:
        ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
@@ -78,7 +77,7 @@ next_buffer:
                        neg = true;
                }
                sample *= pcd->current_gain;
-               sample >>= gain_shift;
+               sample >>= inertia + 1;
                if (sample > 32767) { /* clip */
                        PARA_WARNING_LOG("clip: %d\n", sample);
                        sample = 32767;
@@ -87,11 +86,13 @@ next_buffer:
                        pcd->peak = 0;
                } else if (sample > pcd->peak)
                        pcd->peak = sample;
+               sample >>= U32_OPTVAL(DAMP, fn->lpr);
                op[i] = neg? -sample : sample;
                if (++pcd->num_samples & mask)
                        continue;
 //             PARA_DEBUG_LOG("gain: %u, peak: %u\n", pcd->current_gain,
 //                     pcd->peak);
+
                if (pcd->peak < U32_OPTVAL(TARGET_LEVEL, fn->lpr)) {
                        if (pcd->current_gain < pcd->max_gain)
                                pcd->current_gain++;
index 1399de62e8e38cfb955e9b16a8788aa6cd684c75..dece6e6e54f9c90429c4fe14d070b8dea6cdb1de 100644 (file)
@@ -61,7 +61,7 @@ caption = filters
                typestr = level
                arg_info = required_arg
                arg_type = uint32
-               default_val = 20000
+               default_val = 16384
                [help]
                        If the peak of the previous block is less than the target level,
                        volume is increased slightly for the next block. Otherwise it is