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.
size_t length, i;
int16_t *ip, *op;
uint32_t inertia = U32_OPTVAL(INERTIA, fn->lpr);
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);
//inplace = false;
next_buffer:
ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
neg = true;
}
sample *= pcd->current_gain;
neg = true;
}
sample *= pcd->current_gain;
+ sample >>= inertia + 1;
if (sample > 32767) { /* clip */
PARA_WARNING_LOG("clip: %d\n", sample);
sample = 32767;
if (sample > 32767) { /* clip */
PARA_WARNING_LOG("clip: %d\n", sample);
sample = 32767;
pcd->peak = 0;
} else if (sample > pcd->peak)
pcd->peak = sample;
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);
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++;
if (pcd->peak < U32_OPTVAL(TARGET_LEVEL, fn->lpr)) {
if (pcd->current_gain < pcd->max_gain)
pcd->current_gain++;
typestr = level
arg_info = required_arg
arg_type = uint32
typestr = level
arg_info = required_arg
arg_type = uint32
[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
[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