summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/pcmbuf.c10
-rw-r--r--apps/pcmbuf.h2
-rw-r--r--apps/playback.c12
3 files changed, 14 insertions, 10 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index e21f735bbb..f184672bd1 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -233,7 +233,7 @@ bool pcmbuf_is_lowdata(void)
233 return false; 233 return false;
234} 234}
235 235
236bool pcmbuf_crossfade_init(void) 236bool pcmbuf_crossfade_init(bool manual_skip)
237{ 237{
238 if (pcmbuf_size - audiobuffer_free < CHUNK_SIZE * 8 238 if (pcmbuf_size - audiobuffer_free < CHUNK_SIZE * 8
239 || !pcmbuf_is_crossfade_enabled() 239 || !pcmbuf_is_crossfade_enabled()
@@ -244,8 +244,12 @@ bool pcmbuf_crossfade_init(void)
244 logf("pcmbuf_crossfade_init"); 244 logf("pcmbuf_crossfade_init");
245 pcmbuf_boost(true); 245 pcmbuf_boost(true);
246 246
247 crossfade_mode = global_settings.crossfade_fade_out_mixmode 247 /* Don't enable mix mode when skipping tracks manually. */
248 ? CFM_MIX : CFM_CROSSFADE; 248 if (manual_skip)
249 crossfade_mode = CFM_CROSSFADE;
250 else
251 crossfade_mode = global_settings.crossfade_fade_out_mixmode
252 ? CFM_MIX : CFM_CROSSFADE;
249 crossfade_init = true; 253 crossfade_init = true;
250 254
251 return true; 255 return true;
diff --git a/apps/pcmbuf.h b/apps/pcmbuf.h
index 7e7ecf1d75..afc62021aa 100644
--- a/apps/pcmbuf.h
+++ b/apps/pcmbuf.h
@@ -41,7 +41,7 @@ void pcmbuf_set_boost_mode(bool state);
41bool pcmbuf_is_lowdata(void); 41bool pcmbuf_is_lowdata(void);
42void pcmbuf_flush_audio(void); 42void pcmbuf_flush_audio(void);
43void pcmbuf_play_start(void); 43void pcmbuf_play_start(void);
44bool pcmbuf_crossfade_init(void); 44bool pcmbuf_crossfade_init(bool manual_skip);
45void pcmbuf_add_event(void (*event_handler)(void)); 45void pcmbuf_add_event(void (*event_handler)(void));
46void pcmbuf_set_position_callback(void (*callback)(int size)); 46void pcmbuf_set_position_callback(void (*callback)(int size));
47unsigned int pcmbuf_get_latency(void); 47unsigned int pcmbuf_get_latency(void);
diff --git a/apps/playback.c b/apps/playback.c
index c535e30c8a..3eda695b39 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1510,14 +1510,14 @@ static void audio_update_trackinfo(void)
1510 /* Manual track change (always crossfade or flush audio). */ 1510 /* Manual track change (always crossfade or flush audio). */
1511 if (new_track) 1511 if (new_track)
1512 { 1512 {
1513 pcmbuf_crossfade_init(); 1513 pcmbuf_crossfade_init(true);
1514 codec_track_changed(); 1514 codec_track_changed();
1515 } 1515 }
1516 1516
1517 /* Automatic track change with crossfade. */ 1517 /* Automatic track change with crossfade. */
1518 else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active()) 1518 else if (pcmbuf_is_crossfade_enabled() && !pcmbuf_is_crossfade_active())
1519 { 1519 {
1520 pcmbuf_crossfade_init(); 1520 pcmbuf_crossfade_init(false);
1521 codec_track_changed(); 1521 codec_track_changed();
1522 } 1522 }
1523 1523
@@ -1574,7 +1574,7 @@ static int skip_next_track(bool inside_codec_thread)
1574 stop_codec_flush(); 1574 stop_codec_flush();
1575 } 1575 }
1576 else if (pcmbuf_is_crossfade_enabled()) 1576 else if (pcmbuf_is_crossfade_enabled())
1577 pcmbuf_crossfade_init(); 1577 pcmbuf_crossfade_init(new_track != 0);
1578 1578
1579 queue_post(&audio_queue, Q_AUDIO_PLAY, 0); 1579 queue_post(&audio_queue, Q_AUDIO_PLAY, 0);
1580 return SKIP_OK_DISK; 1580 return SKIP_OK_DISK;
@@ -1611,7 +1611,7 @@ static int skip_previous_track(bool inside_codec_thread)
1611 /* Stop playback. */ 1611 /* Stop playback. */
1612 /* FIXME: Only stop playback if disk is not spinning! */ 1612 /* FIXME: Only stop playback if disk is not spinning! */
1613 if (pcmbuf_is_crossfade_enabled()) 1613 if (pcmbuf_is_crossfade_enabled())
1614 pcmbuf_crossfade_init(); 1614 pcmbuf_crossfade_init(true);
1615 else if (inside_codec_thread) 1615 else if (inside_codec_thread)
1616 pcmbuf_play_stop(); 1616 pcmbuf_play_stop();
1617 else 1617 else
@@ -1747,7 +1747,7 @@ static void initiate_track_change(int peek_index)
1747 /* Detect if disk is spinning or already loading. */ 1747 /* Detect if disk is spinning or already loading. */
1748 if (filling || ci.reload_codec || !audio_codec_loaded) { 1748 if (filling || ci.reload_codec || !audio_codec_loaded) {
1749 if (pcmbuf_is_crossfade_enabled()) 1749 if (pcmbuf_is_crossfade_enabled())
1750 pcmbuf_crossfade_init(); 1750 pcmbuf_crossfade_init(true);
1751 else 1751 else
1752 pcmbuf_play_stop(); 1752 pcmbuf_play_stop();
1753 ci.stop_codec = true; 1753 ci.stop_codec = true;
@@ -2158,7 +2158,7 @@ void audio_play(int offset)
2158 { 2158 {
2159 ci.stop_codec = true; 2159 ci.stop_codec = true;
2160 sleep(1); 2160 sleep(1);
2161 pcmbuf_crossfade_init(); 2161 pcmbuf_crossfade_init(true);
2162 } 2162 }
2163 else 2163 else
2164 { 2164 {