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

Commit da4a6404 authored by Shunkai Yao's avatar Shunkai Yao
Browse files

Add vendorExtension implementation for all unknown parameters

Only pass the parameter and data part of effect_param_t
Use ParcelableHolder as extension parameter ID

Bug: 271601435
Test: Build, atest VtsHalAudioEffectTargetTest
Change-Id: Ida11c20a1f681a8b99801eda54d5b500621ff8fd
parent 9a4e2bf6
Loading
Loading
Loading
Loading
+49 −32
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ using ::aidl::android::hardware::audio::effect::Visualizer;
using ::aidl::android::media::audio::common::AudioDeviceDescription;
using ::aidl::android::media::audio::common::AudioDeviceDescription;


using ::android::BAD_VALUE;
using ::android::BAD_VALUE;
using ::android::OK;
using ::android::base::unexpected;
using ::android::base::unexpected;
using ::android::effect::utils::EffectParamReader;
using ::android::effect::utils::EffectParamReader;
using ::android::effect::utils::EffectParamWriter;
using ::android::effect::utils::EffectParamWriter;
@@ -407,50 +408,66 @@ legacy2aidl_Parameter_Visualizer_uint32_MeasurementMode(uint32_t legacy) {
}
}


/**
/**
 * Copy the entire effect_param_t to DefaultExtension::bytes.
 * Copy the parameter area of effect_param_t to DefaultExtension::bytes.
 */
 */
ConversionResult<Parameter> legacy2aidl_EffectParameterReader_ParameterExtension(
ConversionResult<VendorExtension> legacy2aidl_EffectParameterReader_Param_VendorExtension(
        EffectParamReader& param) {
        EffectParamReader& param) {
    size_t len = param.getTotalSize();
    size_t len = param.getParameterSize();
    DefaultExtension ext;
    DefaultExtension defaultExt;
    ext.bytes.resize(len);
    defaultExt.bytes.resize(len);
    std::memcpy(ext.bytes.data(), &param.getEffectParam(), len);
    RETURN_IF_ERROR(param.readFromParameter(defaultExt.bytes.data(), len));


    VendorExtension effectParam;
    VendorExtension ext;
    effectParam.extension.setParcelable(ext);
    ext.extension.setParcelable(defaultExt);
    return UNION_MAKE(Parameter, specific,
    return ext;
                      UNION_MAKE(Parameter::Specific, vendorEffect, effectParam));
}
}


ConversionResult<std::vector<uint8_t>> aidl2legacy_ParameterExtension_vector_uint8(
/**
        const Parameter& param) {
 * Copy the data area of effect_param_t to DefaultExtension::bytes.
    VendorExtension effectParam = VALUE_OR_RETURN(
 */
            (::aidl::android::getParameterSpecific<Parameter, VendorExtension,
ConversionResult<VendorExtension> legacy2aidl_EffectParameterReader_Data_VendorExtension(
                                                   Parameter::Specific::vendorEffect>(param)));
        EffectParamReader& param) {
    std::optional<DefaultExtension> ext;
    size_t len = param.getValueSize();
    if (STATUS_OK != effectParam.extension.getParcelable(&ext) || !ext.has_value()) {
    DefaultExtension defaultExt;
    defaultExt.bytes.resize(len);
    RETURN_IF_ERROR(param.readFromValue(defaultExt.bytes.data(), len));

    VendorExtension ext;
    ext.extension.setParcelable(defaultExt);
    return ext;
}

/**
 * Copy DefaultExtension::bytes to the data area of effect_param_t.
 */
ConversionResult<status_t> aidl2legacy_VendorExtension_EffectParameterWriter_Data(
        EffectParamWriter& param, VendorExtension ext) {
    std::optional<DefaultExtension> defaultExt;
    RETURN_IF_ERROR(ext.extension.getParcelable(&defaultExt));
    if (!defaultExt.has_value()) {
        return unexpected(BAD_VALUE);
        return unexpected(BAD_VALUE);
    }
    }
    return ext.value().bytes;

    RETURN_IF_ERROR(param.writeToValue(defaultExt->bytes.data(), defaultExt->bytes.size()));

    return OK;
}

ConversionResult<Parameter> legacy2aidl_EffectParameterReader_ParameterExtension(
        EffectParamReader& param) {
    VendorExtension ext =
            VALUE_OR_RETURN(legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
    return UNION_MAKE(Parameter, specific, UNION_MAKE(Parameter::Specific, vendorEffect, ext));
}
}


