summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrançois Gaffie <francois.gaffie@renault.com>2018-07-09 14:35:10 +0200
committerHongwei Wang <hwwang@google.com>2019-02-26 21:27:19 -0800
commit0699fecd478d03d6ac904562a048992e92fda23c (patch)
tree4158926497422ee6cd5b172484f115c2c5d3c25c
parent3f9262a910a0a0e20537ca16dece041c56291f3f (diff)
AudioManager: add Audio Product Strategies introspection SystemAPI
Bug: 124767636 Test: dumpsys media.audio_policy Change-Id: I31b970d7439f76604079d4cffc67bc9373df08e1 Signed-off-by: François Gaffie <francois.gaffie@renault.com>
-rw-r--r--api/system-current.txt1
-rw-r--r--media/java/android/media/AudioManager.java25
-rw-r--r--media/java/android/media/IAudioService.aidl3
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java14
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) {