fix(tvos): make EAC3 playback conform to Dolby's guidance
Groundwork for #1300. Establishes the session, buffering and route handling Dolby's application guide prescribes, and adds the diagnostic arm needed to find out whether Apple's sample-buffer renderer can carry Atmos objects at all. Audio session, per the guide's sequence: - Adopt the long-form playback profile in one atomic call at app launch and activate the session there. The SDK only accepts that policy with category Playback, a Default/MoviePlayback/SpokenAudio mode and no options, so it cannot be assembled from separate calls. - Report the resolved rendering mode in the player, hidden unless the system resolves it. Apple only resolves it for CarPlay and AirPlay, so an unresolved value means unknown, never "not Dolby". Diagnostics (Apple TV only, Settings > Video Playback > Atmos Output Test): - Add a sample-buffer arm. It reads the asset with AVAssetReader at outputSettings nil and hands the untouched compressed buffers and the untouched format description straight to the renderer, with a variant that rebuilds the description the way playback builds it. Every existing mode went through AVPlayer, so nothing exercised the path playback actually uses; this is what tells us whether the renderer or our construction is at fault. - Add an AirPlay route picker. AirPlay is the only route where the system resolves the rendering mode and the supported channel layouts, so it is what makes those observations reachable at all, and the AVPlayer arms now allow external playback so every arm can be compared on the same destination. - Add a session-mode toggle for the one profile difference between the guide and previous playback behaviour. - Report the session profile, supported layouts, both format descriptions, the magic cookie and the renderer status, and release the session on stop so a failed run cannot contaminate the next one. Also bumps MPVKit to 1.0.14, which carries the matching audio output work: the channel layout AVFoundation itself uses for Dolby content, a renderer-failure observer so the fallback to PCM can actually run, the prescribed feed ordering and preroll, flush recovery that re-supplies the discarded audio instead of shifting later audio into its place, and capability-driven fallback on route and capability changes. This does not yet fix #1300. Whether the sample-buffer renderer can carry JOC is still unknown; it removes every difference from the documented setup that could explain the failure, and gives us the arm to answer it on real hardware.
This commit is contained in:
@@ -418,6 +418,15 @@ class _Translations$settings$sv extends Translations$settings$en {
|
||||
@override String get atmosTestRawStreamDescription => 'Strömmar testfilen precis som Atmos-uppspelning i spelaren. Kräver testfilens URL.';
|
||||
@override String get atmosTestRawFile => 'Rå EAC3-fil';
|
||||
@override String get atmosTestRawFileDescription => 'Spelar upp testfilen med känd längd. Kräver testfilens URL.';
|
||||
@override String get atmosTestAsbarNative => 'Sample-buffer-renderare (nativ)';
|
||||
@override String get atmosTestAsbarNativeDescription => 'Skickar filens orörda komprimerade ljud direkt till systemets renderare. Kräver testfilens URL.';
|
||||
@override String get atmosTestAsbarGenerated => 'Sample-buffer-renderare (ombyggd)';
|
||||
@override String get atmosTestAsbarGeneratedDescription => 'Samma sak, men med ljudbeskrivningen byggd som vid uppspelning. Kräver testfilens URL.';
|
||||
@override String get atmosTestSessionMode => 'Använd filmuppspelningsläge';
|
||||
@override String get atmosTestSessionModeDescription => 'Av använder läget som Dolby dokumenterar. På använder det tidigare läget.';
|
||||
@override String get atmosTestShowRoutePicker => 'Välj AirPlay-utgång';
|
||||
@override String get atmosTestHideRoutePicker => 'Dölj AirPlay-utgångsväljare';
|
||||
@override String get atmosTestRoutePickerDescription => 'Skickar testet till en AirPlay-mottagare. Endast AirPlay rapporterar det valda ljudläget.';
|
||||
@override String get atmosTestStop => 'Stoppa test';
|
||||
@override String get atmosTestUrl => 'Testfilens URL';
|
||||
@override String get atmosTestUrlDescription => 'HTTP-URL till en rå .ec3 Dolby Atmos-fil (t.ex. extraherad med ffmpeg)';
|
||||
@@ -1514,6 +1523,11 @@ class _Translations$videoSettings$sv extends Translations$videoSettings$en {
|
||||
@override String get audioOutput => 'Ljudutgång';
|
||||
@override String get performanceOverlay => 'Prestandaöverlägg';
|
||||
@override String get audioPassthrough => 'Ljudgenomströmning';
|
||||
@override String get audioOutputDolbyAtmos => 'Dolby Atmos';
|
||||
@override String get audioOutputDolbyAudio => 'Dolby Audio';
|
||||
@override String get audioOutputSurround => 'Surround';
|
||||
@override String get audioOutputSpatial => 'Rumsligt ljud';
|
||||
@override String get audioOutputStereo => 'Stereo';
|
||||
@override String get audioNormalization => 'Normalisera ljudstyrka';
|
||||
@override String get audioDownmix => 'Nedmixning till stereo';
|
||||
}
|
||||
@@ -2463,6 +2477,15 @@ extension on TranslationsSv {
|
||||
'settings.atmosTestRawStreamDescription' => 'Strömmar testfilen precis som Atmos-uppspelning i spelaren. Kräver testfilens URL.',
|
||||
'settings.atmosTestRawFile' => 'Rå EAC3-fil',
|
||||
'settings.atmosTestRawFileDescription' => 'Spelar upp testfilen med känd längd. Kräver testfilens URL.',
|
||||
'settings.atmosTestAsbarNative' => 'Sample-buffer-renderare (nativ)',
|
||||
'settings.atmosTestAsbarNativeDescription' => 'Skickar filens orörda komprimerade ljud direkt till systemets renderare. Kräver testfilens URL.',
|
||||
'settings.atmosTestAsbarGenerated' => 'Sample-buffer-renderare (ombyggd)',
|
||||
'settings.atmosTestAsbarGeneratedDescription' => 'Samma sak, men med ljudbeskrivningen byggd som vid uppspelning. Kräver testfilens URL.',
|
||||
'settings.atmosTestSessionMode' => 'Använd filmuppspelningsläge',
|
||||
'settings.atmosTestSessionModeDescription' => 'Av använder läget som Dolby dokumenterar. På använder det tidigare läget.',
|
||||
'settings.atmosTestShowRoutePicker' => 'Välj AirPlay-utgång',
|
||||
'settings.atmosTestHideRoutePicker' => 'Dölj AirPlay-utgångsväljare',
|
||||
'settings.atmosTestRoutePickerDescription' => 'Skickar testet till en AirPlay-mottagare. Endast AirPlay rapporterar det valda ljudläget.',
|
||||
'settings.atmosTestStop' => 'Stoppa test',
|
||||
'settings.atmosTestUrl' => 'Testfilens URL',
|
||||
'settings.atmosTestUrlDescription' => 'HTTP-URL till en rå .ec3 Dolby Atmos-fil (t.ex. extraherad med ffmpeg)',
|
||||
@@ -2690,6 +2713,8 @@ extension on TranslationsSv {
|
||||
'videoControls.language' => 'Språk',
|
||||
'videoControls.noSubtitlesFound' => 'Inga undertexter hittades',
|
||||
'videoControls.noSubtitlesAvailable' => 'Inga undertexter tillgängliga',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'videoControls.noAudioTracksAvailable' => 'Inga ljudspår tillgängliga',
|
||||
'videoControls.noTracksAvailable' => 'Inga spår tillgängliga',
|
||||
'videoControls.subtitleDownloaded' => 'Undertexten har laddats ned',
|
||||
@@ -2699,8 +2724,6 @@ extension on TranslationsSv {
|
||||
'messages.markedAsWatched' => 'Markerad som sedd',
|
||||
'messages.markedAsUnwatched' => 'Markerad som osedd',
|
||||
'messages.markedAsWatchedOffline' => 'Markerad som sedd (synkroniseras när online)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'messages.markedAsUnwatchedOffline' => 'Markerad som osedd (synkroniseras när online)',
|
||||
'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatiskt borttagen: ${title}',
|
||||
'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: 'Tog automatiskt bort ${n} sedd nedladdning', other: 'Tog automatiskt bort ${n} sedda nedladdningar', ),
|
||||
@@ -3204,6 +3227,8 @@ extension on TranslationsSv {
|
||||
'watchTogether.codeMustBe5Chars' => 'Sessionskoden måste bestå av 5 tecken',
|
||||
'watchTogether.joinInstructions' => 'Ange värdens sessionskod för att gå med.',
|
||||
'watchTogether.failedToCreate' => 'Det gick inte att skapa sessionen',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'watchTogether.failedToJoin' => 'Det gick inte att gå med i sessionen',
|
||||
'watchTogether.sessionCodeCopied' => 'Sessionskoden har kopierats till urklipp',
|
||||
'watchTogether.relayUnreachable' => 'Reläservern kan inte nås. Din internetleverantör kan blockera Titta tillsammans.',
|
||||
@@ -3213,8 +3238,6 @@ extension on TranslationsSv {
|
||||
'watchTogether.joinCurrentPlaybackDescription' => 'Hoppa tillbaka till det värden tittar på just nu',
|
||||
'watchTogether.failedToOpenCurrentPlayback' => 'Kunde inte öppna aktuell uppspelning',
|
||||
'watchTogether.participantJoined' => ({required Object name}) => '${name} gick med',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'watchTogether.participantLeft' => ({required Object name}) => '${name} lämnade',
|
||||
'watchTogether.participantPaused' => ({required Object name}) => '${name} pausade',
|
||||
'watchTogether.participantResumed' => ({required Object name}) => '${name} återupptog',
|
||||
@@ -3413,6 +3436,11 @@ extension on TranslationsSv {
|
||||
'videoSettings.audioOutput' => 'Ljudutgång',
|
||||
'videoSettings.performanceOverlay' => 'Prestandaöverlägg',
|
||||
'videoSettings.audioPassthrough' => 'Ljudgenomströmning',
|
||||
'videoSettings.audioOutputDolbyAtmos' => 'Dolby Atmos',
|
||||
'videoSettings.audioOutputDolbyAudio' => 'Dolby Audio',
|
||||
'videoSettings.audioOutputSurround' => 'Surround',
|
||||
'videoSettings.audioOutputSpatial' => 'Rumsligt ljud',
|
||||
'videoSettings.audioOutputStereo' => 'Stereo',
|
||||
'videoSettings.audioNormalization' => 'Normalisera ljudstyrka',
|
||||
'videoSettings.audioDownmix' => 'Nedmixning till stereo',
|
||||
'performanceOverlay.color' => 'Färg',
|
||||
|
||||
Reference in New Issue
Block a user