ConversionResult<::android::status_t> aidl2legacy_ParameterExtension_EffectParameterWriter(
ConversionResult<::android::status_t> aidl2legacy_ParameterExtension_EffectParameterWriter(
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        EffectParamWriter& legacy) {
        EffectParamWriter& legacy) {
    const std::vector<uint8_t>& extBytes = VALUE_OR_RETURN_STATUS(
    VendorExtension ext = VALUE_OR_RETURN(
            ::aidl::android::aidl2legacy_ParameterExtension_vector_uint8(aidl));
            (::aidl::android::getParameterSpecific<Parameter, VendorExtension,
    if (legacy.getTotalSize() < extBytes.size()) {
                                                   Parameter::Specific::vendorEffect>(aidl)));
        legacy.setStatus(BAD_VALUE);
    return VALUE_OR_RETURN_STATUS(
        return unexpected(BAD_VALUE);
            aidl2legacy_VendorExtension_EffectParameterWriter_Data(legacy, ext));
    }

    // create a reader wrapper and read the content to legacy EffectParamWriter
    EffectParamReader reader(*(effect_param_t*)extBytes.data());
    if (STATUS_OK != legacy.writeToValue(reader.getValueAddress(), reader.getValueSize())) {
        legacy.setStatus(BAD_VALUE);
        return unexpected(BAD_VALUE);
    }
    return STATUS_OK;
}
}


}  // namespace android
}  // namespace android
+47 −15
Original line number Original line Diff line number Diff line
@@ -46,19 +46,39 @@ ConversionResult<F> getParameterSpecificField(const P& u) {
    return VALUE_OR_RETURN((unionGetField<T, field>(spec)));
    return VALUE_OR_RETURN((unionGetField<T, field>(spec)));
}
}


#define GET_PARAMETER_SPECIFIC_FIELD(u, specific, tag, field, fieldType)                        \
#define GET_PARAMETER_SPECIFIC_FIELD(_u, _effect, _tag, _field, _fieldType)                      \
    getParameterSpecificField<std::decay_t<decltype(u)>, specific,                              \
    getParameterSpecificField<std::decay_t<decltype(_u)>, _effect,                               \
                              aidl::android::hardware::audio::effect::Parameter::Specific::tag, \
                              aidl::android::hardware::audio::effect::Parameter::Specific::_tag, \
                              specific::field, fieldType>(u)
                              _effect::_field, _fieldType>(_u)


#define MAKE_SPECIFIC_PARAMETER(spec, tag, field, value)                                    \
#define MAKE_SPECIFIC_PARAMETER(_spec, _tag, _field, _value)                                 \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter, specific,                  \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter, specific,                  \
               UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Specific, tag, \
               UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Specific, _tag, \
                          UNION_MAKE(spec, field, value)))
                          UNION_MAKE(_spec, _field, _value)))


#define MAKE_SPECIFIC_PARAMETER_ID(spec, tag, field)                       \
#define MAKE_SPECIFIC_PARAMETER_ID(_spec, _tag, _field)                     \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Id, tag, \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Id, _tag, \
               UNION_MAKE(spec::Id, commonTag, field))
               UNION_MAKE(_spec::Id, commonTag, _field))

#define MAKE_EXTENSION_PARAMETER_ID(_effect, _tag, _field)                  \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Id, _tag, \
               UNION_MAKE(_effect::Id, vendorExtensionTag, _field))

#define VENDOR_EXTENSION_GET_AND_RETURN(_effect, _tag, _param)                                    \
    {                                                                                             \
        aidl::android::hardware::audio::effect::VendorExtension _extId = VALUE_OR_RETURN_STATUS(  \
                aidl::android::legacy2aidl_EffectParameterReader_Param_VendorExtension(_param));  \
        aidl::android::hardware::audio::effect::Parameter::Id _id =                               \
                MAKE_EXTENSION_PARAMETER_ID(_effect, _tag##Tag, _extId);                          \
        aidl::android::hardware::audio::effect::Parameter _aidlParam;                             \
        RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(_id, &_aidlParam))); \
        aidl::android::hardware::audio::effect::VendorExtension _ext =                            \
                VALUE_OR_RETURN_STATUS(GET_PARAMETER_SPECIFIC_FIELD(                              \
                        _aidlParam, _effect, _tag, _effect::vendor, VendorExtension));            \
        return VALUE_OR_RETURN_STATUS(                                                            \
                aidl::android::aidl2legacy_ParameterExtension_EffectParameterWriter(_aidlParam,   \
                                                                                    _param));     \
    }


