Der Vorrat steigt jetzt auch eine Ebene tiefer
Bei „Auto\" bestellen wir eine Liste von Stufen; die Schnipsel stehen eine Ebene darunter. Der Speicher erkannte das zwar, stieg dann aber aus und reichte die Liste mit relativen Adressen durch — die zeigten danach auf den lokalen Server, wo es sie nicht gibt. Es wurde nichts vorgeholt, und beinahe waere auch nichts mehr gelaufen. Jetzt wird auch die Stufenliste umgeschrieben. Holt der Player eine Stufe, kommt er wieder bei uns an, und dort beginnt das Vorauslaufen — bei der Stufe, fuer die er sich entschieden hat. Dazu eine Zeile im Qualitaetsblatt, die sagt, ob der Vorrat laeuft und wie weit er voraus ist. Von aussen ist das nicht zu sehen: laeuft er nicht, spielt es trotzdem, nur ohne Vorsprung — und genau so sieht auch ein Vorrat aus, der laeuft und nichts bekommt. Ohne diese Zeile sind die beiden Faelle nicht zu unterscheiden, und ich haette wieder geraten. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
134dc82927
commit
bbd1c3b572
@@ -109,6 +109,15 @@ final class PlayerModel {
|
||||
/// und ausgerechnet da will man zusehen, wie der Vorrat wächst.
|
||||
private(set) var bufferedUntil: Duration?
|
||||
|
||||
/// Was der eigene Vorratsspeicher gerade tut — in einem Satz.
|
||||
///
|
||||
/// **Damit man es ablesen kann statt zu raten.** Ob ein Speicher
|
||||
/// dazwischensteht, ist von aussen nicht zu sehen: läuft er nicht, spielt
|
||||
/// es trotzdem, nur eben ohne Vorsprung. Genau so sieht aber auch ein
|
||||
/// Speicher aus, der läuft und nichts bekommt. Ohne diese Zeile sind die
|
||||
/// beiden Fälle nicht zu unterscheiden.
|
||||
private(set) var prefetchStatus: String?
|
||||
|
||||
/// Die Höhe der Quelldatei — danach richtet sich, welche Stufen überhaupt
|
||||
/// Sinn ergeben. Eine 720p-Datei auf 1080p „hochzurechnen" bringt kein
|
||||
/// Bild dazu.
|
||||
@@ -807,9 +816,12 @@ final class PlayerModel {
|
||||
let lokal = try await server.start(upstream: url)
|
||||
streamServer = server
|
||||
streamCache = speicher
|
||||
prefetchStatus = String(localized: "quality.prefetch.starting")
|
||||
diagnostics.note("Vorrat läuft voraus")
|
||||
return lokal
|
||||
} catch {
|
||||
streamCache = nil
|
||||
prefetchStatus = String(localized: "quality.prefetch.off")
|
||||
diagnostics.note("Vorrat nicht gestartet: \(error.localizedDescription)")
|
||||
return nil
|
||||
}
|
||||
@@ -824,7 +836,11 @@ final class PlayerModel {
|
||||
// der Platte. Ohne Speicher bleibt die Auskunft des Players.
|
||||
let vorrat: Duration?
|
||||
if let cache = self.streamCache {
|
||||
vorrat = await cache.bufferedAhead
|
||||
let eigener = await cache.bufferedAhead
|
||||
vorrat = eigener
|
||||
self.prefetchStatus = String(
|
||||
localized: "quality.prefetch.ahead \(Int(eigener.seconds))"
|
||||
)
|
||||
} else {
|
||||
vorrat = self.engine?.statistics?.bufferedAhead
|
||||
}
|
||||
@@ -1308,6 +1324,7 @@ final class PlayerModel {
|
||||
if let streamServer { Task { await streamServer.stop() } }
|
||||
streamServer = nil
|
||||
streamCache = nil
|
||||
prefetchStatus = nil
|
||||
pictureInPicture = nil
|
||||
pictureInPictureDelegate = nil
|
||||
surface.playerLayer.player = nil
|
||||
|
||||
@@ -87,6 +87,14 @@ struct QualitySheet: View {
|
||||
LabeledContent("quality.current.dropped", value: "\(dropped)")
|
||||
}
|
||||
|
||||
// **Ob der eigene Vorrat läuft, und wie weit.** Von aussen ist
|
||||
// das nicht zu sehen: läuft er nicht, spielt es trotzdem, nur
|
||||
// ohne Vorsprung — und genau so sieht auch ein Vorrat aus, der
|
||||
// läuft und nichts bekommt.
|
||||
if let vorrat = model.prefetchStatus {
|
||||
LabeledContent("quality.current.prefetch", value: vorrat)
|
||||
}
|
||||
|
||||
// **Die Zahl, die alles entscheidet.** Eine Playlist mit
|
||||
// einer Stufe hat nichts zum Umschalten — dann greift jedes
|
||||
// Nachregeln ins Leere, ganz gleich was bestellt wurde.
|
||||
|
||||
Reference in New Issue
Block a user