From d5e1157cf7a59f98c23ed9116b32e660b8111550 Mon Sep 17 00:00:00 2001 From: Magnus Holmgren Date: Mon, 1 May 2006 11:54:04 +0000 Subject: Tweak MP3 seeking a little, and don't do gapless trim if a seek has been done. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9848 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/mpa.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index fa5dab6543..4c3784a5f7 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c @@ -97,6 +97,11 @@ enum codec_status codec_start(struct codec_api *api) int frame_skip; /* samples to skip current frame */ int samples_to_skip; /* samples to skip in total for this file (at start) */ char *inputbuffer; + /* If we know the position isn't exact (i.e., we have seeked to a + * position that isn't the start of the file), we can't reliably do + * end-of-file trimming for gapless playback. + */ + bool exact_position = true; ci = api; @@ -147,6 +152,7 @@ enum codec_status codec_start(struct codec_api *api) } samplesdone = ((int64_t)ci->id3->elapsed) * current_frequency / 1000; + exact_position = samplesdone == 0; samples_to_skip = start_skip; recalc_samplecount(); @@ -163,12 +169,12 @@ enum codec_status codec_start(struct codec_api *api) samplesdone = ((int64_t) (ci->seek_time - 1)) * current_frequency / 1000; + exact_position = samplesdone == 0; if (ci->seek_time-1 == 0) - newpos = 0; + newpos = ci->id3->first_frame_offset; else - newpos = ci->mp3_get_filepos(ci->seek_time-1) + - ci->id3->first_frame_offset; + newpos = ci->mp3_get_filepos(ci->seek_time-1); if (!ci->seek_buffer(newpos)) break; @@ -230,7 +236,7 @@ enum codec_status codec_start(struct codec_api *api) framelength = synth.pcm.length - frame_skip; - if (stop_skip > 0) { + if (exact_position && (stop_skip > 0)) { int64_t max = samplecount - samplesdone; if (max < 0) max = 0; -- cgit v1.2.3