Wiedergabe: der alte Motor lief weiter, während der neue startete
Der Ton, der nach dem Schließen der App weiterlief, und die neue Wiedergabe, die stumm blieb, sind derselbe Fehler — und er ist meiner. `stop()` machte drei Netzwerkaufrufe, bevor es den Motor abschaltete: Fortschritt melden, Transcoder anhalten, Tuner freigeben. Beim Wechsel habe ich das in den Hintergrund gelegt, damit man nach dem Antippen nicht wartet. Damit lief der alte Motor die ganze Zeit weiter, und wenn er endlich abräumte, nahm er der bereits laufenden neuen Wiedergabe die Audiositzung weg. Bei Live-TV kam dazu, dass der Motor weiterspielte, während die App längst im Hintergrund war — Hintergrundton ist erlaubt, und niemand hatte ihn abgeschaltet. Jetzt ist beides getrennt. `silence()` legt den Motor sofort still, ohne Netzwerk und ohne Warten; `releaseOnServer()` meldet danach in Ruhe, dass Schluss ist. Beim Wechsel wird zuerst stillgelegt, dann gebaut — nie laufen zwei Motoren gleichzeitig. Dazu eine Grenze für ewiges Laden: ein Live-Strom kann sterben, ohne dass der Motor es merkt, und der Kreisel drehte sich dann bis zum nächsten Antippen. Nach vierzig Sekunden ohne Daten wird abgebrochen, der Motor stillgelegt und gesagt, was los ist — sonst bliebe bei Live-TV obendrein der Tuner belegt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c348ab0755
commit
c2ddc10871
@@ -107,13 +107,17 @@ struct RootView: View {
|
||||
/// Preis; der Sender, auf den umgeschaltet wird, ist ohnehin schon
|
||||
/// abgestimmt, bevor es hier ankommt.
|
||||
private func handOver(to request: PlaybackRequest?) async {
|
||||
// Zuerst und ohne Warten: den alten Motor stilllegen. Das Aufräumen am
|
||||
// Server darf dauern, das Abschalten nicht — läuft der alte Motor
|
||||
// weiter, während der neue startet, streiten sich zwei um dieselbe
|
||||
// Audiositzung. Zu hören war das als alter Ton, der weiterlief, und
|
||||
// als neue Wiedergabe, die stumm blieb.
|
||||
let previous = player
|
||||
previous?.silence()
|
||||
player = nil
|
||||
if let previous { Task { await previous.releaseOnServer() } }
|
||||
|
||||
guard let request else {
|
||||
player = nil
|
||||
if let previous { await previous.stop() }
|
||||
return
|
||||
}
|
||||
guard let request else { return }
|
||||
|
||||
let fresh = PlayerModel(
|
||||
request: request,
|
||||
@@ -129,7 +133,6 @@ struct RootView: View {
|
||||
fresh.onPictureInPictureRestore { playback.expand() }
|
||||
|
||||
player = fresh
|
||||
if let previous { Task { await previous.stop() } }
|
||||
await fresh.start()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user