summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c30
-rw-r--r--firmware/pcm_playback.c6
2 files changed, 23 insertions, 13 deletions
diff --git a/apps/playback.c b/apps/playback.c
index c053bc1473..03b286c2e9 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -922,6 +922,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
922 /* Get track metadata if we don't already have it. */ 922 /* Get track metadata if we don't already have it. */
923 if (!tracks[track_widx].taginfo_ready) { 923 if (!tracks[track_widx].taginfo_ready) {
924 if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { 924 if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) {
925 logf("Metadata error!");
926 tracks[track_widx].filesize = 0;
925 close(fd); 927 close(fd);
926 return false; 928 return false;
927 } 929 }
@@ -973,8 +975,10 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
973 copy_n = MIN(size - i, copy_n); 975 copy_n = MIN(size - i, copy_n);
974 copy_n = MIN((int)fill_bytesleft, copy_n); 976 copy_n = MIN((int)fill_bytesleft, copy_n);
975 rc = read(fd, &codecbuf[buf_widx], copy_n); 977 rc = read(fd, &codecbuf[buf_widx], copy_n);
976 if (rc <= 0) { 978 if (rc < copy_n) {
977 logf("File error!"); 979 logf("File error!");
980 tracks[track_widx].filesize = 0;
981 tracks[track_widx].filerem = 0;
978 close(fd); 982 close(fd);
979 return false; 983 return false;
980 } 984 }
@@ -1047,6 +1051,7 @@ void audio_play_start(int offset)
1047 } else { 1051 } else {
1048 logf("Failure"); 1052 logf("Failure");
1049 } 1053 }
1054
1050 pcm_set_boost_mode(false); 1055 pcm_set_boost_mode(false);
1051} 1056}
1052 1057
@@ -1127,11 +1132,12 @@ void initialize_buffer_fill(void)
1127 fill_bytesleft = codecbuflen - codecbufused; 1132 fill_bytesleft = codecbuflen - codecbufused;
1128 cur_ti->start_pos = ci.curpos; 1133 cur_ti->start_pos = ci.curpos;
1129 1134
1135 pcm_set_boost_mode(true);
1136
1130 if (filling) 1137 if (filling)
1131 return ; 1138 return ;
1132 1139
1133 filling = true; 1140 filling = true;
1134 pcm_set_boost_mode(true);
1135 1141
1136 /* Calculate real track count after throwing away old tracks. */ 1142 /* Calculate real track count after throwing away old tracks. */
1137 cur_idx = track_ridx; 1143 cur_idx = track_ridx;
@@ -1337,8 +1343,10 @@ bool codec_request_next_track_callback(void)
1337 yield(); 1343 yield();
1338 1344
1339 if (tracks[track_ridx].filesize == 0) { 1345 if (tracks[track_ridx].filesize == 0) {
1340 logf("No more tracks"); 1346 logf("No more tracks [2]");
1347 ci.stop_codec = true;
1341 new_track = 0; 1348 new_track = 0;
1349 queue_post(&codec_queue, CODEC_LOAD, 0);
1342 return false; 1350 return false;
1343 } 1351 }
1344 } 1352 }
@@ -1346,9 +1354,10 @@ bool codec_request_next_track_callback(void)
1346 ci.reload_codec = false; 1354 ci.reload_codec = false;
1347 1355
1348 if (cur_ti->id3.codectype != tracks[track_ridx].id3.codectype) { 1356 if (cur_ti->id3.codectype != tracks[track_ridx].id3.codectype) {
1357 logf("New codec:%d/%d", cur_ti->id3.codectype,
1358 tracks[track_ridx].id3.codectype);
1349 if (--track_ridx < 0) 1359 if (--track_ridx < 0)
1350 track_ridx = MAX_TRACK-1; 1360 track_ridx = MAX_TRACK-1;
1351 logf("New codec");
1352 new_track = 0; 1361 new_track = 0;
1353 return false; 1362 return false;
1354 } 1363 }
@@ -1386,7 +1395,7 @@ static void initiate_track_change(int peek_index)
1386 1395
1387 new_track = peek_index; 1396 new_track = peek_index;
1388 ci.reload_codec = true; 1397 ci.reload_codec = true;
1389 1398
1390 /* Detect if disk is spinning.. */ 1399 /* Detect if disk is spinning.. */
1391 if (filling) { 1400 if (filling) {
1392 ci.stop_codec = true; 1401 ci.stop_codec = true;
@@ -1396,8 +1405,8 @@ static void initiate_track_change(int peek_index)
1396 1405
1397 else if (!pcm_crossfade_init()) 1406 else if (!pcm_crossfade_init())
1398 pcm_flush_audio(); 1407 pcm_flush_audio();
1399 else 1408
1400 codec_track_changed(); 1409 codec_track_changed();
1401} 1410}
1402 1411
1403void audio_thread(void) 1412void audio_thread(void)
@@ -1594,8 +1603,7 @@ void audio_play(int offset)
1594 ci.stop_codec = true; 1603 ci.stop_codec = true;
1595 if (!pcm_crossfade_init()) 1604 if (!pcm_crossfade_init())
1596 pcm_flush_audio(); 1605 pcm_flush_audio();
1597 else 1606 codec_track_changed();
1598 codec_track_changed();
1599 1607
1600 pcm_play_pause(true); 1608 pcm_play_pause(true);
1601 paused = false; 1609 paused = false;
@@ -1813,7 +1821,7 @@ void test_buffer_event(struct mp3entry *id3, bool last_track)
1813 (void)id3; 1821 (void)id3;
1814 (void)last_track; 1822 (void)last_track;
1815 1823
1816 logf("be:%d%s", last_track, id3->title); 1824 logf("be:%d%s", last_track, id3->path);
1817} 1825}
1818 1826
1819void test_unbuffer_event(struct mp3entry *id3, bool last_track) 1827void test_unbuffer_event(struct mp3entry *id3, bool last_track)
@@ -1821,7 +1829,7 @@ void test_unbuffer_event(struct mp3entry *id3, bool last_track)
1821 (void)id3; 1829 (void)id3;
1822 (void)last_track; 1830 (void)last_track;
1823 1831
1824 logf("ube:%d%s", last_track, id3->title); 1832 logf("ube:%d%s", last_track, id3->path);
1825} 1833}
1826 1834
1827void audio_init(void) 1835void audio_init(void)
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 6b9a4bbd5c..b63b12f197 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -459,9 +459,11 @@ bool pcm_crossfade_init(void)
459 */ 459 */
460void pcm_flush_audio(void) 460void pcm_flush_audio(void)
461{ 461{
462 if (crossfade_init || crossfade_active || !pcm_playing) 462 if (crossfade_init || crossfade_active || !pcm_playing) {
463 pcm_play_stop();
463 return ; 464 return ;
464 465 }
466
465 crossfade_mode = CFM_FLUSH; 467 crossfade_mode = CFM_FLUSH;
466 crossfade_init = true; 468 crossfade_init = true;
467} 469}