Merge pull request #1724 from blazoncek/playlist-fix

Playlist handling.
This commit is contained in:
Aircoookie 2021-03-13 22:46:32 +01:00 committed by GitHub
commit ba4c3e3852
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 26 deletions

View File

@ -149,6 +149,7 @@ void _overlayCronixie();
void _drawOverlayCronixie(); void _drawOverlayCronixie();
//playlist.cpp //playlist.cpp
void unloadPlaylist();
void loadPlaylist(JsonObject playlistObject); void loadPlaylist(JsonObject playlistObject);
void handlePlaylist(); void handlePlaylist();

View File

@ -279,7 +279,8 @@ bool deserializeState(JsonObject root)
JsonObject playlist = root[F("playlist")]; JsonObject playlist = root[F("playlist")];
if (!playlist.isNull()) { if (!playlist.isNull()) {
loadPlaylist(playlist); return stateResponse; loadPlaylist(playlist);
noNotification = true; //do not notify both for this request and the first playlist entry
} }
colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE); colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE);

View File

@ -30,6 +30,7 @@ void toggleOnOff()
{ {
briLast = bri; briLast = bri;
bri = 0; bri = 0;
unloadPlaylist();
} }
} }

View File

@ -10,19 +10,42 @@ typedef struct PlaylistEntry {
uint16_t tr; uint16_t tr;
} ple; } ple;
byte playlistRepeat = 1; int8_t playlistRepeat = 1;
byte playlistEndPreset = 0; byte playlistEndPreset = 0;
byte *playlistEntries = nullptr;
uint8_t* playlistEntries; byte playlistLen;
int8_t playlistIndex = -1;
byte playlistLen;
int8_t playlistIndex = -1;
uint16_t playlistEntryDur = 0; uint16_t playlistEntryDur = 0;
void shufflePlaylist() {
int currentIndex = playlistLen, randomIndex;
PlaylistEntry temporaryValue, *entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
// While there remain elements to shuffle...
while (currentIndex--) {
// Pick a random element...
randomIndex = random(0, currentIndex);
// And swap it with the current element.
temporaryValue = entries[currentIndex];
entries[currentIndex] = entries[randomIndex];
entries[randomIndex] = temporaryValue;
}
}
void unloadPlaylist() {
if (playlistEntries != nullptr) {
delete[] playlistEntries;
playlistEntries = nullptr;
}
currentPlaylist = playlistIndex = -1;
playlistLen = playlistEntryDur = 0;
}
void loadPlaylist(JsonObject playlistObj) { void loadPlaylist(JsonObject playlistObj) {
delete playlistEntries; unloadPlaylist();
playlistIndex = -1; playlistEntryDur = 0;
JsonArray presets = playlistObj["ps"]; JsonArray presets = playlistObj["ps"];
playlistLen = presets.size(); playlistLen = presets.size();
if (playlistLen == 0) return; if (playlistLen == 0) return;
@ -72,26 +95,28 @@ void loadPlaylist(JsonObject playlistObj) {
currentPlaylist = 0; //TODO here we need the preset ID where the playlist is saved currentPlaylist = 0; //TODO here we need the preset ID where the playlist is saved
} }
void handlePlaylist()
{ void handlePlaylist() {
if (currentPlaylist < 0 || playlistEntries == nullptr || presetCyclingEnabled) return; if (currentPlaylist < 0 || playlistEntries == nullptr || presetCyclingEnabled) return;
if (millis() - presetCycledTime > (100*playlistEntryDur)) if (millis() - presetCycledTime > (100*playlistEntryDur)) {
{
presetCycledTime = millis(); presetCycledTime = millis();
if (bri == 0 || nightlightActive) return; if (bri == 0 || nightlightActive) return;
playlistIndex++; ++playlistIndex %= playlistLen; // -1 at 1st run (limit to playlistLen)
if (playlistIndex >= playlistLen) {
playlistIndex = 0; if (!playlistRepeat && !playlistIndex) { //stop if repeat == 0 and restart of playlist
if (playlistRepeat == 1) { //stop unloadPlaylist();
currentPlaylist = -1; if (playlistEndPreset) applyPreset(playlistEndPreset);
delete playlistEntries; return;
playlistEntries = nullptr; }
if (playlistEndPreset) applyPreset(playlistEndPreset); // playlist roll-over
return; 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
} }
if (playlistRepeat > 1) playlistRepeat--;
} }
PlaylistEntry* entries = reinterpret_cast<PlaylistEntry*>(playlistEntries); PlaylistEntry* entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
@ -103,4 +128,4 @@ void handlePlaylist()
playlistEntryDur = entries[playlistIndex].dur; playlistEntryDur = entries[playlistIndex].dur;
if (playlistEntryDur == 0) playlistEntryDur = 10; if (playlistEntryDur == 0) playlistEntryDur = 10;
} }
} }