897 lines
45 KiB
Java
897 lines
45 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 2021 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.audio.common;
|
||
|
|
||
|
import android.annotation.NonNull;
|
||
|
import android.media.AudioDescriptor;
|
||
|
import android.media.AudioDeviceAttributes;
|
||
|
import android.media.AudioFormat;
|
||
|
import android.media.AudioSystem;
|
||
|
import android.media.MediaFormat;
|
||
|
import android.os.Parcel;
|
||
|
|
||
|
import com.android.internal.annotations.VisibleForTesting;
|
||
|
|
||
|
import java.util.stream.Collectors;
|
||
|
|
||
|
/**
|
||
|
* This class provides utility functions for converting between
|
||
|
* the AIDL types defined in 'android.media.audio.common' and:
|
||
|
* - SDK (Java API) types from 'android.media';
|
||
|
* - legacy native (system/audio.h) types.
|
||
|
*
|
||
|
* Methods that convert between AIDL and SDK types are called
|
||
|
* using the following pattern:
|
||
|
*
|
||
|
* aidl2api_AIDL-type-name_SDK-type-name
|
||
|
* api2aidl_SDK-type-name_AIDL-type-name
|
||
|
*
|
||
|
* Since the range of the SDK values is generally narrower than
|
||
|
* the range of AIDL values, when a match can't be found, the
|
||
|
* conversion function returns a corresponding 'INVALID' value.
|
||
|
*
|
||
|
* Methods that convert between AIDL and legacy types are called
|
||
|
* using the following pattern:
|
||
|
*
|
||
|
* aidl2legacy_AIDL-type-name_native-type-name
|
||
|
* legacy2aidl_native-type-name_AIDL-type-name
|
||
|
*
|
||
|
* In general, there is a 1:1 mapping between AIDL and framework
|
||
|
* types, and a failure to convert a value indicates a programming
|
||
|
* error. Thus, the conversion functions may throw an IllegalArgumentException.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
@VisibleForTesting
|
||
|
public class AidlConversion {
|
||
|
/** Convert from AIDL AudioChannelLayout to legacy audio_channel_mask_t. */
|
||
|
public static int /*audio_channel_mask_t*/ aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
|
||
|
@NonNull AudioChannelLayout aidl, boolean isInput) {
|
||
|
Parcel out = Parcel.obtain();
|
||
|
aidl.writeToParcel(out, 0);
|
||
|
out.setDataPosition(0);
|
||
|
try {
|
||
|
return aidl2legacy_AudioChannelLayout_Parcel_audio_channel_mask_t(out, isInput);
|
||
|
} finally {
|
||
|
out.recycle();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Convert from legacy audio_channel_mask_t to AIDL AudioChannelLayout. */
|
||
|
public static AudioChannelLayout legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
|
||
|
int /*audio_channel_mask_t*/ legacy, boolean isInput) {
|
||
|
Parcel in = legacy2aidl_audio_channel_mask_t_AudioChannelLayout_Parcel(legacy, isInput);
|
||
|
if (in != null) {
|
||
|
try {
|
||
|
return AudioChannelLayout.CREATOR.createFromParcel(in);
|
||
|
} finally {
|
||
|
in.recycle();
|
||
|
}
|
||
|
}
|
||
|
throw new IllegalArgumentException("Failed to convert legacy audio "
|
||
|
+ (isInput ? "input" : "output") + " audio_channel_mask_t " + legacy + " value");
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioFormatDescription to legacy audio_format_t. */
|
||
|
public static int /*audio_format_t*/ aidl2legacy_AudioFormatDescription_audio_format_t(
|
||
|
@NonNull AudioFormatDescription aidl) {
|
||
|
Parcel out = Parcel.obtain();
|
||
|
aidl.writeToParcel(out, 0);
|
||
|
out.setDataPosition(0);
|
||
|
try {
|
||
|
return aidl2legacy_AudioFormatDescription_Parcel_audio_format_t(out);
|
||
|
} finally {
|
||
|
out.recycle();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Convert from legacy audio_format_t to AIDL AudioFormatDescription. */
|
||
|
public static @NonNull AudioFormatDescription legacy2aidl_audio_format_t_AudioFormatDescription(
|
||
|
int /*audio_format_t*/ legacy) {
|
||
|
Parcel in = legacy2aidl_audio_format_t_AudioFormatDescription_Parcel(legacy);
|
||
|
if (in != null) {
|
||
|
try {
|
||
|
return AudioFormatDescription.CREATOR.createFromParcel(in);
|
||
|
} finally {
|
||
|
in.recycle();
|
||
|
}
|
||
|
}
|
||
|
throw new IllegalArgumentException(
|
||
|
"Failed to convert legacy audio_format_t value " + legacy);
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioEncapsulationMode to legacy audio_encapsulation_mode_t. */
|
||
|
public static native int aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(
|
||
|
int /*AudioEncapsulationMode.* */ aidl);
|
||
|
|
||
|
/** Convert from legacy audio_encapsulation_mode_t to AIDL AudioEncapsulationMode. */
|
||
|
public static native int legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
|
||
|
int /*audio_encapsulation_mode_t*/ legacy);
|
||
|
|
||
|
/** Convert from AIDL AudioStreamType to legacy audio_stream_type_t. */
|
||
|
public static native int aidl2legacy_AudioStreamType_audio_stream_type_t(
|
||
|
int /*AudioStreamType.* */ aidl);
|
||
|
|
||
|
/** Convert from legacy audio_stream_type_t to AIDL AudioStreamType. */
|
||
|
public static native int legacy2aidl_audio_stream_type_t_AudioStreamType(
|
||
|
int /*audio_stream_type_t*/ legacy);
|
||
|
|
||
|
/** Convert from AIDL AudioUsage to legacy audio_usage_t. */
|
||
|
public static native int aidl2legacy_AudioUsage_audio_usage_t(int /*AudioUsage.* */ aidl);
|
||
|
|
||
|
/** Convert from legacy audio_usage_t to AIDL AudioUsage. */
|
||
|
public static native int legacy2aidl_audio_usage_t_AudioUsage(int /*audio_usage_t*/ legacy);
|
||
|
|
||
|
/** Convert from a channel bit of AIDL AudioChannelLayout to SDK AudioFormat.CHANNEL_* bit. */
|
||
|
private static int aidl2api_AudioChannelLayoutBit_AudioFormatChannel(
|
||
|
int aidlBit, boolean isInput) {
|
||
|
if (isInput) {
|
||
|
switch (aidlBit) {
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_LEFT:
|
||
|
return AudioFormat.CHANNEL_IN_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_RIGHT:
|
||
|
return AudioFormat.CHANNEL_IN_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_CENTER:
|
||
|
return AudioFormat.CHANNEL_IN_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_BACK_CENTER:
|
||
|
return AudioFormat.CHANNEL_IN_BACK;
|
||
|
// CHANNEL_IN_*_PROCESSED not supported
|
||
|
// CHANNEL_IN_PRESSURE not supported
|
||
|
// CHANNEL_IN_*_AXIS not supported
|
||
|
// CHANNEL_IN_VOICE_* not supported
|
||
|
case AudioChannelLayout.CHANNEL_BACK_LEFT:
|
||
|
return AudioFormat.CHANNEL_IN_BACK_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_BACK_RIGHT:
|
||
|
return AudioFormat.CHANNEL_IN_BACK_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_LOW_FREQUENCY:
|
||
|
return AudioFormat.CHANNEL_IN_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_SIDE_LEFT:
|
||
|
return AudioFormat.CHANNEL_IN_TOP_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_SIDE_RIGHT:
|
||
|
return AudioFormat.CHANNEL_IN_TOP_RIGHT;
|
||
|
default:
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
}
|
||
|
} else {
|
||
|
switch (aidlBit) {
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_LOW_FREQUENCY:
|
||
|
return AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.CHANNEL_BACK_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_BACK_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_BACK_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_BACK_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_LEFT_OF_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_RIGHT_OF_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_BACK_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_BACK_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_SIDE_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_SIDE_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_SIDE_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_FRONT_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_FRONT_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_FRONT_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_FRONT_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_BACK_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_BACK_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_BACK_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_BACK_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_SIDE_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_TOP_SIDE_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_BOTTOM_FRONT_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_BOTTOM_FRONT_CENTER:
|
||
|
return AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_CENTER;
|
||
|
case AudioChannelLayout.CHANNEL_BOTTOM_FRONT_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_LOW_FREQUENCY_2:
|
||
|
return AudioFormat.CHANNEL_OUT_LOW_FREQUENCY_2;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_WIDE_LEFT:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_WIDE_LEFT;
|
||
|
case AudioChannelLayout.CHANNEL_FRONT_WIDE_RIGHT:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_WIDE_RIGHT;
|
||
|
case AudioChannelLayout.CHANNEL_HAPTIC_A:
|
||
|
return AudioFormat.CHANNEL_OUT_HAPTIC_A;
|
||
|
case AudioChannelLayout.CHANNEL_HAPTIC_B:
|
||
|
return AudioFormat.CHANNEL_OUT_HAPTIC_B;
|
||
|
default:
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from a channel bitmask of AIDL AudioChannelLayout to
|
||
|
* SDK AudioFormat.CHANNEL_* bitmask.
|
||
|
*/
|
||
|
private static int aidl2api_AudioChannelLayoutBitMask_AudioFormatChannelMask(
|
||
|
int aidlBitMask, boolean isInput) {
|
||
|
int apiMask = 0;
|
||
|
for (int bit = 1 << 31; bit != 0; bit >>>= 1) {
|
||
|
if ((aidlBitMask & bit) == bit) {
|
||
|
int apiBit = aidl2api_AudioChannelLayoutBit_AudioFormatChannel(bit, isInput);
|
||
|
if (apiBit != AudioFormat.CHANNEL_INVALID) {
|
||
|
apiMask |= apiBit;
|
||
|
aidlBitMask &= ~bit;
|
||
|
if (aidlBitMask == 0) {
|
||
|
return apiMask;
|
||
|
}
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioChannelLayout to SDK AudioFormat.CHANNEL_*. */
|
||
|
public static int aidl2api_AudioChannelLayout_AudioFormatChannelMask(
|
||
|
@NonNull AudioChannelLayout aidlMask, boolean isInput) {
|
||
|
switch (aidlMask.getTag()) {
|
||
|
case AudioChannelLayout.none:
|
||
|
return isInput ? AudioFormat.CHANNEL_IN_DEFAULT : AudioFormat.CHANNEL_OUT_DEFAULT;
|
||
|
case AudioChannelLayout.invalid:
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
case AudioChannelLayout.indexMask:
|
||
|
// Note that for a proper building of SDK AudioFormat one must
|
||
|
// call either 'setChannelMask' or 'setChannelIndexMask' depending
|
||
|
// on the variant of AudioChannelLayout. The integer representations
|
||
|
// of positional and indexed channel masks are indistinguishable in
|
||
|
// the SDK.
|
||
|
return aidlMask.getIndexMask();
|
||
|
case AudioChannelLayout.layoutMask:
|
||
|
if (isInput) {
|
||
|
switch (aidlMask.getLayoutMask()) {
|
||
|
case AudioChannelLayout.LAYOUT_MONO:
|
||
|
return AudioFormat.CHANNEL_IN_MONO;
|
||
|
case AudioChannelLayout.LAYOUT_STEREO:
|
||
|
return AudioFormat.CHANNEL_IN_STEREO;
|
||
|
case AudioChannelLayout.LAYOUT_FRONT_BACK:
|
||
|
return AudioFormat.CHANNEL_IN_FRONT_BACK;
|
||
|
case AudioChannelLayout.LAYOUT_2POINT0POINT2:
|
||
|
return AudioFormat.CHANNEL_IN_2POINT0POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_2POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_IN_2POINT1POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_3POINT0POINT2:
|
||
|
return AudioFormat.CHANNEL_IN_3POINT0POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_3POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_IN_3POINT1POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_5POINT1:
|
||
|
return AudioFormat.CHANNEL_IN_5POINT1;
|
||
|
default: // fall through
|
||
|
}
|
||
|
} else {
|
||
|
switch (aidlMask.getLayoutMask()) {
|
||
|
case AudioChannelLayout.LAYOUT_MONO:
|
||
|
return AudioFormat.CHANNEL_OUT_MONO;
|
||
|
case AudioChannelLayout.LAYOUT_STEREO:
|
||
|
return AudioFormat.CHANNEL_OUT_STEREO;
|
||
|
case AudioChannelLayout.LAYOUT_2POINT1:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.LAYOUT_TRI:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_CENTER;
|
||
|
case AudioChannelLayout.LAYOUT_TRI_BACK:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_BACK_CENTER;
|
||
|
case AudioChannelLayout.LAYOUT_3POINT1:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_CENTER
|
||
|
| AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.LAYOUT_2POINT0POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT;
|
||
|
case AudioChannelLayout.LAYOUT_2POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.LAYOUT_3POINT0POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_CENTER
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT;
|
||
|
case AudioChannelLayout.LAYOUT_3POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_CENTER
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
|
||
|
| AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT
|
||
|
| AudioFormat.CHANNEL_OUT_LOW_FREQUENCY;
|
||
|
case AudioChannelLayout.LAYOUT_QUAD:
|
||
|
return AudioFormat.CHANNEL_OUT_QUAD;
|
||
|
case AudioChannelLayout.LAYOUT_QUAD_SIDE:
|
||
|
return AudioFormat.CHANNEL_OUT_QUAD_SIDE;
|
||
|
case AudioChannelLayout.LAYOUT_SURROUND:
|
||
|
return AudioFormat.CHANNEL_OUT_SURROUND;
|
||
|
case AudioChannelLayout.LAYOUT_PENTA:
|
||
|
return AudioFormat.CHANNEL_OUT_QUAD
|
||
|
| AudioFormat.CHANNEL_OUT_FRONT_CENTER;
|
||
|
case AudioChannelLayout.LAYOUT_5POINT1:
|
||
|
return AudioFormat.CHANNEL_OUT_5POINT1;
|
||
|
case AudioChannelLayout.LAYOUT_5POINT1_SIDE:
|
||
|
return AudioFormat.CHANNEL_OUT_5POINT1_SIDE;
|
||
|
case AudioChannelLayout.LAYOUT_5POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_5POINT1POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_5POINT1POINT4:
|
||
|
return AudioFormat.CHANNEL_OUT_5POINT1POINT4;
|
||
|
case AudioChannelLayout.LAYOUT_6POINT1:
|
||
|
return AudioFormat.CHANNEL_OUT_6POINT1;
|
||
|
case AudioChannelLayout.LAYOUT_7POINT1:
|
||
|
return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
|
||
|
case AudioChannelLayout.LAYOUT_7POINT1POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_7POINT1POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_7POINT1POINT4:
|
||
|
return AudioFormat.CHANNEL_OUT_7POINT1POINT4;
|
||
|
case AudioChannelLayout.LAYOUT_9POINT1POINT4:
|
||
|
return AudioFormat.CHANNEL_OUT_9POINT1POINT4;
|
||
|
case AudioChannelLayout.LAYOUT_9POINT1POINT6:
|
||
|
return AudioFormat.CHANNEL_OUT_9POINT1POINT6;
|
||
|
case AudioChannelLayout.LAYOUT_13POINT_360RA:
|
||
|
return AudioFormat.CHANNEL_OUT_13POINT_360RA;
|
||
|
case AudioChannelLayout.LAYOUT_22POINT2:
|
||
|
return AudioFormat.CHANNEL_OUT_22POINT2;
|
||
|
case AudioChannelLayout.LAYOUT_MONO_HAPTIC_A:
|
||
|
return AudioFormat.CHANNEL_OUT_MONO
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_A;
|
||
|
case AudioChannelLayout.LAYOUT_STEREO_HAPTIC_A:
|
||
|
return AudioFormat.CHANNEL_OUT_STEREO
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_A;
|
||
|
case AudioChannelLayout.LAYOUT_HAPTIC_AB:
|
||
|
return AudioFormat.CHANNEL_OUT_HAPTIC_A
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_B;
|
||
|
case AudioChannelLayout.LAYOUT_MONO_HAPTIC_AB:
|
||
|
return AudioFormat.CHANNEL_OUT_MONO
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_A
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_B;
|
||
|
case AudioChannelLayout.LAYOUT_STEREO_HAPTIC_AB:
|
||
|
return AudioFormat.CHANNEL_OUT_STEREO
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_A
|
||
|
| AudioFormat.CHANNEL_OUT_HAPTIC_B;
|
||
|
case AudioChannelLayout.LAYOUT_FRONT_BACK:
|
||
|
return AudioFormat.CHANNEL_OUT_FRONT_CENTER
|
||
|
| AudioFormat.CHANNEL_OUT_BACK_CENTER;
|
||
|
default: // fall through
|
||
|
}
|
||
|
}
|
||
|
// If a match for a predefined layout wasn't found, make a custom one from bits.
|
||
|
return aidl2api_AudioChannelLayoutBitMask_AudioFormatChannelMask(
|
||
|
aidlMask.getLayoutMask(), isInput);
|
||
|
case AudioChannelLayout.voiceMask:
|
||
|
if (isInput) {
|
||
|
switch (aidlMask.getVoiceMask()) {
|
||
|
// AudioFormat input masks match legacy native masks directly,
|
||
|
// thus we add AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO here.
|
||
|
case AudioChannelLayout.VOICE_UPLINK_MONO:
|
||
|
return AudioFormat.CHANNEL_IN_VOICE_UPLINK
|
||
|
| AudioFormat.CHANNEL_IN_MONO;
|
||
|
case AudioChannelLayout.VOICE_DNLINK_MONO:
|
||
|
return AudioFormat.CHANNEL_IN_VOICE_DNLINK
|
||
|
| AudioFormat.CHANNEL_IN_MONO;
|
||
|
case AudioChannelLayout.VOICE_CALL_MONO:
|
||
|
return AudioFormat.CHANNEL_IN_VOICE_UPLINK
|
||
|
| AudioFormat.CHANNEL_IN_VOICE_DNLINK
|
||
|
| AudioFormat.CHANNEL_IN_MONO;
|
||
|
}
|
||
|
}
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
default:
|
||
|
return AudioFormat.CHANNEL_INVALID;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioConfig to SDK AudioFormat. */
|
||
|
public static @NonNull AudioFormat aidl2api_AudioConfig_AudioFormat(
|
||
|
@NonNull AudioConfig aidl, boolean isInput) {
|
||
|
// Only information from the encapsulated AudioConfigBase is used.
|
||
|
return aidl2api_AudioConfigBase_AudioFormat(aidl.base, isInput);
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioConfigBase to SDK AudioFormat. */
|
||
|
public static @NonNull AudioFormat aidl2api_AudioConfigBase_AudioFormat(
|
||
|
@NonNull AudioConfigBase aidl, boolean isInput) {
|
||
|
AudioFormat.Builder apiBuilder = new AudioFormat.Builder();
|
||
|
apiBuilder.setSampleRate(aidl.sampleRate);
|
||
|
if (aidl.channelMask.getTag() != AudioChannelLayout.indexMask) {
|
||
|
apiBuilder.setChannelMask(aidl2api_AudioChannelLayout_AudioFormatChannelMask(
|
||
|
aidl.channelMask, isInput));
|
||
|
} else {
|
||
|
apiBuilder.setChannelIndexMask(aidl2api_AudioChannelLayout_AudioFormatChannelMask(
|
||
|
aidl.channelMask, isInput));
|
||
|
}
|
||
|
apiBuilder.setEncoding(aidl2api_AudioFormat_AudioFormatEncoding(aidl.format));
|
||
|
return apiBuilder.build();
|
||
|
}
|
||
|
|
||
|
/** Convert from AIDL AudioFormat to SDK AudioFormat.ENCODING_*. */
|
||
|
public static int aidl2api_AudioFormat_AudioFormatEncoding(
|
||
|
@NonNull AudioFormatDescription aidl) {
|
||
|
switch (aidl.type) {
|
||
|
case AudioFormatType.PCM:
|
||
|
switch (aidl.pcm) {
|
||
|
case PcmType.UINT_8_BIT:
|
||
|
return AudioFormat.ENCODING_PCM_8BIT;
|
||
|
case PcmType.INT_16_BIT:
|
||
|
return AudioFormat.ENCODING_PCM_16BIT;
|
||
|
case PcmType.INT_32_BIT:
|
||
|
return AudioFormat.ENCODING_PCM_32BIT;
|
||
|
case PcmType.FIXED_Q_8_24:
|
||
|
case PcmType.FLOAT_32_BIT:
|
||
|
return AudioFormat.ENCODING_PCM_FLOAT;
|
||
|
case PcmType.INT_24_BIT:
|
||
|
return AudioFormat.ENCODING_PCM_24BIT_PACKED;
|
||
|
default:
|
||
|
return AudioFormat.ENCODING_INVALID;
|
||
|
}
|
||
|
case AudioFormatType.NON_PCM: // same as DEFAULT
|
||
|
if (aidl.encoding != null && !aidl.encoding.isEmpty()) {
|
||
|
if (MediaFormat.MIMETYPE_AUDIO_AC3.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AC3;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_EAC3.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_E_AC3;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DTS.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_DTS;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DTS_HD.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_DTS_HD;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_MPEG.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_MP3;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AAC_LC.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AAC_LC;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AAC_HE_V1.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AAC_HE_V1;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AAC_HE_V2.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AAC_HE_V2;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_IEC61937.equals(aidl.encoding)
|
||
|
&& aidl.pcm == PcmType.INT_16_BIT) {
|
||
|
return AudioFormat.ENCODING_IEC61937;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DOLBY_TRUEHD.equals(
|
||
|
aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_DOLBY_TRUEHD;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AAC_ELD.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AAC_ELD;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AAC_XHE.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AAC_XHE;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_AC4.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_AC4;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_EAC3_JOC.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_E_AC3_JOC;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DOLBY_MAT.equals(aidl.encoding)
|
||
|
|| aidl.encoding.startsWith(
|
||
|
MediaFormat.MIMETYPE_AUDIO_DOLBY_MAT + ".")) {
|
||
|
return AudioFormat.ENCODING_DOLBY_MAT;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_OPUS.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_OPUS;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_MPEGH_BL_L3.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_MPEGH_BL_L3;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_MPEGH_BL_L4.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_MPEGH_BL_L4;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_MPEGH_LC_L3.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_MPEGH_LC_L3;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_MPEGH_LC_L4.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_MPEGH_LC_L4;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DTS_UHD.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_DTS_UHD_P1;
|
||
|
} else if (MediaFormat.MIMETYPE_AUDIO_DRA.equals(aidl.encoding)) {
|
||
|
return AudioFormat.ENCODING_DRA;
|
||
|
} else {
|
||
|
return AudioFormat.ENCODING_INVALID;
|
||
|
}
|
||
|
} else {
|
||
|
return AudioFormat.ENCODING_DEFAULT;
|
||
|
}
|
||
|
case AudioFormatType.SYS_RESERVED_INVALID:
|
||
|
default:
|
||
|
return AudioFormat.ENCODING_INVALID;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK AudioDeviceAttributes to AIDL AudioPort.
|
||
|
*/
|
||
|
public static AudioPort api2aidl_AudioDeviceAttributes_AudioPort(
|
||
|
@NonNull AudioDeviceAttributes attributes) {
|
||
|
AudioPort port = new AudioPort();
|
||
|
port.name = attributes.getName();
|
||
|
// TO DO: b/211611504 Convert attributes.getAudioProfiles() to AIDL as well.
|
||
|
port.profiles = new AudioProfile[]{};
|
||
|
port.extraAudioDescriptors = attributes.getAudioDescriptors().stream()
|
||
|
.map(descriptor -> api2aidl_AudioDescriptor_ExtraAudioDescriptor(descriptor))
|
||
|
.collect(Collectors.toList()).toArray(ExtraAudioDescriptor[]::new);
|
||
|
port.flags = new AudioIoFlags();
|
||
|
port.gains = new AudioGain[]{};
|
||
|
AudioPortDeviceExt deviceExt = new AudioPortDeviceExt();
|
||
|
deviceExt.device = new AudioDevice();
|
||
|
deviceExt.encodedFormats = new AudioFormatDescription[]{};
|
||
|
deviceExt.device.type =
|
||
|
api2aidl_NativeType_AudioDeviceDescription(attributes.getInternalType());
|
||
|
deviceExt.device.address = AudioDeviceAddress.id(attributes.getAddress());
|
||
|
port.ext = AudioPortExt.device(deviceExt);
|
||
|
return port;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK AudioDescriptor to AIDL ExtraAudioDescriptor.
|
||
|
*/
|
||
|
public static ExtraAudioDescriptor api2aidl_AudioDescriptor_ExtraAudioDescriptor(
|
||
|
@NonNull AudioDescriptor descriptor) {
|
||
|
ExtraAudioDescriptor extraDescriptor = new ExtraAudioDescriptor();
|
||
|
extraDescriptor.standard =
|
||
|
api2aidl_AudioDescriptorStandard_AudioStandard(descriptor.getStandard());
|
||
|
extraDescriptor.audioDescriptor = descriptor.getDescriptor();
|
||
|
extraDescriptor.encapsulationType =
|
||
|
api2aidl_AudioProfileEncapsulationType_AudioEncapsulationType(
|
||
|
descriptor.getEncapsulationType());
|
||
|
return extraDescriptor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK AudioDescriptor to AIDL ExtraAudioDescriptor.
|
||
|
*/
|
||
|
public static @NonNull AudioDescriptor aidl2api_ExtraAudioDescriptor_AudioDescriptor(
|
||
|
@NonNull ExtraAudioDescriptor extraDescriptor) {
|
||
|
AudioDescriptor descriptor = new AudioDescriptor(
|
||
|
aidl2api_AudioStandard_AudioDescriptorStandard(extraDescriptor.standard),
|
||
|
aidl2api_AudioEncapsulationType_AudioProfileEncapsulationType(
|
||
|
extraDescriptor.encapsulationType),
|
||
|
extraDescriptor.audioDescriptor);
|
||
|
return descriptor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK AudioDescriptor#mStandard to AIDL AudioStandard
|
||
|
*/
|
||
|
@AudioStandard
|
||
|
public static int api2aidl_AudioDescriptorStandard_AudioStandard(
|
||
|
@AudioDescriptor.AudioDescriptorStandard int standard) {
|
||
|
switch (standard) {
|
||
|
case AudioDescriptor.STANDARD_EDID:
|
||
|
return AudioStandard.EDID;
|
||
|
case AudioDescriptor.STANDARD_SADB:
|
||
|
return AudioStandard.SADB;
|
||
|
case AudioDescriptor.STANDARD_VSADB:
|
||
|
return AudioStandard.VSADB;
|
||
|
case AudioDescriptor.STANDARD_NONE:
|
||
|
default:
|
||
|
return AudioStandard.NONE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from AIDL AudioStandard to SDK AudioDescriptor#mStandard
|
||
|
*/
|
||
|
@AudioDescriptor.AudioDescriptorStandard
|
||
|
public static int aidl2api_AudioStandard_AudioDescriptorStandard(@AudioStandard int standard) {
|
||
|
switch (standard) {
|
||
|
case AudioStandard.EDID:
|
||
|
return AudioDescriptor.STANDARD_EDID;
|
||
|
case AudioStandard.SADB:
|
||
|
return AudioDescriptor.STANDARD_SADB;
|
||
|
case AudioStandard.VSADB:
|
||
|
return AudioDescriptor.STANDARD_VSADB;
|
||
|
case AudioStandard.NONE:
|
||
|
default:
|
||
|
return AudioDescriptor.STANDARD_NONE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK AudioProfile.EncapsulationType to AIDL AudioEncapsulationType
|
||
|
*/
|
||
|
@AudioEncapsulationType
|
||
|
public static int api2aidl_AudioProfileEncapsulationType_AudioEncapsulationType(
|
||
|
@android.media.AudioProfile.EncapsulationType int type) {
|
||
|
switch (type) {
|
||
|
case android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_IEC61937:
|
||
|
return AudioEncapsulationType.IEC61937;
|
||
|
case android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_PCM:
|
||
|
return AudioEncapsulationType.PCM;
|
||
|
case android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_NONE:
|
||
|
default:
|
||
|
return AudioEncapsulationType.NONE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from AIDL AudioEncapsulationType to SDK AudioProfile.EncapsulationType
|
||
|
*/
|
||
|
@android.media.AudioProfile.EncapsulationType
|
||
|
public static int aidl2api_AudioEncapsulationType_AudioProfileEncapsulationType(
|
||
|
@AudioEncapsulationType int type) {
|
||
|
switch (type) {
|
||
|
case AudioEncapsulationType.IEC61937:
|
||
|
return android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_IEC61937;
|
||
|
case AudioEncapsulationType.PCM:
|
||
|
return android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_PCM;
|
||
|
case AudioEncapsulationType.NONE:
|
||
|
default:
|
||
|
return android.media.AudioProfile.AUDIO_ENCAPSULATION_TYPE_NONE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert from SDK native type to AIDL AudioDeviceDescription
|
||
|
*/
|
||
|
public static AudioDeviceDescription api2aidl_NativeType_AudioDeviceDescription(
|
||
|
int nativeType) {
|
||
|
AudioDeviceDescription aidl = new AudioDeviceDescription();
|
||
|
aidl.connection = "";
|
||
|
switch (nativeType) {
|
||
|
case AudioSystem.DEVICE_OUT_EARPIECE:
|
||
|
aidl.type = AudioDeviceType.OUT_SPEAKER_EARPIECE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_SPEAKER:
|
||
|
aidl.type = AudioDeviceType.OUT_SPEAKER;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_WIRED_HEADPHONE:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADPHONE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_SCO:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_SCO;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
|
||
|
aidl.type = AudioDeviceType.OUT_CARKIT;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_SCO;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADPHONE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_A2DP;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER:
|
||
|
aidl.type = AudioDeviceType.OUT_SPEAKER;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_A2DP;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_TELEPHONY_TX:
|
||
|
aidl.type = AudioDeviceType.OUT_TELEPHONY_TX;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_AUX_LINE:
|
||
|
aidl.type = AudioDeviceType.OUT_LINE_AUX;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_SPEAKER_SAFE:
|
||
|
aidl.type = AudioDeviceType.OUT_SPEAKER_SAFE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_HEARING_AID:
|
||
|
aidl.type = AudioDeviceType.OUT_HEARING_AID;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_WIRELESS;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_ECHO_CANCELLER:
|
||
|
aidl.type = AudioDeviceType.OUT_ECHO_CANCELLER;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLE_SPEAKER:
|
||
|
aidl.type = AudioDeviceType.OUT_SPEAKER;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_LE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLE_BROADCAST:
|
||
|
aidl.type = AudioDeviceType.OUT_BROADCAST;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_LE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BUILTIN_MIC:
|
||
|
aidl.type = AudioDeviceType.IN_MICROPHONE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BACK_MIC:
|
||
|
aidl.type = AudioDeviceType.IN_MICROPHONE_BACK;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_TELEPHONY_RX:
|
||
|
aidl.type = AudioDeviceType.IN_TELEPHONY_RX;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_TV_TUNER:
|
||
|
aidl.type = AudioDeviceType.IN_TV_TUNER;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_LOOPBACK:
|
||
|
aidl.type = AudioDeviceType.IN_LOOPBACK;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BLUETOOTH_BLE:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_LE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_ECHO_REFERENCE:
|
||
|
aidl.type = AudioDeviceType.IN_ECHO_REFERENCE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_WIRED_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_WIRED_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_SCO;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_SCO;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_HDMI:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_HDMI:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_REMOTE_SUBMIX:
|
||
|
aidl.type = AudioDeviceType.IN_SUBMIX;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_REMOTE_SUBMIX:
|
||
|
aidl.type = AudioDeviceType.OUT_SUBMIX;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_ANLG_DOCK_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_DOCK;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_DOCK;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_DGTL_DOCK_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_DOCK;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_DOCK;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_USB_ACCESSORY:
|
||
|
aidl.type = AudioDeviceType.IN_ACCESSORY;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_USB_ACCESSORY:
|
||
|
aidl.type = AudioDeviceType.OUT_ACCESSORY;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_USB_DEVICE:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_USB_DEVICE:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_FM_TUNER:
|
||
|
aidl.type = AudioDeviceType.IN_FM_TUNER;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_FM:
|
||
|
aidl.type = AudioDeviceType.OUT_FM;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_LINE:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_LINE:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_ANALOG;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_SPDIF:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_SPDIF;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_SPDIF:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_SPDIF;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BLUETOOTH_A2DP:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_A2DP;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_A2DP;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_IP:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_IP_V4;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_IP:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_IP_V4;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BUS:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BUS;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BUS:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BUS;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_PROXY:
|
||
|
aidl.type = AudioDeviceType.IN_AFE_PROXY;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_PROXY:
|
||
|
aidl.type = AudioDeviceType.OUT_AFE_PROXY;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_USB_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_USB_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_USB;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_HDMI_ARC:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI_ARC;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_HDMI_ARC:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI_ARC;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_HDMI_EARC:
|
||
|
aidl.type = AudioDeviceType.IN_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI_EARC;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_HDMI_EARC:
|
||
|
aidl.type = AudioDeviceType.OUT_DEVICE;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_HDMI_EARC;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_BLE_HEADSET:
|
||
|
aidl.type = AudioDeviceType.IN_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_LE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_BLE_HEADSET:
|
||
|
aidl.type = AudioDeviceType.OUT_HEADSET;
|
||
|
aidl.connection = AudioDeviceDescription.CONNECTION_BT_LE;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_IN_DEFAULT:
|
||
|
aidl.type = AudioDeviceType.IN_DEFAULT;
|
||
|
break;
|
||
|
case AudioSystem.DEVICE_OUT_DEFAULT:
|
||
|
aidl.type = AudioDeviceType.OUT_DEFAULT;
|
||
|
break;
|
||
|
default:
|
||
|
aidl.type = AudioDeviceType.NONE;
|
||
|
}
|
||
|
return aidl;
|
||
|
}
|
||
|
|
||
|
private static native int aidl2legacy_AudioChannelLayout_Parcel_audio_channel_mask_t(
|
||
|
Parcel aidl, boolean isInput);
|
||
|
private static native Parcel legacy2aidl_audio_channel_mask_t_AudioChannelLayout_Parcel(
|
||
|
int legacy, boolean isInput);
|
||
|
private static native int aidl2legacy_AudioFormatDescription_Parcel_audio_format_t(
|
||
|
Parcel aidl);
|
||
|
private static native Parcel legacy2aidl_audio_format_t_AudioFormatDescription_Parcel(
|
||
|
int legacy);
|
||
|
}
|