summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/mpa.c2
-rw-r--r--apps/playback.c23
-rw-r--r--firmware/export/id3.h2
-rw-r--r--firmware/pcm_playback.c9
4 files changed, 21 insertions, 15 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index a52dc12a40..df78b07247 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -119,11 +119,11 @@ enum codec_status codec_start(struct codec_api* api)
first_frame = false;
file_end = 0;
OutputPtr = OutputBuffer;
- frequency_divider = ci->id3->frequency / 100;
while (!*ci->taginfo_ready)
ci->yield();
+ frequency_divider = ci->id3->frequency / 100;
ci->configure(DSP_SET_FREQUENCY, (int *)ci->id3->frequency);
ci->request_buffer(&size, ci->id3->first_frame_offset);
diff --git a/apps/playback.c b/apps/playback.c
index e7baf5b072..e251a1ee89 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1236,16 +1236,19 @@ bool codec_request_next_track_callback(void)
/* Advance to next track. */
if (ci.reload_codec && new_track > 0) {
- /* Wait for new track data. */
- while (track_ridx == track_widx && filling)
- yield();
-
if (!playlist_check(1))
return false;
last_peek_offset--;
playlist_next(1);
if (++track_ridx == MAX_TRACK)
track_ridx = 0;
+
+ /* Wait for new track data (codectype 0 is invalid). When a correct
+ codectype is set, we can assume that the filesize is correct. */
+ while (tracks[track_ridx].id3.codectype == 0 && filling
+ && !ci.stop_codec)
+ yield();
+
if (tracks[track_ridx].filesize == 0) {
logf("Loading from disk...");
new_track = 0;
@@ -1274,10 +1277,6 @@ bool codec_request_next_track_callback(void)
/* Codec requested track change (next track). */
else {
- /* Wait for new track data. */
- while (track_ridx == track_widx && filling)
- yield();
-
if (!playlist_check(1))
return false;
last_peek_offset--;
@@ -1285,7 +1284,13 @@ bool codec_request_next_track_callback(void)
if (++track_ridx >= MAX_TRACK)
track_ridx = 0;
- if (track_ridx == track_widx && tracks[track_ridx].filerem == 0) {
+ /* Wait for new track data (codectype 0 is invalid). When a correct
+ codectype is set, we can assume that the filesize is correct. */
+ while (tracks[track_ridx].id3.codectype == 0 && filling
+ && !ci.stop_codec)
+ yield();
+
+ if (tracks[track_ridx].filesize == 0) {
logf("No more tracks");
new_track = 0;
return false;
diff --git a/firmware/export/id3.h b/firmware/export/id3.h
index 8fd41a1286..8f904e49e6 100644
--- a/firmware/export/id3.h
+++ b/firmware/export/id3.h
@@ -25,7 +25,7 @@
/* Audio file types. */
/* NOTE: When adding new audio types, also add to codec_labels[] in id3.c */
enum {
- AFMT_UNKNOWN = 0, /* Unknown file format */
+ AFMT_UNKNOWN = 1, /* Unknown file format */
#if CONFIG_HWCODEC==MASNONE
AFMT_MPA_L1, /* MPEG Audio layer 1 */
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 298d2e7874..a58069d5f1 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -127,7 +127,7 @@ void pcm_boost(bool state)
{
static bool boost_state = false;
- if (crossfade_active || boost_mode)
+ if (crossfade_init || crossfade_active || boost_mode)
return ;
if (state != boost_state) {
@@ -158,6 +158,7 @@ static void dma_stop(void)
next_start = NULL;
next_size = 0;
crossfade_init = 0;
+ crossfade_active = 0;
pcm_paused = false;
}
@@ -255,13 +256,12 @@ void pcm_play_data(const unsigned char* start, int size,
void pcm_play_stop(void)
{
- crossfade_active = false;
- pcm_set_boost_mode(false);
- pcm_boost(false);
if (pcm_playing) {
uda1380_mute(true);
dma_stop();
}
+ pcm_set_boost_mode(false);
+ pcm_boost(false);
}
void pcm_play_pause(bool play)
@@ -436,6 +436,7 @@ bool pcm_crossfade_init(void)
return false;
}
logf("crossfading!");
+ pcm_boost(true);
crossfade_mode = CFM_CROSSFADE;
crossfade_init = true;