summaryrefslogtreecommitdiffstats
path: root/lib/rbcodec/codecs/mpa.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/mpa.c')
-rw-r--r--lib/rbcodec/codecs/mpa.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/rbcodec/codecs/mpa.c b/lib/rbcodec/codecs/mpa.c
index bafed3970c..c5d47a6791 100644
--- a/lib/rbcodec/codecs/mpa.c
+++ b/lib/rbcodec/codecs/mpa.c
@@ -192,12 +192,20 @@ static int get_file_pos(int newtime)
pos = cur_toc * toc_sizestep;
/* Interpolate between this TOC mark and the next TOC mark */
- newtime -= percent * pct_timestep;
- pos += (uint64_t)plength * newtime / pct_timestep;
+ int newtime_toc = newtime - percent * pct_timestep;
+ pos += (uint64_t)plength * newtime_toc / pct_timestep;
} else {
/* No TOC exists, estimate the new position */
pos = (uint64_t)newtime * id3->filesize / id3->length;
}
+ // VBR seek might be very inaccurate in long files
+ // So make sure that seeking actually happened in the intended direction
+ // Fix jumps in the wrong direction by seeking relative to the current position
+ long delta = id3->elapsed - newtime;
+ if ((delta >= 0 && pos > ci->curpos) || (delta < 0 && pos < ci->curpos))
+ {
+ pos = ci->curpos - delta * id3->filesize / id3->length;
+ }
} else if (id3->bitrate) {
pos = newtime * (id3->bitrate / 8);
} else {