1
0
Fork 0
forked from len0rd/rockbox

Track changing works now better (not still perfect).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7090 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2005-07-10 06:58:02 +00:00
parent 1a7f1f44c7
commit 3e33f85f17

View file

@ -686,7 +686,7 @@ void audio_fill_file_buffer(void)
if (fill_bytesleft == 0) if (fill_bytesleft == 0)
break ; break ;
rc = MIN(conf_filechunk, codecbuflen - buf_widx); rc = MIN(conf_filechunk, codecbuflen - buf_widx);
rc = MIN(rc, (off_t)fill_bytesleft); rc = MIN(rc, fill_bytesleft);
rc = read(current_fd, &codecbuf[buf_widx], rc); rc = read(current_fd, &codecbuf[buf_widx], rc);
if (rc <= 0) { if (rc <= 0) {
tracks[track_widx].filerem = 0; tracks[track_widx].filerem = 0;
@ -810,6 +810,8 @@ bool loadcodec(const char *trackname, bool start_play)
if (rc < 0) if (rc < 0)
return false; return false;
buf_widx += rc; buf_widx += rc;
codecbufused += rc;
fill_bytesleft -= rc;
if (buf_widx >= codecbuflen) if (buf_widx >= codecbuflen)
buf_widx -= codecbuflen; buf_widx -= codecbuflen;
i += rc; i += rc;
@ -817,8 +819,6 @@ bool loadcodec(const char *trackname, bool start_play)
close(fd); close(fd);
logf("Done: %dB", i); logf("Done: %dB", i);
codecbufused += size;
fill_bytesleft -= size;
tracks[track_widx].codecsize = size; tracks[track_widx].codecsize = size;
return true; return true;
@ -958,7 +958,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
if (start_play) { if (start_play) {
track_count++; track_count++;
audiobuffer_add_event(codec_track_changed); codec_track_changed();
} }
/* Do some initial file buffering. */ /* Do some initial file buffering. */
@ -1047,7 +1047,6 @@ void audio_play_start(int offset)
cur_ti->event_sent = true; cur_ti->event_sent = true;
track_buffer_callback(&cur_ti->id3, true); track_buffer_callback(&cur_ti->id3, true);
} }
ata_sleep();
} else { } else {
logf("Failure"); logf("Failure");
} }
@ -1167,8 +1166,9 @@ void audio_check_buffer(void)
initialize_buffer_fill(); initialize_buffer_fill();
/* Limit buffering size at first run. */ /* Limit buffering size at first run. */
if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { if (conf_bufferlimit && fill_bytesleft > conf_bufferlimit
fill_bytesleft = conf_bufferlimit - codecbufused; - codecbufused) {
fill_bytesleft = MAX(0, conf_bufferlimit - codecbufused);
} }
/* Try to load remainings of the file. */ /* Try to load remainings of the file. */
@ -1193,8 +1193,10 @@ void audio_check_buffer(void)
conf_bufferlimit = 0; conf_bufferlimit = 0;
pcm_set_boost_mode(false); pcm_set_boost_mode(false);
if (playing) if (playing) {
ata_flush();
ata_sleep(); ata_sleep();
}
} }
} }
@ -1281,17 +1283,17 @@ void audio_change_track(void)
bool codec_request_next_track_callback(void) bool codec_request_next_track_callback(void)
{ {
if (ci.stop_codec || !playing || !queue_empty(&audio_queue)) if (ci.stop_codec || !playing)
return false; return false;
logf("Request new track"); logf("Request new track");
/* Advance to next track. */ /* Advance to next track. */
if (ci.reload_codec && new_track > 0) { if (ci.reload_codec && new_track > 0) {
if (!playlist_check(1)) if (!playlist_check(new_track))
return false; return false;
last_peek_offset--; last_peek_offset--;
playlist_next(1); playlist_next(new_track);
if (++track_ridx == MAX_TRACK) if (++track_ridx == MAX_TRACK)
track_ridx = 0; track_ridx = 0;
@ -1311,10 +1313,10 @@ bool codec_request_next_track_callback(void)
/* Advance to previous track. */ /* Advance to previous track. */
else if (ci.reload_codec && new_track < 0) { else if (ci.reload_codec && new_track < 0) {
if (!playlist_check(-1)) if (!playlist_check(new_track))
return false; return false;
last_peek_offset++; last_peek_offset++;
playlist_next(-1); playlist_next(new_track);
if (--track_ridx < 0) if (--track_ridx < 0)
track_ridx = MAX_TRACK-1; track_ridx = MAX_TRACK-1;
if (tracks[track_ridx].filesize == 0 || if (tracks[track_ridx].filesize == 0 ||
@ -1514,6 +1516,9 @@ void codec_thread(void)
codecsize = cur_ti->codecsize; codecsize = cur_ti->codecsize;
if (codecsize == 0) { if (codecsize == 0) {
logf("Codec slot is empty!"); logf("Codec slot is empty!");
/* Wait for the pcm buffer to go empty */
while (pcm_is_playing())
yield();
audio_stop_playback(); audio_stop_playback();
break ; break ;
} }