diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/codec_thread.c | 5 | ||||
-rw-r--r-- | apps/menus/playback_menu.c | 10 | ||||
-rw-r--r-- | apps/menus/settings_menu.c | 2 | ||||
-rw-r--r-- | apps/pcmbuf.c | 102 | ||||
-rw-r--r-- | apps/pcmbuf.h | 2 | ||||
-rw-r--r-- | apps/playback.c | 10 | ||||
-rw-r--r-- | apps/playback.h | 4 | ||||
-rw-r--r-- | apps/settings.c | 2 | ||||
-rw-r--r-- | apps/settings.h | 2 |
9 files changed, 97 insertions, 42 deletions
diff --git a/apps/codec_thread.c b/apps/codec_thread.c index 13b203ee30..dc6533dfc9 100644 --- a/apps/codec_thread.c +++ b/apps/codec_thread.c | |||
@@ -475,7 +475,10 @@ static void codec_thread(void) | |||
475 | while (1) { | 475 | while (1) { |
476 | status = 0; | 476 | status = 0; |
477 | 477 | ||
478 | if (!pcmbuf_is_crossfade_active()) { | 478 | #ifdef HAVE_CROSSFADE |
479 | if (!pcmbuf_is_crossfade_active()) | ||
480 | #endif | ||
481 | { | ||
479 | cancel_cpu_boost(); | 482 | cancel_cpu_boost(); |
480 | } | 483 | } |
481 | 484 | ||
diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c index 4c4b29871e..5be7a8ca43 100644 --- a/apps/menus/playback_menu.c +++ b/apps/menus/playback_menu.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | 42 | ||
43 | #if CONFIG_CODEC == SWCODEC | 43 | #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_CROSSFADE) |
44 | static int setcrossfadeonexit_callback(int action,const struct menu_item_ex *this_item) | 44 | static int setcrossfadeonexit_callback(int action,const struct menu_item_ex *this_item) |
45 | { | 45 | { |
46 | (void)this_item; | 46 | (void)this_item; |
@@ -90,19 +90,19 @@ MENUITEM_SETTING(fade_on_stop, &global_settings.fade_on_stop, NULL); | |||
90 | MENUITEM_SETTING(party_mode, &global_settings.party_mode, NULL); | 90 | MENUITEM_SETTING(party_mode, &global_settings.party_mode, NULL); |
91 | 91 | ||
92 | #if CONFIG_CODEC == SWCODEC | 92 | #if CONFIG_CODEC == SWCODEC |
93 | #ifdef HAVE_CROSSFADE | ||
93 | /* crossfade submenu */ | 94 | /* crossfade submenu */ |
94 | MENUITEM_SETTING(crossfade, &global_settings.crossfade, setcrossfadeonexit_callback); | 95 | MENUITEM_SETTING(crossfade, &global_settings.crossfade, setcrossfadeonexit_callback); |
95 | MENUITEM_SETTING(crossfade_fade_in_delay, | 96 | MENUITEM_SETTING(crossfade_fade_in_delay, |
96 | &global_settings.crossfade_fade_in_delay, setcrossfadeonexit_callback); | 97 | &global_settings.crossfade_fade_in_delay, NULL); |
97 | MENUITEM_SETTING(crossfade_fade_in_duration, | 98 | MENUITEM_SETTING(crossfade_fade_in_duration, |
98 | &global_settings.crossfade_fade_in_duration, setcrossfadeonexit_callback); | 99 | &global_settings.crossfade_fade_in_duration, NULL); |
99 | MENUITEM_SETTING(crossfade_fade_out_delay, | 100 | MENUITEM_SETTING(crossfade_fade_out_delay, |
100 | &global_settings.crossfade_fade_out_delay, setcrossfadeonexit_callback); | 101 | &global_settings.crossfade_fade_out_delay, setcrossfadeonexit_callback); |
101 | MENUITEM_SETTING(crossfade_fade_out_duration, | 102 | MENUITEM_SETTING(crossfade_fade_out_duration, |
102 | &global_settings.crossfade_fade_out_duration, setcrossfadeonexit_callback); | 103 | &global_settings.crossfade_fade_out_duration, setcrossfadeonexit_callback); |
103 | MENUITEM_SETTING(crossfade_fade_out_mixmode, | 104 | MENUITEM_SETTING(crossfade_fade_out_mixmode, |
104 | &global_settings.crossfade_fade_out_mixmode,NULL); | 105 | &global_settings.crossfade_fade_out_mixmode,NULL); |
105 | #ifdef HAVE_CROSSFADE | ||
106 | MAKE_MENU(crossfade_settings_menu,ID2P(LANG_CROSSFADE),0, Icon_NOICON, | 106 | MAKE_MENU(crossfade_settings_menu,ID2P(LANG_CROSSFADE),0, Icon_NOICON, |
107 | &crossfade, &crossfade_fade_in_delay, &crossfade_fade_in_duration, | 107 | &crossfade, &crossfade_fade_in_delay, &crossfade_fade_in_duration, |
108 | &crossfade_fade_out_delay, &crossfade_fade_out_duration, | 108 | &crossfade_fade_out_delay, &crossfade_fade_out_duration, |
@@ -187,7 +187,7 @@ MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0, | |||
187 | #endif | 187 | #endif |
188 | &fade_on_stop, &party_mode, | 188 | &fade_on_stop, &party_mode, |
189 | 189 | ||
190 | #if CONFIG_CODEC == SWCODEC && defined(HAVE_CROSSFADE) | 190 | #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_CROSSFADE) |
191 | &crossfade_settings_menu, | 191 | &crossfade_settings_menu, |
192 | #endif | 192 | #endif |
193 | 193 | ||
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 135e632479..04de59fe20 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c | |||
@@ -367,7 +367,7 @@ static int talk_callback(int action,const struct menu_item_ex *this_item) | |||
367 | oldval = global_settings.talk_file_clip; | 367 | oldval = global_settings.talk_file_clip; |
368 | break; | 368 | break; |
369 | case ACTION_EXIT_MENUITEM: | 369 | case ACTION_EXIT_MENUITEM: |
370 | #if CONFIG_CODEC == SWCODEC | 370 | #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_CROSSFADE) |
371 | audio_set_crossfade(global_settings.crossfade); | 371 | audio_set_crossfade(global_settings.crossfade); |
372 | #endif | 372 | #endif |
373 | if (this_item == &talk_dir_clip_item) | 373 | if (this_item == &talk_dir_clip_item) |
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index 975d254424..6f3dd80ed2 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c | |||
@@ -79,12 +79,15 @@ static char *pcmbuffer IDATA_ATTR; | |||
79 | static size_t pcmbuffer_pos IDATA_ATTR; | 79 | static size_t pcmbuffer_pos IDATA_ATTR; |
80 | /* Amount pcmbuffer_pos will be increased.*/ | 80 | /* Amount pcmbuffer_pos will be increased.*/ |
81 | static size_t pcmbuffer_fillpos IDATA_ATTR; | 81 | static size_t pcmbuffer_fillpos IDATA_ATTR; |
82 | static char *fadebuf IDATA_ATTR; | ||
83 | static char *voicebuf IDATA_ATTR; | ||
84 | 82 | ||
83 | /* Gapless playback */ | ||
85 | static bool end_of_track IDATA_ATTR; | 84 | static bool end_of_track IDATA_ATTR; |
86 | bool track_transition IDATA_ATTR; | 85 | bool track_transition IDATA_ATTR; |
87 | 86 | ||
87 | #ifdef HAVE_CROSSFADE | ||
88 | /* Crossfade buffer */ | ||
89 | static char *fadebuf IDATA_ATTR; | ||
90 | |||
88 | /* Crossfade related state */ | 91 | /* Crossfade related state */ |
89 | static bool crossfade_enabled; | 92 | static bool crossfade_enabled; |
90 | static bool crossfade_enable_request; | 93 | static bool crossfade_enable_request; |
@@ -94,7 +97,6 @@ static bool crossfade_track_change_started IDATA_ATTR; | |||
94 | 97 | ||
95 | /* Track the current location for processing crossfade */ | 98 | /* Track the current location for processing crossfade */ |
96 | static struct chunkdesc *crossfade_chunk IDATA_ATTR; | 99 | static struct chunkdesc *crossfade_chunk IDATA_ATTR; |
97 | #ifdef HAVE_CROSSFADE | ||
98 | static size_t crossfade_sample IDATA_ATTR; | 100 | static size_t crossfade_sample IDATA_ATTR; |
99 | 101 | ||
100 | /* Counters for fading in new data */ | 102 | /* Counters for fading in new data */ |
@@ -111,6 +113,8 @@ static size_t last_chunksize IDATA_ATTR; | |||
111 | static size_t pcmbuf_unplayed_bytes IDATA_ATTR; | 113 | static size_t pcmbuf_unplayed_bytes IDATA_ATTR; |
112 | static size_t pcmbuf_watermark IDATA_ATTR; | 114 | static size_t pcmbuf_watermark IDATA_ATTR; |
113 | 115 | ||
116 | /* Voice */ | ||
117 | static char *voicebuf IDATA_ATTR; | ||
114 | static struct chunkdesc *mix_chunk IDATA_ATTR; | 118 | static struct chunkdesc *mix_chunk IDATA_ATTR; |
115 | static size_t pcmbuf_mix_sample IDATA_ATTR; | 119 | static size_t pcmbuf_mix_sample IDATA_ATTR; |
116 | 120 | ||
@@ -133,9 +137,8 @@ extern unsigned int codec_thread_id; | |||
133 | #ifdef HAVE_CROSSFADE | 137 | #ifdef HAVE_CROSSFADE |
134 | static void crossfade_start(void); | 138 | static void crossfade_start(void); |
135 | static void flush_crossfade(char *buf, size_t length); | 139 | static void flush_crossfade(char *buf, size_t length); |
136 | #endif | ||
137 | static void pcmbuf_finish_crossfade_enable(void); | 140 | static void pcmbuf_finish_crossfade_enable(void); |
138 | static bool pcmbuf_is_crossfade_enabled(void); | 141 | #endif |
139 | 142 | ||
140 | 143 | ||
141 | /**************************************/ | 144 | /**************************************/ |
@@ -315,11 +318,13 @@ static bool prepare_insert(size_t length) | |||
315 | } | 318 | } |
316 | } | 319 | } |
317 | 320 | ||
321 | #ifdef HAVE_CROSSFADE | ||
318 | /* Disable crossfade if < .5s of audio */ | 322 | /* Disable crossfade if < .5s of audio */ |
319 | if (LOW_DATA(2)) | 323 | if (LOW_DATA(2)) |
320 | { | 324 | { |
321 | crossfade_active = false; | 325 | crossfade_active = false; |
322 | } | 326 | } |
327 | #endif | ||
323 | } | 328 | } |
324 | else /* pcm_is_playing */ | 329 | else /* pcm_is_playing */ |
325 | { | 330 | { |
@@ -346,13 +351,13 @@ void *pcmbuf_request_buffer(int *count) | |||
346 | #ifdef HAVE_CROSSFADE | 351 | #ifdef HAVE_CROSSFADE |
347 | if (crossfade_track_change_started) | 352 | if (crossfade_track_change_started) |
348 | crossfade_start(); | 353 | crossfade_start(); |
349 | #endif | ||
350 | 354 | ||
351 | if (crossfade_active) { | 355 | if (crossfade_active) { |
352 | *count = MIN(*count, PCMBUF_MIX_CHUNK/4); | 356 | *count = MIN(*count, PCMBUF_MIX_CHUNK/4); |
353 | return fadebuf; | 357 | return fadebuf; |
354 | } | 358 | } |
355 | else | 359 | else |
360 | #endif | ||
356 | { | 361 | { |
357 | if(prepare_insert(*count << 2)) | 362 | if(prepare_insert(*count << 2)) |
358 | { | 363 | { |
@@ -417,9 +422,11 @@ static size_t get_next_required_pcmbuf_size(void) | |||
417 | { | 422 | { |
418 | size_t seconds = 1; | 423 | size_t seconds = 1; |
419 | 424 | ||
425 | #ifdef HAVE_CROSSFADE | ||
420 | if (crossfade_enable_request) | 426 | if (crossfade_enable_request) |
421 | seconds += global_settings.crossfade_fade_out_delay | 427 | seconds += global_settings.crossfade_fade_out_delay + |
422 | + global_settings.crossfade_fade_out_duration; | 428 | global_settings.crossfade_fade_out_duration; |
429 | #endif | ||
423 | 430 | ||
424 | #if MEMORYSIZE > 2 | 431 | #if MEMORYSIZE > 2 |
425 | /* Buffer has to be at least 2s long. */ | 432 | /* Buffer has to be at least 2s long. */ |
@@ -438,8 +445,12 @@ size_t pcmbuf_init(unsigned char *bufend) | |||
438 | write_chunk = (struct chunkdesc *)pcmbuf_bufend - | 445 | write_chunk = (struct chunkdesc *)pcmbuf_bufend - |
439 | NUM_CHUNK_DESCS(pcmbuf_size); | 446 | NUM_CHUNK_DESCS(pcmbuf_size); |
440 | voicebuf = (char *)write_chunk - PCMBUF_MIX_CHUNK; | 447 | voicebuf = (char *)write_chunk - PCMBUF_MIX_CHUNK; |
448 | #ifdef HAVE_CROSSFADE | ||
441 | fadebuf = voicebuf - PCMBUF_MIX_CHUNK; | 449 | fadebuf = voicebuf - PCMBUF_MIX_CHUNK; |
442 | pcmbuffer = fadebuf - pcmbuf_size; | 450 | pcmbuffer = fadebuf - pcmbuf_size; |
451 | #else | ||
452 | pcmbuffer = voicebuf - pcmbuf_size; | ||
453 | #endif | ||
443 | 454 | ||
444 | init_pcmbuffers(); | 455 | init_pcmbuffers(); |
445 | 456 | ||
@@ -447,7 +458,11 @@ size_t pcmbuf_init(unsigned char *bufend) | |||
447 | end_of_track = false; | 458 | end_of_track = false; |
448 | track_transition = false; | 459 | track_transition = false; |
449 | 460 | ||
461 | #ifdef HAVE_CROSSFADE | ||
450 | pcmbuf_finish_crossfade_enable(); | 462 | pcmbuf_finish_crossfade_enable(); |
463 | #else | ||
464 | pcmbuf_watermark = PCMBUF_WATERMARK; | ||
465 | #endif | ||
451 | 466 | ||
452 | pcmbuf_play_stop(); | 467 | pcmbuf_play_stop(); |
453 | 468 | ||
@@ -463,6 +478,7 @@ size_t pcmbuf_init(unsigned char *bufend) | |||
463 | * last one in the track. */ | 478 | * last one in the track. */ |
464 | static void start_gapless_track_change(void) | 479 | static void start_gapless_track_change(void) |
465 | { | 480 | { |
481 | logf(" gapless track change"); | ||
466 | /* we're starting a track transition */ | 482 | /* we're starting a track transition */ |
467 | track_transition = true; | 483 | track_transition = true; |
468 | 484 | ||
@@ -470,13 +486,28 @@ static void start_gapless_track_change(void) | |||
470 | end_of_track = true; | 486 | end_of_track = true; |
471 | } | 487 | } |
472 | 488 | ||
473 | static void start_crossfade_track_change(bool auto_skip) | 489 | #ifdef HAVE_CROSSFADE |
490 | static bool pcmbuf_is_crossfade_enabled(void) | ||
474 | { | 491 | { |
492 | if (global_settings.crossfade == CROSSFADE_ENABLE_SHUFFLE) | ||
493 | return global_settings.playlist_shuffle; | ||
494 | |||
495 | return crossfade_enabled; | ||
496 | } | ||
497 | #endif | ||
498 | |||
499 | static void start_processed_track_change(bool auto_skip) | ||
500 | { | ||
501 | logf(" processed track change"); | ||
475 | /* Notify the wps that the track change starts now */ | 502 | /* Notify the wps that the track change starts now */ |
476 | audio_post_track_change(false); | 503 | audio_post_track_change(false); |
477 | 504 | ||
478 | /* Can't do two crossfades at once and, no fade if pcm is off now */ | 505 | /* Can't do two crossfades at once and, no fade if pcm is off now */ |
479 | if (pcmbuf_is_crossfade_active() || !pcm_is_playing()) | 506 | if ( |
507 | #ifdef HAVE_CROSSFADE | ||
508 | pcmbuf_is_crossfade_active() || | ||
509 | #endif | ||
510 | !pcm_is_playing()) | ||
480 | { | 511 | { |
481 | pcmbuf_play_stop(); | 512 | pcmbuf_play_stop(); |
482 | return; | 513 | return; |
@@ -485,7 +516,11 @@ static void start_crossfade_track_change(bool auto_skip) | |||
485 | trigger_cpu_boost(); | 516 | trigger_cpu_boost(); |
486 | 517 | ||
487 | /* Not enough data, or crossfade disabled, flush the old data instead */ | 518 | /* Not enough data, or crossfade disabled, flush the old data instead */ |
488 | if (LOW_DATA(2) || !pcmbuf_is_crossfade_enabled() || low_latency_mode) | 519 | if (LOW_DATA(2) || |
520 | #ifdef HAVE_CROSSFADE | ||
521 | !pcmbuf_is_crossfade_enabled() || | ||
522 | #endif | ||
523 | low_latency_mode) | ||
489 | { | 524 | { |
490 | /* commit everything to this point and keep going, but... */ | 525 | /* commit everything to this point and keep going, but... */ |
491 | commit_chunk(); | 526 | commit_chunk(); |
@@ -494,19 +529,22 @@ static void start_crossfade_track_change(bool auto_skip) | |||
494 | return; | 529 | return; |
495 | } | 530 | } |
496 | 531 | ||
532 | #ifdef HAVE_CROSSFADE | ||
497 | /* Don't enable mix mode when skipping tracks manually. */ | 533 | /* Don't enable mix mode when skipping tracks manually. */ |
498 | crossfade_mixmode = auto_skip && global_settings.crossfade_fade_out_mixmode; | 534 | crossfade_mixmode = auto_skip && global_settings.crossfade_fade_out_mixmode; |
499 | 535 | ||
500 | crossfade_track_change_started = true; | 536 | crossfade_track_change_started = true; |
537 | #endif | ||
501 | } | 538 | } |
502 | 539 | ||
503 | void pcmbuf_start_track_change(bool auto_skip) | 540 | void pcmbuf_start_track_change(bool auto_skip) |
504 | { | 541 | { |
505 | bool crossfade = false; | 542 | bool process = false; |
506 | /* Manual track change (always crossfade or flush audio). */ | 543 | /* Manual track change (always crossfade or flush audio). */ |
507 | if (!auto_skip) | 544 | if (!auto_skip) |
508 | crossfade = true; | 545 | process = true; |
509 | 546 | ||
547 | #ifdef HAVE_CROSSFADE | ||
510 | /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */ | 548 | /* Automatic track change w/crossfade, if not in "Track Skip Only" mode. */ |
511 | else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active() | 549 | else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active() |
512 | && global_settings.crossfade != CROSSFADE_ENABLE_TRACKSKIP) | 550 | && global_settings.crossfade != CROSSFADE_ENABLE_TRACKSKIP) |
@@ -514,17 +552,18 @@ void pcmbuf_start_track_change(bool auto_skip) | |||
514 | if (global_settings.crossfade == CROSSFADE_ENABLE_SHUFFLE_AND_TRACKSKIP) | 552 | if (global_settings.crossfade == CROSSFADE_ENABLE_SHUFFLE_AND_TRACKSKIP) |
515 | { | 553 | { |
516 | if (global_settings.playlist_shuffle) | 554 | if (global_settings.playlist_shuffle) |
517 | crossfade = true; | 555 | process = true; |
518 | } | 556 | } |
519 | else | 557 | else |
520 | crossfade = true; | 558 | process = true; |
521 | } | 559 | } |
560 | #endif | ||
522 | 561 | ||
523 | if (crossfade) | 562 | if (process) |
524 | /* crossfade to next track */ | 563 | /* process track change (manual skip or crossfade) */ |
525 | start_crossfade_track_change(auto_skip); | 564 | start_processed_track_change(auto_skip); |
526 | else | 565 | else |
527 | /* normal gapless playback. */ | 566 | /* normal gapless playback */ |
528 | start_gapless_track_change(); | 567 | start_gapless_track_change(); |
529 | } | 568 | } |
530 | 569 | ||
@@ -573,9 +612,12 @@ static void pcmbuf_pcm_callback(unsigned char** start, size_t* size) | |||
573 | /* If we've read over the mix chunk while it's still mixing there */ | 612 | /* If we've read over the mix chunk while it's still mixing there */ |
574 | if (pcmbuf_current == mix_chunk) | 613 | if (pcmbuf_current == mix_chunk) |
575 | mix_chunk = NULL; | 614 | mix_chunk = NULL; |
615 | |||
616 | #ifdef HAVE_CROSSFADE | ||
576 | /* If we've read over the crossfade chunk while it's still fading */ | 617 | /* If we've read over the crossfade chunk while it's still fading */ |
577 | if (pcmbuf_current == crossfade_chunk) | 618 | if (pcmbuf_current == crossfade_chunk) |
578 | crossfade_chunk = read_chunk; | 619 | crossfade_chunk = read_chunk; |
620 | #endif | ||
579 | } | 621 | } |
580 | 622 | ||
581 | { | 623 | { |
@@ -636,8 +678,10 @@ void pcmbuf_play_stop(void) | |||
636 | } | 678 | } |
637 | pcmbuffer_pos = 0; | 679 | pcmbuffer_pos = 0; |
638 | pcmbuffer_fillpos = 0; | 680 | pcmbuffer_fillpos = 0; |
681 | #ifdef HAVE_CROSSFADE | ||
639 | crossfade_track_change_started = false; | 682 | crossfade_track_change_started = false; |
640 | crossfade_active = false; | 683 | crossfade_active = false; |
684 | #endif | ||
641 | flush_pcmbuf = false; | 685 | flush_pcmbuf = false; |
642 | DISPLAY_DESC("play_stop"); | 686 | DISPLAY_DESC("play_stop"); |
643 | 687 | ||
@@ -664,10 +708,6 @@ static inline int32_t clip_sample_16(int32_t sample) | |||
664 | return sample; | 708 | return sample; |
665 | } | 709 | } |
666 | 710 | ||
667 | /** | ||
668 | * Low memory targets don't have crossfade, so don't compile crossfade | ||
669 | * specific code in order to save some memory. */ | ||
670 | |||
671 | #ifdef HAVE_CROSSFADE | 711 | #ifdef HAVE_CROSSFADE |
672 | /** | 712 | /** |
673 | * Completely process the crossfade fade out effect with current pcm buffer. | 713 | * Completely process the crossfade fade out effect with current pcm buffer. |
@@ -906,7 +946,6 @@ static void flush_crossfade(char *buf, size_t length) | |||
906 | } | 946 | } |
907 | } | 947 | } |
908 | } | 948 | } |
909 | #endif /* HAVE_CROSSFADE */ | ||
910 | 949 | ||
911 | static void pcmbuf_finish_crossfade_enable(void) | 950 | static void pcmbuf_finish_crossfade_enable(void) |
912 | { | 951 | { |
@@ -920,14 +959,6 @@ static void pcmbuf_finish_crossfade_enable(void) | |||
920 | PCMBUF_WATERMARK; | 959 | PCMBUF_WATERMARK; |
921 | } | 960 | } |
922 | 961 | ||
923 | static bool pcmbuf_is_crossfade_enabled(void) | ||
924 | { | ||
925 | if (global_settings.crossfade == CROSSFADE_ENABLE_SHUFFLE) | ||
926 | return global_settings.playlist_shuffle; | ||
927 | |||
928 | return crossfade_enabled; | ||
929 | } | ||
930 | |||
931 | bool pcmbuf_is_crossfade_active(void) | 962 | bool pcmbuf_is_crossfade_active(void) |
932 | { | 963 | { |
933 | return crossfade_active || crossfade_track_change_started; | 964 | return crossfade_active || crossfade_track_change_started; |
@@ -951,6 +982,7 @@ bool pcmbuf_is_same_size(void) | |||
951 | 982 | ||
952 | return same_size; | 983 | return same_size; |
953 | } | 984 | } |
985 | #endif /* HAVE_CROSSFADE */ | ||
954 | 986 | ||
955 | 987 | ||
956 | /* Voice */ | 988 | /* Voice */ |
@@ -1100,7 +1132,11 @@ unsigned char * pcmbuf_get_meminfo(size_t *length) | |||
1100 | 1132 | ||
1101 | bool pcmbuf_is_lowdata(void) | 1133 | bool pcmbuf_is_lowdata(void) |
1102 | { | 1134 | { |
1103 | if (!pcm_is_playing() || pcm_is_paused() || pcmbuf_is_crossfade_active()) | 1135 | if (!pcm_is_playing() || pcm_is_paused() |
1136 | #ifdef HAVE_CROSSFADE | ||
1137 | || pcmbuf_is_crossfade_active() | ||
1138 | #endif | ||
1139 | ) | ||
1104 | return false; | 1140 | return false; |
1105 | 1141 | ||
1106 | #if MEMORYSIZE > 2 | 1142 | #if MEMORYSIZE > 2 |
diff --git a/apps/pcmbuf.h b/apps/pcmbuf.h index 747ab31537..992eb8063f 100644 --- a/apps/pcmbuf.h +++ b/apps/pcmbuf.h | |||
@@ -35,9 +35,11 @@ void pcmbuf_pause(bool pause); | |||
35 | void pcmbuf_start_track_change(bool manual_skip); | 35 | void pcmbuf_start_track_change(bool manual_skip); |
36 | 36 | ||
37 | /* Crossfade */ | 37 | /* Crossfade */ |
38 | #ifdef HAVE_CROSSFADE | ||
38 | bool pcmbuf_is_crossfade_active(void); | 39 | bool pcmbuf_is_crossfade_active(void); |
39 | void pcmbuf_request_crossfade_enable(bool on_off); | 40 | void pcmbuf_request_crossfade_enable(bool on_off); |
40 | bool pcmbuf_is_same_size(void); | 41 | bool pcmbuf_is_same_size(void); |
42 | #endif | ||
41 | 43 | ||
42 | /* Voice */ | 44 | /* Voice */ |
43 | void *pcmbuf_request_voice_buffer(int *count); | 45 | void *pcmbuf_request_voice_buffer(int *count); |
diff --git a/apps/playback.c b/apps/playback.c index 312a1c8165..2c9ca10311 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -814,6 +814,7 @@ void audio_set_buffer_margin(int setting) | |||
814 | } | 814 | } |
815 | #endif | 815 | #endif |
816 | 816 | ||
817 | #ifdef HAVE_CROSSFADE | ||
817 | /* Take necessary steps to enable or disable the crossfade setting */ | 818 | /* Take necessary steps to enable or disable the crossfade setting */ |
818 | void audio_set_crossfade(int enable) | 819 | void audio_set_crossfade(int enable) |
819 | { | 820 | { |
@@ -847,6 +848,7 @@ void audio_set_crossfade(int enable) | |||
847 | if (was_playing) | 848 | if (was_playing) |
848 | audio_play(offset); | 849 | audio_play(offset); |
849 | } | 850 | } |
851 | #endif | ||
850 | 852 | ||
851 | /* --- Routines called from multiple threads --- */ | 853 | /* --- Routines called from multiple threads --- */ |
852 | 854 | ||
@@ -1919,7 +1921,11 @@ static void audio_thread(void) | |||
1919 | 1921 | ||
1920 | case Q_AUDIO_PAUSE: | 1922 | case Q_AUDIO_PAUSE: |
1921 | LOGFQUEUE("audio < Q_AUDIO_PAUSE"); | 1923 | LOGFQUEUE("audio < Q_AUDIO_PAUSE"); |
1922 | if (!(bool) ev.data && skipped_during_pause && !pcmbuf_is_crossfade_active()) | 1924 | if (!(bool) ev.data && skipped_during_pause |
1925 | #ifdef HAVE_CROSSFADE | ||
1926 | && !pcmbuf_is_crossfade_active() | ||
1927 | #endif | ||
1928 | ) | ||
1923 | pcmbuf_play_stop(); /* Flush old track on resume after skip */ | 1929 | pcmbuf_play_stop(); /* Flush old track on resume after skip */ |
1924 | skipped_during_pause = false; | 1930 | skipped_during_pause = false; |
1925 | if (!playing) | 1931 | if (!playing) |
@@ -2059,8 +2065,10 @@ void audio_init(void) | |||
2059 | voice_thread_init(); | 2065 | voice_thread_init(); |
2060 | #endif | 2066 | #endif |
2061 | 2067 | ||
2068 | #ifdef HAVE_CROSSFADE | ||
2062 | /* Set crossfade setting for next buffer init which should be about... */ | 2069 | /* Set crossfade setting for next buffer init which should be about... */ |
2063 | pcmbuf_request_crossfade_enable(global_settings.crossfade); | 2070 | pcmbuf_request_crossfade_enable(global_settings.crossfade); |
2071 | #endif | ||
2064 | 2072 | ||
2065 | /* initialize the buffering system */ | 2073 | /* initialize the buffering system */ |
2066 | 2074 | ||
diff --git a/apps/playback.h b/apps/playback.h index b40638247b..3a1f45f6b2 100644 --- a/apps/playback.h +++ b/apps/playback.h | |||
@@ -58,9 +58,11 @@ bool audio_is_thread_ready(void); | |||
58 | int audio_track_count(void); | 58 | int audio_track_count(void); |
59 | long audio_filebufused(void); | 59 | long audio_filebufused(void); |
60 | void audio_pre_ff_rewind(void); | 60 | void audio_pre_ff_rewind(void); |
61 | void audio_set_crossfade(int type); | ||
62 | void audio_skip(int direction); | 61 | void audio_skip(int direction); |
63 | void audio_hard_stop(void); /* Stops audio from serving playback */ | 62 | void audio_hard_stop(void); /* Stops audio from serving playback */ |
63 | #ifdef HAVE_CROSSFADE | ||
64 | void audio_set_crossfade(int enable); | ||
65 | #endif | ||
64 | 66 | ||
65 | enum | 67 | enum |
66 | { | 68 | { |
diff --git a/apps/settings.c b/apps/settings.c index 2de4aa8c71..54fe4244f7 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -964,7 +964,9 @@ void settings_apply(bool read_disk) | |||
964 | set_codepage(global_settings.default_codepage); | 964 | set_codepage(global_settings.default_codepage); |
965 | 965 | ||
966 | #if CONFIG_CODEC == SWCODEC | 966 | #if CONFIG_CODEC == SWCODEC |
967 | #ifdef HAVE_CROSSFADE | ||
967 | audio_set_crossfade(global_settings.crossfade); | 968 | audio_set_crossfade(global_settings.crossfade); |
969 | #endif | ||
968 | dsp_set_replaygain(); | 970 | dsp_set_replaygain(); |
969 | dsp_set_crossfeed(global_settings.crossfeed); | 971 | dsp_set_crossfeed(global_settings.crossfeed); |
970 | dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain); | 972 | dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain); |
diff --git a/apps/settings.h b/apps/settings.h index eba592aca8..4ab2d8945d 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -339,6 +339,7 @@ struct user_settings | |||
339 | #endif | 339 | #endif |
340 | 340 | ||
341 | #if CONFIG_CODEC == SWCODEC | 341 | #if CONFIG_CODEC == SWCODEC |
342 | #ifdef HAVE_CROSSFADE | ||
342 | /* Crossfade */ | 343 | /* Crossfade */ |
343 | int crossfade; /* Enable crossfade (0=off, 1=shuffle, 2=trackskip, | 344 | int crossfade; /* Enable crossfade (0=off, 1=shuffle, 2=trackskip, |
344 | 3=shuff&trackskip, 4=always) */ | 345 | 3=shuff&trackskip, 4=always) */ |
@@ -347,6 +348,7 @@ struct user_settings | |||
347 | int crossfade_fade_in_duration; /* Fade in duration (0-15s) */ | 348 | int crossfade_fade_in_duration; /* Fade in duration (0-15s) */ |
348 | int crossfade_fade_out_duration; /* Fade out duration (0-15s) */ | 349 | int crossfade_fade_out_duration; /* Fade out duration (0-15s) */ |
349 | int crossfade_fade_out_mixmode; /* Fade out mode (0=crossfade,1=mix) */ | 350 | int crossfade_fade_out_mixmode; /* Fade out mode (0=crossfade,1=mix) */ |
351 | #endif | ||
350 | 352 | ||
351 | /* Replaygain */ | 353 | /* Replaygain */ |
352 | bool replaygain_noclip; /* scale to prevent clips */ | 354 | bool replaygain_noclip; /* scale to prevent clips */ |