void playlist_stop(struct playlist *playlist, struct player_control *pc) { if (!playlist->playing) return; assert(playlist->current >= 0); g_debug("stop"); pc_stop(pc); playlist->queued = -1; playlist->playing = false; if (playlist->queue.random) { /* shuffle the playlist, so the next playback will result in a new random order */ unsigned current_position = queue_order_to_position(&playlist->queue, playlist->current); queue_shuffle_order(&playlist->queue); /* make sure that "current" stays valid, and the next "play" command plays the same song again */ playlist->current = queue_position_to_order(&playlist->queue, current_position); } }
static void playlist_delete_internal(struct playlist *playlist, unsigned song, const struct song **queued_p) { unsigned songOrder; assert(song < queue_length(&playlist->queue)); songOrder = queue_position_to_order(&playlist->queue, song); if (playlist->playing && playlist->current == (int)songOrder) { bool paused = pc_get_state() == PLAYER_STATE_PAUSE; /* the current song is going to be deleted: stop the player */ pc_stop(); playlist->playing = false; /* see which song is going to be played instead */ playlist->current = queue_next_order(&playlist->queue, playlist->current); if (playlist->current == (int)songOrder) playlist->current = -1; if (playlist->current >= 0 && !paused) /* play the song after the deleted one */ playlist_play_order(playlist, playlist->current); else /* no songs left to play, stop playback completely */ playlist_stop(playlist); *queued_p = NULL; } else if (playlist->current == (int)songOrder) /* there's a "current song" but we're not playing currently - clear "current" */ playlist->current = -1; /* now do it: remove the song */ if (!song_in_database(queue_get(&playlist->queue, song))) pc_song_deleted(queue_get(&playlist->queue, song)); queue_delete(&playlist->queue, song); /* update the "current" and "queued" variables */ if (playlist->current > (int)songOrder) { playlist->current--; } }