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

Commit 253b5e90 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add vendorExtension implementation for all unknown parameters"

parents d1265b9a da4a6404
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