summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/playback.c')
-rw-r--r--apps/playback.c33
1 files changed, 26 insertions, 7 deletions
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