summaryrefslogtreecommitdiff
path: root/apps/metadata.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/metadata.c')
-rw-r--r--apps/metadata.c59
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
54static 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;