diff options
| -rw-r--r-- | core/api/test-current.txt | 1 | ||||
| -rw-r--r-- | media/java/android/media/AudioManager.java | 16 | ||||
| -rwxr-xr-x | media/java/android/media/IAudioService.aidl | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 20 |
4 files changed, 39 insertions, 1 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 58e59fd9430b..0dc08061a8d4 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1466,6 +1466,7 @@ package android.media { method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat); method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int); method @IntRange(from=0) @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public long getFadeOutDurationOnFocusLossMillis(@NonNull android.media.AudioAttributes); + method @Nullable public static String getHalVersion(); method public static final int[] getPublicStreamTypes(); method @NonNull public java.util.List<java.lang.Integer> getReportedSurroundFormats(); method public int getStreamMinVolumeInt(int); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3a2f0d9194f5..432196c9e4ef 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -8450,6 +8450,22 @@ public class AudioManager { } } + /** + * Returns the audio HAL version in the form MAJOR.MINOR. If there is no audio HAL found, null + * will be returned. + * + * @hide + */ + @TestApi + public static @Nullable String getHalVersion() { + try { + return getService().getHalVersion(); + } catch (RemoteException e) { + Log.e(TAG, "Error querying getHalVersion", e); + throw e.rethrowFromSystemServer(); + } + } + private final Object mMuteAwaitConnectionListenerLock = new Object(); @GuardedBy("mMuteAwaitConnectionListenerLock") diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index fa3057a4ead1..bdbb740a849b 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -480,7 +480,6 @@ interface IAudioService { boolean sendFocusLoss(in AudioFocusInfo focusLoser, in IAudioPolicyCallback apcb); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)") void addAssistantServicesUids(in int[] assistantUID); @@ -501,4 +500,6 @@ interface IAudioService { in IAudioDeviceVolumeDispatcher cb, in String packageName, in AudioDeviceAttributes device, in List<VolumeInfo> volumes); + + String getHalVersion(); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 82476d8d1df8..d01be5820d34 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -127,6 +127,7 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.HwBinder; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -10471,6 +10472,25 @@ public class AudioService extends IAudioService.Stub return mMediaFocusControl.sendFocusLoss(focusLoser); } + private static final String[] HAL_VERSIONS = new String[] {"7.1", "7.0", "6.0", "4.0", "2.0"}; + + /** @see AudioManager#getHalVersion */ + public @Nullable String getHalVersion() { + for (String version : HAL_VERSIONS) { + try { + HwBinder.getService( + String.format("android.hardware.audio@%s::IDevicesFactory", version), + "default"); + return version; + } catch (NoSuchElementException e) { + // Ignore, the specified HAL interface is not found. + } catch (RemoteException re) { + Log.e(TAG, "Remote exception when getting hardware audio service:", re); + } + } + return null; + } + /** see AudioManager.hasRegisteredDynamicPolicy */ public boolean hasRegisteredDynamicPolicy() { synchronized (mAudioPolicies) { |