blob: bcfd3c7b51a52a5b68dab20f0d8286c81e29a048 [file] [log] [blame]
Thom Johansen59157362007-12-04 20:48:40 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
Thom Johansenea4fc142007-12-04 21:07:11 +00008 * $Id$
Thom Johansen59157362007-12-04 20:48:40 +00009 *
Dave Chapmand44c7182007-12-05 10:26:38 +000010 * Copyright (C) 2005 Dave Chapman
Thom Johansen59157362007-12-04 20:48:40 +000011 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000012 * 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.
Thom Johansen59157362007-12-04 20:48:40 +000016 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "id3.h"
23#include "logf.h"
24
Bertrik Sikken1273f952008-05-03 07:03:59 +000025#include "metadata_parsers.h"
26
Thom Johansen59157362007-12-04 20:48:40 +000027static const unsigned short a52_bitrates[] =
28{
29 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
30 192, 224, 256, 320, 384, 448, 512, 576, 640
31};
32
33/* Only store frame sizes for 44.1KHz - others are simply multiples
34 of the bitrate */
35static const unsigned short a52_441framesizes[] =
36{
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
43};
44
45bool get_a52_metadata(int fd, struct mp3entry *id3)
46{
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;
50 int i;
51
52 if ((lseek(fd, 0, SEEK_SET) < 0) || (read(fd, buf, 5) < 5))
53 {
54 return false;
55 }
56
57 if ((buf[0] != 0x0b) || (buf[1] != 0x77))
58 {
Robert Kukla893551e2007-12-14 23:14:25 +000059 logf("not an A52/AC3 file\n");
Thom Johansen59157362007-12-04 20:48:40 +000060 return false;
61 }
62
63 i = buf[4] & 0x3e;
64
65 if (i > 36)
66 {
67 logf("A52: Invalid frmsizecod: %d\n",i);
68 return false;
69 }
70
71 id3->bitrate = a52_bitrates[i >> 1];
72 id3->vbr = false;
73 id3->filesize = filesize(fd);
74
75 switch (buf[4] & 0xc0)
76 {
77 case 0x00:
78 id3->frequency = 48000;
79 id3->bytesperframe=id3->bitrate * 2 * 2;
80 break;
81
82 case 0x40:
83 id3->frequency = 44100;
84 id3->bytesperframe = a52_441framesizes[i];
85 break;
86
87 case 0x80:
88 id3->frequency = 32000;
89 id3->bytesperframe = id3->bitrate * 3 * 2;
90 break;
91
92 default:
93 logf("A52: Invalid samplerate code: 0x%02x\n", buf[4] & 0xc0);
94 return false;
95 break;
96 }
97
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;
101 return true;
102}