1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Dave Chapman
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
25 #include "metadata_parsers.h"
27 static const unsigned short a52_bitrates
[] =
29 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
30 192, 224, 256, 320, 384, 448, 512, 576, 640
33 /* Only store frame sizes for 44.1KHz - others are simply multiples
35 static const unsigned short a52_441framesizes
[] =
37 69 * 2, 70 * 2, 87 * 2, 88 * 2, 104 * 2, 105 * 2, 121 * 2,
38 122 * 2, 139 * 2, 140 * 2, 174 * 2, 175 * 2, 208 * 2, 209 * 2,
39 243 * 2, 244 * 2, 278 * 2, 279 * 2, 348 * 2, 349 * 2, 417 * 2,
40 418 * 2, 487 * 2, 488 * 2, 557 * 2, 558 * 2, 696 * 2, 697 * 2,
41 835 * 2, 836 * 2, 975 * 2, 976 * 2, 1114 * 2, 1115 * 2, 1253 * 2,
42 1254 * 2, 1393 * 2, 1394 * 2
45 bool get_a52_metadata(int fd
, struct mp3entry
*id3
)
47 /* Use the trackname part of the id3 structure as a temporary buffer */
48 unsigned char* buf
= (unsigned char *)id3
->path
;
49 unsigned long totalsamples
;
52 if ((lseek(fd
, 0, SEEK_SET
) < 0) || (read(fd
, buf
, 5) < 5))
57 if ((buf
[0] != 0x0b) || (buf
[1] != 0x77))
59 logf("not an A52/AC3 file\n");
67 logf("A52: Invalid frmsizecod: %d\n",i
);
71 id3
->bitrate
= a52_bitrates
[i
>> 1];
73 id3
->filesize
= filesize(fd
);
75 switch (buf
[4] & 0xc0)
78 id3
->frequency
= 48000;
79 id3
->bytesperframe
=id3
->bitrate
* 2 * 2;
83 id3
->frequency
= 44100;
84 id3
->bytesperframe
= a52_441framesizes
[i
];
88 id3
->frequency
= 32000;
89 id3
->bytesperframe
= id3
->bitrate
* 3 * 2;
93 logf("A52: Invalid samplerate code: 0x%02x\n", buf
[4] & 0xc0);
98 /* One A52 frame contains 6 blocks, each containing 256 samples */
99 totalsamples
= id3
->filesize
/ id3
->bytesperframe
* 6 * 256;
100 id3
->length
= totalsamples
/ id3
->frequency
* 1000;