diff options
-rw-r--r-- | apps/codecs.h | 12 | ||||
-rw-r--r-- | apps/playback.c | 34 | ||||
-rw-r--r-- | apps/playback.h | 2 | ||||
-rw-r--r-- | firmware/export/pcm_playback.h | 6 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 35 |
5 files changed, 47 insertions, 42 deletions
diff --git a/apps/codecs.h b/apps/codecs.h index c373bdb8ba..c50af3030e 100644 --- a/apps/codecs.h +++ b/apps/codecs.h | |||
@@ -139,24 +139,24 @@ struct codec_api { | |||
139 | int seek_time; | 139 | int seek_time; |
140 | 140 | ||
141 | /* Returns buffer to malloc array. Only codeclib should need this. */ | 141 | /* Returns buffer to malloc array. Only codeclib should need this. */ |
142 | void* (*get_codec_memory)(size_t *size); | 142 | void* (*get_codec_memory)(long *size); |
143 | /* Insert PCM data into audio buffer for playback. Playback will start | 143 | /* Insert PCM data into audio buffer for playback. Playback will start |
144 | automatically. */ | 144 | automatically. */ |
145 | bool (*audiobuffer_insert)(char *data, size_t length); | 145 | bool (*audiobuffer_insert)(char *data, long length); |
146 | bool (*audiobuffer_insert_split)(void *ch1, void *ch2, size_t length); | 146 | bool (*audiobuffer_insert_split)(void *ch1, void *ch2, long length); |
147 | /* Set song position in WPS (value in ms). */ | 147 | /* Set song position in WPS (value in ms). */ |
148 | void (*set_elapsed)(unsigned int value); | 148 | void (*set_elapsed)(unsigned int value); |
149 | 149 | ||
150 | /* Read next <size> amount bytes from file buffer to <ptr>. | 150 | /* Read next <size> amount bytes from file buffer to <ptr>. |
151 | Will return number of bytes read or 0 if end of file. */ | 151 | Will return number of bytes read or 0 if end of file. */ |
152 | size_t (*read_filebuf)(void *ptr, size_t size); | 152 | long (*read_filebuf)(void *ptr, long size); |
153 | /* Request pointer to file buffer which can be used to read | 153 | /* Request pointer to file buffer which can be used to read |
154 | <realsize> amount of data. <reqsize> tells the buffer system | 154 | <realsize> amount of data. <reqsize> tells the buffer system |
155 | how much data it should try to allocate. If <realsize> is 0, | 155 | how much data it should try to allocate. If <realsize> is 0, |
156 | end of file is reached. */ | 156 | end of file is reached. */ |
157 | void* (*request_buffer)(size_t *realsize, size_t reqsize); | 157 | void* (*request_buffer)(long *realsize, long reqsize); |
158 | /* Advance file buffer position by <amount> amount of bytes. */ | 158 | /* Advance file buffer position by <amount> amount of bytes. */ |
159 | void (*advance_buffer)(size_t amount); | 159 | void (*advance_buffer)(long amount); |
160 | /* Advance file buffer to a pointer location inside file buffer. */ | 160 | /* Advance file buffer to a pointer location inside file buffer. */ |
161 | void (*advance_buffer_loc)(void *ptr); | 161 | void (*advance_buffer_loc)(void *ptr); |
162 | /* Seek file buffer to position <newpos> beginning of file. */ | 162 | /* Seek file buffer to position <newpos> beginning of file. */ |
diff --git a/apps/playback.c b/apps/playback.c index 429141f759..5721e7c21b 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -145,7 +145,7 @@ static bool track_changed; | |||
145 | static int current_fd; | 145 | static int current_fd; |
146 | 146 | ||
147 | /* Information about how many bytes left on the buffer re-fill run. */ | 147 | /* Information about how many bytes left on the buffer re-fill run. */ |
148 | static size_t fill_bytesleft; | 148 | static long fill_bytesleft; |
149 | 149 | ||
150 | /* Track info structure about songs in the file buffer. */ | 150 | /* Track info structure about songs in the file buffer. */ |
151 | static struct track_info tracks[MAX_TRACK]; | 151 | static struct track_info tracks[MAX_TRACK]; |
@@ -172,7 +172,7 @@ int mp3_get_file_pos(void); | |||
172 | 172 | ||
173 | /* Simulator stubs. */ | 173 | /* Simulator stubs. */ |
174 | #ifdef SIMULATOR | 174 | #ifdef SIMULATOR |
175 | bool pcm_insert_buffer(char *buf, size_t length) | 175 | bool pcm_insert_buffer(char *buf, long length) |
176 | { | 176 | { |
177 | (void)buf; | 177 | (void)buf; |
178 | (void)length; | 178 | (void)length; |
@@ -180,13 +180,13 @@ bool pcm_insert_buffer(char *buf, size_t length) | |||
180 | return true; | 180 | return true; |
181 | } | 181 | } |
182 | 182 | ||
183 | void pcm_flush_buffer(size_t length) | 183 | void pcm_flush_buffer(long length) |
184 | { | 184 | { |
185 | (void)length; | 185 | (void)length; |
186 | } | 186 | } |
187 | 187 | ||
188 | 188 | ||
189 | void* pcm_request_buffer(size_t length, size_t *realsize) | 189 | void* pcm_request_buffer(long length, long *realsize) |
190 | { | 190 | { |
191 | (void)length; | 191 | (void)length; |
192 | (void)realsize; | 192 | (void)realsize; |
@@ -244,10 +244,10 @@ int ata_sleep(void) | |||
244 | } | 244 | } |
245 | #endif | 245 | #endif |
246 | 246 | ||
247 | bool codec_audiobuffer_insert_callback(char *buf, size_t length) | 247 | bool codec_audiobuffer_insert_callback(char *buf, long length) |
248 | { | 248 | { |
249 | char *dest; | 249 | char *dest; |
250 | size_t realsize; | 250 | long realsize; |
251 | int factor; | 251 | int factor; |
252 | int next_channel = 0; | 252 | int next_channel = 0; |
253 | int processed_length; | 253 | int processed_length; |
@@ -292,10 +292,10 @@ bool codec_audiobuffer_insert_callback(char *buf, size_t length) | |||
292 | } | 292 | } |
293 | 293 | ||
294 | bool codec_audiobuffer_insert_split_callback(void *ch1, void *ch2, | 294 | bool codec_audiobuffer_insert_split_callback(void *ch1, void *ch2, |
295 | size_t length) | 295 | long length) |
296 | { | 296 | { |
297 | char *dest; | 297 | char *dest; |
298 | size_t realsize; | 298 | long realsize; |
299 | int factor; | 299 | int factor; |
300 | int processed_length; | 300 | int processed_length; |
301 | 301 | ||
@@ -330,7 +330,7 @@ bool codec_audiobuffer_insert_split_callback(void *ch1, void *ch2, | |||
330 | return true; | 330 | return true; |
331 | } | 331 | } |
332 | 332 | ||
333 | void* get_codec_memory_callback(size_t *size) | 333 | void* get_codec_memory_callback(long *size) |
334 | { | 334 | { |
335 | *size = MALLOC_BUFSIZE; | 335 | *size = MALLOC_BUFSIZE; |
336 | return &audiobuf[0]; | 336 | return &audiobuf[0]; |
@@ -353,7 +353,7 @@ void codec_set_elapsed_callback(unsigned int value) | |||
353 | } | 353 | } |
354 | } | 354 | } |
355 | 355 | ||
356 | size_t codec_filebuf_callback(void *ptr, size_t size) | 356 | long codec_filebuf_callback(void *ptr, long size) |
357 | { | 357 | { |
358 | char *buf = (char *)ptr; | 358 | char *buf = (char *)ptr; |
359 | int copy_n; | 359 | int copy_n; |
@@ -389,9 +389,9 @@ size_t codec_filebuf_callback(void *ptr, size_t size) | |||
389 | return copy_n; | 389 | return copy_n; |
390 | } | 390 | } |
391 | 391 | ||
392 | void* codec_request_buffer_callback(size_t *realsize, size_t reqsize) | 392 | void* codec_request_buffer_callback(long *realsize, long reqsize) |
393 | { | 393 | { |
394 | size_t part_n; | 394 | long part_n; |
395 | 395 | ||
396 | if (ci.stop_codec || !playing) { | 396 | if (ci.stop_codec || !playing) { |
397 | *realsize = 0; | 397 | *realsize = 0; |
@@ -423,7 +423,7 @@ void* codec_request_buffer_callback(size_t *realsize, size_t reqsize) | |||
423 | return (char *)&codecbuf[buf_ridx]; | 423 | return (char *)&codecbuf[buf_ridx]; |
424 | } | 424 | } |
425 | 425 | ||
426 | void codec_advance_buffer_callback(size_t amount) | 426 | void codec_advance_buffer_callback(long amount) |
427 | { | 427 | { |
428 | if ((int)amount > cur_ti->available + cur_ti->filerem) | 428 | if ((int)amount > cur_ti->available + cur_ti->filerem) |
429 | amount = cur_ti->available + cur_ti->filerem; | 429 | amount = cur_ti->available + cur_ti->filerem; |
@@ -457,7 +457,7 @@ void codec_advance_buffer_callback(size_t amount) | |||
457 | 457 | ||
458 | void codec_advance_buffer_loc_callback(void *ptr) | 458 | void codec_advance_buffer_loc_callback(void *ptr) |
459 | { | 459 | { |
460 | size_t amount; | 460 | long amount; |
461 | 461 | ||
462 | amount = (int)ptr - (int)&codecbuf[buf_ridx]; | 462 | amount = (int)ptr - (int)&codecbuf[buf_ridx]; |
463 | codec_advance_buffer_callback(amount); | 463 | codec_advance_buffer_callback(amount); |
@@ -560,7 +560,7 @@ void yield_codecs(void) | |||
560 | 560 | ||
561 | void audio_fill_file_buffer(void) | 561 | void audio_fill_file_buffer(void) |
562 | { | 562 | { |
563 | size_t i, size; | 563 | long i, size; |
564 | int rc; | 564 | int rc; |
565 | 565 | ||
566 | if (current_fd < 0) | 566 | if (current_fd < 0) |
@@ -587,10 +587,10 @@ void audio_fill_file_buffer(void) | |||
587 | buf_widx -= codecbuflen; | 587 | buf_widx -= codecbuflen; |
588 | i += rc; | 588 | i += rc; |
589 | tracks[track_widx].available += rc; | 589 | tracks[track_widx].available += rc; |
590 | codecbufused += rc; | ||
590 | fill_bytesleft -= rc; | 591 | fill_bytesleft -= rc; |
591 | } | 592 | } |
592 | 593 | ||
593 | codecbufused += i; | ||
594 | tracks[track_widx].filerem -= i; | 594 | tracks[track_widx].filerem -= i; |
595 | tracks[track_widx].filepos += i; | 595 | tracks[track_widx].filepos += i; |
596 | /*logf("Filled:%d/%d", tracks[track_widx].available, | 596 | /*logf("Filled:%d/%d", tracks[track_widx].available, |
@@ -1176,7 +1176,7 @@ void audio_thread(void) | |||
1176 | void codec_thread(void) | 1176 | void codec_thread(void) |
1177 | { | 1177 | { |
1178 | struct event ev; | 1178 | struct event ev; |
1179 | size_t codecsize; | 1179 | long codecsize; |
1180 | int status; | 1180 | int status; |
1181 | int wrap; | 1181 | int wrap; |
1182 | 1182 | ||
diff --git a/apps/playback.h b/apps/playback.h index 672ddae440..f0ae9eae42 100644 --- a/apps/playback.h +++ b/apps/playback.h | |||
@@ -49,7 +49,7 @@ struct track_info { | |||
49 | struct mp3entry id3; /* TAG metadata */ | 49 | struct mp3entry id3; /* TAG metadata */ |
50 | struct mp3info mp3data; /* MP3 metadata */ | 50 | struct mp3info mp3data; /* MP3 metadata */ |
51 | char *codecbuf; /* Pointer to codec buffer */ | 51 | char *codecbuf; /* Pointer to codec buffer */ |
52 | size_t codecsize; /* Codec length in bytes */ | 52 | long codecsize; /* Codec length in bytes */ |
53 | 53 | ||
54 | off_t filerem; /* Remaining bytes of file NOT in buffer */ | 54 | off_t filerem; /* Remaining bytes of file NOT in buffer */ |
55 | off_t filesize; /* File total length */ | 55 | off_t filesize; /* File total length */ |
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h index 3fe60670b3..07e33e96bf 100644 --- a/firmware/export/pcm_playback.h +++ b/firmware/export/pcm_playback.h | |||
@@ -48,9 +48,9 @@ bool pcm_is_lowdata(void); | |||
48 | bool pcm_crossfade_init(void); | 48 | bool pcm_crossfade_init(void); |
49 | void audiobuffer_add_event(void (*event_handler)(void)); | 49 | void audiobuffer_add_event(void (*event_handler)(void)); |
50 | unsigned int audiobuffer_get_latency(void); | 50 | unsigned int audiobuffer_get_latency(void); |
51 | bool pcm_insert_buffer(char *buf, size_t length); | 51 | bool pcm_insert_buffer(char *buf, long length); |
52 | void pcm_flush_buffer(size_t length); | 52 | void pcm_flush_buffer(long length); |
53 | void* pcm_request_buffer(size_t length, size_t *realsize); | 53 | void* pcm_request_buffer(long length, long *realsize); |
54 | bool pcm_is_crossfade_enabled(void); | 54 | bool pcm_is_crossfade_enabled(void); |
55 | void pcm_crossfade_enable(bool on_off); | 55 | void pcm_crossfade_enable(bool on_off); |
56 | 56 | ||
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 89e72c76a0..b0bdfbbb32 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -55,9 +55,9 @@ static bool pcm_paused; | |||
55 | static int pcm_freq = 0x6; /* 44.1 is default */ | 55 | static int pcm_freq = 0x6; /* 44.1 is default */ |
56 | 56 | ||
57 | static char *audiobuffer; | 57 | static char *audiobuffer; |
58 | static size_t audiobuffer_pos; | 58 | static long audiobuffer_pos; |
59 | size_t audiobuffer_free; | 59 | long audiobuffer_free; |
60 | static size_t audiobuffer_fillpos; | 60 | static long audiobuffer_fillpos; |
61 | static bool boost_mode; | 61 | static bool boost_mode; |
62 | 62 | ||
63 | static bool crossfade_enabled; | 63 | static bool crossfade_enabled; |
@@ -457,7 +457,7 @@ int crossfade(short *buf, const short *buf2, int length) | |||
457 | return size; | 457 | return size; |
458 | } | 458 | } |
459 | 459 | ||
460 | inline static bool prepare_insert(size_t length) | 460 | inline static bool prepare_insert(long length) |
461 | { | 461 | { |
462 | crossfade_start(); | 462 | crossfade_start(); |
463 | if (audiobuffer_free < length + audiobuffer_fillpos | 463 | if (audiobuffer_free < length + audiobuffer_fillpos |
@@ -476,7 +476,7 @@ inline static bool prepare_insert(size_t length) | |||
476 | return true; | 476 | return true; |
477 | } | 477 | } |
478 | 478 | ||
479 | void* pcm_request_buffer(size_t length, size_t *realsize) | 479 | void* pcm_request_buffer(long length, long *realsize) |
480 | { | 480 | { |
481 | void *ptr = NULL; | 481 | void *ptr = NULL; |
482 | 482 | ||
@@ -487,13 +487,15 @@ void* pcm_request_buffer(size_t length, size_t *realsize) | |||
487 | 487 | ||
488 | if (crossfade_active) { | 488 | if (crossfade_active) { |
489 | *realsize = MIN(length, PCMBUF_GUARD); | 489 | *realsize = MIN(length, PCMBUF_GUARD); |
490 | //logf("cfb:%d/%d", *realsize, length); | ||
490 | ptr = &guardbuf[0]; | 491 | ptr = &guardbuf[0]; |
491 | } else { | 492 | } else { |
492 | *realsize = MIN(length, PCMBUF_SIZE - audiobuffer_pos | 493 | *realsize = MIN(length, PCMBUF_SIZE - audiobuffer_pos |
493 | - audiobuffer_fillpos); | 494 | - audiobuffer_fillpos); |
494 | if (*realsize < length) { | 495 | if (*realsize < length) { |
496 | //logf("gbr1:%d/%d", *realsize, length); | ||
495 | *realsize += MIN((long)(length - *realsize), PCMBUF_GUARD); | 497 | *realsize += MIN((long)(length - *realsize), PCMBUF_GUARD); |
496 | //logf("gbr:%d/%d", *realsize, length); | 498 | //logf("gbr2:%d/%d", *realsize, length); |
497 | } | 499 | } |
498 | ptr = &audiobuffer[audiobuffer_pos + audiobuffer_fillpos]; | 500 | ptr = &audiobuffer[audiobuffer_pos + audiobuffer_fillpos]; |
499 | } | 501 | } |
@@ -501,16 +503,18 @@ void* pcm_request_buffer(size_t length, size_t *realsize) | |||
501 | return ptr; | 503 | return ptr; |
502 | } | 504 | } |
503 | 505 | ||
504 | void pcm_flush_buffer(size_t length) | 506 | void pcm_flush_buffer(long length) |
505 | { | 507 | { |
506 | int copy_n; | 508 | int copy_n; |
507 | char *buf; | 509 | char *buf; |
508 | 510 | ||
509 | if (crossfade_active) { | 511 | if (crossfade_active) { |
512 | //logf("cfbf"); | ||
510 | buf = &guardbuf[0]; | 513 | buf = &guardbuf[0]; |
511 | length = MIN(length, PCMBUF_GUARD); | 514 | length = MIN(length, PCMBUF_GUARD); |
512 | while (length > 0 && crossfade_active) { | 515 | while (length > 0 && crossfade_active) { |
513 | copy_n = MIN(length, PCMBUF_SIZE - (unsigned int)crossfade_pos); | 516 | //logf("cfl:%d", length); |
517 | copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos); | ||
514 | copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], | 518 | copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], |
515 | (const short *)buf, copy_n/2); | 519 | (const short *)buf, copy_n/2); |
516 | buf += copy_n; | 520 | buf += copy_n; |
@@ -521,7 +525,8 @@ void pcm_flush_buffer(size_t length) | |||
521 | } | 525 | } |
522 | 526 | ||
523 | while (length > 0) { | 527 | while (length > 0) { |
524 | copy_n = MIN(length, PCMBUF_SIZE - (unsigned)audiobuffer_pos); | 528 | //logf("cfl2:%d", length); |
529 | copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos); | ||
525 | memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n); | 530 | memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n); |
526 | audiobuffer_fillpos = copy_n; | 531 | audiobuffer_fillpos = copy_n; |
527 | buf += copy_n; | 532 | buf += copy_n; |
@@ -538,12 +543,12 @@ void pcm_flush_buffer(size_t length) | |||
538 | - audiobuffer_pos - audiobuffer_fillpos > 0) | 543 | - audiobuffer_pos - audiobuffer_fillpos > 0) |
539 | return ; | 544 | return ; |
540 | 545 | ||
541 | copy_n = MIN((long)(audiobuffer_fillpos - (PCMBUF_SIZE | 546 | copy_n = audiobuffer_fillpos - (PCMBUF_SIZE - audiobuffer_pos); |
542 | - audiobuffer_pos)), PCMBUF_GUARD); | ||
543 | if (copy_n > 0) { | 547 | if (copy_n > 0) { |
544 | //logf("guard buf used:%d", copy_n); | 548 | //logf("gbu:%d/%d/%d", copy_n, audiobuffer_fillpos, audiobuffer_pos); |
545 | audiobuffer_fillpos -= copy_n; | 549 | audiobuffer_fillpos -= copy_n; |
546 | pcm_flush_fillpos(); | 550 | pcm_flush_fillpos(); |
551 | copy_n = MIN(copy_n, PCMBUF_GUARD); | ||
547 | memcpy(&audiobuffer[0], &guardbuf[0], copy_n); | 552 | memcpy(&audiobuffer[0], &guardbuf[0], copy_n); |
548 | audiobuffer_fillpos = copy_n; | 553 | audiobuffer_fillpos = copy_n; |
549 | goto try_flush; | 554 | goto try_flush; |
@@ -551,16 +556,16 @@ void pcm_flush_buffer(size_t length) | |||
551 | pcm_flush_fillpos(); | 556 | pcm_flush_fillpos(); |
552 | } | 557 | } |
553 | 558 | ||
554 | bool pcm_insert_buffer(char *buf, size_t length) | 559 | bool pcm_insert_buffer(char *buf, long length) |
555 | { | 560 | { |
556 | size_t copy_n = 0; | 561 | long copy_n = 0; |
557 | 562 | ||
558 | if (!prepare_insert(length)) | 563 | if (!prepare_insert(length)) |
559 | return false; | 564 | return false; |
560 | 565 | ||
561 | while (length > 0) { | 566 | while (length > 0) { |
562 | if (crossfade_active) { | 567 | if (crossfade_active) { |
563 | copy_n = MIN(length, PCMBUF_SIZE - (unsigned int)crossfade_pos); | 568 | copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos); |
564 | 569 | ||
565 | copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], | 570 | copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], |
566 | (const short *)buf, copy_n/2); | 571 | (const short *)buf, copy_n/2); |