summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/playback.c42
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
786bool 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
786bool audio_load_track(int offset, bool start_play, int peek_offset) 813bool 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
1248void audio_thread(void) 1282void audio_thread(void)