/* * 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.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; /** * Defines the audio HAL version. * * @hide */ @TestApi public final class AudioHalVersionInfo implements Parcelable, Comparable { /** * Indicate the audio HAL is implemented with HIDL (HAL interface definition language). * * @see HIDL *

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 AIDL *

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}) @Retention(RetentionPolicy.SOURCE) 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/FactoryHal.cpp. * * Note: update {@link android.media.audio.cts.AudioHalVersionInfoTest} CTS accordingly if * there is a change to supported versions. */ public static final @NonNull List VERSIONS = List.of(AIDL_1_0, HIDL_7_1, HIDL_7_0, HIDL_6_0, HIDL_5_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. * *

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 CREATOR = new Parcelable.Creator() { @Override public AudioHalVersionInfo createFromParcel(@NonNull Parcel in) { return new AudioHalVersionInfo(in); } @Override public AudioHalVersionInfo[] newArray(int size) { return new AudioHalVersionInfo[size]; } }; }