Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82e5693d authored by jiabin's avatar jiabin
Browse files

Add SAD to AudioPort and encapsulation type to AudioProfile.

Short audio descriptor(SAD) is defined in HDMI specification 1.4b
section 7 that is used to describe the audio capabilities over HDMI.

The encapsulation types represent the encapsulation formats that must be
used when sending the audio data with the format associated with the
AudioProfile to Android.

Bug: 131736540
Bug: 178619392
Test: atest AudioManagerTes
Change-Id: Ie9ab83c8147edfe211363d9676e9cb04dda5b489
parent ac77b699
Loading
Loading
Loading
Loading
+105 −0
Original line number Diff line number Diff line
@@ -1918,6 +1918,9 @@ aidl2legacy_AudioProfile_audio_profile(const media::AudioProfile& aidl) {
            convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
                         aidl2legacy_int32_t_audio_channel_mask_t));
    legacy.num_channel_masks = aidl.channelMasks.size();

    legacy.encapsulation_type = VALUE_OR_RETURN(
            aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(aidl.encapsulationType));
    return legacy;
}

@@ -1941,6 +1944,10 @@ legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy) {
            convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
                         std::back_inserter(aidl.channelMasks),
                         legacy2aidl_audio_channel_mask_t_int32_t));

    aidl.encapsulationType = VALUE_OR_RETURN(
            legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
                    legacy.encapsulation_type));
    return aidl;
}

@@ -1989,6 +1996,15 @@ aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
                                 aidl2legacy_AudioProfile_audio_profile));
    legacy.num_audio_profiles = aidl.profiles.size();

    if (aidl.extraAudioDescriptors.size() > std::size(legacy.extra_audio_descriptors)) {
        return unexpected(BAD_VALUE);
    }
    RETURN_IF_ERROR(
            convertRange(aidl.extraAudioDescriptors.begin(), aidl.extraAudioDescriptors.end(),
                         legacy.extra_audio_descriptors,
                         aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor));
    legacy.num_extra_audio_descriptors = aidl.extraAudioDescriptors.size();

    if (aidl.gains.size() > std::size(legacy.gains)) {
        return unexpected(BAD_VALUE);
    }
@@ -2018,6 +2034,15 @@ legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
                         std::back_inserter(aidl.profiles),
                         legacy2aidl_audio_profile_AudioProfile));

    if (legacy.num_extra_audio_descriptors > std::size(legacy.extra_audio_descriptors)) {
        return unexpected(BAD_VALUE);
    }
    RETURN_IF_ERROR(
            convertRange(legacy.extra_audio_descriptors,
                    legacy.extra_audio_descriptors + legacy.num_extra_audio_descriptors,
                    std::back_inserter(aidl.extraAudioDescriptors),
                    legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor));

    if (legacy.num_gains > std::size(legacy.gains)) {
        return unexpected(BAD_VALUE);
    }
@@ -2218,4 +2243,84 @@ legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t&
    return aidl;
}

ConversionResult<audio_standard_t>
aidl2legacy_AudioStandard_audio_standard_t(media::AudioStandard aidl) {
    switch (aidl) {
        case media::AudioStandard::NONE:
            return AUDIO_STANDARD_NONE;
        case media::AudioStandard::EDID:
            return AUDIO_STANDARD_EDID;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<media::AudioStandard>
legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy) {
    switch (legacy) {
        case AUDIO_STANDARD_NONE:
            return media::AudioStandard::NONE;
        case AUDIO_STANDARD_EDID:
            return media::AudioStandard::EDID;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<audio_extra_audio_descriptor>
aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(
        const media::ExtraAudioDescriptor& aidl) {
    audio_extra_audio_descriptor legacy;
    legacy.standard = VALUE_OR_RETURN(aidl2legacy_AudioStandard_audio_standard_t(aidl.standard));
    if (aidl.audioDescriptor.size() > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
        return unexpected(BAD_VALUE);
    }
    legacy.descriptor_length = aidl.audioDescriptor.size();
    std::copy(aidl.audioDescriptor.begin(), aidl.audioDescriptor.end(),
              std::begin(legacy.descriptor));
    legacy.encapsulation_type =
            VALUE_OR_RETURN(aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
                    aidl.encapsulationType));
    return legacy;
}

ConversionResult<media::ExtraAudioDescriptor>
legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(
        const audio_extra_audio_descriptor& legacy) {
    media::ExtraAudioDescriptor aidl;
    aidl.standard = VALUE_OR_RETURN(legacy2aidl_audio_standard_t_AudioStandard(legacy.standard));
    if (legacy.descriptor_length > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
        return unexpected(BAD_VALUE);
    }
    aidl.audioDescriptor.resize(legacy.descriptor_length);
    std::copy(legacy.descriptor, legacy.descriptor + legacy.descriptor_length,
              aidl.audioDescriptor.begin());
    aidl.encapsulationType =
            VALUE_OR_RETURN(legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
                    legacy.encapsulation_type));
    return aidl;
}

ConversionResult<audio_encapsulation_type_t>
aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
        const media::AudioEncapsulationType& aidl) {
    switch (aidl) {
        case media::AudioEncapsulationType::NONE:
            return AUDIO_ENCAPSULATION_TYPE_NONE;
        case media::AudioEncapsulationType::IEC61937:
            return AUDIO_ENCAPSULATION_TYPE_IEC61937;
    }
    return unexpected(BAD_VALUE);
}

