summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c223
1 files changed, 164 insertions, 59 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 3c8585b50f..ed8bb10caa 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -97,6 +97,17 @@ static volatile bool paused;
97 * for their correct seeek target, 32k seems a good size */ 97 * for their correct seeek target, 32k seems a good size */
98#define AUDIO_REBUFFER_GUESS_SIZE (1024*32) 98#define AUDIO_REBUFFER_GUESS_SIZE (1024*32)
99 99
100/* macros to enable logf for queues */
101#ifdef SIMULATOR
102#define LOGF_QUEUES /* Define this for logf output of all queuing */
103#endif
104
105#ifdef LOGF_QUEUES
106#define LOGFQUEUE(s) logf("%s", s)
107#else
108#define LOGFQUEUE(s)
109#endif
110
100enum { 111enum {
101 Q_AUDIO_PLAY = 1, 112 Q_AUDIO_PLAY = 1,
102 Q_AUDIO_STOP, 113 Q_AUDIO_STOP,
@@ -266,7 +277,7 @@ static int mp3_get_file_pos(void);
266 277
267static void audio_clear_track_entries( 278static void audio_clear_track_entries(
268 bool clear_buffered, bool clear_unbuffered, bool may_yield); 279 bool clear_buffered, bool clear_unbuffered, bool may_yield);
269static bool initialize_buffer_fill(bool clear_tracks); 280static bool audio_initialize_buffer_fill(bool clear_tracks);
270static void audio_fill_file_buffer( 281static void audio_fill_file_buffer(
271 bool start_play, bool rebuffer, size_t offset); 282 bool start_play, bool rebuffer, size_t offset);
272 283
@@ -575,7 +586,7 @@ int audio_track_count(void)
575 return 0; 586 return 0;
576} 587}
577 588
578static void advance_buffer_counters(size_t amount) 589static void codec_advance_buffer_counters(size_t amount)
579{ 590{
580 buf_ridx += amount; 591 buf_ridx += amount;
581 592
@@ -590,7 +601,10 @@ static void advance_buffer_counters(size_t amount)
590 if (!pcmbuf_is_lowdata() && !filling) 601 if (!pcmbuf_is_lowdata() && !filling)
591 { 602 {
592 if (conf_watermark && filebufused <= conf_watermark && playing) 603 if (conf_watermark && filebufused <= conf_watermark && playing)
604 {
605 LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
593 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); 606 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
607 }
594 } 608 }
595} 609}
596 610
@@ -624,7 +638,10 @@ static size_t codec_filebuf_callback(void *ptr, size_t size)
624 while (copy_n > cur_ti->available) 638 while (copy_n > cur_ti->available)
625 { 639 {
626 if (!filling) 640 if (!filling)
641 {
642 LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
627 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); 643 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
644 }
628 645
629 sleep(1); 646 sleep(1);
630 if (ci.stop_codec || ci.new_track) 647 if (ci.stop_codec || ci.new_track)
@@ -640,7 +657,7 @@ static size_t codec_filebuf_callback(void *ptr, size_t size)
640 } 657 }
641 658
642 /* Update read and other position pointers */ 659 /* Update read and other position pointers */
643 advance_buffer_counters(copy_n); 660 codec_advance_buffer_counters(copy_n);
644 661
645 /* Return the actual amount of data copied to the buffer */ 662 /* Return the actual amount of data copied to the buffer */
646 return copy_n; 663 return copy_n;
@@ -673,15 +690,20 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
673 690
674 switch (ev.id) { 691 switch (ev.id) {
675 case Q_AUDIO_PLAY: 692 case Q_AUDIO_PLAY:
693 LOGFQUEUE("voice < Q_AUDIO_PLAY");
676 if (playing) 694 if (playing)
677 swap_codec(); 695 swap_codec();
678 break; 696 break;
697
679#if defined(HAVE_RECORDING) && !defined(SIMULATOR) 698#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
680 case Q_ENCODER_RECORD: 699 case Q_ENCODER_RECORD:
700 LOGFQUEUE("voice < Q_ENCODER_RECORD");
681 swap_codec(); 701 swap_codec();
682 break; 702 break;
683#endif 703#endif
704
684 case Q_VOICE_STOP: 705 case Q_VOICE_STOP:
706 LOGFQUEUE("voice < Q_VOICE_STOP");
685 if (voice_is_playing) 707 if (voice_is_playing)
686 { 708 {
687 /* Clear the current buffer */ 709 /* Clear the current buffer */
@@ -699,7 +721,7 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
699 break; 721 break;
700 722
701 case SYS_USB_CONNECTED: 723 case SYS_USB_CONNECTED:
702 logf("USB: Voice codec"); 724 LOGFQUEUE("voice < SYS_USB_CONNECTED");
703 usb_acknowledge(SYS_USB_CONNECTED_ACK); 725 usb_acknowledge(SYS_USB_CONNECTED_ACK);
704 if (audio_codec_loaded) 726 if (audio_codec_loaded)
705 swap_codec(); 727 swap_codec();
@@ -707,6 +729,7 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
707 break; 729 break;
708 730
709 case Q_VOICE_PLAY: 731 case Q_VOICE_PLAY:
732 LOGFQUEUE("voice < Q_VOICE_PLAY");
710 { 733 {
711 struct voice_info *voice_data; 734 struct voice_info *voice_data;
712 voice_is_playing = true; 735 voice_is_playing = true;
@@ -716,8 +739,13 @@ static void* voice_request_buffer_callback(size_t *realsize, size_t reqsize)
716 voicebuf = voice_data->buf; 739 voicebuf = voice_data->buf;
717 voice_getmore = voice_data->callback; 740 voice_getmore = voice_data->callback;
718 } 741 }
742
719 case SYS_TIMEOUT: 743 case SYS_TIMEOUT:
744 LOGFQUEUE("voice < SYS_TIMEOUT");
720 goto voice_play_clip; 745 goto voice_play_clip;
746
747 default:
748 LOGFQUEUE("voice < default");
721 } 749 }
722 } 750 }
723 751
@@ -731,6 +759,7 @@ voice_play_clip:
731 /* If this clip is done */ 759 /* If this clip is done */
732 if (!voice_remaining) 760 if (!voice_remaining)
733 { 761 {
762 LOGFQUEUE("voice > voice Q_VOICE_STOP");
734 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0); 763 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
735 /* Force pcm playback. */ 764 /* Force pcm playback. */
736 if (!pcm_is_playing()) 765 if (!pcm_is_playing())
@@ -766,7 +795,10 @@ static void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
766 while (copy_n > cur_ti->available) 795 while (copy_n > cur_ti->available)
767 { 796 {
768 if (!filling) 797 if (!filling)
798 {
799 LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER");
769 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); 800 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
801 }
770 802
771 sleep(1); 803 sleep(1);
772 if (ci.stop_codec || ci.new_track) 804 if (ci.stop_codec || ci.new_track)
@@ -990,6 +1022,7 @@ static void audio_check_new_track(void)
990 } 1022 }
991 else 1023 else
992 { 1024 {
1025 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
993 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0); 1026 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
994 return; 1027 return;
995 } 1028 }
@@ -1003,6 +1036,7 @@ static void audio_check_new_track(void)
1003 { 1036 {
1004 if (ci.new_track >= 0) 1037 if (ci.new_track >= 0)
1005 { 1038 {
1039 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
1006 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0); 1040 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
1007 return; 1041 return;
1008 } 1042 }
@@ -1010,6 +1044,7 @@ static void audio_check_new_track(void)
1010 while (!playlist_check(++ci.new_track)) 1044 while (!playlist_check(++ci.new_track))
1011 if (ci.new_track >= 0) 1045 if (ci.new_track >= 0)
1012 { 1046 {
1047 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
1013 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0); 1048 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
1014 return; 1049 return;
1015 } 1050 }
@@ -1019,6 +1054,7 @@ static void audio_check_new_track(void)
1019 1054
1020 if (playlist_next(ci.new_track) < 0) 1055 if (playlist_next(ci.new_track) < 0)
1021 { 1056 {
1057 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
1022 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0); 1058 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
1023 return; 1059 return;
1024 } 1060 }
@@ -1105,10 +1141,11 @@ static void audio_check_new_track(void)
1105 1141
1106skip_done: 1142skip_done:
1107 audio_update_trackinfo(); 1143 audio_update_trackinfo();
1144 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_COMPLETE");
1108 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0); 1145 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
1109} 1146}
1110 1147
1111static void rebuffer_and_seek(size_t newpos) 1148static void audio_rebuffer_and_seek(size_t newpos)
1112{ 1149{
1113 int fd; 1150 int fd;
1114 char *trackname; 1151 char *trackname;
@@ -1119,7 +1156,7 @@ static void rebuffer_and_seek(size_t newpos)
1119 fd = open(trackname, O_RDONLY); 1156 fd = open(trackname, O_RDONLY);
1120 if (fd < 0) 1157 if (fd < 0)
1121 { 1158 {
1122 logf("Open failed!"); 1159 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_FAILED");
1123 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0); 1160 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
1124 return; 1161 return;
1125 } 1162 }
@@ -1139,7 +1176,7 @@ static void rebuffer_and_seek(size_t newpos)
1139 1176
1140 last_peek_offset = 0; 1177 last_peek_offset = 0;
1141 filling = false; 1178 filling = false;
1142 initialize_buffer_fill(true); 1179 audio_initialize_buffer_fill(true);
1143 filling = true; 1180 filling = true;
1144 1181
1145 if (newpos > conf_preseek) { 1182 if (newpos > conf_preseek) {
@@ -1157,6 +1194,7 @@ static void rebuffer_and_seek(size_t newpos)
1157 1194
1158 lseek(current_fd, cur_ti->start_pos, SEEK_SET); 1195 lseek(current_fd, cur_ti->start_pos, SEEK_SET);
1159 1196
1197 LOGFQUEUE("audio > codec Q_CODEC_REQUEST_COMPLETE");
1160 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0); 1198 queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
1161} 1199}
1162 1200
@@ -1179,6 +1217,7 @@ static void codec_advance_buffer_callback(size_t amount)
1179 { 1217 {
1180 struct event ev; 1218 struct event ev;
1181 1219
1220 LOGFQUEUE("codec > audio Q_AUDIO_REBUFFER_SEEK");
1182 queue_post(&audio_queue, 1221 queue_post(&audio_queue,
1183 Q_AUDIO_REBUFFER_SEEK, (void *)(ci.curpos + amount)); 1222 Q_AUDIO_REBUFFER_SEEK, (void *)(ci.curpos + amount));
1184 1223
@@ -1186,18 +1225,22 @@ static void codec_advance_buffer_callback(size_t amount)
1186 switch (ev.id) 1225 switch (ev.id)
1187 { 1226 {
1188 case Q_CODEC_REQUEST_FAILED: 1227 case Q_CODEC_REQUEST_FAILED:
1228 LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
1189 ci.stop_codec = true; 1229 ci.stop_codec = true;
1190 case Q_CODEC_REQUEST_COMPLETE:
1191 return; 1230 return;
1192 1231
1232 case Q_CODEC_REQUEST_COMPLETE:
1233 LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
1234 return;
1235
1193 default: 1236 default:
1194 logf("Bad event on ccq"); 1237 LOGFQUEUE("codec < default");
1195 ci.stop_codec = true; 1238 ci.stop_codec = true;
1196 return; 1239 return;
1197 } 1240 }
1198 } 1241 }
1199 1242
1200 advance_buffer_counters(amount); 1243 codec_advance_buffer_counters(amount);
1201 1244
1202 codec_set_offset_callback(ci.curpos); 1245 codec_set_offset_callback(ci.curpos);
1203} 1246}
@@ -1264,6 +1307,8 @@ static bool codec_seek_buffer_callback(size_t newpos)
1264{ 1307{
1265 int difference; 1308 int difference;
1266 1309
1310 logf("codec_seek_buffer_callback");
1311
1267 if (newpos >= cur_ti->filesize) 1312 if (newpos >= cur_ti->filesize)
1268 newpos = cur_ti->filesize - 1; 1313 newpos = cur_ti->filesize - 1;
1269 1314
@@ -1286,20 +1331,23 @@ static bool codec_seek_buffer_callback(size_t newpos)
1286 { 1331 {
1287 struct event ev; 1332 struct event ev;
1288 1333
1334 LOGFQUEUE("codec > audio Q_AUDIO_REBUFFER_SEEK");
1289 queue_post(&audio_queue, Q_AUDIO_REBUFFER_SEEK, (void *)newpos); 1335 queue_post(&audio_queue, Q_AUDIO_REBUFFER_SEEK, (void *)newpos);
1290 1336
1291 queue_wait(&codec_callback_queue, &ev); 1337 queue_wait(&codec_callback_queue, &ev);
1292 switch (ev.id) 1338 switch (ev.id)
1293 { 1339 {
1294 case Q_CODEC_REQUEST_COMPLETE: 1340 case Q_CODEC_REQUEST_COMPLETE:
1341 LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
1295 return true; 1342 return true;
1296 1343
1297 case Q_CODEC_REQUEST_FAILED: 1344 case Q_CODEC_REQUEST_FAILED:
1345 LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
1298 ci.stop_codec = true; 1346 ci.stop_codec = true;
1299 return false; 1347 return false;
1300 1348
1301 default: 1349 default:
1302 logf("Bad event on ccq"); 1350 LOGFQUEUE("codec < default");
1303 return false; 1351 return false;
1304 } 1352 }
1305 } 1353 }
@@ -1373,6 +1421,7 @@ static void codec_track_changed(void)
1373{ 1421{
1374 automatic_skip = false; 1422 automatic_skip = false;
1375 track_changed = true; 1423 track_changed = true;
1424 LOGFQUEUE("codec > audio Q_AUDIO_TRACK_CHANGED");
1376 queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0); 1425 queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0);
1377} 1426}
1378 1427
@@ -1385,7 +1434,7 @@ static void pcmbuf_track_changed_callback(void)
1385/* Yield to codecs for as long as possible if they are in need of data 1434/* Yield to codecs for as long as possible if they are in need of data
1386 * return true if the caller should break to let the audio thread process 1435 * return true if the caller should break to let the audio thread process
1387 * new events */ 1436 * new events */
1388static bool yield_codecs(void) 1437static bool audio_yield_codecs(void)
1389{ 1438{
1390 yield(); 1439 yield();
1391 1440
@@ -1497,7 +1546,7 @@ static void audio_read_file(bool quick)
1497 /* Let the codec process until it is out of the danger zone, or there 1546 /* Let the codec process until it is out of the danger zone, or there
1498 * is an event to handle. In the latter case, break this fill cycle 1547 * is an event to handle. In the latter case, break this fill cycle
1499 * immediately */ 1548 * immediately */
1500 if (quick || yield_codecs()) 1549 if (quick || audio_yield_codecs())
1501 break; 1550 break;
1502 } 1551 }
1503 1552
@@ -1568,7 +1617,7 @@ static const char * get_codec_filename(int enc_spec)
1568 return fname; 1617 return fname;
1569} /* get_codec_filename */ 1618} /* get_codec_filename */
1570 1619
1571static bool loadcodec(bool start_play) 1620static bool audio_loadcodec(bool start_play)
1572{ 1621{
1573 size_t size; 1622 size_t size;
1574 int fd; 1623 int fd;
@@ -1594,6 +1643,7 @@ static bool loadcodec(bool start_play)
1594 ci.taginfo_ready = &cur_ti->taginfo_ready; 1643 ci.taginfo_ready = &cur_ti->taginfo_ready;
1595 ci.curpos = 0; 1644 ci.curpos = 0;
1596 playing = true; 1645 playing = true;
1646 LOGFQUEUE("codec > codec Q_CODEC_LOAD_DISK");
1597 queue_post(&codec_queue, Q_CODEC_LOAD_DISK, (void *)codec_fn); 1647 queue_post(&codec_queue, Q_CODEC_LOAD_DISK, (void *)codec_fn);
1598 return true; 1648 return true;
1599 } 1649 }
@@ -1655,7 +1705,7 @@ static bool loadcodec(bool start_play)
1655 1705
1656 tracks[track_widx].codecsize += rc; 1706 tracks[track_widx].codecsize += rc;
1657 1707
1658 yield_codecs(); 1708 audio_yield_codecs();
1659 } 1709 }
1660 1710
1661 tracks[track_widx].has_codec = true; 1711 tracks[track_widx].has_codec = true;
@@ -1804,7 +1854,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer)
1804 1854
1805 /* Load the codec. */ 1855 /* Load the codec. */
1806 tracks[track_widx].codecbuf = &filebuf[buf_widx]; 1856 tracks[track_widx].codecbuf = &filebuf[buf_widx];
1807 if (!loadcodec(start_play)) 1857 if (!audio_loadcodec(start_play))
1808 { 1858 {
1809 if (tracks[track_widx].codecsize) 1859 if (tracks[track_widx].codecsize)
1810 { 1860 {
@@ -1919,7 +1969,7 @@ static void audio_clear_track_entries(
1919 if (track_unbuffer_callback) 1969 if (track_unbuffer_callback)
1920 { 1970 {
1921 if (may_yield) 1971 if (may_yield)
1922 yield_codecs(); 1972 audio_yield_codecs();
1923 track_unbuffer_callback(&tracks[last_idx].id3, false); 1973 track_unbuffer_callback(&tracks[last_idx].id3, false);
1924 } 1974 }
1925 1975
@@ -1943,7 +1993,7 @@ static void audio_clear_track_entries(
1943 } 1993 }
1944} 1994}
1945 1995
1946static void stop_codec_flush(void) 1996static void audio_stop_codec_flush(void)
1947{ 1997{
1948 ci.stop_codec = true; 1998 ci.stop_codec = true;
1949 pcmbuf_pause(true); 1999 pcmbuf_pause(true);
@@ -1974,7 +2024,7 @@ static void audio_stop_playback(void)
1974 playing = false; 2024 playing = false;
1975 filling = false; 2025 filling = false;
1976 paused = false; 2026 paused = false;
1977 stop_codec_flush(); 2027 audio_stop_codec_flush();
1978 2028
1979 if (current_fd >= 0) 2029 if (current_fd >= 0)
1980 { 2030 {
@@ -1995,7 +2045,7 @@ static void audio_play_start(size_t offset)
1995 2045
1996 /* Wait for any previously playing audio to flush - TODO: Not necessary? */ 2046 /* Wait for any previously playing audio to flush - TODO: Not necessary? */
1997 while (audio_codec_loaded) 2047 while (audio_codec_loaded)
1998 stop_codec_flush(); 2048 audio_stop_codec_flush();
1999 2049
2000 track_changed = true; 2050 track_changed = true;
2001 playlist_end = false; 2051 playlist_end = false;
@@ -2024,7 +2074,7 @@ static void audio_play_start(size_t offset)
2024} 2074}
2025 2075
2026/* Send callback events to notify about new tracks. */ 2076/* Send callback events to notify about new tracks. */
2027static void generate_postbuffer_events(void) 2077static void audio_generate_postbuffer_events(void)
2028{ 2078{
2029 int cur_idx; 2079 int cur_idx;
2030 int last_idx = -1; 2080 int last_idx = -1;
@@ -2065,7 +2115,7 @@ static void generate_postbuffer_events(void)
2065 } 2115 }
2066} 2116}
2067 2117
2068static bool initialize_buffer_fill(bool clear_tracks) 2118static bool audio_initialize_buffer_fill(bool clear_tracks)
2069{ 2119{
2070 /* Don't initialize if we're already initialized */ 2120 /* Don't initialize if we're already initialized */
2071 if (filling) 2121 if (filling)
@@ -2105,7 +2155,7 @@ static void audio_fill_file_buffer(
2105{ 2155{
2106 bool had_next_track = audio_next_track() != NULL; 2156 bool had_next_track = audio_next_track() != NULL;
2107 2157
2108 if (!initialize_buffer_fill(!start_play)) 2158 if (!audio_initialize_buffer_fill(!start_play))
2109 return ; 2159 return ;
2110 2160
2111 /* If we have a partially buffered track, continue loading, 2161 /* If we have a partially buffered track, continue loading,
@@ -2123,7 +2173,7 @@ static void audio_fill_file_buffer(
2123 { 2173 {
2124 read_next_metadata(); 2174 read_next_metadata();
2125 2175
2126 generate_postbuffer_events(); 2176 audio_generate_postbuffer_events();
2127 filling = false; 2177 filling = false;
2128 2178
2129#ifndef SIMULATOR 2179#ifndef SIMULATOR
@@ -2133,12 +2183,13 @@ static void audio_fill_file_buffer(
2133 } 2183 }
2134} 2184}
2135 2185
2136static void track_skip_done(bool was_manual) 2186static void codec_track_skip_done(bool was_manual)
2137{ 2187{
2138 /* Manual track change (always crossfade or flush audio). */ 2188 /* Manual track change (always crossfade or flush audio). */
2139 if (was_manual) 2189 if (was_manual)
2140 { 2190 {
2141 pcmbuf_crossfade_init(true); 2191 pcmbuf_crossfade_init(true);
2192 LOGFQUEUE("codec > audio Q_AUDIO_TRACK_CHANGED");
2142 queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0); 2193 queue_post(&audio_queue, Q_AUDIO_TRACK_CHANGED, 0);
2143 } 2194 }
2144 /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */ 2195 /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */
@@ -2156,7 +2207,7 @@ static void track_skip_done(bool was_manual)
2156 } 2207 }
2157} 2208}
2158 2209
2159static bool load_next_track(void) 2210static bool codec_load_next_track(void)
2160{ 2211{
2161 struct event ev; 2212 struct event ev;
2162 2213
@@ -2176,6 +2227,7 @@ static bool load_next_track(void)
2176 } 2227 }
2177 2228
2178 cpu_boost(true); 2229 cpu_boost(true);
2230 LOGFQUEUE("codec > audio Q_AUDIO_CHECK_NEW_TRACK");
2179 queue_post(&audio_queue, Q_AUDIO_CHECK_NEW_TRACK, 0); 2231 queue_post(&audio_queue, Q_AUDIO_CHECK_NEW_TRACK, 0);
2180 while (1) 2232 while (1)
2181 { 2233 {
@@ -2192,14 +2244,18 @@ static bool load_next_track(void)
2192 switch (ev.id) 2244 switch (ev.id)
2193 { 2245 {
2194 case Q_CODEC_REQUEST_COMPLETE: 2246 case Q_CODEC_REQUEST_COMPLETE:
2195 track_skip_done(!automatic_skip); 2247 LOGFQUEUE("codec < Q_CODEC_REQUEST_COMPLETE");
2248 codec_track_skip_done(!automatic_skip);
2196 return true; 2249 return true;
2250
2197 case Q_CODEC_REQUEST_FAILED: 2251 case Q_CODEC_REQUEST_FAILED:
2252 LOGFQUEUE("codec < Q_CODEC_REQUEST_FAILED");
2198 ci.new_track = 0; 2253 ci.new_track = 0;
2199 ci.stop_codec = true; 2254 ci.stop_codec = true;
2200 return false; 2255 return false;
2256
2201 default: 2257 default:
2202 logf("Bad event on ccq"); 2258 LOGFQUEUE("codec < default");
2203 ci.stop_codec = true; 2259 ci.stop_codec = true;
2204 return false; 2260 return false;
2205 } 2261 }
@@ -2220,7 +2276,7 @@ static bool codec_request_next_track_callback(void)
2220 2276
2221 prev_codectype = get_codec_base_type(cur_ti->id3.codectype); 2277 prev_codectype = get_codec_base_type(cur_ti->id3.codectype);
2222 2278
2223 if (!load_next_track()) 2279 if (!codec_load_next_track())
2224 return false; 2280 return false;
2225 2281
2226 /* Check if the next codec is the same file. */ 2282 /* Check if the next codec is the same file. */
@@ -2294,7 +2350,7 @@ static void audio_new_playlist(void)
2294 audio_fill_file_buffer(false, true, 0); 2350 audio_fill_file_buffer(false, true, 0);
2295} 2351}
2296 2352
2297static void initiate_track_change(long direction) 2353static void audio_initiate_track_change(long direction)
2298{ 2354{
2299 if (playlist_check(direction)) 2355 if (playlist_check(direction))
2300 { 2356 {
@@ -2307,7 +2363,7 @@ static void initiate_track_change(long direction)
2307 } 2363 }
2308} 2364}
2309 2365
2310static void initiate_dir_change(long direction) 2366static void audio_initiate_dir_change(long direction)
2311{ 2367{
2312 playlist_end = false; 2368 playlist_end = false;
2313 dir_skip = true; 2369 dir_skip = true;
@@ -2333,6 +2389,7 @@ void audio_thread(void)
2333 2389
2334 switch (ev.id) { 2390 switch (ev.id) {
2335 case Q_AUDIO_FILL_BUFFER: 2391 case Q_AUDIO_FILL_BUFFER:
2392 LOGFQUEUE("audio < Q_AUDIO_FILL_BUFFER");
2336 if (!filling) 2393 if (!filling)
2337 if (!playing || playlist_end || ci.stop_codec) 2394 if (!playing || playlist_end || ci.stop_codec)
2338 break; 2395 break;
@@ -2340,70 +2397,71 @@ void audio_thread(void)
2340 break; 2397 break;
2341 2398
2342 case Q_AUDIO_PLAY: 2399 case Q_AUDIO_PLAY:
2343 logf("starting..."); 2400 LOGFQUEUE("audio < Q_AUDIO_PLAY");
2344 audio_clear_track_entries(true, false, true); 2401 audio_clear_track_entries(true, false, true);
2345 audio_play_start((size_t)ev.data); 2402 audio_play_start((size_t)ev.data);
2346 break ; 2403 break ;
2347 2404
2348 case Q_AUDIO_STOP: 2405 case Q_AUDIO_STOP:
2349 logf("audio_stop"); 2406 LOGFQUEUE("audio < Q_AUDIO_STOP");
2350 audio_stop_playback(); 2407 audio_stop_playback();
2351 break ; 2408 break ;
2352 2409
2353 case Q_AUDIO_PAUSE: 2410 case Q_AUDIO_PAUSE:
2354 logf("audio_%s",ev.data?"pause":"resume"); 2411 LOGFQUEUE("audio < Q_AUDIO_PAUSE");
2355 pcmbuf_pause((bool)ev.data); 2412 pcmbuf_pause((bool)ev.data);
2356 paused = (bool)ev.data; 2413 paused = (bool)ev.data;
2357 break ; 2414 break ;
2358 2415
2359 case Q_AUDIO_SKIP: 2416 case Q_AUDIO_SKIP:
2360 logf("audio_skip"); 2417 LOGFQUEUE("audio < Q_AUDIO_SKIP");
2361 initiate_track_change((long)ev.data); 2418 audio_initiate_track_change((long)ev.data);
2362 break; 2419 break;
2363 2420
2364 case Q_AUDIO_PRE_FF_REWIND: 2421 case Q_AUDIO_PRE_FF_REWIND:
2422 LOGFQUEUE("audio < Q_AUDIO_PRE_FF_REWIND");
2365 if (!playing) 2423 if (!playing)
2366 break; 2424 break;
2367 logf("pre_ff_rewind");
2368 pcmbuf_pause(true); 2425 pcmbuf_pause(true);
2369 break; 2426 break;
2370 2427
2371 case Q_AUDIO_FF_REWIND: 2428 case Q_AUDIO_FF_REWIND:
2429 LOGFQUEUE("audio < Q_AUDIO_FF_REWIND");
2372 if (!playing) 2430 if (!playing)
2373 break ; 2431 break ;
2374 logf("ff_rewind");
2375 ci.seek_time = (long)ev.data+1; 2432 ci.seek_time = (long)ev.data+1;
2376 break ; 2433 break ;
2377 2434
2378 case Q_AUDIO_REBUFFER_SEEK: 2435 case Q_AUDIO_REBUFFER_SEEK:
2379 logf("Re-buffering song w/seek"); 2436 LOGFQUEUE("audio < Q_AUDIO_REBUFFER_SEEK");
2380 rebuffer_and_seek((size_t)ev.data); 2437 audio_rebuffer_and_seek((size_t)ev.data);
2381 break; 2438 break;
2382 2439
2383 case Q_AUDIO_CHECK_NEW_TRACK: 2440 case Q_AUDIO_CHECK_NEW_TRACK:
2384 logf("Check new track buffer"); 2441 LOGFQUEUE("audio < Q_AUDIO_CHECK_NEW_TRACK");
2385 audio_check_new_track(); 2442 audio_check_new_track();
2386 break; 2443 break;
2387 2444
2388 case Q_AUDIO_DIR_SKIP: 2445 case Q_AUDIO_DIR_SKIP:
2389 logf("audio_dir_skip"); 2446 LOGFQUEUE("audio < Q_AUDIO_DIR_SKIP");
2390 playlist_end = false; 2447 playlist_end = false;
2391 if (global_settings.beep) 2448 if (global_settings.beep)
2392 pcmbuf_beep(5000, 100, 2500*global_settings.beep); 2449 pcmbuf_beep(5000, 100, 2500*global_settings.beep);
2393 initiate_dir_change((long)ev.data); 2450 audio_initiate_dir_change((long)ev.data);
2394 break; 2451 break;
2395 2452
2396 case Q_AUDIO_NEW_PLAYLIST: 2453 case Q_AUDIO_NEW_PLAYLIST:
2397 logf("new_playlist"); 2454 LOGFQUEUE("audio < Q_AUDIO_NEW_PLAYLIST");
2398 audio_new_playlist(); 2455 audio_new_playlist();
2399 break; 2456 break;
2400 2457
2401 case Q_AUDIO_FLUSH: 2458 case Q_AUDIO_FLUSH:
2402 logf("flush & reload"); 2459 LOGFQUEUE("audio < Q_AUDIO_FLUSH");
2403 audio_invalidate_tracks(); 2460 audio_invalidate_tracks();
2404 break ; 2461 break ;
2405 2462
2406 case Q_AUDIO_TRACK_CHANGED: 2463 case Q_AUDIO_TRACK_CHANGED:
2464 LOGFQUEUE("audio < Q_AUDIO_TRACK_CHANGED");
2407 if (track_changed_callback) 2465 if (track_changed_callback)
2408 track_changed_callback(&cur_ti->id3); 2466 track_changed_callback(&cur_ti->id3);
2409 track_changed = true; 2467 track_changed = true;
@@ -2412,14 +2470,19 @@ void audio_thread(void)
2412 2470
2413#ifndef SIMULATOR 2471#ifndef SIMULATOR
2414 case SYS_USB_CONNECTED: 2472 case SYS_USB_CONNECTED:
2415 logf("USB: Audio core"); 2473 LOGFQUEUE("audio < SYS_USB_CONNECTED");
2416 audio_stop_playback(); 2474 audio_stop_playback();
2417 usb_acknowledge(SYS_USB_CONNECTED_ACK); 2475 usb_acknowledge(SYS_USB_CONNECTED_ACK);
2418 usb_wait_for_disconnect(&audio_queue); 2476 usb_wait_for_disconnect(&audio_queue);
2419 break ; 2477 break ;
2420#endif 2478#endif
2479
2421 case SYS_TIMEOUT: 2480 case SYS_TIMEOUT:
2481 LOGFQUEUE("audio < SYS_TIMEOUT");
2422 break; 2482 break;
2483
2484 default:
2485 LOGFQUEUE("audio < default");
2423 } 2486 }
2424 } 2487 }
2425} 2488}
@@ -2436,10 +2499,13 @@ static void codec_thread(void)
2436 2499
2437 switch (ev.id) { 2500 switch (ev.id) {
2438 case Q_CODEC_LOAD_DISK: 2501 case Q_CODEC_LOAD_DISK:
2439 logf("Codec load disk"); 2502 LOGFQUEUE("codec < Q_CODEC_LOAD_DISK");
2440 audio_codec_loaded = true; 2503 audio_codec_loaded = true;
2441 if (voice_codec_loaded) 2504 if (voice_codec_loaded)
2505 {
2506 LOGFQUEUE("codec > voice Q_AUDIO_PLAY");
2442 queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0); 2507 queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0);
2508 }
2443 mutex_lock(&mutex_codecthread); 2509 mutex_lock(&mutex_codecthread);
2444 current_codec = CODEC_IDX_AUDIO; 2510 current_codec = CODEC_IDX_AUDIO;
2445 ci.stop_codec = false; 2511 ci.stop_codec = false;
@@ -2448,7 +2514,7 @@ static void codec_thread(void)
2448 break ; 2514 break ;
2449 2515
2450 case Q_CODEC_LOAD: 2516 case Q_CODEC_LOAD:
2451 logf("Codec load ram"); 2517 LOGFQUEUE("codec < Q_CODEC_LOAD");
2452 if (!cur_ti->has_codec) { 2518 if (!cur_ti->has_codec) {
2453 logf("Codec slot is empty!"); 2519 logf("Codec slot is empty!");
2454 /* Wait for the pcm buffer to go empty */ 2520 /* Wait for the pcm buffer to go empty */
@@ -2456,13 +2522,17 @@ static void codec_thread(void)
2456 yield(); 2522 yield();
2457 /* This must be set to prevent an infinite loop */ 2523 /* This must be set to prevent an infinite loop */
2458 ci.stop_codec = true; 2524 ci.stop_codec = true;
2525 LOGFQUEUE("codec > codec Q_AUDIO_PLAY");
2459 queue_post(&codec_queue, Q_AUDIO_PLAY, 0); 2526 queue_post(&codec_queue, Q_AUDIO_PLAY, 0);
2460 break ; 2527 break ;
2461 } 2528 }
2462 2529
2463 audio_codec_loaded = true; 2530 audio_codec_loaded = true;
2464 if (voice_codec_loaded) 2531 if (voice_codec_loaded)
2532 {
2533 LOGFQUEUE("codec > voice Q_AUDIO_PLAY");
2465 queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0); 2534 queue_post(&voice_codec_queue, Q_AUDIO_PLAY, 0);
2535 }
2466 mutex_lock(&mutex_codecthread); 2536 mutex_lock(&mutex_codecthread);
2467 current_codec = CODEC_IDX_AUDIO; 2537 current_codec = CODEC_IDX_AUDIO;
2468 ci.stop_codec = false; 2538 ci.stop_codec = false;
@@ -2474,10 +2544,13 @@ static void codec_thread(void)
2474 2544
2475#if defined(HAVE_RECORDING) && !defined(SIMULATOR) 2545#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
2476 case Q_ENCODER_LOAD_DISK: 2546 case Q_ENCODER_LOAD_DISK:
2477 logf("Encoder load disk"); 2547 LOGFQUEUE("codec < Q_ENCODER_LOAD_DISK");
2478 audio_codec_loaded = false; 2548 audio_codec_loaded = false;
2479 if (voice_codec_loaded && current_codec == CODEC_IDX_VOICE) 2549 if (voice_codec_loaded && current_codec == CODEC_IDX_VOICE)
2550 {
2551 LOGFQUEUE("codec > voice Q_ENCODER_RECORD");
2480 queue_post(&voice_codec_queue, Q_ENCODER_RECORD, NULL); 2552 queue_post(&voice_codec_queue, Q_ENCODER_RECORD, NULL);
2553 }
2481 mutex_lock(&mutex_codecthread); 2554 mutex_lock(&mutex_codecthread);
2482 current_codec = CODEC_IDX_AUDIO; 2555 current_codec = CODEC_IDX_AUDIO;
2483 ci.stop_codec = false; 2556 ci.stop_codec = false;
@@ -2488,14 +2561,17 @@ static void codec_thread(void)
2488 2561
2489#ifndef SIMULATOR 2562#ifndef SIMULATOR
2490 case SYS_USB_CONNECTED: 2563 case SYS_USB_CONNECTED:
2564 LOGFQUEUE("codec < SYS_USB_CONNECTED");
2491 queue_clear(&codec_queue); 2565 queue_clear(&codec_queue);
2492 logf("USB: Audio codec");
2493 usb_acknowledge(SYS_USB_CONNECTED_ACK); 2566 usb_acknowledge(SYS_USB_CONNECTED_ACK);
2494 if (voice_codec_loaded) 2567 if (voice_codec_loaded)
2495 swap_codec(); 2568 swap_codec();
2496 usb_wait_for_disconnect(&codec_queue); 2569 usb_wait_for_disconnect(&codec_queue);
2497 break ; 2570 break;
2498#endif 2571#endif
2572
2573 default:
2574 LOGFQUEUE("codec < default");
2499 } 2575 }
2500 2576
2501 if (audio_codec_loaded) 2577 if (audio_codec_loaded)
@@ -2512,6 +2588,7 @@ static void codec_thread(void)
2512 switch (ev.id) { 2588 switch (ev.id) {
2513 case Q_CODEC_LOAD_DISK: 2589 case Q_CODEC_LOAD_DISK:
2514 case Q_CODEC_LOAD: 2590 case Q_CODEC_LOAD:
2591 LOGFQUEUE("codec < Q_CODEC_LOAD");
2515 if (playing) 2592 if (playing)
2516 { 2593 {
2517 if (ci.new_track || status != CODEC_OK) 2594 if (ci.new_track || status != CODEC_OK)
@@ -2522,9 +2599,10 @@ static void codec_thread(void)
2522 gui_syncsplash(HZ*2, true, "Codec failure"); 2599 gui_syncsplash(HZ*2, true, "Codec failure");
2523 } 2600 }
2524 2601
2525 if (!load_next_track()) 2602 if (!codec_load_next_track())
2526 { 2603 {
2527 // queue_post(&codec_queue, Q_AUDIO_STOP, 0); 2604 // queue_post(&codec_queue, Q_AUDIO_STOP, 0);
2605 LOGFQUEUE("codec > audio Q_AUDIO_STOP");
2528 queue_post(&audio_queue, Q_AUDIO_STOP, 0); 2606 queue_post(&audio_queue, Q_AUDIO_STOP, 0);
2529 break; 2607 break;
2530 } 2608 }
@@ -2538,25 +2616,35 @@ static void codec_thread(void)
2538 * triggering the WPS exit */ 2616 * triggering the WPS exit */
2539 while(pcm_is_playing()) 2617 while(pcm_is_playing())
2540 sleep(1); 2618 sleep(1);
2619 LOGFQUEUE("codec > audio Q_AUDIO_STOP");
2541 queue_post(&audio_queue, Q_AUDIO_STOP, 0); 2620 queue_post(&audio_queue, Q_AUDIO_STOP, 0);
2542 break; 2621 break;
2543 } 2622 }
2544 } 2623 }
2545 2624
2546 if (cur_ti->has_codec) 2625 if (cur_ti->has_codec)
2626 {
2627 LOGFQUEUE("codec > codec Q_CODEC_LOAD");
2547 queue_post(&codec_queue, Q_CODEC_LOAD, 0); 2628 queue_post(&codec_queue, Q_CODEC_LOAD, 0);
2629 }
2548 else 2630 else
2549 { 2631 {
2550 const char *codec_fn = get_codec_filename(cur_ti->id3.codectype); 2632 const char *codec_fn = get_codec_filename(cur_ti->id3.codectype);
2633 LOGFQUEUE("codec > codec Q_CODEC_LOAD_DISK");
2551 queue_post(&codec_queue, Q_CODEC_LOAD_DISK, 2634 queue_post(&codec_queue, Q_CODEC_LOAD_DISK,
2552 (void *)codec_fn); 2635 (void *)codec_fn);
2553 } 2636 }
2554 } 2637 }
2638 break;
2639
2640 default:
2641 LOGFQUEUE("codec < default");
2642
2555 } /* end switch */ 2643 } /* end switch */
2556 } 2644 }
2557} 2645}
2558 2646
2559static void reset_buffer(void) 2647static void audio_reset_buffer(void)
2560{ 2648{
2561 size_t offset; 2649 size_t offset;
2562 2650
@@ -2607,6 +2695,7 @@ void audio_load_encoder(int enc_id)
2607 2695
2608 audio_remove_encoder(); 2696 audio_remove_encoder();
2609 2697
2698 LOGFQUEUE("audio > codec Q_ENCODER_LOAD_DISK");
2610 queue_post(&codec_queue, Q_ENCODER_LOAD_DISK, (void *)enc_fn); 2699 queue_post(&codec_queue, Q_ENCODER_LOAD_DISK, (void *)enc_fn);
2611 2700
2612 while (!ci.enc_codec_loaded) 2701 while (!ci.enc_codec_loaded)
@@ -2757,19 +2846,24 @@ void audio_play(long offset)
2757{ 2846{
2758 logf("audio_play"); 2847 logf("audio_play");
2759 if (playing && offset <= 0) 2848 if (playing && offset <= 0)
2849 {
2850 LOGFQUEUE("audio > audio Q_AUDIO_NEW_PLAYLIST");
2760 queue_post(&audio_queue, Q_AUDIO_NEW_PLAYLIST, 0); 2851 queue_post(&audio_queue, Q_AUDIO_NEW_PLAYLIST, 0);
2852 }
2761 else 2853 else
2762 { 2854 {
2763 if (playing) 2855 if (playing)
2764 audio_stop(); 2856 audio_stop();
2765 2857
2766 playing = true; 2858 playing = true;
2859 LOGFQUEUE("audio > audio Q_AUDIO_PLAY");
2767 queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset); 2860 queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset);
2768 } 2861 }
2769} 2862}
2770 2863
2771void audio_stop(void) 2864void audio_stop(void)
2772{ 2865{
2866 LOGFQUEUE("audio > audio Q_AUDIO_STOP");
2773 queue_post(&audio_queue, Q_AUDIO_STOP, 0); 2867 queue_post(&audio_queue, Q_AUDIO_STOP, 0);
2774 while (playing || audio_codec_loaded) 2868 while (playing || audio_codec_loaded)
2775 yield(); 2869 yield();
@@ -2782,11 +2876,13 @@ bool mp3_pause_done(void)
2782 2876
2783void audio_pause(void) 2877void audio_pause(void)
2784{ 2878{
2879 LOGFQUEUE("audio > audio Q_AUDIO_PAUSE");
2785 queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)true); 2880 queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)true);
2786} 2881}
2787 2882
2788void audio_resume(void) 2883void audio_resume(void)
2789{ 2884{
2885 LOGFQUEUE("audio > audio Q_AUDIO_PAUSE resume");
2790 queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)false); 2886 queue_post(&audio_queue, Q_AUDIO_PAUSE, (void *)false);
2791} 2887}
2792 2888
@@ -2797,7 +2893,7 @@ void audio_next(void)
2797 2893
2798 /* Should be safe to do outside of thread, that way we get 2894 /* Should be safe to do outside of thread, that way we get
2799 * the instant wps response at least. */ 2895 * the instant wps response at least. */
2800 initiate_track_change(1); 2896 audio_initiate_track_change(1);
2801 // queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)1); 2897 // queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)1);
2802} 2898}
2803 2899
@@ -2806,32 +2902,37 @@ void audio_prev(void)
2806 if (global_settings.beep) 2902 if (global_settings.beep)
2807 pcmbuf_beep(5000, 100, 2500*global_settings.beep); 2903 pcmbuf_beep(5000, 100, 2500*global_settings.beep);
2808 2904
2809 initiate_track_change(-1); 2905 audio_initiate_track_change(-1);
2810 // queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)-1); 2906 // queue_post(&audio_queue, Q_AUDIO_SKIP, (void *)-1);
2811} 2907}
2812 2908
2813void audio_next_dir(void) 2909void audio_next_dir(void)
2814{ 2910{
2911 LOGFQUEUE("audio > audio Q_AUDIO_DIR_SKIP 1");
2815 queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)1); 2912 queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)1);
2816} 2913}
2817 2914
2818void audio_prev_dir(void) 2915void audio_prev_dir(void)
2819{ 2916{
2917 LOGFQUEUE("audio > audio Q_AUDIO_DIR_SKIP -1");
2820 queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)-1); 2918 queue_post(&audio_queue, Q_AUDIO_DIR_SKIP, (void *)-1);
2821} 2919}
2822 2920
2823void audio_pre_ff_rewind(void) 2921void audio_pre_ff_rewind(void)
2824{ 2922{
2923 LOGFQUEUE("audio > audio Q_AUDIO_PRE_FF_REWIND");
2825 queue_post(&audio_queue, Q_AUDIO_PRE_FF_REWIND, 0); 2924 queue_post(&audio_queue, Q_AUDIO_PRE_FF_REWIND, 0);
2826} 2925}
2827 2926
2828void audio_ff_rewind(long newpos) 2927void audio_ff_rewind(long newpos)
2829{ 2928{
2929 LOGFQUEUE("audio > audio Q_AUDIO_FF_REWIND");
2830 queue_post(&audio_queue, Q_AUDIO_FF_REWIND, (int *)newpos); 2930 queue_post(&audio_queue, Q_AUDIO_FF_REWIND, (int *)newpos);
2831} 2931}
2832 2932
2833void audio_flush_and_reload_tracks(void) 2933void audio_flush_and_reload_tracks(void)
2834{ 2934{
2935 LOGFQUEUE("audio > audio Q_AUDIO_FLUSH");
2835 queue_post(&audio_queue, Q_AUDIO_FLUSH, 0); 2936 queue_post(&audio_queue, Q_AUDIO_FLUSH, 0);
2836} 2937}
2837 2938
@@ -2982,7 +3083,9 @@ void mp3_play_data(const unsigned char* start, int size,
2982 voice_clip.callback = get_more; 3083 voice_clip.callback = get_more;
2983 voice_clip.buf = (char *)start; 3084 voice_clip.buf = (char *)start;
2984 voice_clip.size = size; 3085 voice_clip.size = size;
3086 logf("mp3 > voice Q_VOICE_STOP");
2985 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0); 3087 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
3088 logf("mp3 > voice Q_VOICE_PLAY");
2986 queue_post(&voice_codec_queue, Q_VOICE_PLAY, &voice_clip); 3089 queue_post(&voice_codec_queue, Q_VOICE_PLAY, &voice_clip);
2987 voice_is_playing = true; 3090 voice_is_playing = true;
2988 voice_boost_cpu(true); 3091 voice_boost_cpu(true);
@@ -2990,6 +3093,7 @@ void mp3_play_data(const unsigned char* start, int size,
2990 3093
2991void mp3_play_stop(void) 3094void mp3_play_stop(void)
2992{ 3095{
3096 logf("mp3 > voice Q_VOICE_STOP");
2993 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0); 3097 queue_post(&voice_codec_queue, Q_VOICE_STOP, 0);
2994} 3098}
2995 3099
@@ -3035,6 +3139,7 @@ void audio_set_crossfade(int enable)
3035 /* Store the track resume position */ 3139 /* Store the track resume position */
3036 offset = cur_ti->id3.offset; 3140 offset = cur_ti->id3.offset;
3037 /* Playback has to be stopped before changing the buffer size. */ 3141 /* Playback has to be stopped before changing the buffer size. */
3142 LOGFQUEUE("audio > audio Q_AUDIO_STOP");
3038 queue_post(&audio_queue, Q_AUDIO_STOP, 0); 3143 queue_post(&audio_queue, Q_AUDIO_STOP, 0);
3039 while (audio_codec_loaded) 3144 while (audio_codec_loaded)
3040 yield(); 3145 yield();
@@ -3044,7 +3149,7 @@ void audio_set_crossfade(int enable)
3044 /* Re-initialize audio system. */ 3149 /* Re-initialize audio system. */
3045 pcmbuf_init(size); 3150 pcmbuf_init(size);
3046 pcmbuf_crossfade_enable(enable); 3151 pcmbuf_crossfade_enable(enable);
3047 reset_buffer(); 3152 audio_reset_buffer();
3048 logf("abuf:%dB", pcmbuf_get_bufsize()); 3153 logf("abuf:%dB", pcmbuf_get_bufsize());
3049 logf("fbuf:%dB", filebuflen); 3154 logf("fbuf:%dB", filebuflen);
3050 3155
@@ -3053,6 +3158,7 @@ void audio_set_crossfade(int enable)
3053 /* Restart playback. */ 3158 /* Restart playback. */
3054 if (was_playing) { 3159 if (was_playing) {
3055 playing = true; 3160 playing = true;
3161 LOGFQUEUE("audio > audio Q_AUDIO_PLAY");
3056 queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset); 3162 queue_post(&audio_queue, Q_AUDIO_PLAY, (void *)offset);
3057 3163
3058 /* Wait for the playback to start again (and display the splash 3164 /* Wait for the playback to start again (and display the splash
@@ -3192,8 +3298,7 @@ void audio_preinit(void)
3192 3298
3193void audio_init(void) 3299void audio_init(void)
3194{ 3300{
3195 logf("playback system post-init"); 3301 LOGFQUEUE("audio > audio Q_AUDIO_POSTINIT");
3196
3197 queue_post(&audio_queue, Q_AUDIO_POSTINIT, 0); 3302 queue_post(&audio_queue, Q_AUDIO_POSTINIT, 0);
3198} 3303}
3199 3304