summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2007-12-01 11:55:19 +0000
committerMagnus Holmgren <magnushol@gmail.com>2007-12-01 11:55:19 +0000
commitaee243e7d8b14cb0a1ec1e85ae9bd942254a1308 (patch)
tree0188f7da8d3c3a6527ece9ba8b380564c111a312
parent4ce8fbef3005de8d77caaa76e6ae4e92d8be1647 (diff)
downloadrockbox-aee243e7d8b14cb0a1ec1e85ae9bd942254a1308.zip
rockbox-aee243e7d8b14cb0a1ec1e85ae9bd942254a1308.tar.gz
rockbox-aee243e7d8b14cb0a1ec1e85ae9bd942254a1308.tar.bz2
rockbox-aee243e7d8b14cb0a1ec1e85ae9bd942254a1308.tar.xz
MPC: Simplify the ReplayGain parsing code.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15864 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/metadata/mpc.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c
index 0e3ce7e..186ff29 100644
--- a/apps/metadata/mpc.c
+++ b/apps/metadata/mpc.c
@@ -28,6 +28,26 @@
#include "logf.h"
#include "replaygain.h"
+static int set_replaygain(struct mp3entry* id3, bool album, long value,
+ long used)
+{
+ long gain = (int16_t) ((value >> 16) & 0xffff);
+ long peak = (uint16_t) (value & 0xffff);
+
+ /* We use a peak value of 0 to indicate a given gain type isn't used. */
+ if (peak != 0)
+ {
+ /* Use the Xing TOC field to store ReplayGain strings for use in the
+ * ID3 screen, since Musepack files shouldn't need to use it in any
+ * other way.
+ */
+ used += parse_replaygain_int(album, gain * 512 / 100, peak << 9,
+ id3, id3->toc + used, sizeof(id3->toc) - used);
+ }
+
+ return used;
+}
+
bool get_musepack_metadata(int fd, struct mp3entry *id3)
{
const int32_t sfreqs_sv7[4] = { 44100, 48000, 37800, 32000 };
@@ -51,7 +71,6 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3)
} else if (streamversion == 7) {
unsigned int gapless = (header[5] >> 31) & 0x0001;
unsigned int last_frame_samples = (header[5] >> 20) & 0x07ff;
- int track_gain, album_gain;
unsigned int bufused = 0;
id3->frequency = sfreqs_sv7[(header[2] >> 16) & 0x0003];
@@ -61,40 +80,8 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3)
else
samples -= 481; /* Musepack subband synth filter delay */
- /* Extract ReplayGain data from header, we use peak gain 0 to
- indicate a given gain type isn't used. */
- track_gain = (int16_t)((header[3] >> 16) & 0xffff);
- id3->track_peak = ((uint16_t)(header[3] & 0xffff)) << 9;
- if (id3->track_peak != 0)
- id3->track_gain = get_replaygain_int(track_gain);
- else
- id3->track_gain = 0;
-
- album_gain = (int16_t)((header[4] >> 16) & 0xffff);
- id3->album_peak = ((uint16_t)(header[4] & 0xffff)) << 9;
- if (id3->album_peak != 0)
- id3->album_gain = get_replaygain_int(album_gain);
- else
- id3->album_gain = 0;
-
- /* Write replaygain values to strings for use in id3 screen. We use
- the XING header as buffer space since Musepack files shouldn't
- need to use it in any other way */
- if (id3->track_peak != 0) {
- id3->track_gain_string = (char *)id3->toc;
- bufused = snprintf(id3->track_gain_string, 45,
- "%d.%d dB", track_gain/100, abs(track_gain)%100);
- } else {
- id3->track_gain_string = NULL;
- }
-
- if (id3->album_peak != 0) {
- id3->album_gain_string = (char *)id3->toc + bufused + 1;
- bufused = snprintf(id3->album_gain_string, 45,
- "%d.%d dB", album_gain/100, abs(album_gain)%100);
- } else {
- id3->album_gain_string = NULL;
- }
+ bufused = set_replaygain(id3, false, header[3], bufused);
+ bufused = set_replaygain(id3, true, header[4], bufused);
}
} else {
header[0] = letoh32(header[0]);