diff options
Diffstat (limited to 'apps/metadata.c')
-rw-r--r-- | apps/metadata.c | 78 |
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 | ||
39 | static 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 */ | ||
47 | static 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)) |