summaryrefslogtreecommitdiff
path: root/apps/metadata.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/metadata.c')
-rw-r--r--apps/metadata.c78
1 files changed, 8 insertions, 70 deletions
diff --git a/apps/metadata.c b/apps/metadata.c
index 0d69cb1645..556350bfb6 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -36,24 +36,6 @@
36#include "metadata/metadata_common.h" 36#include "metadata/metadata_common.h"
37#include "metadata/metadata_parsers.h" 37#include "metadata/metadata_parsers.h"
38 38
39static const unsigned short a52_bitrates[] =
40{
41 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
42 192, 224, 256, 320, 384, 448, 512, 576, 640
43};
44
45/* Only store frame sizes for 44.1KHz - others are simply multiples
46 of the bitrate */
47static const unsigned short a52_441framesizes[] =
48{
49 69 * 2, 70 * 2, 87 * 2, 88 * 2, 104 * 2, 105 * 2, 121 * 2,
50 122 * 2, 139 * 2, 140 * 2, 174 * 2, 175 * 2, 208 * 2, 209 * 2,
51 243 * 2, 244 * 2, 278 * 2, 279 * 2, 348 * 2, 349 * 2, 417 * 2,
52 418 * 2, 487 * 2, 488 * 2, 557 * 2, 558 * 2, 696 * 2, 697 * 2,
53 835 * 2, 836 * 2, 975 * 2, 976 * 2, 1114 * 2, 1115 * 2, 1253 * 2,
54 1254 * 2, 1393 * 2, 1394 * 2
55};
56
57#endif /* CONFIG_CODEC == SWCODEC */ 39#endif /* CONFIG_CODEC == SWCODEC */
58 40
59 41
@@ -100,8 +82,6 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
100{ 82{
101#if CONFIG_CODEC == SWCODEC 83#if CONFIG_CODEC == SWCODEC
102 unsigned char* buf; 84 unsigned char* buf;
103 unsigned long totalsamples;
104 int i;
105#endif 85#endif
106 86
107 /* Clear the mp3entry to avoid having bogus pointers appear */ 87 /* Clear the mp3entry to avoid having bogus pointers appear */
@@ -179,64 +159,19 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
179 159
180 case AFMT_WAVPACK: 160 case AFMT_WAVPACK:
181 if (!get_wavpack_metadata(fd, id3)) 161 if (!get_wavpack_metadata(fd, id3))
162 {
182 return false; 163 return false;
164 }
183 165
184 read_ape_tags(fd, id3); /* use any apetag info we find */ 166 read_ape_tags(fd, id3); /* use any apetag info we find */
185 break; 167 break;
186 168
187 case AFMT_A52: 169 case AFMT_A52:
188 /* Use the trackname part of the id3 structure as a temporary buffer */ 170 if (!get_a52_metadata(fd, id3))
189 buf = (unsigned char *)id3->path;
190
191 if ((lseek(fd, 0, SEEK_SET) < 0) || (read(fd, buf, 5) < 5))
192 {
193 return false;
194 }
195
196 if ((buf[0] != 0x0b) || (buf[1] != 0x77))
197 {
198 logf("%s is not an A52/AC3 file\n",trackname);
199 return false;
200 }
201
202 i = buf[4] & 0x3e;
203
204 if (i > 36)
205 {
206 logf("A52: Invalid frmsizecod: %d\n",i);
207 return false;
208 }
209
210 id3->bitrate = a52_bitrates[i >> 1];
211 id3->vbr = false;
212 id3->filesize = filesize(fd);
213
214 switch (buf[4] & 0xc0)
215 { 171 {
216 case 0x00:
217 id3->frequency = 48000;
218 id3->bytesperframe=id3->bitrate * 2 * 2;
219 break;
220
221 case 0x40:
222 id3->frequency = 44100;
223 id3->bytesperframe = a52_441framesizes[i];
224 break;
225
226 case 0x80:
227 id3->frequency = 32000;
228 id3->bytesperframe = id3->bitrate * 3 * 2;
229 break;
230
231 default:
232 logf("A52: Invalid samplerate code: 0x%02x\n", buf[4] & 0xc0);
233 return false; 172 return false;
234 break;
235 } 173 }
236 174
237 /* One A52 frame contains 6 blocks, each containing 256 samples */
238 totalsamples = id3->filesize / id3->bytesperframe * 6 * 256;
239 id3->length = totalsamples / id3->frequency * 1000;
240 break; 175 break;
241 176
242 case AFMT_ALAC: 177 case AFMT_ALAC:
@@ -264,15 +199,17 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
264 return false; 199 return false;
265 } 200 }
266 break; 201 break;
202
267 case AFMT_SPC: 203 case AFMT_SPC:
268 if(!get_spc_metadata(fd, id3)) 204 if (!get_spc_metadata(fd, id3))
269 { 205 {
270 DEBUGF("get_spc_metadata error\n"); 206 DEBUGF("get_spc_metadata error\n");
207 return false;
271 } 208 }
272
273 id3->filesize = filesize(fd); 209 id3->filesize = filesize(fd);
274 id3->genre_string = id3_get_num_genre(36); 210 id3->genre_string = id3_get_num_genre(36);
275 break; 211 break;
212
276 case AFMT_ADX: 213 case AFMT_ADX:
277 if (!get_adx_metadata(fd, id3)) 214 if (!get_adx_metadata(fd, id3))
278 { 215 {
@@ -281,6 +218,7 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
281 } 218 }
282 219
283 break; 220 break;
221
284 case AFMT_NSF: 222 case AFMT_NSF:
285 buf = (unsigned char *)id3->path; 223 buf = (unsigned char *)id3->path;
286 if ((lseek(fd, 0, SEEK_SET) < 0) || ((read(fd, buf, 8)) < 8)) 224 if ((lseek(fd, 0, SEEK_SET) < 0) || ((read(fd, buf, 8)) < 8))