diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2006-11-06 18:07:30 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2006-11-06 18:07:30 +0000 |
commit | 0f5cb94aa4a334366a746fcbb22f3335ca413265 (patch) | |
tree | 8f89a96628c1810d51ee9816daf78edb8c76fcd4 /firmware/id3.c | |
parent | 0b22795e26ee09de14f6ac23219adeda12f2fd5b (diff) | |
download | rockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.tar.gz rockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.zip |
Big Patch adds primarily: Samplerate and format selection to recording for SWCODEC. Supprort for samplerates changing in playback (just goes with the recording part inseparably). Samplerates to all encoders. Encoders can be configured individually on a menu specific to the encoder in the recording menu. File creation is delayed until flush time to reduce spinups when splitting. Misc: statusbar icons for numbers are individual digits to display any number. Audio buffer was rearranged to maximize memory available to recording and properly reinitialized when trashed. ColdFire PCM stuff moved to target tree to avoid a complicated mess when adding samplerate switching. Some needed API changes and to neaten up growing gap between hardware and software codecs.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11452 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/id3.c')
-rw-r--r-- | firmware/id3.c | 138 |
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 **/ | ||
48 | const 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_* */ | ||
107 | const 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_* */ | ||
118 | const 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 */ | ||
89 | const 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_* */ | ||
129 | const 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 | |||
143 | char* id3_get_genre(const struct mp3entry* id3) | 171 | char* id3_get_genre(const struct mp3entry* id3) |
144 | { | 172 | { |
145 | if( id3->genre_string ) | 173 | if( id3->genre_string ) |