diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-07-10 06:58:02 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-07-10 06:58:02 +0000 |
commit | 3e33f85f17b6189e1e7c869cf6030d4fcb33f39e (patch) | |
tree | bf0b4b951a2cdd28c27d05a0a362ffd63bd2e2ca /apps/playback.c | |
parent | 1a7f1f44c7e1b3536c01259ba3dbe03c782ac9a6 (diff) | |
download | rockbox-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
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 31 |
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 | ||
1282 | bool codec_request_next_track_callback(void) | 1284 | bool 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 | } |