summaryrefslogtreecommitdiff
path: root/firmware/id3.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/id3.c')
-rw-r--r--firmware/id3.c138
1 files changed, 83 insertions, 55 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 92f60a2095..7d03c75331 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -44,6 +44,89 @@
44#include "replaygain.h" 44#include "replaygain.h"
45#include "rbunicode.h" 45#include "rbunicode.h"
46 46
47/** Database of audio formats **/
48const struct afmt_entry audio_formats[AFMT_NUM_CODECS] =
49{
50 /* Unknown file format */
51 [AFMT_UNKNOWN] =
52 AFMT_ENTRY("???", NULL, NULL, NULL ),
53
54 /* MPEG Audio layer 1 */
55 [AFMT_MPA_L1] =
56 AFMT_ENTRY("MP1", "mpa", NULL, "mp1\0" ),
57 /* MPEG Audio layer 2 */
58 [AFMT_MPA_L2] =
59 AFMT_ENTRY("MP2", "mpa", NULL, "mpa\0mp2\0" ),
60 /* MPEG Audio layer 3 */
61 [AFMT_MPA_L3] =
62 AFMT_ENTRY("MP3", "mpa", "mp3_enc", "mp3\0" ),
63
64 /* Audio Interchange File Format */
65 [AFMT_AIFF] =
66 AFMT_ENTRY("AIFF", "aiff", NULL, "aiff\0aif\0"),
67
68#if CONFIG_CODEC == SWCODEC
69 /* Uncompressed PCM in a WAV file */
70 [AFMT_PCM_WAV] =
71 AFMT_ENTRY("WAV", "wav", "wav_enc", "wav\0" ),
72 /* Ogg Vorbis */
73 [AFMT_OGG_VORBIS] =
74 AFMT_ENTRY("Ogg", "vorbis", NULL, "ogg\0" ),
75 /* FLAC */
76 [AFMT_FLAC] =
77 AFMT_ENTRY("FLAC", "flac", NULL, "flac\0" ),
78 /* Musepack */
79 [AFMT_MPC] =
80 AFMT_ENTRY("MPC", "mpc", NULL, "mpc\0" ),
81 /* A/52 (aka AC3) audio */
82 [AFMT_A52] =
83 AFMT_ENTRY("AC3", "a52", NULL, "a52\0ac3\0" ),
84 /* WavPack */
85 [AFMT_WAVPACK] =
86 AFMT_ENTRY("WV", "wavpack", "wavpack_enc", "wv\0" ),
87 /* Apple Lossless Audio Codec */
88 [AFMT_ALAC] =
89 AFMT_ENTRY("ALAC", "alac", NULL, "m4a\0" ),
90 /* Advanced Audio Coding in M4A container */
91 [AFMT_AAC] =
92 AFMT_ENTRY("AAC", "aac", NULL, "mp4\0" ),
93 /* Shorten */
94 [AFMT_SHN] =
95 AFMT_ENTRY("SHN", "shorten", NULL, "shn\0" ),
96 /* SID File Format */
97 [AFMT_SID] =
98 AFMT_ENTRY("SID", "sid", NULL, "sid\0" ),
99 /* ADX File Format */
100 [AFMT_ADX] =
101 AFMT_ENTRY("ADX", "adx", NULL, "adx\0" ),
102#endif
103};
104
105#if CONFIG_CODEC == SWCODEC && defined (HAVE_RECORDING)
106/* get REC_FORMAT_* corresponding AFMT_* */
107const int rec_format_afmt[REC_NUM_FORMATS] =
108{
109 /* give AFMT_UNKNOWN by default */
110 [0 ... REC_NUM_FORMATS-1] = AFMT_UNKNOWN,
111 /* add new entries below this line */
112 [REC_FORMAT_MPA_L3] = AFMT_MPA_L3,
113 [REC_FORMAT_WAVPACK] = AFMT_WAVPACK,
114 [REC_FORMAT_PCM_WAV] = AFMT_PCM_WAV,
115};
116
117/* get AFMT_* corresponding REC_FORMAT_* */
118const int afmt_rec_format[AFMT_NUM_CODECS] =
119{
120 /* give -1 by default */
121 [0 ... AFMT_NUM_CODECS-1] = -1,
122 /* add new entries below this line */
123 [AFMT_MPA_L3] = REC_FORMAT_MPA_L3,
124 [AFMT_WAVPACK] = REC_FORMAT_WAVPACK,
125 [AFMT_PCM_WAV] = REC_FORMAT_PCM_WAV,
126};
127#endif /* CONFIG_CODEC == SWCODEC && defined (HAVE_RECORDING) */
128/****/
129
47#define UNSYNC(b0,b1,b2,b3) (((long)(b0 & 0x7F) << (3*7)) | \ 130#define UNSYNC(b0,b1,b2,b3) (((long)(b0 & 0x7F) << (3*7)) | \
48 ((long)(b1 & 0x7F) << (2*7)) | \ 131 ((long)(b1 & 0x7F) << (2*7)) | \
49 ((long)(b2 & 0x7F) << (1*7)) | \ 132 ((long)(b2 & 0x7F) << (1*7)) | \
@@ -85,61 +168,6 @@ static const char* const genres[] = {
85 "Synthpop" 168 "Synthpop"
86}; 169};
87 170
88/* database of audio formats */
89const struct afmt_entry audio_formats[AFMT_NUM_CODECS] =
90{
91 /* Unknown file format */
92 AFMT_ENTRY("???", NULL, NULL, NULL ),
93 /* MPEG Audio layer 1 */
94 AFMT_ENTRY("MP1", "mpa.codec", NULL, NULL ),
95 /* MPEG Audio layer 2 */
96 AFMT_ENTRY("MP2", "mpa.codec", NULL, NULL ),
97 /* MPEG Audio layer 3 */
98 AFMT_ENTRY("MP3", "mpa.codec", "mp3_enc.codec", ".mp3"),
99#if CONFIG_CODEC == SWCODEC
100 /* Uncompressed PCM in a WAV file */
101 AFMT_ENTRY("WAV", "wav.codec", "wav_enc.codec", ".wav"),
102 /* Ogg Vorbis */
103 AFMT_ENTRY("Ogg", "vorbis.codec", NULL, NULL ),
104 /* FLAC */
105 AFMT_ENTRY("FLAC", "flac.codec", NULL, NULL ),
106 /* Musepack */
107 AFMT_ENTRY("MPC", "mpc.codec", NULL, NULL ),
108 /* A/52 (aka AC3) audio */
109 AFMT_ENTRY("AC3", "a52.codec", NULL, NULL ),
110 /* WavPack */
111 AFMT_ENTRY("WV", "wavpack.codec", "wavpack_enc.codec", ".wv" ),
112 /* Apple Lossless Audio Codec */
113 AFMT_ENTRY("ALAC", "alac.codec", NULL, NULL ),
114 /* Advanced Audio Coding in M4A container */
115 AFMT_ENTRY("AAC", "aac.codec", NULL, NULL ),
116 /* Shorten */
117 AFMT_ENTRY("SHN", "shorten.codec", NULL, NULL ),
118 /* Audio Interchange File Format */
119 AFMT_ENTRY("AIFF", "aiff.codec", NULL, NULL ),
120 /* SID File Format */
121 AFMT_ENTRY("SID", "sid.codec", NULL, NULL ),
122 /* ADX File Format */
123 AFMT_ENTRY("ADX", "adx.codec", NULL, NULL ),
124#endif
125};
126
127#if CONFIG_CODEC == SWCODEC
128/* recording quality to AFMT_* */
129const int rec_quality_info_afmt[9] =
130{
131 AFMT_MPA_L3, /* MPEG L3 64 kBit/s */
132 AFMT_MPA_L3, /* MPEG L3 96 kBit/s */
133 AFMT_MPA_L3, /* MPEG L3 128 kBit/s */
134 AFMT_MPA_L3, /* MPEG L3 160 kBit/s */
135 AFMT_MPA_L3, /* MPEG L3 192 kBit/s */
136 AFMT_MPA_L3, /* MPEG L3 224 kBit/s */
137 AFMT_MPA_L3, /* MPEG L3 320 kBit/s */
138 AFMT_WAVPACK, /* WavPack 909 kBit/s */
139 AFMT_PCM_WAV, /* PCM Wav 1411 kBit/s */
140};
141#endif /* SWCODEC */
142
143char* id3_get_genre(const struct mp3entry* id3) 171char* id3_get_genre(const struct mp3entry* id3)
144{ 172{
145 if( id3->genre_string ) 173 if( id3->genre_string )