1
0
Fork 0
forked from len0rd/rockbox

Fixed the "last song bug".

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6725 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2005-06-15 18:59:04 +00:00
parent e941289c2f
commit c3fed62fc7
3 changed files with 24 additions and 5 deletions

View file

@ -171,6 +171,10 @@ bool audiobuffer_insert(char *buf, size_t length)
return true; return true;
} }
void audiobuffer_add_event(void (*event_handler)(void))
{
}
unsigned int audiobuffer_get_latency() unsigned int audiobuffer_get_latency()
{ {
return 0; return 0;
@ -416,6 +420,11 @@ void codec_configure_callback(int setting, void *value)
} }
} }
void codec_track_changed(void)
{
track_changed = true;
}
void yield_codecs(void) void yield_codecs(void)
{ {
yield(); yield();
@ -603,6 +612,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
trackname = playlist_peek(peek_offset); trackname = playlist_peek(peek_offset);
if (!trackname) { if (!trackname) {
logf("End-of-playlist");
conf_watermark = 0;
return false; return false;
} }
@ -668,7 +679,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
if (start_play) { if (start_play) {
track_count++; track_count++;
track_changed = true; audiobuffer_add_event(codec_track_changed);
} }
i = tracks[track_widx].start_pos; i = tracks[track_widx].start_pos;
@ -872,13 +883,15 @@ void audio_update_trackinfo(void)
ci.mp3data = (struct mp3info *)&cur_ti->mp3data; ci.mp3data = (struct mp3info *)&cur_ti->mp3data;
ci.curpos = 0; ci.curpos = 0;
ci.taginfo_ready = (bool *)&cur_ti->taginfo_ready; ci.taginfo_ready = (bool *)&cur_ti->taginfo_ready;
track_changed = true; audiobuffer_add_event(codec_track_changed);
} }
void audio_change_track(void) void audio_change_track(void)
{ {
if (track_ridx == track_widx) { if (track_ridx == track_widx) {
logf("No more tracks"); logf("No more tracks");
while (pcm_is_playing())
yield();
playing = false; playing = false;
return ; return ;
} }

View file

@ -43,6 +43,7 @@ void pcm_play_set_watermark(int numbytes, void (*callback)(int bytes_left));
void pcm_set_boost_mode(bool state); void pcm_set_boost_mode(bool state);
bool pcm_is_lowdata(void); bool pcm_is_lowdata(void);
bool pcm_crossfade_start(void); bool pcm_crossfade_start(void);
void audiobuffer_add_event(void (*event_handler)(void));
unsigned int audiobuffer_get_latency(void); unsigned int audiobuffer_get_latency(void);
bool audiobuffer_insert(char *buf, size_t length); bool audiobuffer_insert(char *buf, size_t length);
bool pcm_is_crossfade_enabled(void); bool pcm_is_crossfade_enabled(void);

View file

@ -62,6 +62,8 @@ static int crossfade_pos;
static int crossfade_amount; static int crossfade_amount;
static int crossfade_rem; static int crossfade_rem;
static void (*pcm_event_handler)(void);
static unsigned char *next_start; static unsigned char *next_start;
static long next_size; static long next_size;
@ -202,6 +204,8 @@ static void pcm_play_callback(unsigned char** start, long* size)
{ {
/* No more buffers */ /* No more buffers */
*size = 0; *size = 0;
if (pcm_event_handler)
pcm_event_handler();
} }
#if 1 #if 1
if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) if(pcmbuf_unplayed_bytes <= pcmbuf_watermark)
@ -363,8 +367,7 @@ void pcm_set_boost_mode(bool state)
void audiobuffer_add_event(void (*event_handler)(void)) void audiobuffer_add_event(void (*event_handler)(void))
{ {
while (!pcm_play_add_chunk(NULL, 0, event_handler)) pcm_event_handler = event_handler;
yield();
} }
unsigned int audiobuffer_get_latency(void) unsigned int audiobuffer_get_latency(void)
@ -474,10 +477,11 @@ bool audiobuffer_insert(char *buf, size_t length)
copy_n += audiobuffer_fillpos; copy_n += audiobuffer_fillpos;
while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos],
copy_n, NULL)) { copy_n, pcm_event_handler)) {
pcm_boost(false); pcm_boost(false);
yield(); yield();
} }
pcm_event_handler = NULL;
audiobuffer_pos += copy_n; audiobuffer_pos += copy_n;
audiobuffer_fillpos = 0; audiobuffer_fillpos = 0;
@ -502,6 +506,7 @@ void pcm_play_init(void)
pcmbuf_write_index = 0; pcmbuf_write_index = 0;
pcmbuf_unplayed_bytes = 0; pcmbuf_unplayed_bytes = 0;
crossfade_enabled = false; crossfade_enabled = false;
pcm_event_handler = NULL;
pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback);
} }