summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-07-10 06:58:02 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-07-10 06:58:02 +0000
commit3e33f85f17b6189e1e7c869cf6030d4fcb33f39e (patch)
treebf0b4b951a2cdd28c27d05a0a362ffd63bd2e2ca
parent1a7f1f44c7e1b3536c01259ba3dbe03c782ac9a6 (diff)
downloadrockbox-3e33f85f17b6189e1e7c869cf6030d4fcb33f39e.tar.gz
rockbox-3e33f85f17b6189e1e7c869cf6030d4fcb33f39e.zip
Track changing works now better (not still perfect).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7090 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/playback.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 03b286c2e9..82ccddfac0 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -686,7 +686,7 @@ void audio_fill_file_buffer(void)
686 if (fill_bytesleft == 0) 686 if (fill_bytesleft == 0)
687 break ; 687 break ;
688 rc = MIN(conf_filechunk, codecbuflen - buf_widx); 688 rc = MIN(conf_filechunk, codecbuflen - buf_widx);
689 rc = MIN(rc, (off_t)fill_bytesleft); 689 rc = MIN(rc, fill_bytesleft);
690 rc = read(current_fd, &codecbuf[buf_widx], rc); 690 rc = read(current_fd, &codecbuf[buf_widx], rc);
691 if (rc <= 0) { 691 if (rc <= 0) {
692 tracks[track_widx].filerem = 0; 692 tracks[track_widx].filerem = 0;
@@ -810,6 +810,8 @@ bool loadcodec(const char *trackname, bool start_play)
810 if (rc < 0) 810 if (rc < 0)
811 return false; 811 return false;
812 buf_widx += rc; 812 buf_widx += rc;
813 codecbufused += rc;
814 fill_bytesleft -= rc;
813 if (buf_widx >= codecbuflen) 815 if (buf_widx >= codecbuflen)
814 buf_widx -= codecbuflen; 816 buf_widx -= codecbuflen;
815 i += rc; 817 i += rc;
@@ -817,8 +819,6 @@ bool loadcodec(const char *trackname, bool start_play)
817 close(fd); 819 close(fd);
818 logf("Done: %dB", i); 820 logf("Done: %dB", i);
819 821
820 codecbufused += size;
821 fill_bytesleft -= size;
822 tracks[track_widx].codecsize = size; 822 tracks[track_widx].codecsize = size;
823 823
824 return true; 824 return true;
@@ -958,7 +958,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
958 958
959 if (start_play) { 959 if (start_play) {
960 track_count++; 960 track_count++;
961 audiobuffer_add_event(codec_track_changed); 961 codec_track_changed();
962 } 962 }
963 963
964 /* Do some initial file buffering. */ 964 /* Do some initial file buffering. */
@@ -1047,7 +1047,6 @@ void audio_play_start(int offset)
1047 cur_ti->event_sent = true; 1047 cur_ti->event_sent = true;
1048 track_buffer_callback(&cur_ti->id3, true); 1048 track_buffer_callback(&cur_ti->id3, true);
1049 } 1049 }
1050 ata_sleep();
1051 } else { 1050 } else {
1052 logf("Failure"); 1051 logf("Failure");
1053 } 1052 }
@@ -1167,8 +1166,9 @@ void audio_check_buffer(void)
1167 initialize_buffer_fill(); 1166 initialize_buffer_fill();
1168 1167
1169 /* Limit buffering size at first run. */ 1168 /* Limit buffering size at first run. */
1170 if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { 1169 if (conf_bufferlimit && fill_bytesleft > conf_bufferlimit
1171 fill_bytesleft = conf_bufferlimit - codecbufused; 1170 - codecbufused) {
1171 fill_bytesleft = MAX(0, conf_bufferlimit - codecbufused);
1172 } 1172 }
1173 1173
1174 /* Try to load remainings of the file. */ 1174 /* Try to load remainings of the file. */
@@ -1193,8 +1193,10 @@ void audio_check_buffer(void)
1193 conf_bufferlimit = 0; 1193 conf_bufferlimit = 0;
1194 pcm_set_boost_mode(false); 1194 pcm_set_boost_mode(false);
1195 1195
1196 if (playing) 1196 if (playing) {
1197 ata_flush();
1197 ata_sleep(); 1198 ata_sleep();
1199 }
1198 } 1200 }
1199} 1201}
1200 1202
@@ -1281,17 +1283,17 @@ void audio_change_track(void)
1281 1283
1282bool codec_request_next_track_callback(void) 1284bool codec_request_next_track_callback(void)
1283{ 1285{
1284 if (ci.stop_codec || !playing || !queue_empty(&audio_queue)) 1286 if (ci.stop_codec || !playing)
1285 return false; 1287 return false;
1286 1288
1287 logf("Request new track"); 1289 logf("Request new track");
1288 1290
1289 /* Advance to next track. */ 1291 /* Advance to next track. */
1290 if (ci.reload_codec && new_track > 0) { 1292 if (ci.reload_codec && new_track > 0) {
1291 if (!playlist_check(1)) 1293 if (!playlist_check(new_track))
1292 return false; 1294 return false;
1293 last_peek_offset--; 1295 last_peek_offset--;
1294 playlist_next(1); 1296 playlist_next(new_track);
1295 if (++track_ridx == MAX_TRACK) 1297 if (++track_ridx == MAX_TRACK)
1296 track_ridx = 0; 1298 track_ridx = 0;
1297 1299
@@ -1311,10 +1313,10 @@ bool codec_request_next_track_callback(void)
1311 1313
1312 /* Advance to previous track. */ 1314 /* Advance to previous track. */
1313 else if (ci.reload_codec && new_track < 0) { 1315 else if (ci.reload_codec && new_track < 0) {
1314 if (!playlist_check(-1)) 1316 if (!playlist_check(new_track))
1315 return false; 1317 return false;
1316 last_peek_offset++; 1318 last_peek_offset++;
1317 playlist_next(-1); 1319 playlist_next(new_track);
1318 if (--track_ridx < 0) 1320 if (--track_ridx < 0)
1319 track_ridx = MAX_TRACK-1; 1321 track_ridx = MAX_TRACK-1;
1320 if (tracks[track_ridx].filesize == 0 || 1322 if (tracks[track_ridx].filesize == 0 ||
@@ -1514,6 +1516,9 @@ void codec_thread(void)
1514 codecsize = cur_ti->codecsize; 1516 codecsize = cur_ti->codecsize;
1515 if (codecsize == 0) { 1517 if (codecsize == 0) {
1516 logf("Codec slot is empty!"); 1518 logf("Codec slot is empty!");
1519 /* Wait for the pcm buffer to go empty */
1520 while (pcm_is_playing())
1521 yield();
1517 audio_stop_playback(); 1522 audio_stop_playback();
1518 break ; 1523 break ;
1519 } 1524 }