summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/metadata.c368
-rw-r--r--apps/metadata.h13
-rw-r--r--apps/metadata/asap.c3
-rw-r--r--apps/metadata/metadata_parsers.h3
-rw-r--r--apps/metadata/monkeys.c2
-rw-r--r--apps/metadata/mp3.c8
-rw-r--r--apps/metadata/mpc.c2
-rw-r--r--apps/metadata/spc.c3
-rw-r--r--apps/metadata/wavpack.c1
9 files changed, 99 insertions, 304 deletions
diff --git a/apps/metadata.c b/apps/metadata.c
index 15b7d9f72b..fb0ce0341c 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -37,154 +37,171 @@
37 37
38#include "metadata/metadata_common.h" 38#include "metadata/metadata_common.h"
39 39
40static bool get_shn_metadata(int fd, struct mp3entry *id3)
41{
42 /* TODO: read the id3v2 header if it exists */
43 id3->vbr = true;
44 id3->filesize = filesize(fd);
45 return skip_id3v2(fd, id3);
46}
47
48static bool get_other_asap_metadata(int fd, struct mp3entry *id3)
49{
50 id3->bitrate = 706;
51 id3->frequency = 44100;
52 id3->vbr = false;
53 id3->filesize = filesize(fd);
54 id3->genre_string = id3_get_num_genre(36);
55 return true;
56}
40#endif /* CONFIG_CODEC == SWCODEC */ 57#endif /* CONFIG_CODEC == SWCODEC */
41 58
42const struct afmt_entry audio_formats[AFMT_NUM_CODECS] = 59const struct afmt_entry audio_formats[AFMT_NUM_CODECS] =
43{ 60{
44 /* Unknown file format */ 61 /* Unknown file format */
45 [AFMT_UNKNOWN] = 62 [AFMT_UNKNOWN] =
46 AFMT_ENTRY("???", NULL, NULL, NULL ), 63 AFMT_ENTRY("???", NULL, NULL, NULL, NULL ),
47 64
48 /* MPEG Audio layer 1 */ 65 /* MPEG Audio layer 1 */
49 [AFMT_MPA_L1] = 66 [AFMT_MPA_L1] =
50 AFMT_ENTRY("MP1", "mpa", NULL, "mp1\0" ), 67 AFMT_ENTRY("MP1", "mpa", NULL, get_mp3_metadata, "mp1\0"),
51 /* MPEG Audio layer 2 */ 68 /* MPEG Audio layer 2 */
52 [AFMT_MPA_L2] = 69 [AFMT_MPA_L2] =
53 AFMT_ENTRY("MP2", "mpa", NULL, "mpa\0mp2\0" ), 70 AFMT_ENTRY("MP2", "mpa", NULL, get_mp3_metadata, "mpa\0mp2\0"),
54 /* MPEG Audio layer 3 */ 71 /* MPEG Audio layer 3 */
55 [AFMT_MPA_L3] = 72 [AFMT_MPA_L3] =
56 AFMT_ENTRY("MP3", "mpa", "mp3_enc", "mp3\0" ), 73 AFMT_ENTRY("MP3", "mpa", "mp3_enc", get_mp3_metadata, "mp3\0"),
57 74
58#if CONFIG_CODEC == SWCODEC 75#if CONFIG_CODEC == SWCODEC
59 /* Audio Interchange File Format */ 76 /* Audio Interchange File Format */
60 [AFMT_AIFF] = 77 [AFMT_AIFF] =
61 AFMT_ENTRY("AIFF", "aiff", "aiff_enc", "aiff\0aif\0"), 78 AFMT_ENTRY("AIFF", "aiff", "aiff_enc", get_aiff_metadata, "aiff\0aif\0"),
62 /* Uncompressed PCM in a WAV file OR ATRAC3 stream in WAV file (.at3) */ 79 /* Uncompressed PCM in a WAV file OR ATRAC3 stream in WAV file (.at3) */
63 [AFMT_PCM_WAV] = 80 [AFMT_PCM_WAV] =
64 AFMT_ENTRY("WAV", "wav", "wav_enc", "wav\0at3\0" ), 81 AFMT_ENTRY("WAV", "wav", "wav_enc", get_wave_metadata, "wav\0at3\0"),
65 /* Ogg Vorbis */ 82 /* Ogg Vorbis */
66 [AFMT_OGG_VORBIS] = 83 [AFMT_OGG_VORBIS] =
67 AFMT_ENTRY("Ogg", "vorbis", NULL, "ogg\0oga\0" ), 84 AFMT_ENTRY("Ogg", "vorbis", NULL, get_ogg_metadata, "ogg\0oga\0"),
68 /* FLAC */ 85 /* FLAC */
69 [AFMT_FLAC] = 86 [AFMT_FLAC] =
70 AFMT_ENTRY("FLAC", "flac", NULL, "flac\0" ), 87 AFMT_ENTRY("FLAC", "flac", NULL, get_flac_metadata, "flac\0"),
71 /* Musepack */ 88 /* Musepack */
72 [AFMT_MPC] = 89 [AFMT_MPC] =
73 AFMT_ENTRY("MPC", "mpc", NULL, "mpc\0" ), 90 AFMT_ENTRY("MPC", "mpc", NULL, get_musepack_metadata,"mpc\0"),
74 /* A/52 (aka AC3) audio */ 91 /* A/52 (aka AC3) audio */
75 [AFMT_A52] = 92 [AFMT_A52] =
76 AFMT_ENTRY("AC3", "a52", NULL, "a52\0ac3\0" ), 93 AFMT_ENTRY("AC3", "a52", NULL, get_a52_metadata, "a52\0ac3\0"),
77 /* WavPack */ 94 /* WavPack */
78 [AFMT_WAVPACK] = 95 [AFMT_WAVPACK] =
79 AFMT_ENTRY("WV", "wavpack", "wavpack_enc", "wv\0" ), 96 AFMT_ENTRY("WV","wavpack","wavpack_enc",get_wavpack_metadata,"wv\0"),
80 /* Apple Lossless Audio Codec */ 97 /* Apple Lossless Audio Codec */
81 [AFMT_MP4_ALAC] = 98 [AFMT_MP4_ALAC] =
82 AFMT_ENTRY("ALAC", "alac", NULL, "m4a\0m4b\0" ), 99 AFMT_ENTRY("ALAC", "alac", NULL, get_mp4_metadata, "m4a\0m4b\0"),
83 /* Advanced Audio Coding in M4A container */ 100 /* Advanced Audio Coding in M4A container */
84 [AFMT_MP4_AAC] = 101 [AFMT_MP4_AAC] =
85 AFMT_ENTRY("AAC", "aac", NULL, "mp4\0" ), 102 AFMT_ENTRY("AAC", "aac", NULL, get_mp4_metadata, "mp4\0"),
86 /* Shorten */ 103 /* Shorten */
87 [AFMT_SHN] = 104 [AFMT_SHN] =
88 AFMT_ENTRY("SHN", "shorten", NULL, "shn\0" ), 105 AFMT_ENTRY("SHN","shorten", NULL, get_shn_metadata, "shn\0"),
89 /* SID File Format */ 106 /* SID File Format */
90 [AFMT_SID] = 107 [AFMT_SID] =
91 AFMT_ENTRY("SID", "sid", NULL, "sid\0" ), 108 AFMT_ENTRY("SID", "sid", NULL, get_sid_metadata, "sid\0"),
92 /* ADX File Format */ 109 /* ADX File Format */
93 [AFMT_ADX] = 110 [AFMT_ADX] =
94 AFMT_ENTRY("ADX", "adx", NULL, "adx\0" ), 111 AFMT_ENTRY("ADX", "adx", NULL, get_adx_metadata, "adx\0"),
95 /* NESM (NES Sound Format) */ 112 /* NESM (NES Sound Format) */
96 [AFMT_NSF] = 113 [AFMT_NSF] =
97 AFMT_ENTRY("NSF", "nsf", NULL, "nsf\0nsfe\0" ), 114 AFMT_ENTRY("NSF", "nsf", NULL, get_nsf_metadata, "nsf\0nsfe\0"),
98 /* Speex File Format */ 115 /* Speex File Format */
99 [AFMT_SPEEX] = 116 [AFMT_SPEEX] =
100 AFMT_ENTRY("Speex","speex", NULL, "spx\0" ), 117 AFMT_ENTRY("Speex", "speex",NULL, get_ogg_metadata, "spx\0"),
101 /* SPC700 Save State */ 118 /* SPC700 Save State */
102 [AFMT_SPC] = 119 [AFMT_SPC] =
103 AFMT_ENTRY("SPC", "spc", NULL, "spc\0" ), 120 AFMT_ENTRY("SPC", "spc", NULL, get_spc_metadata, "spc\0"),
104 /* APE (Monkey's Audio) */ 121 /* APE (Monkey's Audio) */
105 [AFMT_APE] = 122 [AFMT_APE] =
106 AFMT_ENTRY("APE", "ape", NULL, "ape\0mac\0" ), 123 AFMT_ENTRY("APE", "ape", NULL, get_monkeys_metadata,"ape\0mac\0"),
107 /* WMA (WMAV1/V2 in ASF) */ 124 /* WMA (WMAV1/V2 in ASF) */
108 [AFMT_WMA] = 125 [AFMT_WMA] =
109 AFMT_ENTRY("WMA", "wma", NULL, "wma\0wmv\0asf\0" ), 126 AFMT_ENTRY("WMA", "wma", NULL, get_asf_metadata,"wma\0wmv\0asf\0"),
110 /* WMA Professional in ASF */ 127 /* WMA Professional in ASF */
111 [AFMT_WMAPRO] = 128 [AFMT_WMAPRO] =
112 AFMT_ENTRY("WMAPro", "wmapro", NULL, "wma\0wmv\0asf\0" ), 129 AFMT_ENTRY("WMAPro","wmapro",NULL, NULL, "wma\0wmv\0asf\0"),
113 /* Amiga MOD File */ 130 /* Amiga MOD File */
114 [AFMT_MOD] = 131 [AFMT_MOD] =
115 AFMT_ENTRY("MOD", "mod", NULL, "mod\0" ), 132 AFMT_ENTRY("MOD", "mod", NULL, get_mod_metadata, "mod\0"),
116 /* Atari SAP File */ 133 /* Atari SAP File */
117 [AFMT_SAP] = 134 [AFMT_SAP] =
118 AFMT_ENTRY("SAP", "asap", NULL, "sap\0" ), 135 AFMT_ENTRY("SAP", "asap", NULL, get_asap_metadata, "sap\0"),
119 /* Cook in RM/RA */ 136 /* Cook in RM/RA */
120 [AFMT_RM_COOK] = 137 [AFMT_RM_COOK] =
121 AFMT_ENTRY("Cook", "cook", NULL, "rm\0ra\0rmvb\0" ), 138 AFMT_ENTRY("Cook", "cook", NULL, get_rm_metadata,"rm\0ra\0rmvb\0"),
122 /* AAC in RM/RA */ 139 /* AAC in RM/RA */
123 [AFMT_RM_AAC] = 140 [AFMT_RM_AAC] =
124 AFMT_ENTRY("RAAC", "raac", NULL, "rm\0ra\0rmvb\0" ), 141 AFMT_ENTRY("RAAC", "raac", NULL, NULL, "rm\0ra\0rmvb\0"),
125 /* AC3 in RM/RA */ 142 /* AC3 in RM/RA */
126 [AFMT_RM_AC3] = 143 [AFMT_RM_AC3] =
127 AFMT_ENTRY("AC3", "a52_rm", NULL, "rm\0ra\0rmvb\0" ), 144 AFMT_ENTRY("AC3", "a52_rm", NULL, NULL, "rm\0ra\0rmvb\0"),
128 /* ATRAC3 in RM/RA */ 145 /* ATRAC3 in RM/RA */
129 [AFMT_RM_ATRAC3] = 146 [AFMT_RM_ATRAC3] =
130 AFMT_ENTRY("ATRAC3","atrac3_rm", NULL, "rm\0ra\0rmvb\0" ), 147 AFMT_ENTRY("ATRAC3","atrac3_rm",NULL, NULL, "rm\0ra\0rmvb\0"),
131 /* Atari CMC File */ 148 /* Atari CMC File */
132 [AFMT_CMC] = 149 [AFMT_CMC] =
133 AFMT_ENTRY("CMC", "asap", NULL, "cmc\0" ), 150 AFMT_ENTRY("CMC", "asap", NULL, get_other_asap_metadata,"cmc\0"),
134 /* Atari CM3 File */ 151 /* Atari CM3 File */
135 [AFMT_CM3] = 152 [AFMT_CM3] =
136 AFMT_ENTRY("CM3", "asap", NULL, "cm3\0" ), 153 AFMT_ENTRY("CM3", "asap", NULL, get_other_asap_metadata,"cm3\0"),
137 /* Atari CMR File */ 154 /* Atari CMR File */
138 [AFMT_CMR] = 155 [AFMT_CMR] =
139 AFMT_ENTRY("CMR", "asap", NULL, "cmr\0" ), 156 AFMT_ENTRY("CMR", "asap", NULL, get_other_asap_metadata,"cmr\0"),
140 /* Atari CMS File */ 157 /* Atari CMS File */
141 [AFMT_CMS] = 158 [AFMT_CMS] =
142 AFMT_ENTRY("CMS", "asap", NULL, "cms\0" ), 159 AFMT_ENTRY("CMS", "asap", NULL, get_other_asap_metadata,"cms\0"),
143 /* Atari DMC File */ 160 /* Atari DMC File */
144 [AFMT_DMC] = 161 [AFMT_DMC] =
145 AFMT_ENTRY("DMC", "asap", NULL, "dmc\0" ), 162 AFMT_ENTRY("DMC", "asap", NULL, get_other_asap_metadata,"dmc\0"),
146 /* Atari DLT File */ 163 /* Atari DLT File */
147 [AFMT_DLT] = 164 [AFMT_DLT] =
148 AFMT_ENTRY("DLT", "asap", NULL, "dlt\0" ), 165 AFMT_ENTRY("DLT", "asap", NULL, get_other_asap_metadata,"dlt\0"),
149 /* Atari MPT File */ 166 /* Atari MPT File */
150 [AFMT_MPT] = 167 [AFMT_MPT] =
151 AFMT_ENTRY("MPT", "asap", NULL, "mpt\0" ), 168 AFMT_ENTRY("MPT", "asap", NULL, get_other_asap_metadata,"mpt\0"),
152 /* Atari MPD File */ 169 /* Atari MPD File */
153 [AFMT_MPD] = 170 [AFMT_MPD] =
154 AFMT_ENTRY("MPD", "asap", NULL, "mpd\0" ), 171 AFMT_ENTRY("MPD", "asap", NULL, get_other_asap_metadata,"mpd\0"),
155 /* Atari RMT File */ 172 /* Atari RMT File */
156 [AFMT_RMT] = 173 [AFMT_RMT] =
157 AFMT_ENTRY("RMT", "asap", NULL, "rmt\0" ), 174 AFMT_ENTRY("RMT", "asap", NULL, get_other_asap_metadata,"rmt\0"),
158 /* Atari TMC File */ 175 /* Atari TMC File */
159 [AFMT_TMC] = 176 [AFMT_TMC] =
160 AFMT_ENTRY("TMC", "asap", NULL, "tmc\0" ), 177 AFMT_ENTRY("TMC", "asap", NULL, get_other_asap_metadata,"tmc\0"),
161 /* Atari TM8 File */ 178 /* Atari TM8 File */
162 [AFMT_TM8] = 179 [AFMT_TM8] =
163 AFMT_ENTRY("TM8", "asap", NULL, "tm8\0" ), 180 AFMT_ENTRY("TM8", "asap", NULL, get_other_asap_metadata,"tm8\0"),
164 /* Atari TM2 File */ 181 /* Atari TM2 File */
165 [AFMT_TM2] = 182 [AFMT_TM2] =
166 AFMT_ENTRY("TM2", "asap", NULL, "tm2\0" ), 183 AFMT_ENTRY("TM2", "asap", NULL, get_other_asap_metadata,"tm2\0"),
167 /* Atrac3 in Sony OMA Container */ 184 /* Atrac3 in Sony OMA Container */
168 [AFMT_OMA_ATRAC3] = 185 [AFMT_OMA_ATRAC3] =
169 AFMT_ENTRY("ATRAC3", "atrac3_oma", NULL, "oma\0aa3\0" ), 186 AFMT_ENTRY("ATRAC3","atrac3_oma",NULL, get_oma_metadata, "oma\0aa3\0"),
170 /* SMAF (Synthetic music Mobile Application Format) */ 187 /* SMAF (Synthetic music Mobile Application Format) */
171 [AFMT_SMAF] = 188 [AFMT_SMAF] =
172 AFMT_ENTRY("SMAF", "smaf", NULL, "mmf\0" ), 189 AFMT_ENTRY("SMAF", "smaf", NULL, get_smaf_metadata, "mmf\0"),
173 /* Sun Audio file */ 190 /* Sun Audio file */
174 [AFMT_AU] = 191 [AFMT_AU] =
175 AFMT_ENTRY("AU", "au", NULL, "au\0snd\0" ), 192 AFMT_ENTRY("AU", "au", NULL, get_au_metadata, "au\0snd\0"),
176 /* VOX (Dialogic telephony file formats) */ 193 /* VOX (Dialogic telephony file formats) */
177 [AFMT_VOX] = 194 [AFMT_VOX] =
178 AFMT_ENTRY("VOX", "vox", NULL, "vox\0" ), 195 AFMT_ENTRY("VOX", "vox", NULL, get_vox_metadata, "vox\0"),
179 /* Wave64 */ 196 /* Wave64 */
180 [AFMT_WAVE64] = 197 [AFMT_WAVE64] =
181 AFMT_ENTRY("WAVE64", "wav64", NULL, "w64\0" ), 198 AFMT_ENTRY("WAVE64","wav64",NULL, get_wave64_metadata,"w64\0"),
182 /* True Audio */ 199 /* True Audio */
183 [AFMT_TTA] = 200 [AFMT_TTA] =
184 AFMT_ENTRY("TTA", "tta", NULL, "tta\0" ), 201 AFMT_ENTRY("TTA", "tta", NULL, get_tta_metadata, "tta\0"),
185 /* WMA Voice in ASF */ 202 /* WMA Voice in ASF */
186 [AFMT_WMAVOICE] = 203 [AFMT_WMAVOICE] =
187 AFMT_ENTRY("WMAVoice", "wmavoice", NULL, "wma\0wmv\0asf\0" ), 204 AFMT_ENTRY("WMAVoice","wmavoice",NULL, NULL, "wma\0wmv\0"),
188#endif 205#endif
189}; 206};
190 207
@@ -261,7 +278,7 @@ bool mp3info(struct mp3entry *entry, const char *filename)
261 if (fd < 0) 278 if (fd < 0)
262 return true; 279 return true;
263 280
264 result = !get_mp3_metadata(fd, entry, filename); 281 result = !get_mp3_metadata(fd, entry);
265 282
266 close(fd); 283 close(fd);
267 284
@@ -273,255 +290,30 @@ bool mp3info(struct mp3entry *entry, const char *filename)
273 */ 290 */
274bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) 291bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
275{ 292{
293 const struct afmt_entry *entry;
276 /* Clear the mp3entry to avoid having bogus pointers appear */ 294 /* Clear the mp3entry to avoid having bogus pointers appear */
277 memset(id3, 0, sizeof(struct mp3entry)); 295 memset(id3, 0, sizeof(struct mp3entry));
278 296
279 /* Take our best guess at the codec type based on file extension */ 297 /* Take our best guess at the codec type based on file extension */
280 id3->codectype = probe_file_format(trackname); 298 id3->codectype = probe_file_format(trackname);
281 299
300 entry = &audio_formats[id3->codectype];
301
282 /* Load codec specific track tag information and confirm the codec type. */ 302 /* Load codec specific track tag information and confirm the codec type. */
283 switch (id3->codectype) 303 if (!entry->parse_func)
284 { 304 {
285 case AFMT_MPA_L1: 305 DEBUGF("nothing to parse for %s (format %s)", trackname, entry->label);
286 case AFMT_MPA_L2: 306 return false;
287 case AFMT_MPA_L3: 307 }
288 if (!get_mp3_metadata(fd, id3, trackname))
289 {
290 return false;
291 }
292
293 break;
294
295#if CONFIG_CODEC == SWCODEC
296 case AFMT_FLAC:
297 if (!get_flac_metadata(fd, id3))
298 {
299 return false;
300 }
301
302 break;
303
304 case AFMT_WMA:
305 if (!get_asf_metadata(fd, id3))
306 {
307 return false;
308 }
309 break;
310
311 case AFMT_APE:
312 if (!get_monkeys_metadata(fd, id3))
313 {
314 return false;
315 }
316 read_ape_tags(fd, id3);
317 break;
318
319 case AFMT_MPC:
320 if (!get_musepack_metadata(fd, id3))
321 return false;
322 read_ape_tags(fd, id3);
323 break;
324
325 case AFMT_OGG_VORBIS:
326 case AFMT_SPEEX:
327 if (!get_ogg_metadata(fd, id3))/*detects and handles Ogg/Speex files*/
328 {
329 return false;
330 }
331
332 break;
333
334 case AFMT_PCM_WAV:
335 if (!get_wave_metadata(fd, id3))
336 {
337 return false;
338 }
339
340 break;
341
342 case AFMT_WAVPACK:
343 if (!get_wavpack_metadata(fd, id3))
344 {
345 return false;
346 }
347
348 read_ape_tags(fd, id3); /* use any apetag info we find */
349 break;
350
351 case AFMT_A52:
352 if (!get_a52_metadata(fd, id3))
353 {
354 return false;
355 }
356
357 break;
358
359 case AFMT_MP4_ALAC:
360 case AFMT_MP4_AAC:
361 if (!get_mp4_metadata(fd, id3))
362 {
363 return false;
364 }
365
366 break;
367
368 case AFMT_MOD:
369 if (!get_mod_metadata(fd, id3))
370 {
371 return false;
372 }
373
374 break;
375
376 case AFMT_SHN:
377 id3->vbr = true;
378 id3->filesize = filesize(fd);
379 if (!skip_id3v2(fd, id3))
380 {
381 return false;
382 }
383 /* TODO: read the id3v2 header if it exists */
384 break;
385
386 case AFMT_SID:
387 if (!get_sid_metadata(fd, id3))
388 {
389 return false;
390 }
391 break;
392
393 case AFMT_SPC:
394 if (!get_spc_metadata(fd, id3))
395 {
396 DEBUGF("get_spc_metadata error\n");
397 return false;
398 }
399 id3->filesize = filesize(fd);
400 id3->genre_string = id3_get_num_genre(36);
401 break;
402
403 case AFMT_ADX:
404 if (!get_adx_metadata(fd, id3))
405 {
406 DEBUGF("get_adx_metadata error\n");
407 return false;
408 }
409
410 break;
411
412 case AFMT_NSF:
413 if (!get_nsf_metadata(fd, id3))
414 {
415 DEBUGF("get_nsf_metadata error\n");
416 return false;
417 }
418 break;
419
420 case AFMT_AIFF:
421 if (!get_aiff_metadata(fd, id3))
422 {
423 return false;
424 }
425
426 break;
427
428 case AFMT_SAP:
429 if (!get_asap_metadata(fd, id3))
430 {
431 DEBUGF("get_sap_metadata error\n");
432 return false;
433 }
434 id3->filesize = filesize(fd);
435 id3->genre_string = id3_get_num_genre(36);
436 break;
437
438 case AFMT_CMC:
439 case AFMT_CM3:
440 case AFMT_CMR:
441 case AFMT_CMS:
442 case AFMT_DMC:
443 case AFMT_DLT:
444 case AFMT_MPT:
445 case AFMT_MPD:
446 case AFMT_RMT:
447 case AFMT_TMC:
448 case AFMT_TM8:
449 case AFMT_TM2:
450 id3->bitrate = 706;
451 id3->frequency = 44100;
452 id3->vbr = false;
453 id3->filesize = filesize(fd);
454 id3->genre_string = id3_get_num_genre(36);
455 break;
456 case AFMT_RM_COOK:
457 if (!get_rm_metadata(fd, id3))
458 {
459 DEBUGF("get_rm_metadata error\n");
460 return false;
461 }
462 break;
463 case AFMT_OMA_ATRAC3:
464 if (!get_oma_metadata(fd, id3))
465 {
466 DEBUGF("get_oma_metadata error\n");
467 return false;
468 }
469 break;
470
471 case AFMT_SMAF:
472 if (!get_smaf_metadata(fd, id3))
473 {
474 DEBUGF("get_smaf_metadata error\n");
475 return false;
476 }
477 break;
478 308
479 case AFMT_AU: 309 if (!entry->parse_func(fd, id3))
480 if (!get_au_metadata(fd, id3)) 310 {
481 { 311 DEBUGF("parsing %s failed (format: %s)", trackname, entry->label);
482 DEBUGF("get_au_metadata error\n");
483 return false;
484 }
485 break;
486
487 case AFMT_VOX:
488 if (!get_vox_metadata(fd, id3))
489 {
490 DEBUGF("get_vox_metadata error\n");
491 return false;
492 }
493 break;
494
495 case AFMT_WAVE64:
496 if (!get_wave64_metadata(fd, id3))
497 {
498 DEBUGF("get_wave64_metadata error\n");
499 return false;
500 }
501 break;
502
503 case AFMT_TTA:
504 if (!get_tta_metadata(fd, id3))
505 {
506 DEBUGF("get_tta_metadata error\n");
507 return false;
508 }
509 break;
510
511#endif /* CONFIG_CODEC == SWCODEC */
512
513 default:
514 /* If we don't know how to read the metadata, assume we can't play
515 the file */
516 return false; 312 return false;
517 break;
518 } 313 }
519 314
520 /* We have successfully read the metadata from the file */
521
522 lseek(fd, 0, SEEK_SET);
523 strlcpy(id3->path, trackname, sizeof(id3->path)); 315 strlcpy(id3->path, trackname, sizeof(id3->path));
524 316 /* We have successfully read the metadata from the file */
525 return true; 317 return true;
526} 318}
527 319
diff --git a/apps/metadata.h b/apps/metadata.h
index 39da30e1a5..e2deece727 100644
--- a/apps/metadata.h
+++ b/apps/metadata.h
@@ -108,7 +108,6 @@ enum
108#define CODEC_EXTENSION "codec" 108#define CODEC_EXTENSION "codec"
109 109
110#ifdef HAVE_RECORDING 110#ifdef HAVE_RECORDING
111#define ENCODER_SUFFIX "_enc"
112enum rec_format_indexes 111enum rec_format_indexes
113{ 112{
114 __REC_FORMAT_START_INDEX = -1, 113 __REC_FORMAT_START_INDEX = -1,
@@ -139,11 +138,11 @@ extern const int rec_format_afmt[REC_NUM_FORMATS];
139/* get AFMT_* corresponding REC_FORMAT_* */ 138/* get AFMT_* corresponding REC_FORMAT_* */
140extern const int afmt_rec_format[AFMT_NUM_CODECS]; 139extern const int afmt_rec_format[AFMT_NUM_CODECS];
141 140
142#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \ 141#define AFMT_ENTRY(label, root_fname, enc_root_fname, func, ext_list) \
143 { label, root_fname, enc_root_fname, ext_list } 142 { label, root_fname, enc_root_fname, func, ext_list }
144#else /* !HAVE_RECORDING */ 143#else /* !HAVE_RECORDING */
145#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \ 144#define AFMT_ENTRY(label, root_fname, enc_root_fname, func, ext_list) \
146 { label, root_fname, ext_list } 145 { label, root_fname, func, ext_list }
147#endif /* HAVE_RECORDING */ 146#endif /* HAVE_RECORDING */
148 147
149#else /* !SWCODEC */ 148#else /* !SWCODEC */
@@ -154,6 +153,7 @@ extern const int afmt_rec_format[AFMT_NUM_CODECS];
154 153
155/** Database of audio formats **/ 154/** Database of audio formats **/
156/* record describing the audio format */ 155/* record describing the audio format */
156struct mp3entry;
157struct afmt_entry 157struct afmt_entry
158{ 158{
159 const char *label; /* format label */ 159 const char *label; /* format label */
@@ -163,7 +163,8 @@ struct afmt_entry
163 const char *codec_enc_root_fn; /* filename of encoder codec */ 163 const char *codec_enc_root_fn; /* filename of encoder codec */
164#endif 164#endif
165#endif 165#endif
166 const char *ext_list; /* double NULL terminated extension 166 bool (*parse_func)(int fd, struct mp3entry *id3); /* return true on success */
167 const char *ext_list; /* NULL terminated extension
167 list for type with the first as 168 list for type with the first as
168 the default for recording */ 169 the default for recording */
169}; 170};
diff --git a/apps/metadata/asap.c b/apps/metadata/asap.c
index 0472798462..9e7f227031 100644
--- a/apps/metadata/asap.c
+++ b/apps/metadata/asap.c
@@ -248,6 +248,7 @@ bool get_asap_metadata(int fd, struct mp3entry* id3)
248 248
249 id3->vbr = false; 249 id3->vbr = false;
250 id3->filesize = filelength; 250 id3->filesize = filelength;
251 251 id3->genre_string = id3_get_num_genre(36);
252
252 return true; 253 return true;
253} 254}
diff --git a/apps/metadata/metadata_parsers.h b/apps/metadata/metadata_parsers.h
index 7238b71a30..7797b47094 100644
--- a/apps/metadata/metadata_parsers.h
+++ b/apps/metadata/metadata_parsers.h
@@ -23,8 +23,7 @@ char* id3_get_num_genre(unsigned int genre_num);
23int getid3v2len(int fd); 23int getid3v2len(int fd);
24bool setid3v1title(int fd, struct mp3entry *entry); 24bool setid3v1title(int fd, struct mp3entry *entry);
25void setid3v2title(int fd, struct mp3entry *entry); 25void setid3v2title(int fd, struct mp3entry *entry);
26bool get_mp3_metadata(int fd, struct mp3entry* id3, const char *filename); 26bool get_mp3_metadata(int fd, struct mp3entry* id3);
27
28bool get_adx_metadata(int fd, struct mp3entry* id3); 27bool get_adx_metadata(int fd, struct mp3entry* id3);
29bool get_aiff_metadata(int fd, struct mp3entry* id3); 28bool get_aiff_metadata(int fd, struct mp3entry* id3);
30bool get_flac_metadata(int fd, struct mp3entry* id3); 29bool get_flac_metadata(int fd, struct mp3entry* id3);
diff --git a/apps/metadata/monkeys.c b/apps/metadata/monkeys.c
index 1cacff13af..4aff1412aa 100644
--- a/apps/metadata/monkeys.c
+++ b/apps/metadata/monkeys.c
@@ -91,5 +91,7 @@ bool get_monkeys_metadata(int fd, struct mp3entry* id3)
91 91
92 id3->length = ((int64_t) totalsamples * 1000) / id3->frequency; 92 id3->length = ((int64_t) totalsamples * 1000) / id3->frequency;
93 id3->bitrate = (id3->filesize * 8) / id3->length; 93 id3->bitrate = (id3->filesize * 8) / id3->length;
94
95 read_ape_tags(fd, id3);
94 return true; 96 return true;
95} 97}
diff --git a/apps/metadata/mp3.c b/apps/metadata/mp3.c
index c65fb39cd8..9309242604 100644
--- a/apps/metadata/mp3.c
+++ b/apps/metadata/mp3.c
@@ -163,14 +163,8 @@ static int getsonglength(int fd, struct mp3entry *entry)
163 * about an MP3 file and updates it's entry accordingly. 163 * about an MP3 file and updates it's entry accordingly.
164 * 164 *
165 Note, that this returns true for successful, false for error! */ 165 Note, that this returns true for successful, false for error! */
166bool get_mp3_metadata(int fd, struct mp3entry *entry, const char *filename) 166bool get_mp3_metadata(int fd, struct mp3entry *entry)
167{ 167{
168#if CONFIG_CODEC != SWCODEC
169 memset(entry, 0, sizeof(struct mp3entry));
170#endif
171
172 strlcpy(entry->path, filename, sizeof(entry->path));
173
174 entry->title = NULL; 168 entry->title = NULL;
175 entry->filesize = filesize(fd); 169 entry->filesize = filesize(fd);
176 entry->id3v2len = getid3v2len(fd); 170 entry->id3v2len = getid3v2len(fd);
diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c
index c6f3c3df72..f70e1d35df 100644
--- a/apps/metadata/mpc.c
+++ b/apps/metadata/mpc.c
@@ -211,5 +211,7 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3)
211 211
212 id3->filesize = filesize(fd); 212 id3->filesize = filesize(fd);
213 id3->bitrate = id3->filesize * 8 / id3->length; 213 id3->bitrate = id3->filesize * 8 / id3->length;
214
215 read_ape_tags(fd, id3);
214 return true; 216 return true;
215} 217}
diff --git a/apps/metadata/spc.c b/apps/metadata/spc.c
index 786c678c4c..f1fcb81707 100644
--- a/apps/metadata/spc.c
+++ b/apps/metadata/spc.c
@@ -124,5 +124,8 @@ bool get_spc_metadata(int fd, struct mp3entry* id3)
124 124
125 id3->length = length+fade; 125 id3->length = length+fade;
126 126
127 id3->filesize = filesize(fd);
128 id3->genre_string = id3_get_num_genre(36);
129
127 return true; 130 return true;
128} 131}
diff --git a/apps/metadata/wavpack.c b/apps/metadata/wavpack.c
index a6ab6f2bd5..bb181b8d3f 100644
--- a/apps/metadata/wavpack.c
+++ b/apps/metadata/wavpack.c
@@ -136,6 +136,7 @@ bool get_wavpack_metadata(int fd, struct mp3entry* id3)
136 id3->length = ((int64_t) totalsamples * 1000) / id3->frequency; 136 id3->length = ((int64_t) totalsamples * 1000) / id3->frequency;
137 id3->bitrate = filesize (fd) / (id3->length / 8); 137 id3->bitrate = filesize (fd) / (id3->length / 8);
138 138
139 read_ape_tags(fd, id3);
139 return true; 140 return true;
140 } 141 }
141 142