Der Decider rechnet nur um, wenn die Datei die Grenze überschreitet. Für den Normalfall ist das richtig — für eine ausdrückliche Wahl im Player nicht: wer für eine 8-Mbit-Datei „12 Mbit" wählt, bekam DirectPlay, weil die Datei ja darunter liegt. Gemeint ist aber „rechne es mir auf diese Stufe um", nicht „gib mir die Datei, falls sie so vorliegt". Die Richtlinie kann eine Umrechnung jetzt erzwingen, und die Wahl im Player tut das. Dazu verschluckte `select(quality:)` den eigentlichen Grund: lehnte der Server ab und sagte im Klartext warum, wurde diese Meldung danach durch das allgemeine „keine abspielbare Datei" ersetzt — der eine brauchbare Hinweis war damit weg. Jetzt bleibt stehen, was der Server gesagt hat. Und das Menü war zu viel. Vorn steht die kurze Liste — automatisch, Original, je eine brauchbare Stufe pro Auflösung, nur Ton. Wer eine bestimmte Bitrate erzwingen muss, klappt „Alle Stufen" auf; im Alltag will man „eine Stufe kleiner" und nicht die Wahl zwischen zehn und zwölf Megabit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
1.6 KiB
Swift
40 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
/// Was bei der Wiedergabe erlaubt ist.
|
|
///
|
|
/// Das ist die Stellschraube, an der Phase 2 andockt: heute steht
|
|
/// `allowsTranscoding` auf `false` und der Decider kommt zwangsläufig immer
|
|
/// bei DirectPlay heraus. Sobald der Transcoder steht, wird hier umgelegt —
|
|
/// die Views merken davon nichts.
|
|
public struct PlaybackPolicy: Sendable, Equatable {
|
|
/// Darf der Server umrechnen?
|
|
public var allowsTranscoding: Bool
|
|
/// Darf VLCKit einspringen?
|
|
public var allowsFallbackEngine: Bool
|
|
/// Obergrenze in Kilobit pro Sekunde. `nil` heißt unbegrenzt — der
|
|
/// Normalfall im heimischen WLAN.
|
|
public var maximumBitrate: Int?
|
|
/// Umrechnen, auch wenn die Datei die Grenze gar nicht überschreitet.
|
|
///
|
|
/// Für die Wahl im Player. Ohne das verpuffte sie: wer für eine
|
|
/// 8-Mbit-Datei „12 Mbit" wählt, bekam DirectPlay, weil die Datei ja
|
|
/// unter der Grenze liegt — die Wahl blieb folgenlos. Gemeint ist aber
|
|
/// „rechne es mir auf diese Stufe um".
|
|
public var forcesTranscoding: Bool
|
|
|
|
public init(
|
|
allowsTranscoding: Bool,
|
|
allowsFallbackEngine: Bool = true,
|
|
maximumBitrate: Int? = nil,
|
|
forcesTranscoding: Bool = false
|
|
) {
|
|
self.allowsTranscoding = allowsTranscoding
|
|
self.allowsFallbackEngine = allowsFallbackEngine
|
|
self.maximumBitrate = maximumBitrate
|
|
self.forcesTranscoding = forcesTranscoding
|
|
}
|
|
|
|
/// Phase 1: alles direkt, nichts umrechnen.
|
|
public static let directPlayOnly = PlaybackPolicy(allowsTranscoding: false)
|
|
}
|