From fe6b7f19fdd60536ef119497fb9cc53118b8c7c5 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 c36b94b424ac6..326a4b20bb03b 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1465,6 +1465,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 3a2f0d9194f52..432196c9e4ef2 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 fa3057a4ead12..bdbb740a849b7 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 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 82476d8d1df86..d01be5820d348 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) {