Na das mach ich doch gerne:
angefasste Dateien: src/main.h, src/main.cpp, src/AudioPlayer.cpp, src/Wlan.cpp,
src/logmessages.h, src/LogMessages_EN.cpp, src/LogMessages_DE.cpp,
src/LogMessages_FR.cpp
- Neue Variable
gRetryRfidOnWifiConnect hinzugefügt. Wird ein
Webstream-/m3u-Webstream-Verbindungsversuch übersprungen, weil das WLAN noch nicht
verbunden ist (AudioPlayer.cpp, innerhalb von AudioPlayer_Loop()), wird
stattdessen dieses Flag gesetzt, statt einfach nur zu scheitern.
- Im WLAN-Verbunden-Handler (
Wlan.cpp, Pfad nach erfolgreicher Verbindung) wird,
falls dieses Flag gesetzt ist, das RFID-Tag, das ursprünglich die gescheiterte
Playlist ausgelöst hat (gPlayProperties.playRfidTag), automatisch erneut in die
RFID-Warteschlange eingereiht – unter Wiederverwendung desselben Mechanismus, der
bereits an anderer Stelle zum Fortsetzen der Wiedergabe nach einer
Sprachausgabe-Unterbrechung genutzt wird. Dies funktioniert unabhängig von der
Einstellung „letzte RFID nach Neustart abspielen“ und gilt somit für jedes Tag,
nicht nur für eine automatisch fortgesetzte Sitzung.
- Der
WEBSTREAM-Fall in AudioPlayer_SetPlaylist() scheitert nicht mehr sofort,
wenn das WLAN noch nicht verbunden ist; er durchläuft jetzt denselben
Dispatch-/Retry-Pfad wie LOCAL_M3U, sodass auch reine Webstream-Tags (nicht nur
m3u-Playlists) davon profitieren.
- Die Sperrlogik von
DONT_ACCEPT_SAME_RFID_TWICE wurde korrigiert: Sie wird jetzt
bereits scharf geschaltet, sobald eine neue Playlist akzeptiert wird
(AudioPlayer_ResetOldRfidOnIdle, gesetzt an der Stelle, an der
newPlayListAvailable verarbeitet wird), statt nur durch eine spätere
Loop-Iteration scharf geschaltet zu werden, die einen „aktiv“-Zustand beobachtet –
einen Zustand, den eine Playlist, die bereits beim ersten Titel scheitert, nie
erreicht.
- Eine neue übersetzte Log-Meldung (
retryingRfidAfterWifiConnected) hinzugefügt,
die beim automatischen erneuten Versuch protokolliert wird, in Englisch, Deutsch
und Französisch.
Das Ergebnis:
Ein beim Booten aufgelegtes Tag, das auf einen Webstream verweist (direkt oder via
m3u), wird jetzt automatisch erneut versucht, sobald das WLAN tatsächlich verbunden
ist – ohne dass ein erneutes Auflegen nötig ist. Und das funktioniert unabhängig von
DONT_ACCEPT_SAME_RFID_TWICE, da sich die „Gleiches-Tag“-Sperre nun korrekt
zurücksetzt, sobald der gescheiterte Versuch in den Leerlauf geht.
Änderungen im Detail:
main.cpp: hinzufügen der globalen Variable gRetryRfidOnWifiConnect
voher:
bool gPlayLastRfIdWhenWiFiConnected = false;
bool gTriedToConnectToHost = false;
nachher:
bool gPlayLastRfIdWhenWiFiConnected = false;
bool gTriedToConnectToHost = false;
bool gRetryRfidOnWifiConnect = false;
Main.h
extern bool gRetryRfidOnWifiConnect;
audioplayer.cpp (95) hinzufügen der statischen Variable AudioPlayer_ResetOldRfidOnIdle
vorher:
static bool AudioPlayer_UploadActive = false;
static bool AudioPlayer_WasPausedBeforeUpload = false; // remember pre-upload pause state
nachher:
static bool AudioPlayer_UploadActive = false;
static bool AudioPlayer_WasPausedBeforeUpload = false; // remember pre-upload pause state
// Armed as soon as a new playlist is accepted; consumed once playback goes idle again, at which
// point gOldRfidTagId is reset (dontAcceptRfidTwice). Armed here (rather than only when the loop
// observes an "active" iteration) because playlists that fail on their very first track (e.g. a
// webstream attempted before WiFi is up) never have such an iteration - every early-return would
// otherwise leave gOldRfidTagId stuck forever.
static bool AudioPlayer_ResetOldRfidOnIdle = false;
audioplayer.cpp(633) AudioPlayer_ResetOldRfidOnIdle scharf schalten
vorher:
if (newPlayListAvailable || gPlayProperties.trackFinished || trackCommand != NO_ACTION) {
if (newPlayListAvailable) {
newPlayListAvailable = false;
audio->stopSong();
// destroy the old playlist and assign the new one
freePlaylist(gPlayProperties.playlist);
gPlayProperties.playlist = newPlayList;
Log_Printf(LOGLEVEL_NOTICE, newPlaylistReceived, gPlayProperties.playlist->size());
Log_Printf(LOGLEVEL_DEBUG, "Free heap: %u", ESP.getFreeHeap());
playbackTimeoutStart = millis();
gPlayProperties.pausePlay = false;
gPlayProperties.trackFinished = false;
gPlayProperties.playlistFinished = false;
nachher:
if (newPlayListAvailable || gPlayProperties.trackFinished || trackCommand != NO_ACTION) {
if (newPlayListAvailable) {
newPlayListAvailable = false;
audio->stopSong();
// destroy the old playlist and assign the new one
freePlaylist(gPlayProperties.playlist);
gPlayProperties.playlist = newPlayList;
Log_Printf(LOGLEVEL_NOTICE, newPlaylistReceived, gPlayProperties.playlist->size());
Log_Printf(LOGLEVEL_DEBUG, "Free heap: %u", ESP.getFreeHeap());
playbackTimeoutStart = millis();
gPlayProperties.pausePlay = false;
gPlayProperties.trackFinished = false;
gPlayProperties.playlistFinished = false;
AudioPlayer_ResetOldRfidOnIdle = true; // Make sure gOldRfidTagId gets reset once this playlist goes idle, even if it never gets past a failed first track
audioplayer.cpp (984) gRetryRfidOnWifiConnect scharf schalten
vorher:
if (gPlayProperties.playMode == WEBSTREAM || (gPlayProperties.playMode == LOCAL_M3U && gPlayProperties.isWebstream)) { // Webstream
audioReturnCode = audio->connecttohost(gPlayProperties.playlist->at(gPlayProperties.currentTrackNumber));
nachher:
if (gPlayProperties.playMode == WEBSTREAM || (gPlayProperties.playMode == LOCAL_M3U && gPlayProperties.isWebstream)) { // Webstream
if (Wlan_IsConnected()) {
audioReturnCode = audio->connecttohost(gPlayProperties.playlist->at(gPlayProperties.currentTrackNumber));
} else {
// WiFi not up yet (e.g. right after boot): don't bother trying to connect, remember to
// retry this RFID-tag automatically once WiFi becomes available (see handleWifiStateConnected())
Log_Println(webstreamNotAvailable, LOGLEVEL_ERROR);
gRetryRfidOnWifiConnect = true;
audioReturnCode = false;
}
audioplayer.cpp (1130) audio->isRunning() nicht mehrfach aufrufen
vorher:
if (audio->isRunning()) {
playbackTimeoutStart = millis();
}
// If error occured: move to the next track in the playlist
const bool activeMode = (gPlayProperties.playMode != NO_PLAYLIST && gPlayProperties.playMode != BUSY);
const bool noAudio = (!audio->isRunning() && !gPlayProperties.pausePlay);
nachher:
const bool audioIsRunning = audio->isRunning();
if (audioIsRunning) {
playbackTimeoutStart = millis();
}
// If error occured: move to the next track in the playlist
const bool activeMode = (gPlayProperties.playMode != NO_PLAYLIST && gPlayProperties.playMode != BUSY);
const bool noAudio = (!audioIsRunning && !gPlayProperties.pausePlay);
audioplayer.cpp (1151 ) Umstellung resetOnNextIdle auf AudioPlayer_ResetOldRfidOnIdle
vorher:
if (gPlayProperties.dontAcceptRfidTwice) {
static uint8_t resetOnNextIdle = false;
if (gPlayProperties.playlistFinished || gPlayProperties.playMode == NO_PLAYLIST) {
if (resetOnNextIdle) {
Rfid_ResetOldRfid();
resetOnNextIdle = false;
}
} else {
resetOnNextIdle = true;
}
}
nachher:
if (gPlayProperties.dontAcceptRfidTwice) {
if (gPlayProperties.playlistFinished || gPlayProperties.playMode == NO_PLAYLIST) {
if (AudioPlayer_ResetOldRfidOnIdle) {
Rfid_ResetOldRfid();
AudioPlayer_ResetOldRfidOnIdle = false;
}
} else {
AudioPlayer_ResetOldRfidOnIdle = true;
}
}
audioplayer.cpp (1398) playmode schleife nicht verlassen wenn WiFi noch nicht da ist.
vorher:
case WEBSTREAM: { // This is always just one "track"
Log_Println(modeWebstream, LOGLEVEL_NOTICE);
if (!Wlan_IsConnected()) {
Log_Println(webstreamNotAvailable, LOGLEVEL_ERROR);
error = true;
}
break;
}
nachher:
case WEBSTREAM: { // This is always just one "track"
Log_Println(modeWebstream, LOGLEVEL_NOTICE);
// Don't bail out here if WiFi isn't connected yet (e.g. right after boot): the
// dispatch in AudioPlayer_Loop() will retry automatically once WiFi comes up.
break;
}
Wlan.cpp (9) Queues.h hinzufügen
#include "Queues.h"
Wlan.cpp (507) Rerty für Webstreams anstossen wenn Wlan verfügbar
vorher:
if (playLastRfidAfterReboot && gPlayLastRfIdWhenWiFiConnected && gTriedToConnectToHost) {
gPlayLastRfIdWhenWiFiConnected = false;
recoverLastRfidPlayedFromNvs(true);
}
nachher:
if (playLastRfidAfterReboot && gPlayLastRfIdWhenWiFiConnected && gTriedToConnectToHost) {
gPlayLastRfIdWhenWiFiConnected = false;
recoverLastRfidPlayedFromNvs(true);
}
// A webstream/m3u-webstream RFID-tag (e.g. applied right at boot) couldn't be started
// because WiFi wasn't connected yet. Now that it is, retry it regardless of playLastRfidAfterReboot.
if (gRetryRfidOnWifiConnect) {
gRetryRfidOnWifiConnect = false;
if (strlen(gPlayProperties.playRfidTag) > 0) {
Log_Printf(LOGLEVEL_NOTICE, retryingRfidAfterWifiConnected, gPlayProperties.playRfidTag);
xQueueSend(gRfidCardQueue, gPlayProperties.playRfidTag, 0);
}
}
LogMessagees_DE.cpp: Zusätzliche Infomeldung hinzufügen gleiches in EN und FR
const char retryingRfidAfterWifiConnected[] = "RFID-Tag %s wird erneut versucht, da WLAN nun verbunden ist";
Logmessages.h
extern const char retryingRfidAfterWifiConnected[];