Add AudioHalVersionInfo definition

Bug: 260761700
Test: atest android.media.audio.cts.AudioHalVersionInfoTest
Test: atest android.media.audio.cts.AudioManagerTest#testGetHalVersion
Test: CtsVerifier - Audio Descriptor Test

Change-Id: Ie62ae20c08e457a55f864229eb5f659070ea3960
This commit is contained in:
Shunkai Yao
2022-11-22 01:47:48 +00:00
parent fca208d09a
commit 601b6133e6
6 changed files with 235 additions and 15 deletions

View File

@@ -1466,13 +1466,33 @@ package android.media {
method public static boolean isEncodingLinearPcm(int);
}
public final class AudioHalVersionInfo implements java.lang.Comparable<android.media.AudioHalVersionInfo> android.os.Parcelable {
method public int compareTo(@NonNull android.media.AudioHalVersionInfo);
method public int describeContents();
method public int getHalType();
method public int getMajorVersion();
method public int getMinorVersion();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.media.AudioHalVersionInfo AIDL_1_0;
field public static final int AUDIO_HAL_TYPE_AIDL = 1; // 0x1
field public static final int AUDIO_HAL_TYPE_HIDL = 0; // 0x0
field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioHalVersionInfo> CREATOR;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_2_0;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_4_0;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_5_0;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_6_0;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_7_0;
field @NonNull public static final android.media.AudioHalVersionInfo HIDL_7_1;
field @NonNull public static final java.util.List<android.media.AudioHalVersionInfo> VERSIONS;
}
public class AudioManager {
method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int abandonAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String);
method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
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 @Nullable public static android.media.AudioHalVersionInfo getHalVersion();
method public static final int[] getPublicStreamTypes();
method @NonNull public java.util.List<java.lang.Integer> getReportedSurroundFormats();
method public int getStreamMinVolumeInt(int);

View File

@@ -0,0 +1,18 @@
/* Copyright 2022, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.media;
parcelable AudioHalVersionInfo;

View File

@@ -0,0 +1,174 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
/**
* Defines the audio HAL version.
*
* @hide
*/
@TestApi
public final class AudioHalVersionInfo implements Parcelable, Comparable<AudioHalVersionInfo> {
/**
* Indicate the audio HAL is implemented with HIDL (HAL interface definition language).
*
* @see <a href="https://source.android.com/docs/core/architecture/hidl/">HIDL</a>
* <p>The value of AUDIO_HAL_TYPE_HIDL should match the value of {@link
* android.media.AudioHalVersion.Type#HIDL}.
*/
public static final int AUDIO_HAL_TYPE_HIDL = 0;
/**
* Indicate the audio HAL is implemented with AIDL (Android Interface Definition Language).
*
* @see <a href="https://source.android.com/docs/core/architecture/aidl/">AIDL</a>
* <p>The value of AUDIO_HAL_TYPE_AIDL should match the value of {@link
* android.media.AudioHalVersion.Type#AIDL}.
*/
public static final int AUDIO_HAL_TYPE_AIDL = 1;
/** @hide */
@IntDef(
flag = false,
prefix = "AUDIO_HAL_TYPE_",
value = {AUDIO_HAL_TYPE_HIDL, AUDIO_HAL_TYPE_AIDL})
public @interface AudioHalType {}
/** AudioHalVersionInfo object of all valid Audio HAL versions. */
public static final @NonNull AudioHalVersionInfo AIDL_1_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_AIDL, 1 /* major */, 0 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_7_1 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 7 /* major */, 1 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_7_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 7 /* major */, 0 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_6_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 6 /* major */, 0 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_5_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 5 /* major */, 0 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_4_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 4 /* major */, 0 /* minor */);
public static final @NonNull AudioHalVersionInfo HIDL_2_0 =
new AudioHalVersionInfo(AUDIO_HAL_TYPE_HIDL, 2 /* major */, 0 /* minor */);
/**
* List of all valid Audio HAL versions. This list need to be in sync with sAudioHALVersions
* defined in frameworks/av/media/libaudiohal/FactoryHalHidl.cpp.
*/
// TODO: add AIDL_1_0 with sAudioHALVersions.
public static final @NonNull List<AudioHalVersionInfo> VERSIONS =
List.of(HIDL_7_1, HIDL_7_0, HIDL_6_0, HIDL_5_0, HIDL_4_0);
private static final String TAG = "AudioHalVersionInfo";
private AudioHalVersion mHalVersion = new AudioHalVersion();
public @AudioHalType int getHalType() {
return mHalVersion.type;
}
public int getMajorVersion() {
return mHalVersion.major;
}
public int getMinorVersion() {
return mHalVersion.minor;
}
/** String representative of AudioHalVersion.Type */
private static @NonNull String typeToString(@AudioHalType int type) {
if (type == AudioHalVersion.Type.HIDL) {
return "HIDL";
} else if (type == AudioHalVersion.Type.AIDL) {
return "AIDL";
} else {
return "INVALID";
}
}
/** String representative of type, major and minor */
private static @NonNull String toString(@AudioHalType int type, int major, int minor) {
return typeToString(type) + ":" + Integer.toString(major) + "." + Integer.toString(minor);
}
private AudioHalVersionInfo(@AudioHalType int type, int major, int minor) {
mHalVersion.type = type;
mHalVersion.major = major;
mHalVersion.minor = minor;
}
private AudioHalVersionInfo(Parcel in) {
mHalVersion = in.readTypedObject(AudioHalVersion.CREATOR);
}
/** String representative of this (AudioHalVersionInfo) object */
@Override
public String toString() {
return toString(mHalVersion.type, mHalVersion.major, mHalVersion.minor);
}
/**
* Compare two HAL versions by comparing their index in VERSIONS.
*
* <p>Normally all AudioHalVersionInfo object to compare should exist in the VERSIONS list. If
* both candidates exist in the VERSIONS list, smaller index means newer. Any candidate not
* exist in the VERSIONS list will be considered to be oldest version.
*
* @return 0 if the HAL version is the same as the other HAL version. Positive if the HAL
* version is newer than the other HAL version. Negative if the HAL version is older than
* the other version.
*/
@Override
public int compareTo(@NonNull AudioHalVersionInfo other) {
int indexOther = VERSIONS.indexOf(other);
int indexThis = VERSIONS.indexOf(this);
if (indexThis < 0 || indexOther < 0) {
return indexThis - indexOther;
}
return indexOther - indexThis;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull android.os.Parcel out, int flag) {
out.writeTypedObject(mHalVersion, flag);
}
public static final @NonNull Parcelable.Creator<AudioHalVersionInfo> CREATOR =
new Parcelable.Creator<AudioHalVersionInfo>() {
@Override
public AudioHalVersionInfo createFromParcel(@NonNull Parcel in) {
return new AudioHalVersionInfo(in);
}
@Override
public AudioHalVersionInfo[] newArray(int size) {
return new AudioHalVersionInfo[size];
}
};
}

