diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-15 18:59:04 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-15 18:59:04 +0000 |
commit | c3fed62fc7ea4ac4a2ed60ecf3ca7d43367e1e0c (patch) | |
tree | 9a4c2ad1ba5d5830184a32415b05ba59fc72ea44 | |
parent | e941289c2f08e8dd4d073b7d025381b660d69012 (diff) | |
download | rockbox-c3fed62fc7ea4ac4a2ed60ecf3ca7d43367e1e0c.tar.gz rockbox-c3fed62fc7ea4ac4a2ed60ecf3ca7d43367e1e0c.zip |
Fixed the "last song bug".
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6725 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/playback.c | 17 | ||||
-rw-r--r-- | firmware/export/pcm_playback.h | 1 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 11 |
3 files changed, 24 insertions, 5 deletions
diff --git a/apps/playback.c b/apps/playback.c index 029aefbddb..821b70523c 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -171,6 +171,10 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
171 | return true; | 171 | return true; |
172 | } | 172 | } |
173 | 173 | ||
174 | void audiobuffer_add_event(void (*event_handler)(void)) | ||
175 | { | ||
176 | } | ||
177 | |||
174 | unsigned int audiobuffer_get_latency() | 178 | unsigned int audiobuffer_get_latency() |
175 | { | 179 | { |
176 | return 0; | 180 | return 0; |
@@ -416,6 +420,11 @@ void codec_configure_callback(int setting, void *value) | |||
416 | } | 420 | } |
417 | } | 421 | } |
418 | 422 | ||
423 | void codec_track_changed(void) | ||
424 | { | ||
425 | track_changed = true; | ||
426 | } | ||
427 | |||
419 | void yield_codecs(void) | 428 | void yield_codecs(void) |
420 | { | 429 | { |
421 | yield(); | 430 | yield(); |
@@ -603,6 +612,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
603 | 612 | ||
604 | trackname = playlist_peek(peek_offset); | 613 | trackname = playlist_peek(peek_offset); |
605 | if (!trackname) { | 614 | if (!trackname) { |
615 | logf("End-of-playlist"); | ||
616 | conf_watermark = 0; | ||
606 | return false; | 617 | return false; |
607 | } | 618 | } |
608 | 619 | ||
@@ -668,7 +679,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
668 | 679 | ||
669 | if (start_play) { | 680 | if (start_play) { |
670 | track_count++; | 681 | track_count++; |
671 | track_changed = true; | 682 | audiobuffer_add_event(codec_track_changed); |
672 | } | 683 | } |
673 | 684 | ||
674 | i = tracks[track_widx].start_pos; | 685 | i = tracks[track_widx].start_pos; |
@@ -872,13 +883,15 @@ void audio_update_trackinfo(void) | |||
872 | ci.mp3data = (struct mp3info *)&cur_ti->mp3data; | 883 | ci.mp3data = (struct mp3info *)&cur_ti->mp3data; |
873 | ci.curpos = 0; | 884 | ci.curpos = 0; |
874 | ci.taginfo_ready = (bool *)&cur_ti->taginfo_ready; | 885 | ci.taginfo_ready = (bool *)&cur_ti->taginfo_ready; |
875 | track_changed = true; | 886 | audiobuffer_add_event(codec_track_changed); |
876 | } | 887 | } |
877 | 888 | ||
878 | void audio_change_track(void) | 889 | void audio_change_track(void) |
879 | { | 890 | { |
880 | if (track_ridx == track_widx) { | 891 | if (track_ridx == track_widx) { |
881 | logf("No more tracks"); | 892 | logf("No more tracks"); |
893 | while (pcm_is_playing()) | ||
894 | yield(); | ||
882 | playing = false; | 895 | playing = false; |
883 | return ; | 896 | return ; |
884 | } | 897 | } |
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h index 960641531a..c78936a3f2 100644 --- a/firmware/export/pcm_playback.h +++ b/firmware/export/pcm_playback.h | |||
@@ -43,6 +43,7 @@ void pcm_play_set_watermark(int numbytes, void (*callback)(int bytes_left)); | |||
43 | void pcm_set_boost_mode(bool state); | 43 | void pcm_set_boost_mode(bool state); |
44 | bool pcm_is_lowdata(void); | 44 | bool pcm_is_lowdata(void); |
45 | bool pcm_crossfade_start(void); | 45 | bool pcm_crossfade_start(void); |
46 | void audiobuffer_add_event(void (*event_handler)(void)); | ||
46 | unsigned int audiobuffer_get_latency(void); | 47 | unsigned int audiobuffer_get_latency(void); |
47 | bool audiobuffer_insert(char *buf, size_t length); | 48 | bool audiobuffer_insert(char *buf, size_t length); |
48 | bool pcm_is_crossfade_enabled(void); | 49 | bool pcm_is_crossfade_enabled(void); |
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index b18238cd3e..45e91ac3be 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -62,6 +62,8 @@ static int crossfade_pos; | |||
62 | static int crossfade_amount; | 62 | static int crossfade_amount; |
63 | static int crossfade_rem; | 63 | static int crossfade_rem; |
64 | 64 | ||
65 | static void (*pcm_event_handler)(void); | ||
66 | |||
65 | static unsigned char *next_start; | 67 | static unsigned char *next_start; |
66 | static long next_size; | 68 | static long next_size; |
67 | 69 | ||
@@ -202,6 +204,8 @@ static void pcm_play_callback(unsigned char** start, long* size) | |||
202 | { | 204 | { |
203 | /* No more buffers */ | 205 | /* No more buffers */ |
204 | *size = 0; | 206 | *size = 0; |
207 | if (pcm_event_handler) | ||
208 | pcm_event_handler(); | ||
205 | } | 209 | } |
206 | #if 1 | 210 | #if 1 |
207 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) | 211 | if(pcmbuf_unplayed_bytes <= pcmbuf_watermark) |
@@ -363,8 +367,7 @@ void pcm_set_boost_mode(bool state) | |||
363 | 367 | ||
364 | void audiobuffer_add_event(void (*event_handler)(void)) | 368 | void audiobuffer_add_event(void (*event_handler)(void)) |
365 | { | 369 | { |
366 | while (!pcm_play_add_chunk(NULL, 0, event_handler)) | 370 | pcm_event_handler = event_handler; |
367 | yield(); | ||
368 | } | 371 | } |
369 | 372 | ||
370 | unsigned int audiobuffer_get_latency(void) | 373 | unsigned int audiobuffer_get_latency(void) |
@@ -474,10 +477,11 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
474 | copy_n += audiobuffer_fillpos; | 477 | copy_n += audiobuffer_fillpos; |
475 | 478 | ||
476 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], | 479 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], |
477 | copy_n, NULL)) { | 480 | copy_n, pcm_event_handler)) { |
478 | pcm_boost(false); | 481 | pcm_boost(false); |
479 | yield(); | 482 | yield(); |
480 | } | 483 | } |
484 | pcm_event_handler = NULL; | ||
481 | 485 | ||
482 | audiobuffer_pos += copy_n; | 486 | audiobuffer_pos += copy_n; |
483 | audiobuffer_fillpos = 0; | 487 | audiobuffer_fillpos = 0; |
@@ -502,6 +506,7 @@ void pcm_play_init(void) | |||
502 | pcmbuf_write_index = 0; | 506 | pcmbuf_write_index = 0; |
503 | pcmbuf_unplayed_bytes = 0; | 507 | pcmbuf_unplayed_bytes = 0; |
504 | crossfade_enabled = false; | 508 | crossfade_enabled = false; |
509 | pcm_event_handler = NULL; | ||
505 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); | 510 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); |
506 | } | 511 | } |
507 | 512 | ||