summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2006-08-30 15:47:18 +0000
committerMagnus Holmgren <magnushol@gmail.com>2006-08-30 15:47:18 +0000
commit719d22092554b3f26aed9a7c5e21a2ef3bd86065 (patch)
treef3c928ad511944dc123f726b83e60bdc39ba5454
parent446922d47d1e5b8a4b3158f799437abf2bcd40bb (diff)
downloadrockbox-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.h1
-rw-r--r--apps/playback.c33
-rw-r--r--apps/playback.h2
-rw-r--r--docs/CREDITS1
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 @@
31enum { 31enum {
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 */
257static size_t conf_watermark; 257static size_t conf_watermark;
258static size_t conf_filechunk; 258static size_t conf_filechunk;
259static size_t conf_preseek;
259static size_t buffer_margin; 260static size_t buffer_margin;
260 261
261static bool v1first = false; 262static 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
236Victor Cardenas 236Victor Cardenas
237Andrew Melville 237Andrew Melville
238Pengxuan Liu 238Pengxuan Liu
239Andrew Cupper \ No newline at end of file