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) if (buf_ridx >= codecbuflen) buf_ridx -= codecbuflen; - if (!pcm_crossfade_init()) - pcm_flush_audio(); + pcm_crossfade_init(); if (!filling) pcm_set_boost_mode(false); @@ -1156,11 +1155,11 @@ void audio_thread(void) switch (ev.id) { case AUDIO_PLAY: logf("starting..."); + playing = true; ci.stop_codec = true; ci.reload_codec = false; ci.seek_time = 0; - if (!pcm_crossfade_init()) - pcm_flush_audio(); + pcm_crossfade_init(); audio_play_start((int)ev.data); break ; @@ -1325,9 +1324,10 @@ void audio_play(int offset) { logf("audio_play"); ci.stop_codec = true; + if (!pcm_crossfade_init()) + pcm_flush_audio(); pcm_play_pause(true); paused = false; - playing = true; queue_post(&audio_queue, AUDIO_PLAY, (void *)offset); } 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) */ void pcm_flush_audio(void) { - if (crossfade_init || crossfade_active) + if (crossfade_init || crossfade_active || !pcm_playing) return ; crossfade_mode = CFM_FLUSH; @@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length) memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], buf, copy_n); buf += copy_n; - audiobuffer_free -= copy_n; + audiobuffer_fillpos += copy_n; length -= copy_n; /* Pre-buffer to meet CHUNK_SIZE requirement */ if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { - audiobuffer_fillpos += copy_n; return true; } - - copy_n += audiobuffer_fillpos; - - while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], - copy_n, pcm_event_handler)) { - pcm_boost(false); - yield(); - } - pcm_event_handler = NULL; - - audiobuffer_pos += copy_n; - audiobuffer_fillpos = 0; - - if (audiobuffer_pos >= PCMBUF_SIZE) { - audiobuffer_pos = 0; - } + + pcm_flush_fillpos(); } return true;