Merge pull request #2020 from blazoncek/endless-playlist-fix
Endless playlist fix.
This commit is contained in:
commit
73d6cc1e54
@ -10,9 +10,10 @@ typedef struct PlaylistEntry {
|
||||
uint16_t tr;
|
||||
} ple;
|
||||
|
||||
bool playlistEndless = false;
|
||||
int8_t playlistRepeat = 1;
|
||||
byte playlistEndPreset = 0;
|
||||
byte *playlistEntries = nullptr;
|
||||
PlaylistEntry *playlistEntries = nullptr;
|
||||
byte playlistLen;
|
||||
int8_t playlistIndex = -1;
|
||||
uint16_t playlistEntryDur = 0;
|
||||
@ -20,20 +21,21 @@ uint16_t playlistEntryDur = 0;
|
||||
|
||||
void shufflePlaylist() {
|
||||
int currentIndex = playlistLen;
|
||||
|
||||
PlaylistEntry temporaryValue, *entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
|
||||
PlaylistEntry temporaryValue;
|
||||
|
||||
// While there remain elements to shuffle...
|
||||
while (currentIndex--) {
|
||||
// Pick a random element...
|
||||
int randomIndex = random(0, currentIndex);
|
||||
// And swap it with the current element.
|
||||
temporaryValue = entries[currentIndex];
|
||||
entries[currentIndex] = entries[randomIndex];
|
||||
entries[randomIndex] = temporaryValue;
|
||||
temporaryValue = playlistEntries[currentIndex];
|
||||
playlistEntries[currentIndex] = playlistEntries[randomIndex];
|
||||
playlistEntries[randomIndex] = temporaryValue;
|
||||
}
|
||||
DEBUG_PRINTLN(F("Playlist shuffle."));
|
||||
}
|
||||
|
||||
|
||||
void unloadPlaylist() {
|
||||
if (playlistEntries != nullptr) {
|
||||
delete[] playlistEntries;
|
||||
@ -41,8 +43,10 @@ void unloadPlaylist() {
|
||||
}
|
||||
currentPlaylist = playlistIndex = -1;
|
||||
playlistLen = playlistEntryDur = 0;
|
||||
DEBUG_PRINTLN(F("Playlist unloaded."));
|
||||
}
|
||||
|
||||
|
||||
void loadPlaylist(JsonObject playlistObj) {
|
||||
unloadPlaylist();
|
||||
|
||||
@ -50,49 +54,52 @@ void loadPlaylist(JsonObject playlistObj) {
|
||||
playlistLen = presets.size();
|
||||
if (playlistLen == 0) return;
|
||||
if (playlistLen > 100) playlistLen = 100;
|
||||
uint16_t dataSize = sizeof(ple) * playlistLen;
|
||||
playlistEntries = new byte[dataSize];
|
||||
PlaylistEntry* entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
|
||||
|
||||
playlistEntries = new PlaylistEntry[playlistLen];
|
||||
if (playlistEntries == nullptr) return;
|
||||
|
||||
byte it = 0;
|
||||
for (int ps : presets) {
|
||||
if (it >= playlistLen) break;
|
||||
entries[it].preset = ps;
|
||||
playlistEntries[it].preset = ps;
|
||||
it++;
|
||||
}
|
||||
|
||||
it = 0;
|
||||
JsonArray durations = playlistObj["dur"];
|
||||
if (durations.isNull()) {
|
||||
entries[0].dur = playlistObj["dur"] | 100;
|
||||
playlistEntries[0].dur = playlistObj["dur"] | 100;
|
||||
it = 1;
|
||||
} else {
|
||||
for (int dur : durations) {
|
||||
if (it >= playlistLen) break;
|
||||
entries[it].dur = dur;
|
||||
playlistEntries[it].dur = (dur > 0) ? dur : presetCycleTime;
|
||||
it++;
|
||||
}
|
||||
}
|
||||
for (int i = it; i < playlistLen; i++) entries[i].dur = entries[it -1].dur;
|
||||
for (int i = it; i < playlistLen; i++) playlistEntries[i].dur = playlistEntries[it -1].dur;
|
||||
|
||||
it = 0;
|
||||
JsonArray tr = playlistObj["transition"];
|
||||
JsonArray tr = playlistObj[F("transition")];
|
||||
if (tr.isNull()) {
|
||||
entries[0].tr = playlistObj["transition"] | (transitionDelay / 100);
|
||||
playlistEntries[0].tr = playlistObj[F("transition")] | (transitionDelay / 100);
|
||||
it = 1;
|
||||
} else {
|
||||
for (int transition : tr) {
|
||||
if (it >= playlistLen) break;
|
||||
entries[it].tr = transition;
|
||||
playlistEntries[it].tr = transition;
|
||||
it++;
|
||||
}
|
||||
}
|
||||
for (int i = it; i < playlistLen; i++) entries[i].tr = entries[it -1].tr;
|
||||
for (int i = it; i < playlistLen; i++) playlistEntries[i].tr = playlistEntries[it -1].tr;
|
||||
|
||||
playlistRepeat = playlistObj[F("repeat")] | 0;
|
||||
playlistEndPreset = playlistObj[F("end")] | 0;
|
||||
|
||||
if (playlistRepeat <= 0) playlistRepeat--; // make it endless (-2 == endless & random)
|
||||
|
||||
currentPlaylist = 0; //TODO here we need the preset ID where the playlist is saved
|
||||
DEBUG_PRINTLN(F("Playlist loaded."));
|
||||
}
|
||||
|
||||
|
||||
@ -112,20 +119,14 @@ void handlePlaylist() {
|
||||
}
|
||||
// playlist roll-over
|
||||
if (!playlistIndex) {
|
||||
if (playlistRepeat > 0) {// playlistRepeat < 0 => endless loop with shuffling presets
|
||||
playlistRepeat--; // decrease repeat count on each index reset
|
||||
} else {
|
||||
shufflePlaylist(); // shuffle playlist and start over
|
||||
// playlistRepeat < 0 => endless loop
|
||||
if (playlistRepeat > 0) playlistRepeat--; // decrease repeat count on each index reset if not an endless playlist
|
||||
if (playlistRepeat < -1) shufflePlaylist(); // shuffle playlist and start over
|
||||
}
|
||||
}
|
||||
|
||||
PlaylistEntry* entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
|
||||
|
||||
jsonTransitionOnce = true;
|
||||
transitionDelayTemp = entries[playlistIndex].tr * 100;
|
||||
|
||||
applyPreset(entries[playlistIndex].preset);
|
||||
playlistEntryDur = entries[playlistIndex].dur;
|
||||
if (playlistEntryDur == 0) playlistEntryDur = 10;
|
||||
transitionDelayTemp = playlistEntries[playlistIndex].tr * 100;
|
||||
playlistEntryDur = playlistEntries[playlistIndex].dur;
|
||||
applyPreset(playlistEntries[playlistIndex].preset);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user