compress.c: Activate pre-amplification.
authorAndre Noll <maan@systemlinux.org>
Sun, 6 Jul 2008 18:26:12 +0000 (20:26 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 6 Jul 2008 18:26:12 +0000 (20:26 +0200)
Use the amplification value announced by para_server to
pre-amplify the stream.

compress.c
filter.c

index a6c3d32..dd77de8 100644 (file)
 #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. */
@@ -32,6 +35,8 @@ struct private_compress_data {
        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)
@@ -47,10 +52,9 @@ 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);
@@ -102,6 +106,10 @@ static void open_compress(struct filter_node *fn)
        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);
 }
 
 /**
index 939f9b5..bab827d 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -17,6 +17,8 @@
 #include "stdout.h"
 #include "error.h"
 
+char *stat_item_values[NUM_STAT_ITEMS] = {NULL};
+
 /** Initialize the array of errors for para_filter. */
 INIT_FILTER_ERRLISTS;