diff options
Diffstat (limited to 'firmware/mp3data.c')
-rw-r--r-- | firmware/mp3data.c | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/firmware/mp3data.c b/firmware/mp3data.c index 670934d38d..83d916ff9f 100644 --- a/firmware/mp3data.c +++ b/firmware/mp3data.c | |||
@@ -212,7 +212,7 @@ static bool mp3headerinfo(struct mp3info *info, unsigned long header) | |||
212 | return true; | 212 | return true; |
213 | } | 213 | } |
214 | 214 | ||
215 | unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header) | 215 | static unsigned long __find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header, int(*getfunc)(int fd, unsigned char *c)) |
216 | { | 216 | { |
217 | unsigned long header=0; | 217 | unsigned long header=0; |
218 | unsigned char tmp; | 218 | unsigned char tmp; |
@@ -227,7 +227,7 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long | |||
227 | /* Fill up header with first 24 bits */ | 227 | /* Fill up header with first 24 bits */ |
228 | for(i = 0; i < 3; i++) { | 228 | for(i = 0; i < 3; i++) { |
229 | header <<= 8; | 229 | header <<= 8; |
230 | if(!read(fd, &tmp, 1)) | 230 | if(!getfunc(fd, &tmp)) |
231 | return 0; | 231 | return 0; |
232 | header |= tmp; | 232 | header |= tmp; |
233 | pos++; | 233 | pos++; |
@@ -235,7 +235,7 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long | |||
235 | 235 | ||
236 | do { | 236 | do { |
237 | header <<= 8; | 237 | header <<= 8; |
238 | if(!read(fd, &tmp, 1)) | 238 | if(!getfunc(fd, &tmp)) |
239 | return 0; | 239 | return 0; |
240 | header |= tmp; | 240 | header |= tmp; |
241 | pos++; | 241 | pos++; |
@@ -254,6 +254,16 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long | |||
254 | return header; | 254 | return header; |
255 | } | 255 | } |
256 | 256 | ||
257 | static int fileread(int fd, unsigned char *c) | ||
258 | { | ||
259 | return read(fd, c, 1); | ||
260 | } | ||
261 | |||
262 | unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header) | ||
263 | { | ||
264 | return __find_next_frame(fd, offset, max_offset, last_header, fileread); | ||
265 | } | ||
266 | |||
257 | static int fnf_read_index; | 267 | static int fnf_read_index; |
258 | static int fnf_buf_len; | 268 | static int fnf_buf_len; |
259 | 269 | ||
@@ -315,44 +325,37 @@ static void buf_init(void) | |||
315 | unsigned long buf_find_next_frame(int fd, int *offset, int max_offset, | 325 | unsigned long buf_find_next_frame(int fd, int *offset, int max_offset, |
316 | unsigned long last_header) | 326 | unsigned long last_header) |
317 | { | 327 | { |
318 | unsigned long header=0; | 328 | return __find_next_frame(fd, offset, max_offset, last_header, buf_getbyte); |
319 | unsigned char tmp; | 329 | } |
320 | int i; | ||
321 | |||
322 | int pos = 0; | ||
323 | 330 | ||
324 | /* We remember the last header we found, to use as a template to see if | 331 | static int mp3buflen; |
325 | the header we find has the same frequency, layer etc */ | 332 | static int mem_pos; |
326 | last_header &= 0xffff0c00; | 333 | static int mem_cnt; |
334 | static int mem_maxlen; | ||
327 | 335 | ||
328 | /* Fill up header with first 24 bits */ | 336 | static int mem_getbyte(int dummy, unsigned char *c) |
329 | for(i = 0; i < 3; i++) { | 337 | { |
330 | header <<= 8; | 338 | dummy = dummy; |
331 | if(!buf_getbyte(fd, &tmp)) | 339 | |
332 | return 0; | 340 | *c = mp3buf[mem_pos++]; |
333 | header |= tmp; | 341 | if(mem_pos >= mp3buflen) |
334 | pos++; | 342 | mem_pos = 0; |
335 | } | ||
336 | 343 | ||
337 | do { | 344 | if(mem_cnt++ >= mem_maxlen) |
338 | header <<= 8; | 345 | return 0; |
339 | if(!buf_getbyte(fd, &tmp)) | 346 | else |
340 | return 0; | 347 | return 1; |
341 | header |= tmp; | 348 | } |
342 | pos++; | ||
343 | if(max_offset > 0 && pos > max_offset) | ||
344 | return 0; | ||
345 | } while(!is_mp3frameheader(header) || | ||
346 | (last_header?((header & 0xffff0c00) != last_header):false)); | ||
347 | 349 | ||
348 | *offset = pos - 4; | 350 | unsigned long mem_find_next_frame(int startpos, int *offset, int max_offset, |
351 | unsigned long last_header) | ||
352 | { | ||
353 | mp3buflen = mp3end - mp3buf; | ||
354 | mem_pos = startpos; | ||
355 | mem_cnt = 0; | ||
356 | mem_maxlen = max_offset; | ||
349 | 357 | ||
350 | #ifdef DEBUG | 358 | return __find_next_frame(0, offset, max_offset, last_header, mem_getbyte); |
351 | if(*offset) | ||
352 | DEBUGF("Warning: skipping %d bytes of garbage\n", *offset); | ||
353 | #endif | ||
354 | |||
355 | return header; | ||
356 | } | 359 | } |
357 | 360 | ||
358 | int get_mp3file_info(int fd, struct mp3info *info) | 361 | int get_mp3file_info(int fd, struct mp3info *info) |