View File

@@ -8462,13 +8462,14 @@ public class AudioManager {
}
/**
* Returns the audio HAL version in the form MAJOR.MINOR. If there is no audio HAL found, null
* will be returned.
* Returns an {@link AudioHalVersionInfo} indicating the Audio Hal Version. If there is no audio
* HAL found, null will be returned.
*
* @return @see @link #AudioHalVersionInfo The version of Audio HAL.
* @hide
*/
@TestApi
public static @Nullable String getHalVersion() {
public static @Nullable AudioHalVersionInfo getHalVersion() {
try {
return getService().getHalVersion();
} catch (RemoteException e) {

3
media/java/android/media/IAudioService.aidl Executable file → Normal file
View File

@@ -22,6 +22,7 @@ import android.media.AudioAttributes;
import android.media.AudioDeviceAttributes;
import android.media.AudioFormat;
import android.media.AudioFocusInfo;
import android.media.AudioHalVersionInfo;
import android.media.AudioPlaybackConfiguration;
import android.media.AudioRecordingConfiguration;
import android.media.AudioRoutesInfo;
@@ -512,5 +513,5 @@ interface IAudioService {
in AudioDeviceAttributes device, in List<VolumeInfo> volumes,
boolean handlesvolumeAdjustment);
String getHalVersion();
AudioHalVersionInfo getHalVersion();
}

View File

@@ -82,6 +82,7 @@ import android.media.AudioDeviceVolumeManager;
import android.media.AudioFocusInfo;
import android.media.AudioFocusRequest;
import android.media.AudioFormat;
import android.media.AudioHalVersionInfo;
import android.media.AudioManager;
import android.media.AudioManagerInternal;
import android.media.AudioPlaybackConfiguration;
@@ -6289,9 +6290,13 @@ public class AudioService extends IAudioService.Stub
return AudioSystem.STREAM_RING;
} else if (wasStreamActiveRecently(
AudioSystem.STREAM_NOTIFICATION, sStreamOverrideDelayMs)) {
if (DEBUG_VOL)
Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION stream active");
return AudioSystem.STREAM_NOTIFICATION;
if (DEBUG_VOL) {
Log.v(
TAG,
"getActiveStreamType: Forcing STREAM_NOTIFICATION stream"
+ " active");
}
return AudioSystem.STREAM_NOTIFICATION;
} else {
if (DEBUG_VOL) {
Log.v(TAG, "getActiveStreamType: Forcing DEFAULT_VOL_STREAM_NO_PLAYBACK("
@@ -10825,15 +10830,16 @@ public class AudioService extends IAudioService.Stub
return mMediaFocusControl.sendFocusLoss(focusLoser);
}
private static final String[] HAL_VERSIONS =
new String[] {"7.1", "7.0", "6.0", "5.0", "4.0", "2.0"};
/** @see AudioManager#getHalVersion */
public @Nullable String getHalVersion() {
for (String version : HAL_VERSIONS) {
/**
* @see AudioManager#getHalVersion
*/
public @Nullable AudioHalVersionInfo getHalVersion() {
for (AudioHalVersionInfo version : AudioHalVersionInfo.VERSIONS) {
try {
// TODO: check AIDL service.
String versionStr = version.getMajorVersion() + "." + version.getMinorVersion();
HwBinder.getService(
String.format("android.hardware.audio@%s::IDevicesFactory", version),
String.format("android.hardware.audio@%s::IDevicesFactory", versionStr),
"default");
return version;
} catch (NoSuchElementException e) {