Parse lame tag for encoder delay/padding so we can later implement gapless
git-svn-id: https://svn.musicpd.org/mpd/trunk@4460 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
a686436c77
commit
1523e8a842
|
@ -455,6 +455,18 @@ enum {
|
||||||
XING_SCALE = 0x00000008L,
|
XING_SCALE = 0x00000008L,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct lame {
|
||||||
|
char encoder[10]; /* 9 byte encoder name/version ("LAME3.97b") */
|
||||||
|
#if 0
|
||||||
|
/* See related comment in parse_lame() */
|
||||||
|
float peak; /* replaygain peak */
|
||||||
|
float trackGain; /* replaygain track gain */
|
||||||
|
float albumGain; /* replaygain album gain */
|
||||||
|
#endif
|
||||||
|
int encoderDelay; /* # of added samples at start of mp3 */
|
||||||
|
int encoderPadding; /* # of added samples at end of mp3 */
|
||||||
|
};
|
||||||
|
|
||||||
static int parse_xing(struct xing *xing, struct mad_bitptr *ptr, int *oldbitlen)
|
static int parse_xing(struct xing *xing, struct mad_bitptr *ptr, int *oldbitlen)
|
||||||
{
|
{
|
||||||
unsigned long bits;
|
unsigned long bits;
|
||||||
|
@ -528,13 +540,67 @@ static int parse_xing(struct xing *xing, struct mad_bitptr *ptr, int *oldbitlen)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parse_lame(struct lame *lame, struct mad_bitptr *ptr, int *bitlen)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Unlike the xing header, the lame tag has a fixed length. Fail if
|
||||||
|
* not all 36 bytes (288 bits) are there. */
|
||||||
|
if (*bitlen < 288) return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 9; i++) lame->encoder[i] = (char)mad_bit_read(ptr, 8);
|
||||||
|
lame->encoder[9] = '\0';
|
||||||
|
|
||||||
|
/* This is technically incorrect, since the encoder might not be lame.
|
||||||
|
* But there's no other way to determine if this is a lame tag, and we
|
||||||
|
* wouldn't want to go reading a tag that's not there. */
|
||||||
|
if (strncmp(lame->encoder, "LAME", 4) != 0) return 0;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Apparently lame versions <3.97b1 do not calculate replaygain. I'm
|
||||||
|
* using lame 3.97b2, and while it does calculate replaygain, it's
|
||||||
|
* setting the values to 0. Using --replaygain-(fast|accurate) doesn't
|
||||||
|
* make any difference. Leaving this code unused until we have a way
|
||||||
|
* of testing it. -- jat */
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 16);
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 32); /* peak */
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 6); /* header */
|
||||||
|
bits = mad_bit_read(ptr, 1); /* sign bit */
|
||||||
|
lame->trackGain = mad_bit_read(ptr, 9); /* gain*10 */
|
||||||
|
lame->trackGain = (bits ? -lame->trackGain : lame->trackGain) / 10;
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 6); /* header */
|
||||||
|
bits = mad_bit_read(ptr, 1); /* sign bit */
|
||||||
|
lame->albumGain = mad_bit_read(ptr, 9); /* gain*10 */
|
||||||
|
lame->albumGain = (bits ? -lame->albumGain : lame->albumGain) / 10;
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 16);
|
||||||
|
#else
|
||||||
|
mad_bit_read(ptr, 96);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lame->encoderDelay = mad_bit_read(ptr, 12);
|
||||||
|
lame->encoderPadding = mad_bit_read(ptr, 12);
|
||||||
|
|
||||||
|
mad_bit_read(ptr, 96);
|
||||||
|
|
||||||
|
*bitlen -= 288;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc,
|
static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc,
|
||||||
MpdTag ** tag, ReplayGainInfo ** replayGainInfo)
|
MpdTag ** tag, ReplayGainInfo ** replayGainInfo)
|
||||||
{
|
{
|
||||||
struct xing xing;
|
struct xing xing;
|
||||||
|
struct lame lame;
|
||||||
struct mad_bitptr ptr;
|
struct mad_bitptr ptr;
|
||||||
int bitlen;
|
int bitlen;
|
||||||
int found_xing;
|
int found_xing;
|
||||||
|
int found_lame;
|
||||||
int ret;
|
int ret;
|
||||||
int skip;
|
int skip;
|
||||||
|
|
||||||
|
@ -557,6 +623,7 @@ static int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc,
|
||||||
bitlen = data->stream.anc_bitlen;
|
bitlen = data->stream.anc_bitlen;
|
||||||
|
|
||||||
found_xing = parse_xing(&xing, &ptr, &bitlen);
|
found_xing = parse_xing(&xing, &ptr, &bitlen);
|
||||||
|
found_lame = (found_xing ? parse_lame(&lame, &ptr, &bitlen) : 0);
|
||||||
|
|
||||||
if (found_xing) {
|
if (found_xing) {
|
||||||
if (xing.flags & XING_FRAMES) {
|
if (xing.flags & XING_FRAMES) {
|
||||||
|
|
Loading…
Reference in New Issue