16
16
package androidx .media3 .exoplayer .trackselection ;
17
17
18
18
import 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 ;
19
21
import static androidx .media3 .common .TrackSelectionParameters .AudioOffloadPreferences .AUDIO_OFFLOAD_MODE_DISABLED ;
20
22
import static androidx .media3 .common .TrackSelectionParameters .AudioOffloadPreferences .AUDIO_OFFLOAD_MODE_REQUIRED ;
21
23
import static androidx .media3 .common .util .Assertions .checkNotNull ;
34
36
import android .media .AudioFormat ;
35
37
import android .media .AudioManager ;
36
38
import android .media .Spatializer ;
39
+ import android .os .Build ;
37
40
import android .os .Bundle ;
38
41
import android .os .Handler ;
39
42
import android .os .Looper ;
40
43
import android .text .TextUtils ;
41
44
import android .util .Pair ;
42
45
import android .util .SparseArray ;
43
46
import android .util .SparseBooleanArray ;
47
+ import android .view .accessibility .AccessibilityManager ;
44
48
import android .view .accessibility .CaptioningManager ;
45
49
import androidx .annotation .GuardedBy ;
46
50
import androidx .annotation .IntDef ;
@@ -410,6 +414,14 @@ public ParametersBuilder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAu
410
414
return this ;
411
415
}
412
416
417
+ @ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
418
+ @ CanIgnoreReturnValue
419
+ @ Override
420
+ public ParametersBuilder setPreferredAudioRoleFlagsFromAccessibilityManager () {
421
+ delegate .setPreferredAudioRoleFlagsFromAccessibilityManager ();
422
+ return this ;
423
+ }
424
+
413
425
@ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
414
426
@ CanIgnoreReturnValue
415
427
@ Override
@@ -1264,6 +1276,13 @@ public Builder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAudioRoleFla
1264
1276
return this ;
1265
1277
}
1266
1278
1279
+ @ CanIgnoreReturnValue
1280
+ @ Override
1281
+ public Builder setPreferredAudioRoleFlagsFromAccessibilityManager () {
1282
+ super .setPreferredAudioRoleFlagsFromAccessibilityManager ();
1283
+ return this ;
1284
+ }
1285
+
1267
1286
@ CanIgnoreReturnValue
1268
1287
@ Override
1269
1288
public Builder setPreferredAudioLabels (String ... preferredAudioLabels ) {
@@ -2910,7 +2929,13 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
2910
2929
break ;
2911
2930
}
2912
2931
}
2932
+
2933
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager = 0 ;
2934
+ if (SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
2935
+ preferredRoleFlagFromAccessibilityManager = getPreferredRoleFlagFromAccessibilityManager (context );
2936
+ }
2913
2937
boolean hasVideoRendererWithMappedTracksFinal = hasVideoRendererWithMappedTracks ;
2938
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManagerFinal = preferredRoleFlagFromAccessibilityManager ;
2914
2939
return selectTracksForType (
2915
2940
C .TRACK_TYPE_AUDIO ,
2916
2941
mappedTrackInfo ,
@@ -2923,7 +2948,8 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
2923
2948
support ,
2924
2949
hasVideoRendererWithMappedTracksFinal ,
2925
2950
format -> isAudioFormatWithinAudioChannelCountConstraints (format , params ),
2926
- rendererMixedMimeTypeAdaptationSupports [rendererIndex ]),
2951
+ rendererMixedMimeTypeAdaptationSupports [rendererIndex ],
2952
+ preferredRoleFlagFromAccessibilityManagerFinal ),
2927
2953
AudioTrackInfo ::compareSelections );
2928
2954
}
2929
2955
@@ -3601,6 +3627,21 @@ private static String getPreferredLanguageFromCaptioningManager(@Nullable Contex
3601
3627
return Util .getLocaleLanguageTag (preferredLocale );
3602
3628
}
3603
3629
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
+
3604
3645
/** Base class for track selection information of a {@link Format}. */
3605
3646
private abstract static class TrackInfo <T extends TrackInfo <T >> {
3606
3647
/** Factory for {@link TrackInfo} implementations for a given {@link TrackGroup}. */
@@ -3910,7 +3951,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
3910
3951
@ Capabilities int [] formatSupport ,
3911
3952
boolean hasMappedVideoTracks ,
3912
3953
Predicate <Format > withinAudioChannelCountConstraints ,
3913
- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
3954
+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
3955
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
3914
3956
ImmutableList .Builder <AudioTrackInfo > listBuilder = ImmutableList .builder ();
3915
3957
for (int i = 0 ; i < trackGroup .length ; i ++) {
3916
3958
listBuilder .add (
@@ -3922,7 +3964,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
3922
3964
formatSupport [i ],
3923
3965
hasMappedVideoTracks ,
3924
3966
withinAudioChannelCountConstraints ,
3925
- mixedMimeTypeAdaptationSupport ));
3967
+ mixedMimeTypeAdaptationSupport ,
3968
+ preferredRoleFlagFromAccessibilityManager ));
3926
3969
}
3927
3970
return listBuilder .build ();
3928
3971
}
@@ -3957,7 +4000,8 @@ public AudioTrackInfo(
3957
4000
@ Capabilities int formatSupport ,
3958
4001
boolean hasMappedVideoTracks ,
3959
4002
Predicate <Format > withinAudioChannelCountConstraints ,
3960
- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
4003
+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
4004
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
3961
4005
super (rendererIndex , trackGroup , trackIndex );
3962
4006
this .parameters = parameters ;
3963
4007
@ SuppressLint ("WrongConstant" )
@@ -3988,8 +4032,10 @@ public AudioTrackInfo(
3988
4032
}
3989
4033
preferredLanguageIndex = bestLanguageIndex ;
3990
4034
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 );
3993
4039
preferredLabelMatchIndex = getBestLabelMatchIndex (format , parameters .preferredAudioLabels );
3994
4040
hasMainOrNoRoleFlag = format .roleFlags == 0 || (format .roleFlags & C .ROLE_FLAG_MAIN ) != 0 ;
3995
4041
isDefaultSelectionFlag = (format .selectionFlags & C .SELECTION_FLAG_DEFAULT ) != 0 ;
0 commit comments