From e0441a354b25f6fdd97480fe4e1f4f942347611f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 23 Jul 2018 10:52:14 +0200 Subject: [PATCH 1/1] compress: Apply damping later. 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 | 7 ++++--- m4/lls/filter_cmd.suite.m4 | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/compress_filter.c b/compress_filter.c index f98fb413..0c76fd78 100644 --- a/compress_filter.c +++ b/compress_filter.c @@ -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++; diff --git a/m4/lls/filter_cmd.suite.m4 b/m4/lls/filter_cmd.suite.m4 index 1399de62..dece6e6e 100644 --- a/m4/lls/filter_cmd.suite.m4 +++ b/m4/lls/filter_cmd.suite.m4 @@ -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 -- 2.39.2