summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2011-02-24 19:10:59 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2011-02-24 19:10:59 +0000
commit71ceac0b740398050af4f21b56acd5b31e2520f0 (patch)
treeda550f14a3c81f62aceae698c8b459287d201a01
parent65109732230849eeb9eec2f56f9e046ad6b476c3 (diff)
downloadrockbox-71ceac0b740398050af4f21b56acd5b31e2520f0.tar.gz
rockbox-71ceac0b740398050af4f21b56acd5b31e2520f0.zip
FS#11964. Rework replaygain handling to save metadata buffer and binsize. Remove string representation of replaygain and use a dedicated ftoa implementation for WPS/screen info.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29388 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/dsp.c8
-rw-r--r--apps/gui/skin_engine/skin_tokens.c9
-rw-r--r--apps/metadata.c6
-rw-r--r--apps/metadata.h7
-rw-r--r--apps/metadata/asf.c12
-rw-r--r--apps/metadata/id3tags.c18
-rw-r--r--apps/metadata/metadata_common.c2
-rw-r--r--apps/metadata/mp4.c8
-rw-r--r--apps/metadata/mpc.c6
-rw-r--r--apps/replaygain.c130
-rw-r--r--apps/replaygain.h10
-rw-r--r--apps/screens.c7
12 files changed, 65 insertions, 158 deletions
diff --git a/apps/dsp.c b/apps/dsp.c
index 3cff1918d7..c462fc37a6 100644
--- a/apps/dsp.c
+++ b/apps/dsp.c
@@ -1475,22 +1475,22 @@ intptr_t dsp_configure(struct dsp_config *dsp, int setting, intptr_t value)
1475 1475
1476 case DSP_SET_TRACK_GAIN: 1476 case DSP_SET_TRACK_GAIN:
1477 if (dsp == &AUDIO_DSP) 1477 if (dsp == &AUDIO_DSP)
1478 dsp_set_gain_var(&track_gain, value); 1478 dsp_set_gain_var(&track_gain, convert_gain(value));
1479 break; 1479 break;
1480 1480
1481 case DSP_SET_ALBUM_GAIN: 1481 case DSP_SET_ALBUM_GAIN:
1482 if (dsp == &AUDIO_DSP) 1482 if (dsp == &AUDIO_DSP)
1483 dsp_set_gain_var(&album_gain, value); 1483 dsp_set_gain_var(&album_gain, convert_gain(value));
1484 break; 1484 break;
1485 1485
1486 case DSP_SET_TRACK_PEAK: 1486 case DSP_SET_TRACK_PEAK:
1487 if (dsp == &AUDIO_DSP) 1487 if (dsp == &AUDIO_DSP)
1488 dsp_set_gain_var(&track_peak, value); 1488 dsp_set_gain_var(&track_peak, convert_gain(value));
1489 break; 1489 break;
1490 1490
1491 case DSP_SET_ALBUM_PEAK: 1491 case DSP_SET_ALBUM_PEAK:
1492 if (dsp == &AUDIO_DSP) 1492 if (dsp == &AUDIO_DSP)
1493 dsp_set_gain_var(&album_peak, value); 1493 dsp_set_gain_var(&album_peak, convert_gain(value));
1494 break; 1494 break;
1495 1495
1496 default: 1496 default:
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index f455999b2a..1fbe3d714e 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -35,6 +35,7 @@
35#include "sound.h" 35#include "sound.h"
36#include "debug.h" 36#include "debug.h"
37#include "cuesheet.h" 37#include "cuesheet.h"
38#include "replaygain.h"
38#ifdef HAVE_LCD_CHARCELLS 39#ifdef HAVE_LCD_CHARCELLS
39#include "hwcompat.h" 40#include "hwcompat.h"
40#endif 41#endif
@@ -1305,8 +1306,8 @@ const char *get_token_value(struct gui_wps *gwps,
1305 { 1306 {
1306 int type; 1307 int type;
1307 if (LIKELY(id3)) 1308 if (LIKELY(id3))
1308 type = get_replaygain_mode(id3->track_gain_string != NULL, 1309 type = get_replaygain_mode(id3->track_gain != 0,
1309 id3->album_gain_string != NULL); 1310 id3->album_gain != 0);
1310 else 1311 else
1311 type = -1; 1312 type = -1;
1312 1313
@@ -1331,11 +1332,11 @@ const char *get_token_value(struct gui_wps *gwps,
1331 /* due to above, coming here with !id3 shouldn't be possible */ 1332 /* due to above, coming here with !id3 shouldn't be possible */
1332 case 2: 1333 case 2:
1333 case 4: 1334 case 4:
1334 strlcpy(buf, id3->track_gain_string, buf_size); 1335 replaygain_itoa(buf, buf_size, id3->track_gain);
1335 break; 1336 break;
1336 case 3: 1337 case 3:
1337 case 5: 1338 case 5:
1338 strlcpy(buf, id3->album_gain_string, buf_size); 1339 replaygain_itoa(buf, buf_size, id3->album_gain);
1339 break; 1340 break;
1340 } 1341 }
1341 return buf; 1342 return buf;
diff --git a/apps/metadata.c b/apps/metadata.c
index 12bea286d0..4e4ffb6ad2 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -411,12 +411,6 @@ void adjust_mp3entry(struct mp3entry *entry, void *dest, const void *orig)
411 entry->albumartist += offset; 411 entry->albumartist += offset;
412 if (entry->grouping) 412 if (entry->grouping)
413 entry->grouping += offset; 413 entry->grouping += offset;
414#if CONFIG_CODEC == SWCODEC
415 if (entry->track_gain_string)
416 entry->track_gain_string += offset;
417 if (entry->album_gain_string)
418 entry->album_gain_string += offset;
419#endif
420 if (entry->mb_track_id) 414 if (entry->mb_track_id)
421 entry->mb_track_id += offset; 415 entry->mb_track_id += offset;
422} 416}
diff --git a/apps/metadata.h b/apps/metadata.h
index 8d20882835..5662c2e840 100644
--- a/apps/metadata.h
+++ b/apps/metadata.h
@@ -283,13 +283,10 @@ struct mp3entry {
283#endif 283#endif
284 284
285 /* replaygain support */ 285 /* replaygain support */
286
287#if CONFIG_CODEC == SWCODEC 286#if CONFIG_CODEC == SWCODEC
288 char* track_gain_string; 287 long track_gain; /* s19.12 signed fixed point. 0 for no gain. */
289 char* album_gain_string;
290 long track_gain; /* 7.24 signed fixed point. 0 for no gain. */
291 long album_gain; 288 long album_gain;
292 long track_peak; /* 7.24 signed fixed point. 0 for no peak. */ 289 long track_peak; /* s19.12 signed fixed point. 0 for no peak. */
293 long album_peak; 290 long album_peak;
294#endif 291#endif
295 292
diff --git a/apps/metadata/asf.c b/apps/metadata/asf.c
index c445e485a2..56d5c87f9d 100644
--- a/apps/metadata/asf.c
+++ b/apps/metadata/asf.c
@@ -456,18 +456,8 @@ static int asf_parse_header(int fd, struct mp3entry* id3,
456 lseek(fd, length, SEEK_CUR); 456 lseek(fd, length, SEEK_CUR);
457 } 457 }
458 } else if (!strncmp("replaygain_", utf8buf, 11)) { 458 } else if (!strncmp("replaygain_", utf8buf, 11)) {
459 char* value = id3buf;
460 int buf_len = id3buf_remaining;
461 int len;
462 asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining); 459 asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining);
463 len = parse_replaygain(utf8buf, value, id3, 460 parse_replaygain(utf8buf, id3buf, id3);
464 value, buf_len);
465
466 if (len == 0) {
467 /* Don't need to keep the value */
468 id3buf = value;
469 id3buf_remaining = buf_len;
470 }
471 } else if (!strcmp("MusicBrainz/Track Id", utf8buf)) { 461 } else if (!strcmp("MusicBrainz/Track Id", utf8buf)) {
472 id3->mb_track_id = id3buf; 462 id3->mb_track_id = id3buf;
473 asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining); 463 asf_utf16LEdecode(fd, length, &id3buf, &id3buf_remaining);
diff --git a/apps/metadata/id3tags.c b/apps/metadata/id3tags.c
index 3cbebc12e3..c1d9cb2020 100644
--- a/apps/metadata/id3tags.c
+++ b/apps/metadata/id3tags.c
@@ -370,14 +370,8 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
370 entry->albumartist = tag; 370 entry->albumartist = tag;
371#if CONFIG_CODEC == SWCODEC 371#if CONFIG_CODEC == SWCODEC
372 } else { 372 } else {
373 /* Calculate residual buffer size in bytes which can be used by 373 /* Call parse_replaygain(). */
374 * parse_replaygain() to save the string representation of 374 parse_replaygain(tag, value, entry);
375 * replaygain data.*/
376 length = sizeof(entry->id3v2buf) - (tag - entry->id3v2buf);
377
378 /* Call parse_replaygain(), returns length in bytes used by the
379 * string representation of replaygain data. */
380 length = parse_replaygain(tag, value, entry, tag, length);
381#endif 375#endif
382 } 376 }
383 } 377 }
@@ -387,12 +381,11 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
387 381
388#if CONFIG_CODEC == SWCODEC 382#if CONFIG_CODEC == SWCODEC
389/* parse RVA2 binary data and convert to replaygain information. */ 383/* parse RVA2 binary data and convert to replaygain information. */
390static int parserva2( struct mp3entry* entry, char* tag, int bufferpos ) 384static int parserva2( struct mp3entry* entry, char* tag, int bufferpos)
391{ 385{
392 int desc_len = strlen(tag); 386 int desc_len = strlen(tag);
393 int start_pos = tag - entry->id3v2buf; 387 int start_pos = tag - entry->id3v2buf;
394 int end_pos = start_pos + desc_len + 5; 388 int end_pos = start_pos + desc_len + 5;
395 int value_len = 0;
396 unsigned char* value = tag + desc_len + 1; 389 unsigned char* value = tag + desc_len + 1;
397 390
398 /* Only parse RVA2 replaygain tags if tag version == 2.4 and channel 391 /* Only parse RVA2 replaygain tags if tag version == 2.4 and channel
@@ -447,11 +440,10 @@ static int parserva2( struct mp3entry* entry, char* tag, int bufferpos )
447 } 440 }
448 } 441 }
449 442
450 value_len = parse_replaygain_int(album, gain, peak * 2, entry, 443 parse_replaygain_int(album, gain, peak * 2, entry);
451 tag, sizeof(entry->id3v2buf) - start_pos);
452 } 444 }
453 445
454 return start_pos + value_len; 446 return start_pos;
455} 447}
456#endif 448#endif
457 449
diff --git a/apps/metadata/metadata_common.c b/apps/metadata/metadata_common.c
index 341d279b5d..ae6b245616 100644
--- a/apps/metadata/metadata_common.c
+++ b/apps/metadata/metadata_common.c
@@ -333,7 +333,7 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
333 } 333 }
334 else 334 else
335 { 335 {
336 len = parse_replaygain(name, value, id3, buf, buf_remaining); 336 parse_replaygain(name, value, id3);
337 p = NULL; 337 p = NULL;
338 } 338 }
339 339
diff --git a/apps/metadata/mp4.c b/apps/metadata/mp4.c
index 6130135bae..a431231e12 100644
--- a/apps/metadata/mp4.c
+++ b/apps/metadata/mp4.c
@@ -528,13 +528,7 @@ static bool read_mp4_tags(int fd, struct mp3entry* id3,
528 buffer -= length; 528 buffer -= length;
529 buffer_left += length; 529 buffer_left += length;
530 530
531 if (parse_replaygain(tag_name, buffer, id3, 531 parse_replaygain(tag_name, buffer, id3);
532 buffer, buffer_left) > 0)
533 {
534 /* Data used, keep it. */
535 buffer += length;
536 buffer_left -= length;
537 }
538 } 532 }
539 } 533 }
540 } 534 }
diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c
index 0387dc9f77..0b75ed04dd 100644
--- a/apps/metadata/mpc.c
+++ b/apps/metadata/mpc.c
@@ -46,8 +46,7 @@ static int set_replaygain_sv7(struct mp3entry* id3,
46 /* We use a peak value of 0 to indicate a given gain type isn't used. */ 46 /* We use a peak value of 0 to indicate a given gain type isn't used. */
47 if (peak != 0) { 47 if (peak != 0) {
48 /* Save the ReplayGain data to id3-structure for further processing. */ 48 /* Save the ReplayGain data to id3-structure for further processing. */
49 used += parse_replaygain_int(album, gain * 512 / 100, peak << 9, 49 parse_replaygain_int(album, gain * 512 / 100, peak << 9, id3);
50 id3, id3->toc + used, sizeof(id3->toc) - used);
51 } 50 }
52 51
53 return used; 52 return used;
@@ -73,8 +72,7 @@ static int set_replaygain_sv8(struct mp3entry* id3,
73 /* We use a peak value of 0 to indicate a given gain type isn't used. */ 72 /* We use a peak value of 0 to indicate a given gain type isn't used. */
74 if (peak != 0) { 73 if (peak != 0) {
75 /* Save the ReplayGain data to id3-structure for further processing. */ 74 /* Save the ReplayGain data to id3-structure for further processing. */
76 used += parse_replaygain_int(album, gain * 512 / 100, peak, 75 parse_replaygain_int(album, gain * 512 / 100, peak, id3);
77 id3, id3->toc + used, sizeof(id3->toc) - used);
78 } 76 }
79 77
80 return used; 78 return used;
diff --git a/apps/replaygain.c b/apps/replaygain.c
index 81f1a45ad7..9f0dda7a0b 100644
--- a/apps/replaygain.c
+++ b/apps/replaygain.c
@@ -36,6 +36,13 @@
36#define FP_BITS (12) 36#define FP_BITS (12)
37#define FP_ONE (1 << FP_BITS) 37#define FP_ONE (1 << FP_BITS)
38 38
39void replaygain_itoa(char* buffer, int length, long int_gain)
40{
41 /* int_gain uses Q19.12 format. */
42 int one = abs(int_gain) >> FP_BITS;
43 int cent = ((abs(int_gain) & 0x0fff) * 100 + (FP_ONE/2)) >> FP_BITS;
44 snprintf(buffer, length, "%d.%02d dB", (int_gain<0) ? -one : one, cent);
45}
39 46
40static long fp_atof(const char* s, int precision) 47static long fp_atof(const char* s, int precision)
41{ 48{
@@ -109,42 +116,25 @@ static long fp_atof(const char* s, int precision)
109 + (((int64_t) frac_part * int_one) / frac_max_int)); 116 + (((int64_t) frac_part * int_one) / frac_max_int));
110} 117}
111 118
112static long convert_gain(long gain) 119long convert_gain(long gain)
113{ 120{
114 /* Don't allow unreasonably low or high gain changes. 121 /* Don't allow unreasonably low or high gain changes.
115 * Our math code can't handle it properly anyway. :) 122 * Our math code can't handle it properly anyway. :)
116 */ 123 */
117 if (gain < (-48 * FP_ONE)) 124 gain = MAX(gain,-48 * FP_ONE);
118 { 125 gain = MIN(gain, 17 * FP_ONE);
119 gain = -48 * FP_ONE;
120 }
121
122 if (gain > (17 * FP_ONE))
123 {
124 gain = 17 * FP_ONE;
125 }
126
127 gain = fp_factor(gain, FP_BITS) << (24 - FP_BITS);
128 126
129 return gain; 127 return fp_factor(gain, FP_BITS) << (24 - FP_BITS);
130} 128}
131 129
132/* Get the sample scale factor in Q7.24 format from a gain value. Returns 0 130/* Get the sample scale factor in Q19.12 format from a gain value. Returns 0
133 * for no gain. 131 * for no gain.
134 * 132 *
135 * str Gain in dB as a string. E.g., "-3.45 dB"; the "dB" part is ignored. 133 * str Gain in dB as a string. E.g., "-3.45 dB"; the "dB" part is ignored.
136 */ 134 */
137static long get_replaygain(const char* str) 135static long get_replaygain(const char* str)
138{ 136{
139 long gain = 0; 137 return fp_atof(str, FP_BITS);
140
141 if (str)
142 {
143 gain = fp_atof(str, FP_BITS);
144 gain = convert_gain(gain);
145 }
146
147 return gain;
148} 138}
149 139
150/* Get the peak volume in Q7.24 format. 140/* Get the peak volume in Q7.24 format.
@@ -153,14 +143,7 @@ static long get_replaygain(const char* str)
153 */ 143 */
154static long get_replaypeak(const char* str) 144static long get_replaypeak(const char* str)
155{ 145{
156 long peak = 0; 146 return fp_atof(str, 24);
157
158 if (str)
159 {
160 peak = fp_atof(str, 24);
161 }
162
163 return peak;
164} 147}
165 148
166/* Get a sample scale factor in Q7.24 format from a gain value. 149/* Get a sample scale factor in Q7.24 format from a gain value.
@@ -174,107 +157,60 @@ long get_replaygain_int(long int_gain)
174 157
175/* Parse a ReplayGain tag conforming to the "VorbisGain standard". If a 158/* Parse a ReplayGain tag conforming to the "VorbisGain standard". If a
176 * valid tag is found, update mp3entry struct accordingly. Existing values 159 * valid tag is found, update mp3entry struct accordingly. Existing values
177 * are not overwritten. Returns number of bytes written to buffer. 160 * are not overwritten.
178 * 161 *
179 * key Name of the tag. 162 * key Name of the tag.
180 * value Value of the tag. 163 * value Value of the tag.
181 * entry mp3entry struct to update. 164 * entry mp3entry struct to update.
182 * buffer Where to store the text for gain values (for later display).
183 * length Bytes left in buffer.
184 */ 165 */
185long parse_replaygain(const char* key, const char* value, 166void parse_replaygain(const char* key, const char* value,
186 struct mp3entry* entry, char* buffer, int length) 167 struct mp3entry* entry)
187{ 168{
188 char **p = NULL; 169 if (((strcasecmp(key, "replaygain_track_gain") == 0) ||
189 170 (strcasecmp(key, "rg_radio") == 0)) &&
190 if (((strcasecmp(key, "replaygain_track_gain") == 0) 171 !entry->track_gain)
191 || (strcasecmp(key, "rg_radio") == 0)) && !entry->track_gain)
192 { 172 {
193 entry->track_gain = get_replaygain(value); 173 entry->track_gain = get_replaygain(value);
194 p = &(entry->track_gain_string);
195 } 174 }
196 else if (((strcasecmp(key, "replaygain_album_gain") == 0) 175 else if (((strcasecmp(key, "replaygain_album_gain") == 0) ||
197 || (strcasecmp(key, "rg_audiophile") == 0)) && !entry->album_gain) 176 (strcasecmp(key, "rg_audiophile") == 0)) &&
177 !entry->album_gain)
198 { 178 {
199 entry->album_gain = get_replaygain(value); 179 entry->album_gain = get_replaygain(value);
200 p = &(entry->album_gain_string);
201 } 180 }
202 else if (((strcasecmp(key, "replaygain_track_peak") == 0) 181 else if (((strcasecmp(key, "replaygain_track_peak") == 0) ||
203 || (strcasecmp(key, "rg_peak") == 0)) && !entry->track_peak) 182 (strcasecmp(key, "rg_peak") == 0)) &&
183 !entry->track_peak)
204 { 184 {
205 entry->track_peak = get_replaypeak(value); 185 entry->track_peak = get_replaypeak(value);
206 } 186 }
207 else if ((strcasecmp(key, "replaygain_album_peak") == 0) 187 else if ((strcasecmp(key, "replaygain_album_peak") == 0) &&
208 && !entry->album_peak) 188 !entry->album_peak)
209 { 189 {
210 entry->album_peak = get_replaypeak(value); 190 entry->album_peak = get_replaypeak(value);
211 } 191 }
212
213 if (p)
214 {
215 int len = strlen(value);
216
217 len = MIN(len, length - 1);
218
219 /* A few characters just isn't interesting... */
220 if (len > 1)
221 {
222 strlcpy(buffer, value, len + 1);
223 *p = buffer;
224 return len + 1;
225 }
226 }
227
228 return 0;
229} 192}
230 193
231/* Set ReplayGain values from integers. Existing values are not overwritten. 194/* Set ReplayGain values from integers. Existing values are not overwritten.
232 * Returns number of bytes written to buffer.
233 * 195 *
234 * album If true, set album values, otherwise set track values. 196 * album If true, set album values, otherwise set track values.
235 * gain Gain value in dB, multiplied by 512. 0 for no gain. 197 * gain Gain value in dB, multiplied by 512. 0 for no gain.
236 * peak Peak volume in Q7.24 format, where 1.0 is full scale. 0 for no 198 * peak Peak volume in Q7.24 format, where 1.0 is full scale. 0 for no
237 * peak volume. 199 * peak volume.
238 * buffer Where to store the text for gain values (for later display).
239 * length Bytes left in buffer.
240 */ 200 */
241long parse_replaygain_int(bool album, long gain, long peak, 201void parse_replaygain_int(bool album, long gain, long peak,
242 struct mp3entry* entry, char* buffer, int length) 202 struct mp3entry* entry)
243{ 203{
244 long len = 0; 204 gain = gain * FP_ONE / 512;
245
246 if (buffer != NULL)
247 {
248 len = snprintf(buffer, length, "%ld.%02d dB", gain / 512,
249 ((abs(gain) & 0x01ff) * 100 + 256) / 512);
250 len++;
251 }
252
253 if (gain != 0)
254 {
255 gain = convert_gain(gain * FP_ONE / 512);
256 }
257 205
258 if (album) 206 if (album)
259 { 207 {
260 entry->album_gain = gain; 208 entry->album_gain = gain;
261 entry->album_gain_string = buffer; 209 entry->album_peak = peak;
262
263 if (peak)
264 {
265 entry->album_peak = peak;
266 }
267 } 210 }
268 else 211 else
269 { 212 {
270 entry->track_gain = gain; 213 entry->track_gain = gain;
271 entry->track_gain_string = buffer; 214 entry->track_peak = peak;
272
273 if (peak)
274 {
275 entry->track_peak = peak;
276 }
277 } 215 }
278
279 return len;
280} 216}
diff --git a/apps/replaygain.h b/apps/replaygain.h
index 02ca2e0bae..4fb5476e23 100644
--- a/apps/replaygain.h
+++ b/apps/replaygain.h
@@ -25,9 +25,11 @@
25#include "metadata.h" 25#include "metadata.h"
26 26
27long get_replaygain_int(long int_gain); 27long get_replaygain_int(long int_gain);
28long parse_replaygain(const char* key, const char* value, 28void parse_replaygain(const char* key, const char* value,
29 struct mp3entry* entry, char* buffer, int length); 29 struct mp3entry* entry);
30long parse_replaygain_int(bool album, long gain, long peak, 30void parse_replaygain_int(bool album, long gain, long peak,
31 struct mp3entry* entry, char* buffer, int length); 31 struct mp3entry* entry);
32void replaygain_itoa(char* buffer, int length, long int_gain);
33long convert_gain(long gain);
32 34
33#endif 35#endif
diff --git a/apps/screens.c b/apps/screens.c
index 81472e6cc7..b1a48c5bd6 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -53,6 +53,7 @@
53#include "backdrop.h" 53#include "backdrop.h"
54#include "viewport.h" 54#include "viewport.h"
55#include "language.h" 55#include "language.h"
56#include "replaygain.h"
56 57
57#if CONFIG_CODEC == SWCODEC 58#if CONFIG_CODEC == SWCODEC
58#include "dsp.h" 59#include "dsp.h"
@@ -728,10 +729,12 @@ static const char* id3_get_info(int selected_item, void* data,
728 break; 729 break;
729#if CONFIG_CODEC == SWCODEC 730#if CONFIG_CODEC == SWCODEC
730 case LANG_ID3_TRACK_GAIN: 731 case LANG_ID3_TRACK_GAIN:
731 val=id3->track_gain_string; 732 replaygain_itoa(buffer, buffer_len, id3->track_gain);
733 val=(id3->track_gain) ? buffer : NULL; /* only show gains!=0 */
732 break; 734 break;
733 case LANG_ID3_ALBUM_GAIN: 735 case LANG_ID3_ALBUM_GAIN:
734 val=id3->album_gain_string; 736 replaygain_itoa(buffer, buffer_len, id3->album_gain);
737 val=(id3->album_gain) ? buffer : NULL; /* only show gains!=0 */
735 break; 738 break;
736#endif 739#endif
737 case LANG_ID3_PATH: 740 case LANG_ID3_PATH: