Merge "Add AudioHalVersionInfo definition"
This commit is contained in:
@@ -1466,13 +1466,33 @@ package android.media {
|
|||||||
method public static boolean isEncodingLinearPcm(int);
|
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 {
|
public class AudioManager {
|
||||||
method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int abandonAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String);
|
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.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 @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 @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 @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 public static final int[] getPublicStreamTypes();
|
||||||
method @NonNull public java.util.List<java.lang.Integer> getReportedSurroundFormats();
|
method @NonNull public java.util.List<java.lang.Integer> getReportedSurroundFormats();
|
||||||
method public int getStreamMinVolumeInt(int);
|
method public int getStreamMinVolumeInt(int);
|
||||||
|
|||||||
18
media/java/android/media/AudioHalVersionInfo.aidl
Normal file
18
media/java/android/media/AudioHalVersionInfo.aidl
Normal 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;
|
||||||
174
media/java/android/media/AudioHalVersionInfo.java
Normal file
174
media/java/android/media/AudioHalVersionInfo.java
Normal 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];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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
|
* Returns an {@link AudioHalVersionInfo} indicating the Audio Hal Version. If there is no audio
|
||||||
* will be returned.
|
* HAL found, null will be returned.
|
||||||
*
|
*
|
||||||
|
* @return @see @link #AudioHalVersionInfo The version of Audio HAL.
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@TestApi
|
@TestApi
|
||||||
public static @Nullable String getHalVersion() {
|
public static @Nullable AudioHalVersionInfo getHalVersion() {
|
||||||
try {
|
try {
|
||||||
return getService().getHalVersion();
|
return getService().getHalVersion();
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
|
|||||||
3
media/java/android/media/IAudioService.aidl
Executable file → Normal file
3
media/java/android/media/IAudioService.aidl
Executable file → Normal file
@@ -22,6 +22,7 @@ import android.media.AudioAttributes;
|
|||||||
import android.media.AudioDeviceAttributes;
|
import android.media.AudioDeviceAttributes;
|
||||||
import android.media.AudioFormat;
|
import android.media.AudioFormat;
|
||||||
import android.media.AudioFocusInfo;
|
import android.media.AudioFocusInfo;
|
||||||
|
import android.media.AudioHalVersionInfo;
|
||||||
import android.media.AudioPlaybackConfiguration;
|
import android.media.AudioPlaybackConfiguration;
|
||||||
import android.media.AudioRecordingConfiguration;
|
import android.media.AudioRecordingConfiguration;
|
||||||
import android.media.AudioRoutesInfo;
|
import android.media.AudioRoutesInfo;
|
||||||
@@ -512,5 +513,5 @@ interface IAudioService {
|
|||||||
in AudioDeviceAttributes device, in List<VolumeInfo> volumes,
|
in AudioDeviceAttributes device, in List<VolumeInfo> volumes,
|
||||||
boolean handlesvolumeAdjustment);
|
boolean handlesvolumeAdjustment);
|
||||||
|
|
||||||
String getHalVersion();
|
AudioHalVersionInfo getHalVersion();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ import android.media.AudioDeviceVolumeManager;
|
|||||||
import android.media.AudioFocusInfo;
|
import android.media.AudioFocusInfo;
|
||||||
import android.media.AudioFocusRequest;
|
import android.media.AudioFocusRequest;
|
||||||
import android.media.AudioFormat;
|
import android.media.AudioFormat;
|
||||||
|
import android.media.AudioHalVersionInfo;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.AudioManagerInternal;
|
import android.media.AudioManagerInternal;
|
||||||
import android.media.AudioPlaybackConfiguration;
|
import android.media.AudioPlaybackConfiguration;
|
||||||
@@ -6289,9 +6290,13 @@ public class AudioService extends IAudioService.Stub
|
|||||||
return AudioSystem.STREAM_RING;
|
return AudioSystem.STREAM_RING;
|
||||||
} else if (wasStreamActiveRecently(
|
} else if (wasStreamActiveRecently(
|
||||||
AudioSystem.STREAM_NOTIFICATION, sStreamOverrideDelayMs)) {
|
AudioSystem.STREAM_NOTIFICATION, sStreamOverrideDelayMs)) {
|
||||||
if (DEBUG_VOL)
|
if (DEBUG_VOL) {
|
||||||
Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION stream active");
|
Log.v(
|
||||||
return AudioSystem.STREAM_NOTIFICATION;
|
TAG,
|
||||||
|
"getActiveStreamType: Forcing STREAM_NOTIFICATION stream"
|
||||||
|
+ " active");
|
||||||
|
}
|
||||||
|
return AudioSystem.STREAM_NOTIFICATION;
|
||||||
} else {
|
} else {
|
||||||
if (DEBUG_VOL) {
|
if (DEBUG_VOL) {
|
||||||
Log.v(TAG, "getActiveStreamType: Forcing DEFAULT_VOL_STREAM_NO_PLAYBACK("
|
Log.v(TAG, "getActiveStreamType: Forcing DEFAULT_VOL_STREAM_NO_PLAYBACK("
|
||||||
@@ -10825,15 +10830,16 @@ public class AudioService extends IAudioService.Stub
|
|||||||
return mMediaFocusControl.sendFocusLoss(focusLoser);
|
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
|
||||||
|
*/
|
||||||
/** @see AudioManager#getHalVersion */
|
public @Nullable AudioHalVersionInfo getHalVersion() {
|
||||||
public @Nullable String getHalVersion() {
|
for (AudioHalVersionInfo version : AudioHalVersionInfo.VERSIONS) {
|
||||||
for (String version : HAL_VERSIONS) {
|
|
||||||
try {
|
try {
|
||||||
|
// TODO: check AIDL service.
|
||||||
|
String versionStr = version.getMajorVersion() + "." + version.getMinorVersion();
|
||||||
HwBinder.getService(
|
HwBinder.getService(
|
||||||
String.format("android.hardware.audio@%s::IDevicesFactory", version),
|
String.format("android.hardware.audio@%s::IDevicesFactory", versionStr),
|
||||||
"default");
|
"default");
|
||||||
return version;
|
return version;
|
||||||
} catch (NoSuchElementException e) {
|
} catch (NoSuchElementException e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user