1
0
Fork 0
forked from len0rd/rockbox

Seeking forwards works a little better. Playlist handling still buggy.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6702 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2005-06-13 22:09:12 +00:00
parent 789791e659
commit 58af47c8f2

View file

@ -82,6 +82,7 @@ static volatile bool paused;
#define AUDIO_FF_REWIND 7 #define AUDIO_FF_REWIND 7
#define AUDIO_FLUSH_RELOAD 8 #define AUDIO_FLUSH_RELOAD 8
#define AUDIO_CODEC_DONE 9 #define AUDIO_CODEC_DONE 9
#define AUDIO_FLUSH 10
#define CODEC_LOAD 1 #define CODEC_LOAD 1
#define CODEC_LOAD_DISK 2 #define CODEC_LOAD_DISK 2
@ -284,23 +285,29 @@ void codec_advance_buffer_callback(size_t amount)
if ((int)amount > cur_ti->available + cur_ti->filerem) if ((int)amount > cur_ti->available + cur_ti->filerem)
amount = cur_ti->available + cur_ti->filerem; amount = cur_ti->available + cur_ti->filerem;
try_again:
if ((int)amount > cur_ti->available) { if ((int)amount > cur_ti->available) {
if (filling) {
while (filling)
yield();
goto try_again;
}
codecbufused = 0; codecbufused = 0;
buf_ridx = 0; buf_ridx = 0;
buf_widx = 0; buf_widx = 0;
cur_ti->start_pos += amount; cur_ti->start_pos = ci.curpos + amount;
amount -= cur_ti->available; amount -= cur_ti->available;
ci.curpos += cur_ti->available; ci.curpos += cur_ti->available;
cur_ti->available = 0; cur_ti->available = 0;
while ((int)amount < cur_ti->available && !ci.stop_codec) while ((int)amount > cur_ti->available && !ci.stop_codec)
yield(); yield();
} else {
cur_ti->available -= amount;
codecbufused -= amount;
buf_ridx += amount;
if (buf_ridx >= codecbuflen)
buf_ridx -= codecbuflen;
} }
buf_ridx += amount;
if (buf_ridx >= codecbuflen)
buf_ridx -= codecbuflen;
cur_ti->available -= amount;
codecbufused -= amount;
ci.curpos += amount; ci.curpos += amount;
cur_ti->id3.offset = ci.curpos; cur_ti->id3.offset = ci.curpos;
} }
@ -447,6 +454,7 @@ void audio_fill_file_buffer(void)
size_t i; size_t i;
int rc; int rc;
tracks[track_widx].start_pos = ci.curpos;
logf("Filling buffer..."); logf("Filling buffer...");
i = 0; i = 0;
while ((off_t)i < tracks[track_widx].filerem) { while ((off_t)i < tracks[track_widx].filerem) {
@ -455,8 +463,8 @@ void audio_fill_file_buffer(void)
if (!queue_empty(&audio_queue)) { if (!queue_empty(&audio_queue)) {
logf("Filling interrupted"); logf("Filling interrupted");
close(current_fd); //close(current_fd);
current_fd = -1; //current_fd = -1;
return ; return ;
} }
@ -480,13 +488,9 @@ void audio_fill_file_buffer(void)
codecbufused += i; codecbufused += i;
tracks[track_widx].filerem -= i; tracks[track_widx].filerem -= i;
tracks[track_widx].start_pos = tracks[track_widx].filepos;
tracks[track_widx].filepos += i; tracks[track_widx].filepos += i;
logf("Done:%d", tracks[track_widx].available); logf("Done:%d", tracks[track_widx].available);
if (tracks[track_widx].filerem == 0) { if (tracks[track_widx].filerem == 0) {
if (++track_widx == MAX_TRACK)
track_widx = 0;
tracks[track_widx].filerem = 0;
close(current_fd); close(current_fd);
current_fd = -1; current_fd = -1;
} }
@ -667,7 +671,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
if (!queue_empty(&audio_queue)) { if (!queue_empty(&audio_queue)) {
logf("Interrupted!"); logf("Interrupted!");
ci.stop_codec = true; //ci.stop_codec = true;
close(fd); close(fd);
return false; return false;
} }
@ -949,8 +953,11 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
break; break;
} }
track_changed = true; if (start_play) {
track_count++; track_count++;
track_changed = true;
}
i = tracks[track_widx].start_pos; i = tracks[track_widx].start_pos;
while (i < size) { while (i < size) {
/* Give codecs some processing time to prevent glitches. */ /* Give codecs some processing time to prevent glitches. */
@ -990,6 +997,9 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
fill_bytesleft -= rc; fill_bytesleft -= rc;
} }
if (!start_play)
track_count++;
tracks[track_widx].filepos = i; tracks[track_widx].filepos = i;
/* Leave the file handle open for faster buffer refill. */ /* Leave the file handle open for faster buffer refill. */
@ -1042,6 +1052,19 @@ void audio_play_start(int offset)
#endif #endif
} }
void audio_clear_track_entries(void)
{
int cur_idx;
int i;
cur_idx = track_widx;
for (i = 0; i < MAX_TRACK - track_count; i++) {
if (++cur_idx >= MAX_TRACK)
cur_idx = 0;
memset(&tracks[cur_idx], 0, sizeof(struct track_info));
}
}
void audio_check_buffer(void) void audio_check_buffer(void)
{ {
int i; int i;
@ -1077,22 +1100,24 @@ void audio_check_buffer(void)
} }
track_count = i; track_count = i;
if (tracks[cur_idx].filerem != 0) if (tracks[track_widx].filerem != 0)
track_count++; track_count++;
/* Mark all other entries null. */ /* Mark all other entries null. */
cur_idx = track_widx; audio_clear_track_entries();
for (i = 0; i < MAX_TRACK - track_count; i++) {
if (++cur_idx >= MAX_TRACK)
cur_idx = 0;
tracks[cur_idx].filesize = 0;
tracks[cur_idx].available = 0;
}
/* Try to load remainings of the file. */ /* Try to load remainings of the file. */
if (tracks[track_widx].filerem > 0) if (tracks[track_widx].filerem > 0)
audio_fill_file_buffer(); audio_fill_file_buffer();
/* Increase track write index as necessary. */
if (tracks[track_widx].filerem == 0 && tracks[track_widx].filesize != 0) {
if (++track_widx == MAX_TRACK)
track_widx = 0;
logf("new ti: %d", track_widx);
}
logf("ti: %d", track_widx);
/* Load new files to fill the entire buffer. */ /* Load new files to fill the entire buffer. */
if (tracks[track_widx].filerem == 0) if (tracks[track_widx].filerem == 0)
audio_insert_tracks(0, false, 1); audio_insert_tracks(0, false, 1);
@ -1224,15 +1249,30 @@ bool codec_request_next_track_callback(void)
return true; return true;
} }
/* Invalidates all but currently playing track. */
void audio_invalidate_tracks(void)
{
if (track_count == 0) {
queue_post(&audio_queue, AUDIO_PLAY, 0);
return ;
}
track_count = 1;
track_widx = track_ridx;
audio_clear_track_entries();
codecbufused = cur_ti->available;
buf_widx = buf_ridx + cur_ti->available;
if (buf_widx >= codecbuflen)
buf_widx -= codecbuflen;
}
void audio_thread(void) void audio_thread(void)
{ {
struct event ev; struct event ev;
while (1) { while (1) {
sleep(50);
audio_check_buffer(); audio_check_buffer();
queue_wait_w_tmo(&audio_queue, &ev, 100);
queue_wait_w_tmo(&audio_queue, &ev, 10);
switch (ev.id) { switch (ev.id) {
case AUDIO_PLAY: case AUDIO_PLAY:
ci.stop_codec = true; ci.stop_codec = true;
@ -1261,6 +1301,10 @@ void audio_thread(void)
case AUDIO_NEXT: case AUDIO_NEXT:
break ; break ;
case AUDIO_FLUSH:
audio_invalidate_tracks();
break ;
case AUDIO_CODEC_DONE: case AUDIO_CODEC_DONE:
//if (playing) //if (playing)
// audio_change_track(); // audio_change_track();
@ -1476,6 +1520,7 @@ void audio_ff_rewind(int newpos)
void audio_flush_and_reload_tracks(void) void audio_flush_and_reload_tracks(void)
{ {
logf("flush & reload"); logf("flush & reload");
queue_post(&audio_queue, AUDIO_FLUSH, 0);
} }
void audio_error_clear(void) void audio_error_clear(void)