These macros are type-safe and evaluate their arguments only once.
However, they are also slow. For the compress filter we are dealing
with ints and unsigned ints only, so the additional checks performed
by the macros only slow things down. Getting rid of the macros reduces
the running time of
para_filter -f compress < foo.wav > /dev/null
by approximately 8%.
op = para_malloc(length);
for (i = 0; i < length / 2; i++) {
/* be careful in that heat, my dear */
op = para_malloc(length);
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;
+ int sample = *ip++, adjusted_sample;
+
+ adjusted_sample = sample > 0? sample : -sample;
+ adjusted_sample *= pcd->current_gain;
+ adjusted_sample >>= gain_shift;
if (adjusted_sample > 32767) { /* clip */
PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
sample, adjusted_sample);
if (adjusted_sample > 32767) { /* clip */
PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
sample, adjusted_sample);
pcd->current_gain = (3 * pcd->current_gain +
(1 << pcd->conf->inertia_arg)) / 4;
pcd->peak = 0;
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);
+ } else if (adjusted_sample > pcd->peak)
+ pcd->peak = adjusted_sample;
op[i] = sample >= 0? adjusted_sample : -adjusted_sample;
if (++pcd->num_samples & mask)
continue;
op[i] = sample >= 0? adjusted_sample : -adjusted_sample;
if (++pcd->num_samples & mask)
continue;