#include "sched.h"
#include "filter.h"
#include "string.h"
+#include "audiod.h"
/** The size of the output data buffer. */
#define COMPRESS_CHUNK_SIZE 40960
+extern char *stat_item_values[NUM_STAT_ITEMS];
+
/** Data specific to the compress filter. */
struct private_compress_data {
/** The current multiplier. */
unsigned num_samples;
/** Absolute value of the maximal sample in the current block. */
unsigned peak;
+ /** Amplification factor. */
+ unsigned amp;
};
static ssize_t compress(char *inbuf, size_t inbuf_len, struct filter_node *fn)
return 0;
for (i = 0; i < length / 2; i++) {
/* be careful in that heat, my dear */
- int sample = *ip++, adjusted_sample;
+ int sample = *ip++, adjusted_sample = (PARA_ABS(sample) * (64 + pcd->amp)) >> 6;
- adjusted_sample = (PARA_ABS(sample) * pcd->current_gain)
- >> gain_shift;
+ adjusted_sample = (adjusted_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);
fn->buf = para_malloc(fn->bufsize);
pcd->current_gain = 1 << pcd->conf->inertia_arg;
pcd->max_gain = 1 << (pcd->conf->inertia_arg + pcd->conf->aggressiveness_arg);
+ if (stat_item_values[SI_AMPLIFICATION])
+ sscanf(stat_item_values[SI_AMPLIFICATION], "%u", &pcd->amp);
+ PARA_NOTICE_LOG("amplification: %u (scaling factor: %1.2f)\n", pcd->amp,
+ pcd->amp / 64.0 + 1.0);
}
/**