diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-29 14:46:27 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-29 14:46:27 +0000 |
commit | de3b04ee28ecf83a187abb6864387f039dfabcec (patch) | |
tree | de4fb3b8ec13e4772f0e70502c46f2e0684087d1 | |
parent | ee3405390331a2c9b2db9882f9a3af5892936cb7 (diff) | |
download | rockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.tar.gz rockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.zip |
Fixed buffering problems with dynamic playlist handling. Increased
codec buffer default watermark to prevent skipping.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6922 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/playback.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/apps/playback.c b/apps/playback.c index 5721e7c21b..e6cc68af6b 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -73,7 +73,7 @@ static volatile bool paused; | |||
73 | #define CODEC_WAVPACK "/.rockbox/codecs/wavpack.codec"; | 73 | #define CODEC_WAVPACK "/.rockbox/codecs/wavpack.codec"; |
74 | 74 | ||
75 | #define AUDIO_FILL_CYCLE (1024*256) | 75 | #define AUDIO_FILL_CYCLE (1024*256) |
76 | #define AUDIO_DEFAULT_WATERMARK (1024*256) | 76 | #define AUDIO_DEFAULT_WATERMARK (1024*512) |
77 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) | 77 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) |
78 | 78 | ||
79 | #define AUDIO_PLAY 1 | 79 | #define AUDIO_PLAY 1 |
@@ -724,11 +724,12 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
724 | off_t size; | 724 | off_t size; |
725 | int rc, i; | 725 | int rc, i; |
726 | int copy_n; | 726 | int copy_n; |
727 | 727 | ||
728 | if (track_count >= MAX_TRACK || tracks[track_widx].filesize != 0 | 728 | if (track_count >= MAX_TRACK || tracks[track_widx].filesize != 0 |
729 | || current_fd >= 0) | 729 | || current_fd >= 0) |
730 | return false; | 730 | return false; |
731 | 731 | ||
732 | logf("Buffering track:%d/%d", track_widx, track_ridx); | ||
732 | trackname = playlist_peek(peek_offset); | 733 | trackname = playlist_peek(peek_offset); |
733 | if (!trackname) { | 734 | if (!trackname) { |
734 | logf("End-of-playlist"); | 735 | logf("End-of-playlist"); |
@@ -737,8 +738,10 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
737 | } | 738 | } |
738 | 739 | ||
739 | fd = open(trackname, O_RDONLY); | 740 | fd = open(trackname, O_RDONLY); |
740 | if (fd < 0) | 741 | if (fd < 0) { |
742 | logf("Open failed"); | ||
741 | return false; | 743 | return false; |
744 | } | ||
742 | 745 | ||
743 | size = filesize(fd); | 746 | size = filesize(fd); |
744 | tracks[track_widx].filerem = size; | 747 | tracks[track_widx].filerem = size; |
@@ -770,7 +773,6 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
770 | tracks[track_widx].start_pos = 0; | 773 | tracks[track_widx].start_pos = 0; |
771 | 774 | ||
772 | //logf("%s", trackname); | 775 | //logf("%s", trackname); |
773 | logf("Buffering track:%d/%d", track_widx, track_ridx); | ||
774 | 776 | ||
775 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { | 777 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { |
776 | close(fd); | 778 | close(fd); |
@@ -896,10 +898,15 @@ void initialize_buffer_fill(void) | |||
896 | { | 898 | { |
897 | int cur_idx, i; | 899 | int cur_idx, i; |
898 | 900 | ||
899 | pcm_set_boost_mode(true); | ||
900 | 901 | ||
901 | fill_bytesleft = codecbuflen - codecbufused; | 902 | fill_bytesleft = codecbuflen - codecbufused; |
902 | tracks[track_widx].start_pos = ci.curpos; | 903 | tracks[track_widx].start_pos = ci.curpos; |
904 | |||
905 | if (filling) | ||
906 | return ; | ||
907 | |||
908 | filling = true; | ||
909 | pcm_set_boost_mode(true); | ||
903 | 910 | ||
904 | /* Calculate real track count after throwing away old tracks. */ | 911 | /* Calculate real track count after throwing away old tracks. */ |
905 | cur_idx = track_ridx; | 912 | cur_idx = track_ridx; |
@@ -926,10 +933,7 @@ void audio_check_buffer(void) | |||
926 | || !playing || ci.stop_codec || ci.reload_codec) && !filling) | 933 | || !playing || ci.stop_codec || ci.reload_codec) && !filling) |
927 | return ; | 934 | return ; |
928 | 935 | ||
929 | if (!filling) { | 936 | initialize_buffer_fill(); |
930 | initialize_buffer_fill(); | ||
931 | filling = true; | ||
932 | } | ||
933 | 937 | ||
934 | /* Limit buffering size at first run. */ | 938 | /* Limit buffering size at first run. */ |
935 | if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { | 939 | if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { |
@@ -1097,6 +1101,11 @@ void audio_invalidate_tracks(void) | |||
1097 | } | 1101 | } |
1098 | 1102 | ||
1099 | track_count = 1; | 1103 | track_count = 1; |
1104 | last_peek_offset = 1; | ||
1105 | if (cur_ti->filerem == 0 && current_fd >= 0) { | ||
1106 | close(current_fd); | ||
1107 | current_fd = -1; | ||
1108 | } | ||
1100 | track_widx = track_ridx; | 1109 | track_widx = track_ridx; |
1101 | audio_clear_track_entries(); | 1110 | audio_clear_track_entries(); |
1102 | codecbufused = cur_ti->available; | 1111 | codecbufused = cur_ti->available; |