summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2011-04-04 15:21:44 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2011-04-04 15:21:44 +0000
commitd1766a1510b6092fa8ea0e644fdd1c1e508d9c4d (patch)
tree644a546ce4baf2b4618837d7bc9f774d0c9545ed /apps
parentf0132528fdc3a966e3d5efba0fb720faabca241b (diff)
downloadrockbox-d1766a1510b6092fa8ea0e644fdd1c1e508d9c4d.zip
rockbox-d1766a1510b6092fa8ea0e644fdd1c1e508d9c4d.tar.gz
rockbox-d1766a1510b6092fa8ea0e644fdd1c1e508d9c4d.tar.bz2
rockbox-d1766a1510b6092fa8ea0e644fdd1c1e508d9c4d.tar.xz
Rework parts of the replaygain code to be able to differentiate between 0.00 dB set intentionally and having no replaygain information at all. Bump codec api.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29679 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs.h4
-rw-r--r--apps/dsp.c4
-rw-r--r--apps/gui/skin_engine/skin_tokens.c4
-rw-r--r--apps/metadata.h2
-rw-r--r--apps/replaygain.c18
-rw-r--r--apps/replaygain.h1
-rw-r--r--apps/screens.c8
7 files changed, 23 insertions, 18 deletions
diff --git a/apps/codecs.h b/apps/codecs.h
index daf2c86..d96b2a7 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -75,12 +75,12 @@
#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
/* increase this every time the api struct changes */
-#define CODEC_API_VERSION 40
+#define CODEC_API_VERSION 41
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
-#define CODEC_MIN_API_VERSION 40
+#define CODEC_MIN_API_VERSION 41
/* codec return codes */
enum codec_status {
diff --git a/apps/dsp.c b/apps/dsp.c
index 3aab2f2..3cff191 100644
--- a/apps/dsp.c
+++ b/apps/dsp.c
@@ -1475,12 +1475,12 @@ intptr_t dsp_configure(struct dsp_config *dsp, int setting, intptr_t value)
case DSP_SET_TRACK_GAIN:
if (dsp == &AUDIO_DSP)
- dsp_set_gain_var(&track_gain, value ? convert_gain(value) : 0);
+ dsp_set_gain_var(&track_gain, value);
break;
case DSP_SET_ALBUM_GAIN:
if (dsp == &AUDIO_DSP)
- dsp_set_gain_var(&album_gain, value ? convert_gain(value) : 0);
+ dsp_set_gain_var(&album_gain, value);
break;
case DSP_SET_TRACK_PEAK:
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index a315bae..3aa7947 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -1332,11 +1332,11 @@ const char *get_token_value(struct gui_wps *gwps,
/* due to above, coming here with !id3 shouldn't be possible */
case 2:
case 4:
- replaygain_itoa(buf, buf_size, id3->track_gain);
+ replaygain_itoa(buf, buf_size, id3->track_level);
break;
case 3:
case 5:
- replaygain_itoa(buf, buf_size, id3->album_gain);
+ replaygain_itoa(buf, buf_size, id3->album_level);
break;
}
return buf;
diff --git a/apps/metadata.h b/apps/metadata.h
index 4c7e94f..a520f40 100644
--- a/apps/metadata.h
+++ b/apps/metadata.h
@@ -282,6 +282,8 @@ struct mp3entry {
/* replaygain support */
#if CONFIG_CODEC == SWCODEC
+ long track_level; /* holds the level in dB * (1<<FP_BITS) */
+ long album_level;
long track_gain; /* s19.12 signed fixed point. 0 for no gain. */
long album_gain;
long track_peak; /* s19.12 signed fixed point. 0 for no peak. */
diff --git a/apps/replaygain.c b/apps/replaygain.c
index 7875e06..5eb745a 100644
--- a/apps/replaygain.c
+++ b/apps/replaygain.c
@@ -118,7 +118,7 @@ static long fp_atof(const char* s, int precision)
+ (((int64_t) frac_part * int_one) / frac_max_int));
}
-long convert_gain(long gain)
+static long convert_gain(long gain)
{
/* Don't allow unreasonably low or high gain changes.
* Our math code can't handle it properly anyway. :) */
@@ -171,13 +171,15 @@ void parse_replaygain(const char* key, const char* value,
(strcasecmp(key, "rg_radio") == 0)) &&
!entry->track_gain)
{
- entry->track_gain = get_replaygain(value);
+ entry->track_level = get_replaygain(value);
+ entry->track_gain = convert_gain(entry->track_level);
}
else if (((strcasecmp(key, "replaygain_album_gain") == 0) ||
(strcasecmp(key, "rg_audiophile") == 0)) &&
!entry->album_gain)
{
- entry->album_gain = get_replaygain(value);
+ entry->album_level = get_replaygain(value);
+ entry->album_gain = convert_gain(entry->album_level);
}
else if (((strcasecmp(key, "replaygain_track_peak") == 0) ||
(strcasecmp(key, "rg_peak") == 0)) &&
@@ -207,12 +209,14 @@ void parse_replaygain_int(bool album, long gain, long peak,
if (album)
{
- entry->album_gain = gain;
- entry->album_peak = peak;
+ entry->album_level = gain;
+ entry->album_gain = convert_gain(gain);
+ entry->album_peak = peak;
}
else
{
- entry->track_gain = gain;
- entry->track_peak = peak;
+ entry->track_level = gain;
+ entry->track_gain = convert_gain(gain);
+ entry->track_peak = peak;
}
}
diff --git a/apps/replaygain.h b/apps/replaygain.h
index 4fb5476..215464d 100644
--- a/apps/replaygain.h
+++ b/apps/replaygain.h
@@ -30,6 +30,5 @@ void parse_replaygain(const char* key, const char* value,
void parse_replaygain_int(bool album, long gain, long peak,
struct mp3entry* entry);
void replaygain_itoa(char* buffer, int length, long int_gain);
-long convert_gain(long gain);
#endif
diff --git a/apps/screens.c b/apps/screens.c
index b1a48c5..6c70477 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -729,12 +729,12 @@ static const char* id3_get_info(int selected_item, void* data,
break;
#if CONFIG_CODEC == SWCODEC
case LANG_ID3_TRACK_GAIN:
- replaygain_itoa(buffer, buffer_len, id3->track_gain);
- val=(id3->track_gain) ? buffer : NULL; /* only show gains!=0 */
+ replaygain_itoa(buffer, buffer_len, id3->track_level);
+ val=(id3->track_level) ? buffer : NULL; /* only show level!=0 */
break;
case LANG_ID3_ALBUM_GAIN:
- replaygain_itoa(buffer, buffer_len, id3->album_gain);
- val=(id3->album_gain) ? buffer : NULL; /* only show gains!=0 */
+ replaygain_itoa(buffer, buffer_len, id3->album_level);
+ val=(id3->album_level) ? buffer : NULL; /* only show level!=0 */
break;
#endif
case LANG_ID3_PATH: