diff --git a/NEWS b/NEWS index 7bdfa353c..717151dec 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ ver 0.17.2 (2012/??/??) * playlist: fix use-after-free bug * playlist: fix memory leak * state_file: save song priorities +* player: disable cross-fading in "single" mode ver 0.17.1 (2012/07/31) diff --git a/src/player_control.c b/src/player_control.c index d8d54dfd6..90f616d77 100644 --- a/src/player_control.c +++ b/src/player_control.c @@ -210,6 +210,14 @@ pc_set_pause(struct player_control *pc, bool pause_flag) player_unlock(pc); } +void +pc_set_border_pause(struct player_control *pc, bool border_pause) +{ + player_lock(pc); + pc->border_pause = border_pause; + player_unlock(pc); +} + void pc_get_status(struct player_control *pc, struct player_status *status) { diff --git a/src/player_control.h b/src/player_control.h index 5a04ab0f9..a77d31ec5 100644 --- a/src/player_control.h +++ b/src/player_control.h @@ -115,6 +115,15 @@ struct player_control { float mixramp_db; float mixramp_delay_seconds; double total_play_time; + + /** + * If this flag is set, then the player will be auto-paused at + * the end of the song, before the next song starts to play. + * + * This is a copy of the queue's "single" flag most of the + * time. + */ + bool border_pause; }; struct player_control * @@ -207,6 +216,12 @@ pc_set_pause(struct player_control *pc, bool pause_flag); void pc_pause(struct player_control *pc); +/** + * Set the player's #border_pause flag. + */ +void +pc_set_border_pause(struct player_control *pc, bool border_pause); + void pc_kill(struct player_control *pc); diff --git a/src/player_thread.c b/src/player_thread.c index eaf6df303..707fb27ae 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -842,6 +842,16 @@ player_song_border(struct player *player) if (!player_wait_for_decoder(player)) return false; + struct player_control *const pc = player->pc; + player_lock(pc); + + if (pc->border_pause) { + player->paused = true; + pc->state = PLAYER_STATE_PAUSE; + } + + player_unlock(pc); + return true; } @@ -957,7 +967,10 @@ static void do_play(struct player_control *pc, struct decoder_control *dc) player_dc_start(&player, music_pipe_new()); } - if (player_dc_at_next_song(&player) && + if (/* no cross-fading if MPD is going to pause at the + end of the current song */ + !pc->border_pause && + player_dc_at_next_song(&player) && player.xfade == XFADE_UNKNOWN && !decoder_lock_is_starting(dc)) { /* enable cross fading in this song? if yes, diff --git a/src/playlist.c b/src/playlist.c index d62865dd1..dc6d8c340 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -109,11 +109,6 @@ playlist_song_started(struct playlist *playlist, struct player_control *pc) playlist->current = playlist->queued; playlist->queued = -1; - /* Pause if we are in single mode. */ - if(playlist->queue.single && !playlist->queue.repeat) { - pc_set_pause(pc, true); - } - if(playlist->queue.consume) playlist_delete(playlist, pc, queue_order_to_position(&playlist->queue, @@ -310,7 +305,11 @@ playlist_set_repeat(struct playlist *playlist, struct player_control *pc, if (status == playlist->queue.repeat) return; - playlist->queue.repeat = status; + struct queue *queue = &playlist->queue; + + queue->repeat = status; + + pc_set_border_pause(pc, queue->single && !queue->repeat); /* if the last song is currently being played, the "next song" might change when repeat mode is toggled */ @@ -338,7 +337,11 @@ playlist_set_single(struct playlist *playlist, struct player_control *pc, if (status == playlist->queue.single) return; - playlist->queue.single = status; + struct queue *queue = &playlist->queue; + + queue->single = status; + + pc_set_border_pause(pc, queue->single && !queue->repeat); /* if the last song is currently being played, the "next song" might change when single mode is toggled */