diff options
Diffstat (limited to 'apps/metadata.c')
-rw-r--r-- | apps/metadata.c | 59 |
1 files changed, 1 insertions, 58 deletions
diff --git a/apps/metadata.c b/apps/metadata.c index 15813c679d..5796a5669f 100644 --- a/apps/metadata.c +++ b/apps/metadata.c | |||
@@ -51,12 +51,6 @@ static const unsigned short a52_441framesizes[] = | |||
51 | 1254 * 2, 1393 * 2, 1394 * 2 | 51 | 1254 * 2, 1393 * 2, 1394 * 2 |
52 | }; | 52 | }; |
53 | 53 | ||
54 | static const long wavpack_sample_rates [] = | ||
55 | { | ||
56 | 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, | ||
57 | 32000, 44100, 48000, 64000, 88200, 96000, 192000 | ||
58 | }; | ||
59 | |||
60 | #endif /* CONFIG_CODEC == SWCODEC */ | 54 | #endif /* CONFIG_CODEC == SWCODEC */ |
61 | 55 | ||
62 | 56 | ||
@@ -179,59 +173,8 @@ bool get_metadata(struct track_info* track, int fd, const char* trackname, | |||
179 | break; | 173 | break; |
180 | 174 | ||
181 | case AFMT_WAVPACK: | 175 | case AFMT_WAVPACK: |
182 | /* A simple parser to read basic information from a WavPack file. This | 176 | if (!get_wavpack_metadata(fd, &(track->id3))) |
183 | * now works with self-extrating WavPack files. This no longer fails on | ||
184 | * WavPack files containing floating-point audio data because these are | ||
185 | * now converted to standard Rockbox format in the decoder. | ||
186 | */ | ||
187 | |||
188 | /* Use the trackname part of the id3 structure as a temporary buffer */ | ||
189 | buf = (unsigned char *)track->id3.path; | ||
190 | |||
191 | for (i = 0; i < 256; ++i) { | ||
192 | |||
193 | /* at every 256 bytes into file, try to read a WavPack header */ | ||
194 | |||
195 | if ((lseek(fd, i * 256, SEEK_SET) < 0) || (read(fd, buf, 32) < 32)) | ||
196 | { | ||
197 | return false; | ||
198 | } | ||
199 | |||
200 | /* if valid WavPack 4 header version & not floating data, break */ | ||
201 | |||
202 | if (memcmp (buf, "wvpk", 4) == 0 && buf [9] == 4 && | ||
203 | (buf [8] >= 2 && buf [8] <= 0x10)) | ||
204 | { | ||
205 | break; | ||
206 | } | ||
207 | } | ||
208 | |||
209 | if (i == 256) { | ||
210 | logf ("%s is not a WavPack file\n", trackname); | ||
211 | return false; | 177 | return false; |
212 | } | ||
213 | |||
214 | track->id3.vbr = true; /* All WavPack files are VBR */ | ||
215 | track->id3.filesize = filesize (fd); | ||
216 | |||
217 | if ((buf [20] | buf [21] | buf [22] | buf [23]) && | ||
218 | (buf [12] & buf [13] & buf [14] & buf [15]) != 0xff) | ||
219 | { | ||
220 | int srindx = ((buf [26] >> 7) & 1) + ((buf [27] << 1) & 14); | ||
221 | |||
222 | if (srindx == 15) | ||
223 | { | ||
224 | track->id3.frequency = 44100; | ||
225 | } | ||
226 | else | ||
227 | { | ||
228 | track->id3.frequency = wavpack_sample_rates[srindx]; | ||
229 | } | ||
230 | |||
231 | totalsamples = get_long_le(&buf[12]); | ||
232 | track->id3.length = totalsamples / (track->id3.frequency / 100) * 10; | ||
233 | track->id3.bitrate = filesize (fd) / (track->id3.length / 8); | ||
234 | } | ||
235 | 178 | ||
236 | read_ape_tags(fd, &track->id3); /* use any apetag info we find */ | 179 | read_ape_tags(fd, &track->id3); /* use any apetag info we find */ |
237 | break; | 180 | break; |