From 64e8616027238f6ef1933ccef14a2e031552db79 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 9 Feb 2008 20:32:36 +0100 Subject: [PATCH] compress.c: Simplify volume adjusting code. 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 | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/compress.c b/compress.c index 1ea41107..579a6ab6 100644 --- a/compress.c +++ b/compress.c @@ -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; -- 2.39.2