diff options
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/apps/playback.c b/apps/playback.c index edeaedb118..c5b6fbc6a5 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -783,6 +783,33 @@ bool loadcodec(const char *trackname, bool start_play) | |||
783 | return true; | 783 | return true; |
784 | } | 784 | } |
785 | 785 | ||
786 | bool read_next_metadata(void) | ||
787 | { | ||
788 | int fd; | ||
789 | char *trackname; | ||
790 | int next_track; | ||
791 | int status; | ||
792 | |||
793 | trackname = playlist_peek(last_peek_offset); | ||
794 | if (!trackname) | ||
795 | return false; | ||
796 | |||
797 | fd = open(trackname, O_RDONLY); | ||
798 | if (fd < 0) | ||
799 | return false; | ||
800 | |||
801 | next_track = track_ridx + 1; | ||
802 | if (next_track >= MAX_TRACK) | ||
803 | next_track -= MAX_TRACK; | ||
804 | |||
805 | /* Start buffer refilling also because we need to spin-up the disk. */ | ||
806 | filling = true; | ||
807 | status = get_metadata(&tracks[next_track],fd,trackname,v1first); | ||
808 | close(fd); | ||
809 | |||
810 | return status; | ||
811 | } | ||
812 | |||
786 | bool audio_load_track(int offset, bool start_play, int peek_offset) | 813 | bool audio_load_track(int offset, bool start_play, int peek_offset) |
787 | { | 814 | { |
788 | char *trackname; | 815 | char *trackname; |
@@ -838,10 +865,12 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
838 | tracks[track_widx].start_pos = 0; | 865 | tracks[track_widx].start_pos = 0; |
839 | 866 | ||
840 | //logf("%s", trackname); | 867 | //logf("%s", trackname); |
841 | 868 | ||
842 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { | 869 | if (!tracks[track_widx].taginfo_ready) { |
843 | close(fd); | 870 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { |
844 | return false; | 871 | close(fd); |
872 | return false; | ||
873 | } | ||
845 | } | 874 | } |
846 | 875 | ||
847 | /* Starting playback from an offset is only support in MPA at the moment */ | 876 | /* Starting playback from an offset is only support in MPA at the moment */ |
@@ -1068,10 +1097,14 @@ void audio_check_buffer(void) | |||
1068 | if (audio_load_track(0, false, last_peek_offset)) { | 1097 | if (audio_load_track(0, false, last_peek_offset)) { |
1069 | last_peek_offset++; | 1098 | last_peek_offset++; |
1070 | } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { | 1099 | } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { |
1100 | if (track_count <= 1) | ||
1101 | read_next_metadata(); | ||
1102 | |||
1071 | generate_postbuffer_events(); | 1103 | generate_postbuffer_events(); |
1072 | filling = false; | 1104 | filling = false; |
1073 | conf_bufferlimit = 0; | 1105 | conf_bufferlimit = 0; |
1074 | pcm_set_boost_mode(false); | 1106 | pcm_set_boost_mode(false); |
1107 | |||
1075 | if (playing) | 1108 | if (playing) |
1076 | ata_sleep(); | 1109 | ata_sleep(); |
1077 | } | 1110 | } |
@@ -1243,6 +1276,7 @@ void audio_invalidate_tracks(void) | |||
1243 | buf_widx = buf_ridx + cur_ti->available; | 1276 | buf_widx = buf_ridx + cur_ti->available; |
1244 | if (buf_widx >= codecbuflen) | 1277 | if (buf_widx >= codecbuflen) |
1245 | buf_widx -= codecbuflen; | 1278 | buf_widx -= codecbuflen; |
1279 | read_next_metadata(); | ||
1246 | } | 1280 | } |
1247 | 1281 | ||
1248 | void audio_thread(void) | 1282 | void audio_thread(void) |