summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/playback.c')
-rw-r--r--apps/playback.c94
1 files changed, 47 insertions, 47 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 2fae4d34ea..39076a2ba3 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -655,7 +655,7 @@ struct mp3entry* audio_current_track(void)
655 static struct mp3entry temp_id3; 655 static struct mp3entry temp_id3;
656 int cur_idx; 656 int cur_idx;
657 int offset = ci.new_track + wps_offset; 657 int offset = ci.new_track + wps_offset;
658 658
659 cur_idx = track_ridx + offset; 659 cur_idx = track_ridx + offset;
660 cur_idx &= MAX_TRACK_MASK; 660 cur_idx &= MAX_TRACK_MASK;
661 661
@@ -667,7 +667,7 @@ struct mp3entry* audio_current_track(void)
667 return bufgetid3(tracks[cur_idx].id3_hid); 667 return bufgetid3(tracks[cur_idx].id3_hid);
668 668
669 memset(&temp_id3, 0, sizeof(struct mp3entry)); 669 memset(&temp_id3, 0, sizeof(struct mp3entry));
670 670
671 filename = playlist_peek(0); 671 filename = playlist_peek(0);
672 if (!filename) 672 if (!filename)
673 filename = "No file!"; 673 filename = "No file!";
@@ -710,7 +710,7 @@ struct mp3entry* audio_next_track(void)
710 710
711bool audio_has_changed_track(void) 711bool audio_has_changed_track(void)
712{ 712{
713 if (track_changed) 713 if (track_changed)
714 { 714 {
715 track_changed = false; 715 track_changed = false;
716 return true; 716 return true;
@@ -1018,7 +1018,7 @@ static void voice_stop(void)
1018 ci_voice.new_track) 1018 ci_voice.new_track)
1019 yield(); 1019 yield();
1020 1020
1021 if (!playing) 1021 if (!playing)
1022 pcmbuf_play_stop(); 1022 pcmbuf_play_stop();
1023} /* voice_stop */ 1023} /* voice_stop */
1024 1024
@@ -1199,7 +1199,7 @@ static bool voice_on_voice_stop(bool aborting, size_t *realsize)
1199 sleep(0); 1199 sleep(0);
1200 1200
1201 /* Force the codec to think it's changing tracks */ 1201 /* Force the codec to think it's changing tracks */
1202 ci_voice.new_track = 1; 1202 ci_voice.new_track = 1;
1203 1203
1204 *realsize = 0; 1204 *realsize = 0;
1205 return true; /* Yes, change tracks */ 1205 return true; /* Yes, change tracks */
@@ -1311,7 +1311,7 @@ voice_play_clip:
1311 pcmbuf_play_start(); 1311 pcmbuf_play_start();
1312 } 1312 }
1313 } 1313 }
1314 1314
1315 *realsize = MIN(voice_remaining, reqsize); 1315 *realsize = MIN(voice_remaining, reqsize);
1316 1316
1317 if (*realsize == 0) 1317 if (*realsize == 0)
@@ -1330,14 +1330,14 @@ static void voice_advance_buffer_callback(size_t amount)
1330static void voice_advance_buffer_loc_callback(void *ptr) 1330static void voice_advance_buffer_loc_callback(void *ptr)
1331{ 1331{
1332 size_t amount = (size_t)ptr - (size_t)voicebuf; 1332 size_t amount = (size_t)ptr - (size_t)voicebuf;
1333 1333
1334 voice_advance_buffer_callback(amount); 1334 voice_advance_buffer_callback(amount);
1335} 1335}
1336 1336
1337static off_t voice_mp3_get_filepos_callback(int newtime) 1337static off_t voice_mp3_get_filepos_callback(int newtime)
1338{ 1338{
1339 (void)newtime; 1339 (void)newtime;
1340 1340
1341 return 0; 1341 return 0;
1342} 1342}
1343 1343
@@ -1349,7 +1349,7 @@ static void voice_do_nothing(void)
1349static bool voice_seek_buffer_callback(size_t newpos) 1349static bool voice_seek_buffer_callback(size_t newpos)
1350{ 1350{
1351 (void)newpos; 1351 (void)newpos;
1352 1352
1353 return false; 1353 return false;
1354} 1354}
1355 1355
@@ -1398,7 +1398,7 @@ static bool codec_pcmbuf_insert_callback(
1398 if (ci.new_track || ci.stop_codec) 1398 if (ci.new_track || ci.stop_codec)
1399 return true; 1399 return true;
1400 1400
1401 while ((dest = pcmbuf_request_buffer(&out_count)) == NULL) 1401 while ((dest = pcmbuf_request_buffer(&out_count)) == NULL)
1402 { 1402 {
1403 sleep(1); 1403 sleep(1);
1404 if (ci.seek_time || ci.new_track || ci.stop_codec) 1404 if (ci.seek_time || ci.new_track || ci.stop_codec)
@@ -1424,7 +1424,7 @@ static bool codec_pcmbuf_insert_callback(
1424 pcmbuf_write_complete(out_count); 1424 pcmbuf_write_complete(out_count);
1425 1425
1426#ifdef PLAYBACK_VOICE 1426#ifdef PLAYBACK_VOICE
1427 if ((voice_is_playing || voice_thread_start) 1427 if ((voice_is_playing || voice_thread_start)
1428 && pcm_is_playing() && voice_codec_loaded && 1428 && pcm_is_playing() && voice_codec_loaded &&
1429 pcmbuf_usage() > 30 && pcmbuf_mix_free() > 80) 1429 pcmbuf_usage() > 30 && pcmbuf_mix_free() > 80)
1430 { 1430 {
@@ -1446,13 +1446,13 @@ static void* codec_get_memory_callback(size_t *size)
1446} 1446}
1447 1447
1448static void codec_pcmbuf_position_callback(size_t size) ICODE_ATTR; 1448static void codec_pcmbuf_position_callback(size_t size) ICODE_ATTR;
1449static void codec_pcmbuf_position_callback(size_t size) 1449static void codec_pcmbuf_position_callback(size_t size)
1450{ 1450{
1451 /* This is called from an ISR, so be quick */ 1451 /* This is called from an ISR, so be quick */
1452 unsigned int time = size * 1000 / 4 / NATIVE_FREQUENCY + 1452 unsigned int time = size * 1000 / 4 / NATIVE_FREQUENCY +
1453 prevtrack_id3.elapsed; 1453 prevtrack_id3.elapsed;
1454 1454
1455 if (time >= prevtrack_id3.length) 1455 if (time >= prevtrack_id3.length)
1456 { 1456 {
1457 pcmbuf_set_position_callback(NULL); 1457 pcmbuf_set_position_callback(NULL);
1458 prevtrack_id3.elapsed = prevtrack_id3.length; 1458 prevtrack_id3.elapsed = prevtrack_id3.length;
@@ -1484,7 +1484,7 @@ static void codec_set_elapsed_callback(unsigned int value)
1484static void codec_set_offset_callback(size_t value) 1484static void codec_set_offset_callback(size_t value)
1485{ 1485{
1486 unsigned int latency; 1486 unsigned int latency;
1487 1487
1488 if (ci.seek_time) 1488 if (ci.seek_time)
1489 return; 1489 return;
1490 1490
@@ -1495,7 +1495,7 @@ static void codec_set_offset_callback(size_t value)
1495 curtrack_id3.offset = value - latency; 1495 curtrack_id3.offset = value - latency;
1496} 1496}
1497 1497
1498static void codec_advance_buffer_counters(size_t amount) 1498static void codec_advance_buffer_counters(size_t amount)
1499{ 1499{
1500 bufadvance(CUR_TI->audio_hid, amount); 1500 bufadvance(CUR_TI->audio_hid, amount);
1501 ci.curpos += amount; 1501 ci.curpos += amount;
@@ -1545,7 +1545,7 @@ static void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
1545 ssize_t ret; 1545 ssize_t ret;
1546 void *ptr; 1546 void *ptr;
1547 1547
1548 if (!playing) 1548 if (!playing)
1549 { 1549 {
1550 *realsize = 0; 1550 *realsize = 0;
1551 return NULL; 1551 return NULL;
@@ -1571,7 +1571,7 @@ static void* codec_request_buffer_callback(size_t *realsize, size_t reqsize)
1571 { 1571 {
1572 sleep(1); 1572 sleep(1);
1573 1573
1574 if (ci.stop_codec || ci.new_track) 1574 if (ci.stop_codec || ci.new_track)
1575 { 1575 {
1576 *realsize = 0; 1576 *realsize = 0;
1577 return NULL; 1577 return NULL;
@@ -1677,7 +1677,7 @@ static off_t codec_mp3_get_filepos_callback(int newtime)
1677static void codec_seek_complete_callback(void) 1677static void codec_seek_complete_callback(void)
1678{ 1678{
1679 logf("seek_complete"); 1679 logf("seek_complete");
1680 if (pcm_is_paused()) 1680 if (pcm_is_paused())
1681 { 1681 {
1682 /* If this is not a seamless seek, clear the buffer */ 1682 /* If this is not a seamless seek, clear the buffer */
1683 pcmbuf_play_stop(); 1683 pcmbuf_play_stop();
@@ -1746,14 +1746,16 @@ static void codec_discard_codec_callback(void)
1746 } 1746 }
1747} 1747}
1748 1748
1749static inline void codec_gapless_track_change(void) { 1749static inline void codec_gapless_track_change(void)
1750{
1750 /* callback keeps the progress bar moving while the pcmbuf empties */ 1751 /* callback keeps the progress bar moving while the pcmbuf empties */
1751 pcmbuf_set_position_callback(codec_pcmbuf_position_callback); 1752 pcmbuf_set_position_callback(codec_pcmbuf_position_callback);
1752 /* set the pcmbuf callback for when the track really changes */ 1753 /* set the pcmbuf callback for when the track really changes */
1753 pcmbuf_set_event_handler(codec_pcmbuf_track_changed_callback); 1754 pcmbuf_set_event_handler(codec_pcmbuf_track_changed_callback);
1754} 1755}
1755 1756
1756static inline void codec_crossfade_track_change(void) { 1757static inline void codec_crossfade_track_change(void)
1758{
1757 /* Initiate automatic crossfade mode */ 1759 /* Initiate automatic crossfade mode */
1758 pcmbuf_crossfade_init(false); 1760 pcmbuf_crossfade_init(false);
1759 /* Notify the wps that the track change starts now */ 1761 /* Notify the wps that the track change starts now */
@@ -1762,8 +1764,6 @@ static inline void codec_crossfade_track_change(void) {
1762 1764
1763static void codec_track_skip_done(bool was_manual) 1765static void codec_track_skip_done(bool was_manual)
1764{ 1766{
1765 int crossfade_mode = global_settings.crossfade;
1766
1767 /* Manual track change (always crossfade or flush audio). */ 1767 /* Manual track change (always crossfade or flush audio). */
1768 if (was_manual) 1768 if (was_manual)
1769 { 1769 {
@@ -1773,9 +1773,9 @@ static void codec_track_skip_done(bool was_manual)
1773 } 1773 }
1774 /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */ 1774 /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */
1775 else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active() 1775 else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active()
1776 && crossfade_mode != CROSSFADE_ENABLE_TRACKSKIP) 1776 && global_settings.crossfade != CROSSFADE_ENABLE_TRACKSKIP)
1777 { 1777 {
1778 if (crossfade_mode == CROSSFADE_ENABLE_SHUFFLE_AND_TRACKSKIP) 1778 if (global_settings.crossfade == CROSSFADE_ENABLE_SHUFFLE_AND_TRACKSKIP)
1779 { 1779 {
1780 if (global_settings.playlist_shuffle) 1780 if (global_settings.playlist_shuffle)
1781 /* shuffle mode is on, so crossfade: */ 1781 /* shuffle mode is on, so crossfade: */
@@ -1793,7 +1793,7 @@ static void codec_track_skip_done(bool was_manual)
1793 codec_gapless_track_change(); 1793 codec_gapless_track_change();
1794} 1794}
1795 1795
1796static bool codec_load_next_track(void) 1796static bool codec_load_next_track(void)
1797{ 1797{
1798 intptr_t result = Q_CODEC_REQUEST_FAILED; 1798 intptr_t result = Q_CODEC_REQUEST_FAILED;
1799 1799
@@ -1986,11 +1986,11 @@ static void codec_thread(void)
1986 case Q_CODEC_LOAD_DISK: 1986 case Q_CODEC_LOAD_DISK:
1987 case Q_CODEC_LOAD: 1987 case Q_CODEC_LOAD:
1988 LOGFQUEUE("codec < Q_CODEC_LOAD"); 1988 LOGFQUEUE("codec < Q_CODEC_LOAD");
1989 if (playing) 1989 if (playing)
1990 { 1990 {
1991 if (ci.new_track || status != CODEC_OK) 1991 if (ci.new_track || status != CODEC_OK)
1992 { 1992 {
1993 if (!ci.new_track) 1993 if (!ci.new_track)
1994 { 1994 {
1995 logf("Codec failure"); 1995 logf("Codec failure");
1996 gui_syncsplash(HZ*2, "Codec failure"); 1996 gui_syncsplash(HZ*2, "Codec failure");
@@ -2003,8 +2003,8 @@ static void codec_thread(void)
2003 queue_post(&audio_queue, Q_AUDIO_STOP, 0); 2003 queue_post(&audio_queue, Q_AUDIO_STOP, 0);
2004 break; 2004 break;
2005 } 2005 }
2006 } 2006 }
2007 else 2007 else
2008 { 2008 {
2009 logf("Codec finished"); 2009 logf("Codec finished");
2010 if (ci.stop_codec) 2010 if (ci.stop_codec)
@@ -2029,7 +2029,7 @@ static void codec_thread(void)
2029 LOGFQUEUE("codec > codec Q_CODEC_LOAD"); 2029 LOGFQUEUE("codec > codec Q_CODEC_LOAD");
2030 queue_post(&codec_queue, Q_CODEC_LOAD, 0); 2030 queue_post(&codec_queue, Q_CODEC_LOAD, 0);
2031 } 2031 }
2032 else 2032 else if (curtrack_id3.codectype != 0) /* Sucky workaround */
2033 { 2033 {
2034 const char *codec_fn = 2034 const char *codec_fn =
2035 get_codec_filename(curtrack_id3.codectype); 2035 get_codec_filename(curtrack_id3.codectype);
@@ -2079,22 +2079,22 @@ static bool audio_have_free_tracks(void)
2079 return track_widx + 1 < track_ridx; 2079 return track_widx + 1 < track_ridx;
2080 else if (track_ridx == 0) 2080 else if (track_ridx == 0)
2081 return track_widx < MAX_TRACK - 1; 2081 return track_widx < MAX_TRACK - 1;
2082 2082
2083 return true; 2083 return true;
2084} 2084}
2085 2085
2086int audio_track_count(void) 2086int audio_track_count(void)
2087{ 2087{
2088 if (audio_have_tracks()) 2088 if (audio_have_tracks())
2089 { 2089 {
2090 int relative_track_widx = track_widx; 2090 int relative_track_widx = track_widx;
2091 2091
2092 if (track_ridx > track_widx) 2092 if (track_ridx > track_widx)
2093 relative_track_widx += MAX_TRACK; 2093 relative_track_widx += MAX_TRACK;
2094 2094
2095 return relative_track_widx - track_ridx + 1; 2095 return relative_track_widx - track_ridx + 1;
2096 } 2096 }
2097 2097
2098 return 0; 2098 return 0;
2099} 2099}
2100 2100
@@ -2220,7 +2220,7 @@ static bool audio_loadcodec(bool start_play)
2220 else 2220 else
2221 { 2221 {
2222 /* If we already have another track than this one buffered */ 2222 /* If we already have another track than this one buffered */
2223 if (track_widx != track_ridx) 2223 if (track_widx != track_ridx)
2224 { 2224 {
2225 prev_track = (track_widx - 1) & MAX_TRACK_MASK; 2225 prev_track = (track_widx - 1) & MAX_TRACK_MASK;
2226 2226
@@ -2266,7 +2266,7 @@ static bool audio_loadcodec(bool start_play)
2266/* TODO: Copied from mpeg.c. Should be moved somewhere else. */ 2266/* TODO: Copied from mpeg.c. Should be moved somewhere else. */
2267static void audio_set_elapsed(struct mp3entry* id3) 2267static void audio_set_elapsed(struct mp3entry* id3)
2268{ 2268{
2269 unsigned long offset = id3->offset > id3->first_frame_offset ? 2269 unsigned long offset = id3->offset > id3->first_frame_offset ?
2270 id3->offset - id3->first_frame_offset : 0; 2270 id3->offset - id3->first_frame_offset : 0;
2271 2271
2272 if ( id3->vbr ) { 2272 if ( id3->vbr ) {
@@ -2305,7 +2305,7 @@ static void audio_set_elapsed(struct mp3entry* id3)
2305 } 2305 }
2306 else { 2306 else {
2307 /* no TOC exists. set a rough estimate using average bitrate */ 2307 /* no TOC exists. set a rough estimate using average bitrate */
2308 int tpk = id3->length / 2308 int tpk = id3->length /
2309 ((id3->filesize - id3->first_frame_offset - id3->id3v1len) / 2309 ((id3->filesize - id3->first_frame_offset - id3->id3v1len) /
2310 1024); 2310 1024);
2311 id3->elapsed = offset / 1024 * tpk; 2311 id3->elapsed = offset / 1024 * tpk;
@@ -2530,12 +2530,12 @@ static void audio_generate_postbuffer_events(void)
2530 2530
2531 logf("Postbuffer:%d/%d",track_ridx,track_widx); 2531 logf("Postbuffer:%d/%d",track_ridx,track_widx);
2532 2532
2533 if (audio_have_tracks()) 2533 if (audio_have_tracks())
2534 { 2534 {
2535 cur_idx = track_ridx; 2535 cur_idx = track_ridx;
2536 2536
2537 while (1) { 2537 while (1) {
2538 if (!tracks[cur_idx].event_sent) 2538 if (!tracks[cur_idx].event_sent)
2539 { 2539 {
2540 if (last_idx >= 0 && !tracks[last_idx].event_sent) 2540 if (last_idx >= 0 && !tracks[last_idx].event_sent)
2541 { 2541 {
@@ -2828,7 +2828,7 @@ static void audio_stop_playback(void)
2828 * Done here, as audio_stop_playback() may be called more than once. 2828 * Done here, as audio_stop_playback() may be called more than once.
2829 * Don't update runtime unless playback is stopped because of end of playlist. 2829 * Don't update runtime unless playback is stopped because of end of playlist.
2830 * Updating runtime when manually stopping a tracks, can destroy autoscores 2830 * Updating runtime when manually stopping a tracks, can destroy autoscores
2831 * and playcounts. 2831 * and playcounts.
2832 */ 2832 */
2833 if (playlist_end) 2833 if (playlist_end)
2834 { 2834 {
@@ -2911,7 +2911,7 @@ static void audio_new_playlist(void)
2911{ 2911{
2912 /* Prepare to start a new fill from the beginning of the playlist */ 2912 /* Prepare to start a new fill from the beginning of the playlist */
2913 last_peek_offset = -1; 2913 last_peek_offset = -1;
2914 if (audio_have_tracks()) 2914 if (audio_have_tracks())
2915 { 2915 {
2916 if (paused) 2916 if (paused)
2917 skipped_during_pause = true; 2917 skipped_during_pause = true;
@@ -3267,7 +3267,7 @@ void audio_init(void)
3267#ifdef ROCKBOX_HAS_LOGF 3267#ifdef ROCKBOX_HAS_LOGF
3268 audio_set_track_changed_event(audio_test_track_changed_event); 3268 audio_set_track_changed_event(audio_test_track_changed_event);
3269#endif 3269#endif
3270 3270
3271 /* Initialize codec api. */ 3271 /* Initialize codec api. */
3272 ci.read_filebuf = codec_filebuf_callback; 3272 ci.read_filebuf = codec_filebuf_callback;
3273 ci.pcmbuf_insert = codec_pcmbuf_insert_callback; 3273 ci.pcmbuf_insert = codec_pcmbuf_insert_callback;
@@ -3283,7 +3283,7 @@ void audio_init(void)
3283 ci.set_offset = codec_set_offset_callback; 3283 ci.set_offset = codec_set_offset_callback;
3284 ci.configure = codec_configure_callback; 3284 ci.configure = codec_configure_callback;
3285 ci.discard_codec = codec_discard_codec_callback; 3285 ci.discard_codec = codec_discard_codec_callback;
3286 3286
3287 /* Initialize voice codec api. */ 3287 /* Initialize voice codec api. */
3288#ifdef PLAYBACK_VOICE 3288#ifdef PLAYBACK_VOICE
3289 memcpy(&ci_voice, &ci, sizeof(ci_voice)); 3289 memcpy(&ci_voice, &ci, sizeof(ci_voice));
@@ -3307,7 +3307,7 @@ void audio_init(void)
3307 id3_voice.frequency = 11200; 3307 id3_voice.frequency = 11200;
3308 id3_voice.length = 1000000L; 3308 id3_voice.length = 1000000L;
3309#endif 3309#endif
3310 3310
3311 /* initialize the buffer */ 3311 /* initialize the buffer */
3312 filebuf = audiobuf; 3312 filebuf = audiobuf;
3313 3313
@@ -3355,7 +3355,7 @@ void audio_init(void)
3355#ifdef HAVE_WM8758 3355#ifdef HAVE_WM8758
3356 eq_hw_enable(global_settings.eq_hw_enabled); 3356 eq_hw_enable(global_settings.eq_hw_enabled);
3357#endif 3357#endif
3358#ifndef HAVE_FLASH_STORAGE 3358#ifndef HAVE_FLASH_STORAGE
3359 audio_set_buffer_margin(global_settings.buffer_margin); 3359 audio_set_buffer_margin(global_settings.buffer_margin);
3360#endif 3360#endif
3361 3361