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 ;
@@ -402,6 +406,14 @@ public ParametersBuilder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAu
402
406
return this ;
403
407
}
404
408
409
+ @ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
410
+ @ CanIgnoreReturnValue
411
+ @ Override
412
+ public ParametersBuilder setPreferredAudioRoleFlagsFromAccessibilityManager () {
413
+ delegate .setPreferredAudioRoleFlagsFromAccessibilityManager ();
414
+ return this ;
415
+ }
416
+
405
417
@ SuppressWarnings ("deprecation" ) // Intentionally returning deprecated type
406
418
@ CanIgnoreReturnValue
407
419
@ Override
@@ -1225,6 +1237,13 @@ public Builder setPreferredAudioRoleFlags(@C.RoleFlags int preferredAudioRoleFla
1225
1237
return this ;
1226
1238
}
1227
1239
1240
+ @ CanIgnoreReturnValue
1241
+ @ Override
1242
+ public Builder setPreferredAudioRoleFlagsFromAccessibilityManager () {
1243
+ super .setPreferredAudioRoleFlagsFromAccessibilityManager ();
1244
+ return this ;
1245
+ }
1246
+
1228
1247
@ CanIgnoreReturnValue
1229
1248
@ Override
1230
1249
public Builder setMaxAudioChannelCount (int maxAudioChannelCount ) {
@@ -2850,7 +2869,13 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
2850
2869
break ;
2851
2870
}
2852
2871
}
2872
+
2873
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager = 0 ;
2874
+ if (SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
2875
+ preferredRoleFlagFromAccessibilityManager = getPreferredRoleFlagFromAccessibilityManager (context );
2876
+ }
2853
2877
boolean hasVideoRendererWithMappedTracksFinal = hasVideoRendererWithMappedTracks ;
2878
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManagerFinal = preferredRoleFlagFromAccessibilityManager ;
2854
2879
return selectTracksForType (
2855
2880
C .TRACK_TYPE_AUDIO ,
2856
2881
mappedTrackInfo ,
@@ -2863,7 +2888,8 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectAudioTrack(
2863
2888
support ,
2864
2889
hasVideoRendererWithMappedTracksFinal ,
2865
2890
format -> isAudioFormatWithinAudioChannelCountConstraints (format , params ),
2866
- rendererMixedMimeTypeAdaptationSupports [rendererIndex ]),
2891
+ rendererMixedMimeTypeAdaptationSupports [rendererIndex ],
2892
+ preferredRoleFlagFromAccessibilityManagerFinal ),
2867
2893
AudioTrackInfo ::compareSelections );
2868
2894
}
2869
2895
@@ -3530,6 +3556,21 @@ private static String getPreferredLanguageFromCaptioningManager(@Nullable Contex
3530
3556
return Util .getLocaleLanguageTag (preferredLocale );
3531
3557
}
3532
3558
3559
+ @ RequiresApi (api = Build .VERSION_CODES .TIRAMISU )
3560
+ private static @ RoleFlags int getPreferredRoleFlagFromAccessibilityManager (
3561
+ @ Nullable Context context ) {
3562
+ if (context == null ) {
3563
+ return 0 ;
3564
+ }
3565
+ AccessibilityManager accessibilityManager = (AccessibilityManager ) context .getSystemService (
3566
+ Context .ACCESSIBILITY_SERVICE );
3567
+ if (accessibilityManager != null ) {
3568
+ return accessibilityManager .isAudioDescriptionRequested () ? ROLE_FLAG_DESCRIBES_VIDEO
3569
+ | ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND : 0 ;
3570
+ }
3571
+ return 0 ;
3572
+ }
3573
+
3533
3574
/** Base class for track selection information of a {@link Format}. */
3534
3575
private abstract static class TrackInfo <T extends TrackInfo <T >> {
3535
3576
/** Factory for {@link TrackInfo} implementations for a given {@link TrackGroup}. */
@@ -3833,7 +3874,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
3833
3874
@ Capabilities int [] formatSupport ,
3834
3875
boolean hasMappedVideoTracks ,
3835
3876
Predicate <Format > withinAudioChannelCountConstraints ,
3836
- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
3877
+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
3878
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
3837
3879
ImmutableList .Builder <AudioTrackInfo > listBuilder = ImmutableList .builder ();
3838
3880
for (int i = 0 ; i < trackGroup .length ; i ++) {
3839
3881
listBuilder .add (
@@ -3845,7 +3887,8 @@ public static ImmutableList<AudioTrackInfo> createForTrackGroup(
3845
3887
formatSupport [i ],
3846
3888
hasMappedVideoTracks ,
3847
3889
withinAudioChannelCountConstraints ,
3848
- mixedMimeTypeAdaptationSupport ));
3890
+ mixedMimeTypeAdaptationSupport ,
3891
+ preferredRoleFlagFromAccessibilityManager ));
3849
3892
}
3850
3893
return listBuilder .build ();
3851
3894
}
@@ -3879,7 +3922,8 @@ public AudioTrackInfo(
3879
3922
@ Capabilities int formatSupport ,
3880
3923
boolean hasMappedVideoTracks ,
3881
3924
Predicate <Format > withinAudioChannelCountConstraints ,
3882
- @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ) {
3925
+ @ AdaptiveSupport int mixedMimeTypeAdaptationSupport ,
3926
+ @ RoleFlags int preferredRoleFlagFromAccessibilityManager ) {
3883
3927
super (rendererIndex , trackGroup , trackIndex );
3884
3928
this .parameters = parameters ;
3885
3929
@ SuppressLint ("WrongConstant" )
@@ -3910,8 +3954,10 @@ public AudioTrackInfo(
3910
3954
}
3911
3955
preferredLanguageIndex = bestLanguageIndex ;
3912
3956
preferredLanguageScore = bestLanguageScore ;
3913
- preferredRoleFlagsScore =
3914
- getRoleFlagMatchScore (format .roleFlags , parameters .preferredAudioRoleFlags );
3957
+ @ RoleFlags int preferredAudioRoleFlags =
3958
+ preferredRoleFlagFromAccessibilityManager == 0 ? parameters .preferredAudioRoleFlags
3959
+ : preferredRoleFlagFromAccessibilityManager ;
3960
+ preferredRoleFlagsScore = getRoleFlagMatchScore (format .roleFlags , preferredAudioRoleFlags );
3915
3961
hasMainOrNoRoleFlag = format .roleFlags == 0 || (format .roleFlags & C .ROLE_FLAG_MAIN ) != 0 ;
3916
3962
isDefaultSelectionFlag = (format .selectionFlags & C .SELECTION_FLAG_DEFAULT ) != 0 ;
3917
3963
isObjectBasedAudio = isObjectBasedAudio (format );
0 commit comments