From 0289e15505b842f78b43a11ad299d31544054003 Mon Sep 17 00:00:00 2001 From: jiabin Date: Fri, 4 Feb 2022 18:45:44 +0000 Subject: [PATCH] Add a test API to query audio HAL version. Add a test API to query audio HAL version. The HAL version is useful for test since the HAL version cannot be determined from the platform version. There can be some test requiring external devices connection that can only run in CTS verifier but not the VTS. With a different HAL version, there can be different CDD requirements for a given API. In that case, the test will need to know the HAL version to behave differently. Bug: 195401076 Test: atest AudioManagerTest Change-Id: I18cbf2f181e799e56b48916aefaede50389051fe --- core/api/test-current.txt | 1 + media/java/android/media/AudioManager.java | 16 +++++++++++++++ media/java/android/media/IAudioService.aidl | 3 ++- .../android/server/audio/AudioService.java | 20 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 239bba560aa96..787d7f310737f 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1455,6 +1455,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 getReportedSurroundFormats(); method public int getStreamMinVolumeInt(int); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3887372d00b5c..19c0379670308 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -8443,6 +8443,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 2c9f015cf4ce6..47b29fdb5e6e5 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -478,7 +478,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); @@ -499,4 +498,6 @@ interface IAudioService { in IAudioDeviceVolumeDispatcher cb, in String packageName, in AudioDeviceAttributes device, in List 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 807293fdae500..b558918749a91 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; @@ -10397,6 +10398,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) {