ConversionResult<uint32_t> aidl2legacy_Flags_Type_uint32(
ConversionResult<uint32_t> aidl2legacy_Flags_Type_uint32(
        ::aidl::android::hardware::audio::effect::Flags::Type type);
        ::aidl::android::hardware::audio::effect::Flags::Type type);
@@ -140,11 +160,23 @@ legacy2aidl_Parameter_Visualizer_uint32_MeasurementMode(uint32_t legacy);
ConversionResult<::aidl::android::hardware::audio::effect::Parameter>
ConversionResult<::aidl::android::hardware::audio::effect::Parameter>
legacy2aidl_EffectParameterReader_ParameterExtension(
legacy2aidl_EffectParameterReader_ParameterExtension(
        ::android::effect::utils::EffectParamReader& param);
        ::android::effect::utils::EffectParamReader& param);
ConversionResult<std::vector<uint8_t>> aidl2legacy_ParameterExtension_vector_uint8(
        const ::aidl::android::hardware::audio::effect::Parameter& legacy);
ConversionResult<::android::status_t> aidl2legacy_ParameterExtension_EffectParameterWriter(
ConversionResult<::android::status_t> aidl2legacy_ParameterExtension_EffectParameterWriter(
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        ::android::effect::utils::EffectParamWriter& legacy);
        ::android::effect::utils::EffectParamWriter& legacy);


ConversionResult<::aidl::android::hardware::audio::effect::VendorExtension>
legacy2aidl_EffectParameterReader_Param_VendorExtension(
        ::android::effect::utils::EffectParamReader& param);
ConversionResult<::aidl::android::hardware::audio::effect::VendorExtension>
legacy2aidl_EffectParameterReader_Data_VendorExtension(
        ::android::effect::utils::EffectParamReader& param);

ConversionResult<::android::status_t> aidl2legacy_VendorExtension_EffectParameterWriter_Data(
        ::android::effect::utils::EffectParamWriter& param,
        ::aidl::android::hardware::audio::effect::VendorExtension ext);
ConversionResult<::aidl::android::hardware::audio::effect::Parameter>
legacy2aidl_EffectParameterReader_ParameterExtension(
        ::android::effect::utils::EffectParamReader& param);

}  // namespace android
}  // namespace android
}  // namespace aidl
}  // namespace aidl
+20 −12
Original line number Original line Diff line number Diff line
@@ -33,9 +33,11 @@
namespace android {
namespace android {
namespace effect {
namespace effect {


using ::aidl::android::getParameterSpecificField;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::VendorExtension;
using ::android::status_t;
using ::android::status_t;
using utils::EffectParamReader;
using utils::EffectParamReader;
using utils::EffectParamWriter;
using utils::EffectParamWriter;
@@ -64,8 +66,13 @@ status_t AidlConversionAec::setParameter(EffectParamReader& param) {
            break;
            break;
        }
        }
        default: {
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            // for vendor extension, copy data area to the DefaultExtension, parameter ignored
            return BAD_VALUE;
            VendorExtension ext = VALUE_OR_RETURN_STATUS(
                    aidl::android::legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
            aidlParam = MAKE_SPECIFIC_PARAMETER(AcousticEchoCanceler, acousticEchoCanceler, vendor,
                                                ext);
            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->setParameter(aidlParam)));
            break;
        }
        }
    }
    }


@@ -73,7 +80,7 @@ status_t AidlConversionAec::setParameter(EffectParamReader& param) {
}
}


