forked from len0rd/rockbox
Fixed a hang on track changed. Automatically deleting invalid track
entries from current playlist. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7262 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
059a6c8671
commit
fd7952e413
1 changed files with 36 additions and 24 deletions
|
|
@ -96,11 +96,6 @@ static volatile bool paused;
|
||||||
#define MALLOC_BUFSIZE (512*1024)
|
#define MALLOC_BUFSIZE (512*1024)
|
||||||
#define GUARD_BUFSIZE (8*1024)
|
#define GUARD_BUFSIZE (8*1024)
|
||||||
|
|
||||||
/* TODO:
|
|
||||||
Handle playlist_peek in mpeg.c
|
|
||||||
Track changing
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern bool audio_is_initialized;
|
extern bool audio_is_initialized;
|
||||||
|
|
||||||
/* Buffer control thread. */
|
/* Buffer control thread. */
|
||||||
|
|
@ -758,7 +753,7 @@ bool read_next_metadata(void)
|
||||||
if (tracks[next_track].taginfo_ready)
|
if (tracks[next_track].taginfo_ready)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
trackname = playlist_peek(last_peek_offset);
|
trackname = playlist_peek(last_peek_offset + 1);
|
||||||
if (!trackname)
|
if (!trackname)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -780,7 +775,7 @@ bool read_next_metadata(void)
|
||||||
bool audio_load_track(int offset, bool start_play, int peek_offset)
|
bool audio_load_track(int offset, bool start_play, int peek_offset)
|
||||||
{
|
{
|
||||||
char *trackname;
|
char *trackname;
|
||||||
int fd;
|
int fd = -1;
|
||||||
off_t size;
|
off_t size;
|
||||||
int rc, i;
|
int rc, i;
|
||||||
int copy_n;
|
int copy_n;
|
||||||
|
|
@ -799,23 +794,32 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
|
||||||
if (tracks[track_widx].filesize != 0)
|
if (tracks[track_widx].filesize != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
last_index = playlist_get_display_index();
|
last_index = playlist_get_display_index() - 1
|
||||||
|
+ playlist_get_first_index(NULL);
|
||||||
|
if (last_index >= playlist_amount())
|
||||||
|
last_index -= playlist_amount();
|
||||||
|
|
||||||
|
peek_again:
|
||||||
/* Get track name from current playlist read position. */
|
/* Get track name from current playlist read position. */
|
||||||
logf("Buffering track:%d/%d", track_widx, track_ridx);
|
logf("Buffering track:%d/%d", track_widx, track_ridx);
|
||||||
trackname = playlist_peek(peek_offset);
|
/* Handle broken playlists. */
|
||||||
|
while ( (trackname = playlist_peek(peek_offset)) != NULL) {
|
||||||
|
fd = open(trackname, O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
logf("Open failed");
|
||||||
|
/* Delete invalid entry from playlist. */
|
||||||
|
playlist_delete(NULL, last_index);
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
if (!trackname) {
|
if (!trackname) {
|
||||||
logf("End-of-playlist");
|
logf("End-of-playlist");
|
||||||
conf_watermark = 0;
|
conf_watermark = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = open(trackname, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
logf("Open failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize track entry. */
|
/* Initialize track entry. */
|
||||||
size = filesize(fd);
|
size = filesize(fd);
|
||||||
tracks[track_widx].filerem = size;
|
tracks[track_widx].filerem = size;
|
||||||
|
|
@ -823,7 +827,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
|
||||||
tracks[track_widx].filepos = 0;
|
tracks[track_widx].filepos = 0;
|
||||||
tracks[track_widx].available = 0;
|
tracks[track_widx].available = 0;
|
||||||
//tracks[track_widx].taginfo_ready = false;
|
//tracks[track_widx].taginfo_ready = false;
|
||||||
tracks[track_widx].playlist_offset = offset;
|
tracks[track_widx].playlist_offset = peek_offset;
|
||||||
|
last_peek_offset = peek_offset;
|
||||||
|
|
||||||
if (buf_widx >= codecbuflen)
|
if (buf_widx >= codecbuflen)
|
||||||
buf_widx -= codecbuflen;
|
buf_widx -= codecbuflen;
|
||||||
|
|
@ -846,6 +851,13 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
|
||||||
/* Set filesize to zero to indicate no file was loaded. */
|
/* Set filesize to zero to indicate no file was loaded. */
|
||||||
tracks[track_widx].filesize = 0;
|
tracks[track_widx].filesize = 0;
|
||||||
tracks[track_widx].filerem = 0;
|
tracks[track_widx].filerem = 0;
|
||||||
|
|
||||||
|
/* Try skipping to next track. */
|
||||||
|
if (fill_bytesleft > 0) {
|
||||||
|
/* Delete invalid entry from playlist. */
|
||||||
|
playlist_delete(NULL, last_index);
|
||||||
|
goto peek_again;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// tracks[track_widx].filebuf = &codecbuf[buf_widx];
|
// tracks[track_widx].filebuf = &codecbuf[buf_widx];
|
||||||
|
|
@ -857,7 +869,9 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
|
||||||
logf("Metadata error!");
|
logf("Metadata error!");
|
||||||
tracks[track_widx].filesize = 0;
|
tracks[track_widx].filesize = 0;
|
||||||
close(fd);
|
close(fd);
|
||||||
return false;
|
/* Delete invalid entry from playlist. */
|
||||||
|
playlist_delete(NULL, last_index);
|
||||||
|
goto peek_again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_filebuf_watermark(buffer_margin);
|
set_filebuf_watermark(buffer_margin);
|
||||||
|
|
@ -977,9 +991,8 @@ void audio_play_start(int offset)
|
||||||
|
|
||||||
fill_bytesleft = codecbuflen;
|
fill_bytesleft = codecbuflen;
|
||||||
filling = true;
|
filling = true;
|
||||||
last_peek_offset = 0;
|
last_peek_offset = -1;
|
||||||
if (audio_load_track(offset, true, 0)) {
|
if (audio_load_track(offset, true, 0)) {
|
||||||
last_peek_offset++;
|
|
||||||
if (track_buffer_callback) {
|
if (track_buffer_callback) {
|
||||||
cur_ti->event_sent = true;
|
cur_ti->event_sent = true;
|
||||||
track_buffer_callback(&cur_ti->id3, true);
|
track_buffer_callback(&cur_ti->id3, true);
|
||||||
|
|
@ -1123,8 +1136,8 @@ void audio_check_buffer(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load new files to fill the entire buffer. */
|
/* Load new files to fill the entire buffer. */
|
||||||
if (audio_load_track(0, false, last_peek_offset)) {
|
if (audio_load_track(0, false, last_peek_offset + 1)) {
|
||||||
last_peek_offset++;
|
|
||||||
} else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) {
|
} else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) {
|
||||||
/* Read next unbuffered track's metadata as necessary. */
|
/* Read next unbuffered track's metadata as necessary. */
|
||||||
read_next_metadata();
|
read_next_metadata();
|
||||||
|
|
@ -1342,7 +1355,7 @@ void audio_invalidate_tracks(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
track_count = 1;
|
track_count = 1;
|
||||||
last_peek_offset = 1;
|
last_peek_offset = 0;
|
||||||
track_widx = track_ridx;
|
track_widx = track_ridx;
|
||||||
/* Mark all other entries null (also buffered wrong metadata). */
|
/* Mark all other entries null (also buffered wrong metadata). */
|
||||||
audio_clear_track_entries(false);
|
audio_clear_track_entries(false);
|
||||||
|
|
@ -1372,7 +1385,6 @@ static void initiate_track_change(int peek_index)
|
||||||
|
|
||||||
/* Detect if disk is spinning.. */
|
/* Detect if disk is spinning.. */
|
||||||
if (filling) {
|
if (filling) {
|
||||||
ci.stop_codec = true;
|
|
||||||
playlist_next(peek_index);
|
playlist_next(peek_index);
|
||||||
queue_post(&audio_queue, AUDIO_PLAY, 0);
|
queue_post(&audio_queue, AUDIO_PLAY, 0);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue