diff options
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r-- | firmware/pcm_playback.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index b18238cd3e..45e91ac3be 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -62,6 +62,8 @@ static int crossfade_pos; | |||
62 | static int crossfade_amount; | 62 | static int crossfade_amount; |
63 | static int crossfade_rem; | 63 | static int crossfade_rem; |
64 | 64 | ||
65 | static void (*pcm_event_handler)(void); | ||
66 | |||
65 | static unsigned char *next_start; | 67 | static unsigned char *next_start; |
66 | static long next_size; | 68 | static long next_size; |
67 | 69 | ||
@@ -202,6 +204,8 @@ static void pcm_play_callback(unsigned char** start, long* size) | |||
202 | { | 204 | { |
203 | /* No more buffers */ | 205 | /* No more buffers */ |
204 | *size = 0; | 206 | *size = 0; |
207 | if (pcm_event_handler) | ||
208 | pcm_event_handler(); | ||
205 | } | 209 | } |
206 | #if 1 | 210 | #if 1 |
207 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) | 211 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) |
@@ -363,8 +367,7 @@ void pcm_set_boost_mode(bool state) | |||
363 | 367 | ||
364 | void audiobuffer_add_event(void (*event_handler)(void)) | 368 | void audiobuffer_add_event(void (*event_handler)(void)) |
365 | { | 369 | { |
366 | while (!pcm_play_add_chunk(NULL, 0, event_handler)) | 370 | pcm_event_handler = event_handler; |
367 | yield(); | ||
368 | } | 371 | } |
369 | 372 | ||
370 | unsigned int audiobuffer_get_latency(void) | 373 | unsigned int audiobuffer_get_latency(void) |
@@ -474,10 +477,11 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
474 | copy_n += audiobuffer_fillpos; | 477 | copy_n += audiobuffer_fillpos; |
475 | 478 | ||
476 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], | 479 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], |
477 | copy_n, NULL)) { | 480 | copy_n, pcm_event_handler)) { |
478 | pcm_boost(false); | 481 | pcm_boost(false); |
479 | yield(); | 482 | yield(); |
480 | } | 483 | } |
484 | pcm_event_handler = NULL; | ||
481 | 485 | ||
482 | audiobuffer_pos += copy_n; | 486 | audiobuffer_pos += copy_n; |
483 | audiobuffer_fillpos = 0; | 487 | audiobuffer_fillpos = 0; |
@@ -502,6 +506,7 @@ void pcm_play_init(void) | |||
502 | pcmbuf_write_index = 0; | 506 | pcmbuf_write_index = 0; |
503 | pcmbuf_unplayed_bytes = 0; | 507 | pcmbuf_unplayed_bytes = 0; |
504 | crossfade_enabled = false; | 508 | crossfade_enabled = false; |
509 | pcm_event_handler = NULL; | ||
505 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); | 510 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); |
506 | } | 511 | } |
507 | 512 | ||