1616package androidx .media3 .exoplayer .trackselection ;
1717
1818import static android .os .Build .VERSION .SDK_INT ;
19+ import static androidx .media3 .common .C .ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND ;
20+ import static androidx .media3 .common .C .ROLE_FLAG_DESCRIBES_VIDEO ;
1921import static androidx .media3 .common .TrackSelectionParameters .AudioOffloadPreferences .AUDIO_OFFLOAD_MODE_DISABLED ;
2022import static androidx .media3 .common .TrackSelectionParameters .AudioOffloadPreferences .AUDIO_OFFLOAD_MODE_REQUIRED ;
2123import static androidx .media3 .common .util .Assertions .checkNotNull ;
3436import android .media .AudioFormat ;
3537import android .media .AudioManager ;
3638import android .media .Spatializer ;
39+ import android .os .Build ;
3740import android .os .Bundle ;
3841import android .os .Handler ;
3942import android .os .Looper ;
4043import android .text .TextUtils ;
4144import android .util .Pair ;
4245import android .util .SparseArray ;
4346import android .util .SparseBooleanArray ;
47+ import android .view .accessibility .AccessibilityManager ;
4448import android .view .accessibility .CaptioningManager ;
4549import androidx .annotation .GuardedBy ;
4650import androidx .annotation .IntDef ;
@@ -410,6 +414,14 @@ public ParametersBuilder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAu
410414 return this ;
411415 }
412416
417+ @ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
418+ @ CanIgnoreReturnValue
419+ @ Override
420+ public ParametersBuilder setPreferredAudioRoleFlagsFromAccessibilityManager () {
421+ delegate .setPreferredAudioRoleFlagsFromAccessibilityManager ();
422+ return this ;
423+ }
424+
413425 @ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
414426 @ CanIgnoreReturnValue
415427 @ Override
@@ -1264,6 +1276,13 @@ public Builder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAudioRoleFla
12641276 return this ;
12651277 }
12661278
1279+ @ CanIgnoreReturnValue
1280+ @ Override
1281+ public Builder setPreferredAudioRoleFlagsFromAccessibilityManager () {
1282+ super .setPreferredAudioRoleFlagsFromAccessibilityManager ();
1283+ return this ;
1284+ }
1285+
12671286 @ CanIgnoreReturnValue
12681287 @ Override
12691288 public Builder setPreferredAudioLabels (String ... preferredAudioLabels ) {
@@ -2910,7 +2929,13 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
29102929 break ;
29112930 }
29122931 }
2932+
2933+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager = 0 ;
2934+ if (SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
2935+ preferredRoleFlagFromAccessibilityManager = getPreferredRoleFlagFromAccessibilityManager (context );
2936+ }
29132937 boolean hasVideoRendererWithMappedTracksFinal = hasVideoRendererWithMappedTracks ;
2938+ @ RoleFlags int preferredRoleFlagFromAccessibilityManagerFinal = preferredRoleFlagFromAccessibilityManager ;
29142939 return selectTracksForType (
29152940 C .TRACK_TYPE_AUDIO ,
29162941 mappedTrackInfo ,
@@ -2923,7 +2948,8 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
29232948 support ,
29242949 hasVideoRendererWithMappedTracksFinal ,
29252950 format -> isAudioFormatWithinAudioChannelCountConstraints (format , params ),
2926- rendererMixedMimeTypeAdaptationSupports [rendererIndex ]),
2951+ rendererMixedMimeTypeAdaptationSupports [rendererIndex ],
2952+ preferredRoleFlagFromAccessibilityManagerFinal ),
29272953 AudioTrackInfo ::compareSelections );
29282954 }
29292955
@@ -3601,6 +3627,21 @@ private static String getPreferredLanguageFromCaptioningManager(@Nullable Contex
36013627 return Util .getLocaleLanguageTag (preferredLocale );
36023628 }
36033629
3630+ @ RequiresApi (api = Build .VERSION_CODES .TIRAMISU )
3631+ private static @ RoleFlags int getPreferredRoleFlagFromAccessibilityManager (
3632+ @ Nullable Context context ) {
3633+ if (context == null ) {
3634+ return 0 ;
3635+ }
3636+ AccessibilityManager accessibilityManager = (AccessibilityManager ) context .getSystemService (
3637+ Context .ACCESSIBILITY_SERVICE );
3638+ if (accessibilityManager != null ) {
3639+ return accessibilityManager .isAudioDescriptionRequested () ? ROLE_FLAG_DESCRIBES_VIDEO
3640+ | ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND : 0 ;
3641+ }
3642+ return 0 ;
3643+ }
3644+
36043645 /** Base class for track selection information of a {@link Format}. */
36053646 private abstract static class TrackInfo <T extends TrackInfo <T >> {
36063647 /** Factory for {@link TrackInfo} implementations for a given {@link TrackGroup}. */
@@ -3910,7 +3951,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
39103951 @ Capabilities int [] formatSupport ,
39113952 boolean hasMappedVideoTracks ,
39123953 Predicate <Format > withinAudioChannelCountConstraints ,
3913- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
3954+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
3955+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
39143956 ImmutableList .Builder <AudioTrackInfo > listBuilder = ImmutableList .builder ();
39153957 for (int i = 0 ; i < trackGroup .length ; i ++) {
39163958 listBuilder .add (
@@ -3922,7 +3964,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
39223964 formatSupport [i ],
39233965 hasMappedVideoTracks ,
39243966 withinAudioChannelCountConstraints ,
3925- mixedMimeTypeAdaptationSupport ));
3967+ mixedMimeTypeAdaptationSupport ,
3968+ preferredRoleFlagFromAccessibilityManager ));
39263969 }
39273970 return listBuilder .build ();
39283971 }
@@ -3957,7 +4000,8 @@ public AudioTrackInfo(
39574000 @ Capabilities int formatSupport ,
39584001 boolean hasMappedVideoTracks ,
39594002 Predicate <Format > withinAudioChannelCountConstraints ,
3960- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
4003+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
4004+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
39614005 super (rendererIndex , trackGroup , trackIndex );
39624006 this .parameters = parameters ;
39634007 @ SuppressLint ("WrongConstant" )
@@ -3988,8 +4032,10 @@ public AudioTrackInfo(
39884032 }
39894033 preferredLanguageIndex = bestLanguageIndex ;
39904034 preferredLanguageScore = bestLanguageScore ;
3991- preferredRoleFlagsScore =
3992- getRoleFlagMatchScore (format .roleFlags , parameters .preferredAudioRoleFlags );
4035+ @ RoleFlags int preferredAudioRoleFlags =
4036+ preferredRoleFlagFromAccessibilityManager == 0 ? parameters .preferredAudioRoleFlags
4037+ : preferredRoleFlagFromAccessibilityManager ;
4038+ preferredRoleFlagsScore = getRoleFlagMatchScore (format .roleFlags , preferredAudioRoleFlags );
39934039 preferredLabelMatchIndex = getBestLabelMatchIndex (format , parameters .preferredAudioLabels );
39944040 hasMainOrNoRoleFlag = format .roleFlags == 0 || (format .roleFlags & C .ROLE_FLAG_MAIN ) != 0 ;
39954041 isDefaultSelectionFlag = (format .selectionFlags & C .SELECTION_FLAG_DEFAULT ) != 0 ;
0 commit comments