ConversionResult<media::AudioEncapsulationType>
legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
        const audio_encapsulation_type_t & legacy) {
    switch (legacy) {
        case AUDIO_ENCAPSULATION_TYPE_NONE:
            return media::AudioEncapsulationType::NONE;
        case AUDIO_ENCAPSULATION_TYPE_IEC61937:
            return media::AudioEncapsulationType::IEC61937;
    }
    return unexpected(BAD_VALUE);
}

}  // namespace android
+3 −0
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ aidl_interface {
        "aidl/android/media/AudioDualMonoMode.aidl",
        "aidl/android/media/AudioEncapsulationMode.aidl",
        "aidl/android/media/AudioEncapsulationMetadataType.aidl",
        "aidl/android/media/AudioEncapsulationType.aidl",
        "aidl/android/media/AudioFlag.aidl",
        "aidl/android/media/AudioGain.aidl",
        "aidl/android/media/AudioGainConfig.aidl",
@@ -341,12 +342,14 @@ aidl_interface {
        "aidl/android/media/AudioPortType.aidl",
        "aidl/android/media/AudioProfile.aidl",
        "aidl/android/media/AudioSourceType.aidl",
        "aidl/android/media/AudioStandard.aidl",
        "aidl/android/media/AudioStreamType.aidl",
        "aidl/android/media/AudioTimestampInternal.aidl",
        "aidl/android/media/AudioUniqueIdUse.aidl",
        "aidl/android/media/AudioUsage.aidl",
        "aidl/android/media/AudioUuid.aidl",
        "aidl/android/media/EffectDescriptor.aidl",
        "aidl/android/media/ExtraAudioDescriptor.aidl",
    ],
    imports: [
        "audio_common-aidl",
+29 −0
Original line number Diff line number Diff line
/*
 * 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 encapsulation type is used to describe if the audio data should be sent with a particular
 * encapsulation type or not.
 *
 * {@hide}
 */
@Backing(type="int")
enum AudioEncapsulationType {
    NONE     = 0,
    IEC61937 = 1,
}
 No newline at end of file
+6 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.media.AudioPortExt;
import android.media.AudioPortRole;
import android.media.AudioPortType;
import android.media.AudioProfile;
import android.media.ExtraAudioDescriptor;

/**
 * {@hide}
@@ -36,6 +37,11 @@ parcelable AudioPort {
    @utf8InCpp String name;
    /** AudioProfiles supported by this port (format, Rates, Channels). */
    AudioProfile[] profiles;
    /**
     * ExtraAudioDescriptors supported by this port. The format is not unrecognized to the
     * platform. The audio capability is described by a hardware descriptor.
     */
    ExtraAudioDescriptor[] extraAudioDescriptors;
    /** Gain controllers. */
    AudioGain[] gains;
    /** Current audio port configuration. */
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.media;

import android.media.AudioEncapsulationType;
import android.media.audio.common.AudioFormat;

/**
@@ -31,4 +32,5 @@ parcelable AudioProfile {
    boolean isDynamicFormat;
    boolean isDynamicChannels;
    boolean isDynamicRate;
    AudioEncapsulationType encapsulationType;
}
Loading