diff options
-rw-r--r-- | apps/playback.c | 10 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 23 |
2 files changed, 9 insertions, 24 deletions
diff --git a/apps/playback.c b/apps/playback.c index 8b4cc6eab6..76c8b29db1 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -1003,8 +1003,7 @@ void audio_update_trackinfo(void) | |||
1003 | if (buf_ridx >= codecbuflen) | 1003 | if (buf_ridx >= codecbuflen) |
1004 | buf_ridx -= codecbuflen; | 1004 | buf_ridx -= codecbuflen; |
1005 | 1005 | ||
1006 | if (!pcm_crossfade_init()) | 1006 | pcm_crossfade_init(); |
1007 | pcm_flush_audio(); | ||
1008 | 1007 | ||
1009 | if (!filling) | 1008 | if (!filling) |
1010 | pcm_set_boost_mode(false); | 1009 | pcm_set_boost_mode(false); |
@@ -1156,11 +1155,11 @@ void audio_thread(void) | |||
1156 | switch (ev.id) { | 1155 | switch (ev.id) { |
1157 | case AUDIO_PLAY: | 1156 | case AUDIO_PLAY: |
1158 | logf("starting..."); | 1157 | logf("starting..."); |
1158 | playing = true; | ||
1159 | ci.stop_codec = true; | 1159 | ci.stop_codec = true; |
1160 | ci.reload_codec = false; | 1160 | ci.reload_codec = false; |
1161 | ci.seek_time = 0; | 1161 | ci.seek_time = 0; |
1162 | if (!pcm_crossfade_init()) | 1162 | pcm_crossfade_init(); |
1163 | pcm_flush_audio(); | ||
1164 | audio_play_start((int)ev.data); | 1163 | audio_play_start((int)ev.data); |
1165 | break ; | 1164 | break ; |
1166 | 1165 | ||
@@ -1325,9 +1324,10 @@ void audio_play(int offset) | |||
1325 | { | 1324 | { |
1326 | logf("audio_play"); | 1325 | logf("audio_play"); |
1327 | ci.stop_codec = true; | 1326 | ci.stop_codec = true; |
1327 | if (!pcm_crossfade_init()) | ||
1328 | pcm_flush_audio(); | ||
1328 | pcm_play_pause(true); | 1329 | pcm_play_pause(true); |
1329 | paused = false; | 1330 | paused = false; |
1330 | playing = true; | ||
1331 | queue_post(&audio_queue, AUDIO_PLAY, (void *)offset); | 1331 | queue_post(&audio_queue, AUDIO_PLAY, (void *)offset); |
1332 | } | 1332 | } |
1333 | 1333 | ||
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index a7ee5cecde..04630f100f 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -415,7 +415,7 @@ bool pcm_crossfade_init(void) | |||
415 | */ | 415 | */ |
416 | void pcm_flush_audio(void) | 416 | void pcm_flush_audio(void) |
417 | { | 417 | { |
418 | if (crossfade_init || crossfade_active) | 418 | if (crossfade_init || crossfade_active || !pcm_playing) |
419 | return ; | 419 | return ; |
420 | 420 | ||
421 | crossfade_mode = CFM_FLUSH; | 421 | crossfade_mode = CFM_FLUSH; |
@@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length) | |||
640 | memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], | 640 | memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], |
641 | buf, copy_n); | 641 | buf, copy_n); |
642 | buf += copy_n; | 642 | buf += copy_n; |
643 | audiobuffer_free -= copy_n; | 643 | audiobuffer_fillpos += copy_n; |
644 | length -= copy_n; | 644 | length -= copy_n; |
645 | 645 | ||
646 | /* Pre-buffer to meet CHUNK_SIZE requirement */ | 646 | /* Pre-buffer to meet CHUNK_SIZE requirement */ |
647 | if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { | 647 | if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { |
648 | audiobuffer_fillpos += copy_n; | ||
649 | return true; | 648 | return true; |
650 | } | 649 | } |
651 | 650 | ||
652 | copy_n += audiobuffer_fillpos; | 651 | pcm_flush_fillpos(); |
653 | |||
654 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], | ||
655 | copy_n, pcm_event_handler)) { | ||
656 | pcm_boost(false); | ||
657 | yield(); | ||
658 | } | ||
659 | pcm_event_handler = NULL; | ||
660 | |||
661 | audiobuffer_pos += copy_n; | ||
662 | audiobuffer_fillpos = 0; | ||
663 | |||
664 | if (audiobuffer_pos >= PCMBUF_SIZE) { | ||
665 | audiobuffer_pos = 0; | ||
666 | } | ||
667 | } | 652 | } |
668 | 653 | ||
669 | return true; | 654 | return true; |