| /* | |
| * 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]; | |
| } | |
| }; | |
| } |