-static ssize_t compress(char *inbuf, size_t inbuf_len, struct filter_node *fn)
-{
- size_t i, length = PARA_MIN((inbuf_len / 2) * 2,
- (fn->bufsize - fn->loaded) / 2 * 2);
- struct private_compress_data *pcd = fn->private_data;
- int16_t *ip = (int16_t *)inbuf, *op = (int16_t *)(fn->buf + fn->loaded);
- unsigned gain_shift = pcd->conf->inertia_arg + pcd->conf->damp_arg,
- mask = (1 << pcd->conf->blocksize_arg) - 1;
-
- if (!length)
- return 0;
- for (i = 0; i < length / 2; i++) {
- /* be careful in that heat, my dear */
- int sample = *ip++, adjusted_sample = (PARA_ABS(sample) *
- pcd->current_gain) >> gain_shift;
- if (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 (++pcd->num_samples & mask)
- continue;
-// PARA_DEBUG_LOG("gain: %u, peak: %u\n", pcd->current_gain,
-// pcd->peak);
- if (pcd->peak < pcd->conf->target_level_arg) {
- if (pcd->current_gain < pcd->max_gain)
- pcd->current_gain++;
- } else
- pcd->current_gain = PARA_MAX(pcd->current_gain - 2,
- 1U << pcd->conf->inertia_arg);
- pcd->peak = 0;
- }
- fn->loaded += length;
- return length;
-}
-
-static void close_compress(struct filter_node *fn)