diff options
-rw-r--r-- | api/system-current.txt | 1 | ||||
-rw-r--r-- | media/java/android/media/AudioManager.java | 25 | ||||
-rw-r--r-- | media/java/android/media/IAudioService.aidl | 3 | ||||
-rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 14 |
4 files changed, 43 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 86a13bb13429..c5b294ba0db2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3455,6 +3455,7 @@ package android.media { method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes); method public void clearAudioServerStateCallback(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioProductStrategies getAudioProductStrategies(); method public boolean isAudioServerRunning(); method public boolean isHdmiSystemAudioSupported(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index bd828eea8179..3fb2365cb006 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener; +import android.media.audiopolicy.AudioProductStrategies; import android.media.projection.MediaProjection; import android.media.session.MediaController; import android.media.session.MediaSession; @@ -5221,6 +5222,30 @@ public class AudioManager { return AudioSystem.isHapticPlaybackSupported(); } + /** + * @hide + * Introspection API to retrieve audio product strategies. + * When implementing {Car|Oem}AudioManager, use this method to retrieve the collection of + * audio product strategies, which is indexed by a weakly typed index in order to be extended + * by OEM without any needs of AOSP patches. + * The {Car|Oem}AudioManager can expose API to build {@link AudioAttributes} for a given product + * strategy refered either by its index or human readable string. It will allow clients + * application to start streaming data using these {@link AudioAttributes} on the selected + * device by Audio Policy Engine. + * @return a (possibly zero-length) array of + * {@see android.media.audiopolicy.AudioProductStrategy} objects. + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public @NonNull AudioProductStrategies getAudioProductStrategies() { + final IAudioService service = getService(); + try { + return service.getAudioProductStrategies(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + //--------------------------------------------------------- // Inner classes diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 571e67e1ccfc..abdc3c9c834b 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -33,6 +33,7 @@ import android.media.IVolumeController; import android.media.PlayerBase; import android.media.VolumePolicy; import android.media.audiopolicy.AudioPolicyConfig; +import android.media.audiopolicy.AudioProductStrategies; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; @@ -82,6 +83,8 @@ interface IAudioService { int getLastAudibleStreamVolume(int streamType); + AudioProductStrategies getAudioProductStrategies(); + void setMicrophoneMute(boolean on, String callingPackage, int userId); void setRingerModeExternal(int ringerMode, String caller); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index afdfbe328ae2..a2d6508c509f 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -88,6 +88,7 @@ import android.media.audiofx.AudioEffect; import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicyConfig; +import android.media.audiopolicy.AudioProductStrategies; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionManager; @@ -274,6 +275,9 @@ public class AudioService extends IAudioService.Stub private SettingsObserver mSettingsObserver; + /** @see AudioProductStrategies */ + private static AudioProductStrategies sAudioProductStrategies; + private int mMode = AudioSystem.MODE_NORMAL; // protects mRingerMode private final Object mSettingsLock = new Object(); @@ -624,6 +628,8 @@ public class AudioService extends IAudioService.Stub mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); + sAudioProductStrategies = new AudioProductStrategies(); + // Initialize volume int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1); if (maxCallVolume != -1) { @@ -988,6 +994,14 @@ public class AudioService extends IAudioService.Stub } } + /** + * @return the {@link android.media.audiopolicy.AudioProductStrategies} discovered from the + * platform configuration file. + */ + public @NonNull AudioProductStrategies getAudioProductStrategies() { + return sAudioProductStrategies; + } + private void checkAllAliasStreamVolumes() { synchronized (mSettingsLock) { synchronized (VolumeStreamState.class) { |