summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2006-04-17 21:04:57 +0000
committerMagnus Holmgren <magnushol@gmail.com>2006-04-17 21:04:57 +0000
commit4b3a00703ded20b5c90bf397fa5483a57c28180e (patch)
tree9e6e1a03518c4e624ff139aa18ab008dc74b4fa3
parent7f5fb7bbd9fbb875ad83088c151ab04b3a3f203f (diff)
downloadrockbox-4b3a00703ded20b5c90bf397fa5483a57c28180e.zip
rockbox-4b3a00703ded20b5c90bf397fa5483a57c28180e.tar.gz
rockbox-4b3a00703ded20b5c90bf397fa5483a57c28180e.tar.bz2
rockbox-4b3a00703ded20b5c90bf397fa5483a57c28180e.tar.xz
Fix the use of equalizer pre-cut in combination with replaygain.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9711 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/dsp.c118
1 files changed, 66 insertions, 52 deletions
diff --git a/apps/dsp.c b/apps/dsp.c
index 0ef5e0e..4ea2a0c 100644
--- a/apps/dsp.c
+++ b/apps/dsp.c
@@ -45,7 +45,7 @@
#define NATIVE_DEPTH 16
#define SAMPLE_BUF_SIZE 256
#define RESAMPLE_BUF_SIZE (256 * 4) /* Enough for 11,025 Hz -> 44,100 Hz*/
-#define DEFAULT_REPLAYGAIN 0x01000000
+#define DEFAULT_GAIN 0x01000000
#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
@@ -174,7 +174,7 @@ struct dsp_config
long album_gain;
long track_peak;
long album_peak;
- long replaygain; /* Note that this is in S8.23 format. */
+ long replaygain;
int sample_depth;
int sample_bytes;
int stereo_mode;
@@ -183,7 +183,8 @@ struct dsp_config
bool new_gain;
bool crossfeed_enabled;
bool eq_enabled;
- long eq_precut; /* Note that this is in S8.23 format. */
+ long eq_precut;
+ long gain; /* Note that this is in S8.23 format. */
};
struct resample_data
@@ -589,6 +590,31 @@ void apply_crossfeed(int32_t* src[], int count)
}
#endif
+/* Combine all gains to a global gain. */
+static void set_gain(void)
+{
+ dsp->gain = DEFAULT_GAIN;
+
+ if (dsp->replaygain)
+ {
+ dsp->gain = dsp->replaygain;
+ }
+
+ if (dsp->eq_enabled && dsp->eq_precut)
+ {
+ dsp->gain = (long) (((int64_t) dsp->gain * dsp->eq_precut) >> 24);
+ }
+
+ if (dsp->gain == DEFAULT_GAIN)
+ {
+ dsp->gain = 0;
+ }
+ else
+ {
+ dsp->gain >>= 1;
+ }
+}
+
/**
* Use to enable the equalizer.
*
@@ -606,8 +632,8 @@ void dsp_set_eq(bool enable)
*/
void dsp_set_eq_precut(int precut)
{
- /* Needs to be in s8.23 format amplitude for apply_gain() */
- dsp->eq_precut = get_replaygain_int(precut * -10) >> 1;
+ dsp->eq_precut = get_replaygain_int(precut * -10);
+ set_gain();
}
/**
@@ -678,51 +704,38 @@ static void eq_process(int32_t **x, unsigned num)
*/
static void apply_gain(int32_t* _src[], int _count)
{
- int32_t** src = _src;
- int count = _count;
- int32_t* s0 = src[0];
- int32_t* s1 = src[1];
- long gain = 0;
- int32_t s;
- int i;
- int32_t *d;
-
- if (dsp->replaygain)
- {
- gain = dsp->replaygain;
- }
-
- if (dsp->eq_enabled)
+ if (dsp->gain)
{
- gain += dsp->eq_precut; /* FIXME: This isn't that easy right? */
- }
-
- /* Don't bother if the gain is zero */
- if (gain == 0)
- {
- return;
- }
-
- if (s0 != s1)
- {
- d = &sample_buf[SAMPLE_BUF_SIZE / 2];
- src[1] = d;
- s = *s1++;
-
+ int32_t** src = _src;
+ int count = _count;
+ int32_t* s0 = src[0];
+ int32_t* s1 = src[1];
+ long gain = dsp->gain;
+ int32_t s;
+ int i;
+ int32_t *d;
+
+ if (s0 != s1)
+ {
+ d = &sample_buf[SAMPLE_BUF_SIZE / 2];
+ src[1] = d;
+ s = *s1++;
+
+ for (i = 0; i < count; i++)
+ FRACMUL_8_LOOP(s, gain, s1, d);
+ }
+ else
+ {
+ src[1] = &sample_buf[0];
+ }
+
+ d = &sample_buf[0];
+ src[0] = d;
+ s = *s0++;
+
for (i = 0; i < count; i++)
- FRACMUL_8_LOOP(s, gain, s1, d);
- }
- else
- {
- src[1] = &sample_buf[0];
+ FRACMUL_8_LOOP(s, gain, s0, d);
}
-
- d = &sample_buf[0];
- src[0] = d;
- s = *s0++;
-
- for (i = 0; i < count; i++)
- FRACMUL_8_LOOP(s, gain, s0, d);
}
void channels_set(int value)
@@ -1093,16 +1106,16 @@ void dsp_set_replaygain(bool always)
if (gain == 0)
{
/* So that noclip can work even with no gain information. */
- gain = DEFAULT_REPLAYGAIN;
+ gain = DEFAULT_GAIN;
}
if (global_settings.replaygain_noclip && (peak != 0)
- && ((((int64_t) gain * peak) >> 24) >= DEFAULT_REPLAYGAIN))
+ && ((((int64_t) gain * peak) >> 24) >= DEFAULT_GAIN))
{
- gain = (((int64_t) DEFAULT_REPLAYGAIN << 24) / peak);
+ gain = (((int64_t) DEFAULT_GAIN << 24) / peak);
}
- if (gain == DEFAULT_REPLAYGAIN)
+ if (gain == DEFAULT_GAIN)
{
/* Nothing to do, disable processing. */
gain = 0;
@@ -1111,6 +1124,7 @@ void dsp_set_replaygain(bool always)
}
/* Store in S8.23 format to simplify calculations. */
- dsp->replaygain = gain >> 1;
+ dsp->replaygain = gain;
+ set_gain();
}
}