Eine Quelle, zwei Arten -- Sender und Titel gehen denselben Weg

Der ganze Unterschied ist einer: ein Sender endet nie, ein Titel schon.
Also verzweigt genau eine Abspielfunktion und genau ein Idle-Melder nach
der Art der Quelle, statt dass ein zweiter Pfad daneben entsteht -- zwei
Pfade, die dasselbe tun sollen, driften auseinander.

Beim Sender heisst Idle "die Leitung ist weg" (neu aufbauen), bei YouTube
"fertig, der naechste bitte". Danach: Warteschlange, sonst der Sender von
vorher, sonst raus. Das Radio ist die Grundstellung, YouTube die
Unterbrechung.

Bremse gegen das Durchrutschen: ein Eintrag ohne Ton geht sofort wieder
auf Idle. Ohne Zaehlung waere eine Liste mit einem kaputten Eintrag in
Sekundenbruchteilen leer, und niemand haette gesehen warum. Nach drei
Fehlschlaegen in Folge wird angehalten und der Grund gemeldet. Von Hand
Uebersprungenes zaehlt nicht mit.

Zwei Fehler nebenbei, beide vorher schon da:

Der Idle-Melder hielt `kanal` aus dem Abschluss des ERSTEN Aufrufs fest.
Nach einem Kanalwechsel haette der Wiederanlauf in den alten Kanal
gespielt. Er liest den Kanal jetzt frisch aus `laufend`.

`radioLautstaerke()` gab bei unbelegter Einstellung 10 zurueck statt der
50, die der Kommentar zwei Zeilen darueber als Vorgabe begruendet:
`Number(null)` ist 0 und damit endlich, die Pruefung auf "nicht endlich"
hat den unbelegten Fall nie erwischt und auf die Untergrenze geklemmt.
Eine frische Installation startete also sehr leise. Gemessen gegen eine
leere Datenbank, mit Gegenproben fuer leeren String, Unsinn, 0 und 999.
This commit is contained in:
2026-08-28 13:33:42 +02:00
parent af16bc1b18
commit 409b28e9e0
3 changed files with 341 additions and 47 deletions
+12 -3
View File
@@ -380,9 +380,18 @@ export const LAUT_SCHRITT = 10;
export const LAUT_VORGABE = 50;
export function radioLautstaerke() {
const roh = Number(getSetting('radio_lautstaerke'));
if (!Number.isFinite(roh)) return LAUT_VORGABE;
return Math.min(LAUT_MAX, Math.max(LAUT_MIN, Math.round(roh)));
const roh = getSetting('radio_lautstaerke');
// Der unbelegte Fall muss VOR der Umwandlung abgefangen werden.
//
// `Number(null)` ist 0, und 0 ist endlich — die Prüfung unten hat „noch
// nie eingestellt" deshalb nie erwischt, sondern auf LAUT_MIN geklemmt.
// Ergebnis: eine frische Installation startete mit 10 % statt mit den 50,
// die zwei Zeilen weiter oben als Vorgabe begründet werden. Gemessen am
// 28.08.2026 gegen eine leere Datenbank.
if (roh === null || roh === undefined || roh === '') return LAUT_VORGABE;
const wert = Number(roh);
if (!Number.isFinite(wert)) return LAUT_VORGABE;
return Math.min(LAUT_MAX, Math.max(LAUT_MIN, Math.round(wert)));
}
/**