Add ConsumeMode oneshot, closes #925

This commit is contained in:
jcorporation
2022-08-28 19:07:34 +02:00
parent b2fb920d28
commit 48a936ef5b
12 changed files with 138 additions and 14 deletions

View File

@@ -23,6 +23,7 @@
#include "player/Control.hxx"
#include "song/DetachedSong.hxx"
#include "SingleMode.hxx"
#include "ConsumeMode.hxx"
#include "Log.hxx"
#include <cassert>
@@ -101,9 +102,14 @@ playlist::QueuedSongStarted(PlayerControl &pc) noexcept
current = queued;
queued = -1;
if (queue.consume)
if (queue.consume != ConsumeMode::OFF)
DeleteOrder(pc, old_current);
if (queue.consume == ConsumeMode::ONE_SHOT) {
queue.consume = ConsumeMode::OFF;
listener.OnQueueOptionsChanged();
}
listener.OnQueueSongStarted();
SongStarted();
@@ -289,12 +295,13 @@ playlist::SetSingle(PlayerControl &pc, SingleMode status) noexcept
}
void
playlist::SetConsume(bool status) noexcept
playlist::SetConsume(ConsumeMode status) noexcept
{
if (status == queue.consume)
return;
queue.consume = status;
listener.OnQueueOptionsChanged();
}

View File

@@ -21,6 +21,7 @@
#define MPD_PLAYLIST_HXX
#include "SingleMode.hxx"
#include "ConsumeMode.hxx"
#include "queue/Queue.hxx"
#include "config.h"
@@ -369,11 +370,11 @@ public:
void SetSingle(PlayerControl &pc, SingleMode new_value) noexcept;
bool GetConsume() const noexcept {
ConsumeMode GetConsume() const noexcept {
return queue.consume;
}
void SetConsume(bool new_value) noexcept;
void SetConsume(ConsumeMode new_value) noexcept;
private:
/**

View File

@@ -26,6 +26,7 @@
#include "PlaylistError.hxx"
#include "player/Control.hxx"
#include "song/DetachedSong.hxx"
#include "Listener.hxx"
#include "Log.hxx"
void
@@ -178,8 +179,14 @@ playlist::PlayNext(PlayerControl &pc)
}
/* Consume mode removes each played songs. */
if (queue.consume)
if (queue.consume != ConsumeMode::OFF)
DeleteOrder(pc, old_current);
/* Disable consume mode after consuming one song in oneshot mode. */
if (queue.consume == ConsumeMode::ONE_SHOT) {
queue.consume = ConsumeMode::OFF;
listener.OnQueueOptionsChanged();
}
}
void

View File

@@ -162,7 +162,7 @@ playlist_state_restore(const StateFileConfig &config,
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_SINGLE))) {
playlist.SetSingle(pc, SingleFromString(p));
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_CONSUME))) {
playlist.SetConsume(StringIsEqual(p, "1"));
playlist.SetConsume(ConsumeFromString(p));
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_CROSSFADE))) {
pc.SetCrossFade(FloatDuration(atoi(p)));
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_MIXRAMPDB))) {
@@ -243,6 +243,7 @@ playlist_state_get_hash(const playlist &playlist,
((int)playlist.queue.single << 25) ^
(playlist.queue.random << 27) ^
(playlist.queue.repeat << 28) ^
(playlist.queue.consume << 30) ^
/* note that this takes 2 bits */
((int)playlist.queue.consume << 29) ^
(playlist.queue.random << 31);
}

View File

@@ -54,11 +54,11 @@ Queue::GetNextOrder(unsigned _order) const noexcept
{
assert(_order < length);
if (single != SingleMode::OFF && repeat && !consume)
if (single != SingleMode::OFF && repeat && consume == ConsumeMode::OFF )
return _order;
else if (_order + 1 < length)
return _order + 1;
else if (repeat && (_order > 0 || !consume))
else if (repeat && (_order > 0 || consume == ConsumeMode::OFF))
/* restart at first song */
return 0;
else

View File

@@ -23,6 +23,7 @@
#include "util/Compiler.h"
#include "IdTable.hxx"
#include "SingleMode.hxx"
#include "ConsumeMode.hxx"
#include "util/LazyRandomEngine.hxx"
#include <cassert>
@@ -96,7 +97,7 @@ struct Queue {
SingleMode single = SingleMode::OFF;
/** remove each played files. */
bool consume = false;
ConsumeMode consume = ConsumeMode::OFF;
/** play back songs in random order? */
bool random = false;