summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c10
-rw-r--r--firmware/pcm_playback.c23
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 */
416void pcm_flush_audio(void) 416void 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;