diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 223 |
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 | |||
100 | enum { | 111 | enum { |
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 | ||
267 | static void audio_clear_track_entries( | 278 | static 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); |
269 | static bool initialize_buffer_fill(bool clear_tracks); | 280 | static bool audio_initialize_buffer_fill(bool clear_tracks); |
270 | static void audio_fill_file_buffer( | 281 | static 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 | ||
578 | static void advance_buffer_counters(size_t amount) | 589 | static 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 | ||
1106 | skip_done: | 1142 | skip_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 | ||
1111 | static void rebuffer_and_seek(size_t newpos) | 1148 | static 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 */ |
1388 | static bool yield_codecs(void) | 1437 | static 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 | ||
1571 | static bool loadcodec(bool start_play) | 1620 | static 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 | ||
1946 | static void stop_codec_flush(void) | 1996 | static 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. */ |
2027 | static void generate_postbuffer_events(void) | 2077 | static 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 | ||
2068 | static bool initialize_buffer_fill(bool clear_tracks) | 2118 | static 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 | ||
2136 | static void track_skip_done(bool was_manual) | 2186 | static 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 | ||
2159 | static bool load_next_track(void) | 2210 | static 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 | ||
2297 | static void initiate_track_change(long direction) | 2353 | static 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 | ||
2310 | static void initiate_dir_change(long direction) | 2366 | static 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 | ||
2559 | static void reset_buffer(void) | 2647 | static 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 | ||
2771 | void audio_stop(void) | 2864 | void 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 | ||
2783 | void audio_pause(void) | 2877 | void 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 | ||
2788 | void audio_resume(void) | 2883 | void 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 | ||
2813 | void audio_next_dir(void) | 2909 | void 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 | ||
2818 | void audio_prev_dir(void) | 2915 | void 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 | ||
2823 | void audio_pre_ff_rewind(void) | 2921 | void 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 | ||
2828 | void audio_ff_rewind(long newpos) | 2927 | void 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 | ||
2833 | void audio_flush_and_reload_tracks(void) | 2933 | void 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 | ||
2991 | void mp3_play_stop(void) | 3094 | void 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 | ||
3193 | void audio_init(void) | 3299 | void 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 | ||