status_t AidlConversionAec::getParameter(EffectParamWriter& param) {
status_t AidlConversionAec::getParameter(EffectParamWriter& param) {
    uint32_t type = 0, value = 0;
    uint32_t type = 0;
    if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
    if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
        OK != param.readFromParameter(&type)) {
        OK != param.readFromParameter(&type)) {
        param.setStatus(BAD_VALUE);
        param.setStatus(BAD_VALUE);
@@ -85,29 +92,30 @@ status_t AidlConversionAec::getParameter(EffectParamWriter& param) {
        case AEC_PARAM_ECHO_DELAY:
        case AEC_PARAM_ECHO_DELAY:
            FALLTHROUGH_INTENDED;
            FALLTHROUGH_INTENDED;
        case AEC_PARAM_PROPERTIES: {
        case AEC_PARAM_PROPERTIES: {
            int32_t delay = 0;
            Parameter::Id id =
            Parameter::Id id =
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                                               AcousticEchoCanceler::echoDelayUs);
                                               AcousticEchoCanceler::echoDelayUs);
            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
            value = VALUE_OR_RETURN_STATUS(
            delay = VALUE_OR_RETURN_STATUS(
                    aidl::android::aidl2legacy_Parameter_aec_uint32_echoDelay(aidlParam));
                    aidl::android::aidl2legacy_Parameter_aec_uint32_echoDelay(aidlParam));
            break;
            return param.writeToValue(&delay);
        }
        }
        case AEC_PARAM_MOBILE_MODE: {
        case AEC_PARAM_MOBILE_MODE: {
            int32_t mode = 0;
            Parameter::Id id =
            Parameter::Id id =
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                                               AcousticEchoCanceler::mobileMode);
                                               AcousticEchoCanceler::mobileMode);
            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
            RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mEffect->getParameter(id, &aidlParam)));
            value = VALUE_OR_RETURN_STATUS(
            mode = VALUE_OR_RETURN_STATUS(
                    aidl::android::aidl2legacy_Parameter_aec_uint32_mobileMode(aidlParam));
                    aidl::android::aidl2legacy_Parameter_aec_uint32_mobileMode(aidlParam));
            break;
            return param.writeToValue(&mode);
        }
        default: {
            // use vendor extension implementation, the first 32bits (param type) won't pass to HAL
            VENDOR_EXTENSION_GET_AND_RETURN(AcousticEchoCanceler, acousticEchoCanceler, param);
        }
        }
        default:
            // use vendor extension implementation
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            return BAD_VALUE;
    }
    }
    return param.writeToValue(&value);
}
}


} // namespace effect
} // namespace effect
+9 −5
Original line number Original line Diff line number Diff line
@@ -33,10 +33,11 @@
namespace android {
namespace android {
namespace effect {
namespace effect {


using ::aidl::android::getParameterSpecificField;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::hardware::audio::effect::AutomaticGainControlV1;
using ::aidl::android::hardware::audio::effect::AutomaticGainControlV1;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::getParameterSpecificField;
using ::aidl::android::hardware::audio::effect::VendorExtension;
using ::android::status_t;
using ::android::status_t;
using utils::EffectParamReader;
using utils::EffectParamReader;
using utils::EffectParamWriter;
using utils::EffectParamWriter;
@@ -88,8 +89,12 @@ status_t AidlConversionAgc1::setParameter(EffectParamReader& param) {
            return OK;
            return OK;
        }
        }
        default: {
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            // for vendor extension, copy data area to the DefaultExtension, parameter ignored
            return BAD_VALUE;
            VendorExtension ext = VALUE_OR_RETURN_STATUS(
                    aidl::android::legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
            Parameter aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV1,
                                                          automaticGainControlV1, vendor, ext);
            return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
        }
        }
    }
    }
}
}
@@ -150,8 +155,7 @@ status_t AidlConversionAgc1::getParameter(EffectParamWriter& param) {
            return OK;
            return OK;
        }
        }
        default: {
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            VENDOR_EXTENSION_GET_AND_RETURN(AutomaticGainControlV1, automaticGainControlV1, param);
            return BAD_VALUE;
        }
        }
    }
    }
}
}
+9 −4
Original line number Original line Diff line number Diff line
@@ -33,9 +33,11 @@
namespace android {
namespace android {
namespace effect {
namespace effect {


using ::aidl::android::getParameterSpecificField;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::hardware::audio::effect::AutomaticGainControlV2;
using ::aidl::android::hardware::audio::effect::AutomaticGainControlV2;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::VendorExtension;
using ::android::status_t;
using ::android::status_t;
using utils::EffectParamReader;
using utils::EffectParamReader;
using utils::EffectParamWriter;
using utils::EffectParamWriter;
@@ -65,8 +67,12 @@ status_t AidlConversionAgc2::setParameter(EffectParamReader& param) {
            break;
            break;
        }
        }
        default: {
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            // for vendor extension, copy data area to the DefaultExtension, parameter ignored
            return BAD_VALUE;
            VendorExtension ext = VALUE_OR_RETURN_STATUS(
                    aidl::android::legacy2aidl_EffectParameterReader_Data_VendorExtension(param));
            aidlParam = MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV2, automaticGainControlV2,
                                                vendor, ext);
            break;
        }
        }
    }
    }


@@ -110,8 +116,7 @@ status_t AidlConversionAgc2::getParameter(EffectParamWriter& param) {
            break;
            break;
        }
        }
        default: {
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            VENDOR_EXTENSION_GET_AND_RETURN(AutomaticGainControlV2, automaticGainControlV2, param);
            return BAD_VALUE;
        }
        }
    }
    }


Loading