From d6e79424264147e52f70d9ed34b80e34a9d3c23b Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Tue, 5 Jul 2005 15:19:22 +0000 Subject: Fixed: Crossfading, broken elapsed info with mp3 files, possible cpu boost problem and track changing. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7027 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/mpa.c | 2 +- apps/playback.c | 23 ++++++++++++++--------- firmware/export/id3.h | 2 +- firmware/pcm_playback.c | 9 +++++---- 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; -- cgit v1.2.3