diff options
author | Magnus Holmgren <magnushol@gmail.com> | 2006-08-30 15:47:18 +0000 |
---|---|---|
committer | Magnus Holmgren <magnushol@gmail.com> | 2006-08-30 15:47:18 +0000 |
commit | 719d22092554b3f26aed9a7c5e21a2ef3bd86065 (patch) | |
tree | f3c928ad511944dc123f726b83e60bdc39ba5454 | |
parent | 446922d47d1e5b8a4b3158f799437abf2bcd40bb (diff) | |
download | rockbox-719d22092554b3f26aed9a7c5e21a2ef3bd86065.tar.gz rockbox-719d22092554b3f26aed9a7c5e21a2ef3bd86065.zip |
Applied patch #5879 by Andrew Cupper: Fix backward seeking bug.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10807 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/dsp.h | 1 | ||||
-rw-r--r-- | apps/playback.c | 33 | ||||
-rw-r--r-- | apps/playback.h | 2 | ||||
-rw-r--r-- | docs/CREDITS | 1 |
4 files changed, 29 insertions, 8 deletions
diff --git a/apps/dsp.h b/apps/dsp.h index 9d0f7de0db..4221d9e350 100644 --- a/apps/dsp.h +++ b/apps/dsp.h | |||
@@ -31,6 +31,7 @@ | |||
31 | enum { | 31 | enum { |
32 | CODEC_SET_FILEBUF_WATERMARK = 1, | 32 | CODEC_SET_FILEBUF_WATERMARK = 1, |
33 | CODEC_SET_FILEBUF_CHUNKSIZE, | 33 | CODEC_SET_FILEBUF_CHUNKSIZE, |
34 | CODEC_SET_FILEBUF_PRESEEK, | ||
34 | DSP_SET_FREQUENCY, | 35 | DSP_SET_FREQUENCY, |
35 | DSP_SWITCH_FREQUENCY, | 36 | DSP_SWITCH_FREQUENCY, |
36 | DSP_SET_CLIP_MIN, | 37 | DSP_SET_CLIP_MIN, |
diff --git a/apps/playback.c b/apps/playback.c index d4f3626f99..adb676e7b1 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -256,6 +256,7 @@ static void playback_init(void); | |||
256 | /* Configuration */ | 256 | /* Configuration */ |
257 | static size_t conf_watermark; | 257 | static size_t conf_watermark; |
258 | static size_t conf_filechunk; | 258 | static size_t conf_filechunk; |
259 | static size_t conf_preseek; | ||
259 | static size_t buffer_margin; | 260 | static size_t buffer_margin; |
260 | 261 | ||
261 | static bool v1first = false; | 262 | static bool v1first = false; |
@@ -952,11 +953,12 @@ static void audio_rebuffer(void) | |||
952 | filling = false; | 953 | filling = false; |
953 | 954 | ||
954 | /* Reset buffer and track pointers */ | 955 | /* Reset buffer and track pointers */ |
955 | buf_ridx = buf_widx = 0; | 956 | tracks[track_ridx].buf_idx = buf_ridx = buf_widx = 0; |
956 | track_widx = track_ridx; | 957 | track_widx = track_ridx; |
957 | cur_ti = &tracks[track_ridx]; | 958 | cur_ti = &tracks[track_ridx]; |
958 | audio_clear_track_entries(true, true, false); | 959 | audio_clear_track_entries(true, true, false); |
959 | filebufused = 0; | 960 | filebufused = 0; |
961 | cur_ti->available = 0; | ||
960 | 962 | ||
961 | /* Fill the buffer */ | 963 | /* Fill the buffer */ |
962 | last_peek_offset = -1; | 964 | last_peek_offset = -1; |
@@ -1133,16 +1135,16 @@ static void rebuffer_and_seek(size_t newpos) | |||
1133 | /* Clear codec buffer. */ | 1135 | /* Clear codec buffer. */ |
1134 | track_widx = track_ridx; | 1136 | track_widx = track_ridx; |
1135 | filebufused = 0; | 1137 | filebufused = 0; |
1136 | buf_widx = buf_ridx = 0; | 1138 | tracks[track_widx].buf_idx = buf_widx = buf_ridx = 0; |
1137 | 1139 | ||
1138 | last_peek_offset = 0; | 1140 | last_peek_offset = 0; |
1139 | filling = false; | 1141 | filling = false; |
1140 | initialize_buffer_fill(true); | 1142 | initialize_buffer_fill(true); |
1143 | filling = true; | ||
1141 | 1144 | ||
1142 | if (newpos > AUDIO_REBUFFER_GUESS_SIZE) | 1145 | if (newpos > conf_preseek) { |
1143 | { | 1146 | buf_ridx += conf_preseek; |
1144 | buf_ridx += AUDIO_REBUFFER_GUESS_SIZE; | 1147 | cur_ti->start_pos = newpos - conf_preseek; |
1145 | cur_ti->start_pos = newpos - AUDIO_REBUFFER_GUESS_SIZE; | ||
1146 | } | 1148 | } |
1147 | else | 1149 | else |
1148 | { | 1150 | { |
@@ -1341,6 +1343,10 @@ static void codec_configure_callback(int setting, void *value) | |||
1341 | conf_filechunk = (unsigned long)value; | 1343 | conf_filechunk = (unsigned long)value; |
1342 | break; | 1344 | break; |
1343 | 1345 | ||
1346 | case CODEC_SET_FILEBUF_PRESEEK: | ||
1347 | conf_preseek = (unsigned long)value; | ||
1348 | break; | ||
1349 | |||
1344 | default: | 1350 | default: |
1345 | if (!dsp_configure(setting, value)) { logf("Illegal key:%d", setting); } | 1351 | if (!dsp_configure(setting, value)) { logf("Illegal key:%d", setting); } |
1346 | } | 1352 | } |
@@ -1447,6 +1453,8 @@ static void audio_read_file(bool quick) | |||
1447 | 1453 | ||
1448 | while (tracks[track_widx].filerem > 0) | 1454 | while (tracks[track_widx].filerem > 0) |
1449 | { | 1455 | { |
1456 | int overlap; | ||
1457 | |||
1450 | if (fill_bytesleft == 0) | 1458 | if (fill_bytesleft == 0) |
1451 | break ; | 1459 | break ; |
1452 | 1460 | ||
@@ -1465,8 +1473,18 @@ static void audio_read_file(bool quick) | |||
1465 | } | 1473 | } |
1466 | 1474 | ||
1467 | buf_widx += rc; | 1475 | buf_widx += rc; |
1476 | |||
1477 | overlap = buf_widx - tracks[track_ridx].buf_idx; | ||
1468 | if (buf_widx >= filebuflen) | 1478 | if (buf_widx >= filebuflen) |
1469 | buf_widx -= filebuflen; | 1479 | buf_widx -= filebuflen; |
1480 | if (overlap >= filebuflen) | ||
1481 | overlap -= filebuflen; | ||
1482 | |||
1483 | if (overlap > 0 && overlap <= rc && tracks[track_ridx].available != 0) { | ||
1484 | tracks[track_ridx].buf_idx = buf_widx; | ||
1485 | tracks[track_ridx].start_pos += overlap; | ||
1486 | } | ||
1487 | |||
1470 | tracks[track_widx].available += rc; | 1488 | tracks[track_widx].available += rc; |
1471 | tracks[track_widx].filerem -= rc; | 1489 | tracks[track_widx].filerem -= rc; |
1472 | 1490 | ||
@@ -1750,6 +1768,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer) | |||
1750 | current_codec = CODEC_IDX_AUDIO; | 1768 | current_codec = CODEC_IDX_AUDIO; |
1751 | conf_watermark = AUDIO_DEFAULT_WATERMARK; | 1769 | conf_watermark = AUDIO_DEFAULT_WATERMARK; |
1752 | conf_filechunk = AUDIO_DEFAULT_FILECHUNK; | 1770 | conf_filechunk = AUDIO_DEFAULT_FILECHUNK; |
1771 | conf_preseek = AUDIO_REBUFFER_GUESS_SIZE; | ||
1753 | dsp_configure(DSP_RESET, 0); | 1772 | dsp_configure(DSP_RESET, 0); |
1754 | current_codec = last_codec; | 1773 | current_codec = last_codec; |
1755 | } | 1774 | } |
@@ -1861,7 +1880,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer) | |||
1861 | } | 1880 | } |
1862 | 1881 | ||
1863 | logf("alt:%s", trackname); | 1882 | logf("alt:%s", trackname); |
1864 | // tracks[track_widx].buf_idx = buf_widx; | 1883 | tracks[track_widx].buf_idx = buf_widx; |
1865 | 1884 | ||
1866 | audio_read_file(rebuffer); | 1885 | audio_read_file(rebuffer); |
1867 | 1886 | ||
diff --git a/apps/playback.h b/apps/playback.h index 73cd0ccfaf..decb709384 100644 --- a/apps/playback.h +++ b/apps/playback.h | |||
@@ -47,7 +47,7 @@ struct track_info { | |||
47 | size_t codecsize; /* Codec length in bytes */ | 47 | size_t codecsize; /* Codec length in bytes */ |
48 | bool has_codec; /* Does this track have a codec on the buffer */ | 48 | bool has_codec; /* Does this track have a codec on the buffer */ |
49 | 49 | ||
50 | // size_t buf_idx; /* Pointer to the track's buffer */ | 50 | size_t buf_idx; /* Pointer to the track's buffer */ |
51 | size_t filerem; /* Remaining bytes of file NOT in buffer */ | 51 | size_t filerem; /* Remaining bytes of file NOT in buffer */ |
52 | size_t filesize; /* File total length */ | 52 | size_t filesize; /* File total length */ |
53 | size_t start_pos; /* Position to first bytes of file in buffer */ | 53 | size_t start_pos; /* Position to first bytes of file in buffer */ |
diff --git a/docs/CREDITS b/docs/CREDITS index e4c9e92ba1..77c125bcf5 100644 --- a/docs/CREDITS +++ b/docs/CREDITS | |||
@@ -236,3 +236,4 @@ Christopher Borcsok | |||
236 | Victor Cardenas | 236 | Victor Cardenas |
237 | Andrew Melville | 237 | Andrew Melville |
238 | Pengxuan Liu | 238 | Pengxuan Liu |
239 | Andrew Cupper \ No newline at end of file | ||