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

Commit c2bdea7f authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add vendorExtension implementation for all unknown parameters" am: 253b5e90 am: 5d163838

parents a84da920 5d163838
Loading
Loading
Loading
Loading
+49 −32
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ using ::aidl::android::hardware::audio::effect::Visualizer;
using ::aidl::android::media::audio::common::AudioDeviceDescription;

using ::android::BAD_VALUE;
using ::android::OK;
using ::android::base::unexpected;
using ::android::effect::utils::EffectParamReader;
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) {
    size_t len = param.getTotalSize();
    DefaultExtension ext;
    ext.bytes.resize(len);
    std::memcpy(ext.bytes.data(), &param.getEffectParam(), len);
    size_t len = param.getParameterSize();
    DefaultExtension defaultExt;
    defaultExt.bytes.resize(len);
    RETURN_IF_ERROR(param.readFromParameter(defaultExt.bytes.data(), len));

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

ConversionResult<std::vector<uint8_t>> aidl2legacy_ParameterExtension_vector_uint8(
        const Parameter& param) {
    VendorExtension effectParam = VALUE_OR_RETURN(
            (::aidl::android::getParameterSpecific<Parameter, VendorExtension,
                                                   Parameter::Specific::vendorEffect>(param)));
    std::optional<DefaultExtension> ext;
    if (STATUS_OK != effectParam.extension.getParcelable(&ext) || !ext.has_value()) {
/**
 * Copy the data area of effect_param_t to DefaultExtension::bytes.
 */
ConversionResult<VendorExtension> legacy2aidl_EffectParameterReader_Data_VendorExtension(
        EffectParamReader& param) {
    size_t len = param.getValueSize();
    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 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(
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        EffectParamWriter& legacy) {
    const std::vector<uint8_t>& extBytes = VALUE_OR_RETURN_STATUS(
            ::aidl::android::aidl2legacy_ParameterExtension_vector_uint8(aidl));
    if (legacy.getTotalSize() < extBytes.size()) {
        legacy.setStatus(BAD_VALUE);
        return unexpected(BAD_VALUE);
    }

    // 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;
    VendorExtension ext = VALUE_OR_RETURN(
            (::aidl::android::getParameterSpecific<Parameter, VendorExtension,
                                                   Parameter::Specific::vendorEffect>(aidl)));
    return VALUE_OR_RETURN_STATUS(
            aidl2legacy_VendorExtension_EffectParameterWriter_Data(legacy, ext));
}

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

#define GET_PARAMETER_SPECIFIC_FIELD(u, specific, tag, field, fieldType)                        \
    getParameterSpecificField<std::decay_t<decltype(u)>, specific,                              \
                              aidl::android::hardware::audio::effect::Parameter::Specific::tag, \
                              specific::field, fieldType>(u)
#define GET_PARAMETER_SPECIFIC_FIELD(_u, _effect, _tag, _field, _fieldType)                      \
    getParameterSpecificField<std::decay_t<decltype(_u)>, _effect,                               \
                              aidl::android::hardware::audio::effect::Parameter::Specific::_tag, \
                              _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, tag, \
                          UNION_MAKE(spec, field, value)))

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

#define MAKE_SPECIFIC_PARAMETER_ID(_spec, _tag, _field)                     \
    UNION_MAKE(aidl::android::hardware::audio::effect::Parameter::Id, _tag, \
               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(
        ::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>
legacy2aidl_EffectParameterReader_ParameterExtension(
        ::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(
        const ::aidl::android::hardware::audio::effect::Parameter& aidl,
        ::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 aidl
+20 −12
Original line number Diff line number Diff line
@@ -33,9 +33,11 @@
namespace android {
namespace effect {

using ::aidl::android::getParameterSpecificField;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::VendorExtension;
using ::android::status_t;
using utils::EffectParamReader;
using utils::EffectParamWriter;
@@ -64,8 +66,13 @@ status_t AidlConversionAec::setParameter(EffectParamReader& param) {
            break;
        }
        default: {
            ALOGW("%s unknown param %s", __func__, param.toString().c_str());
            return BAD_VALUE;
            // for vendor extension, copy data area to the DefaultExtension, parameter ignored
            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) {
    uint32_t type = 0, value = 0;
    uint32_t type = 0;
    if (!param.validateParamValueSize(sizeof(uint32_t), sizeof(uint32_t)) ||
        OK != param.readFromParameter(&type)) {
        param.setStatus(BAD_VALUE);
@@ -85,29 +92,30 @@ status_t AidlConversionAec::getParameter(EffectParamWriter& param) {
        case AEC_PARAM_ECHO_DELAY:
            FALLTHROUGH_INTENDED;
        case AEC_PARAM_PROPERTIES: {
            int32_t delay = 0;
            Parameter::Id id =
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                                               AcousticEchoCanceler::echoDelayUs);
            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));
            break;
            return param.writeToValue(&delay);
        }
        case AEC_PARAM_MOBILE_MODE: {
            int32_t mode = 0;
            Parameter::Id id =
                    MAKE_SPECIFIC_PARAMETER_ID(AcousticEchoCanceler, acousticEchoCancelerTag,
                                               AcousticEchoCanceler::mobileMode);
            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));
            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
+9 −5
Original line number Diff line number Diff line
@@ -33,10 +33,11 @@
namespace android {
namespace effect {

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

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

Loading