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

Commit f508bd46 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

audiohal: Support 64-bit audioflinger with 32-bit hal

effect_config_t size depends on the architecture because it
uses pointers. Need to convert it into HIDL structure when
passing to HAL.

Test: build 64-bit af with 32-bit hal server in binderized mode
      run Play Music, apply effects

Change-Id: I16ff9cd3accc00b6cb30f86418880ca5b749fdad
parent 6ab60611
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -26,8 +26,12 @@
#include "HidlUtils.h"

using ::android::hardware::audio::effect::V2_0::AudioBuffer;
using ::android::hardware::audio::effect::V2_0::EffectBufferAccess;
using ::android::hardware::audio::effect::V2_0::EffectConfigParameters;
using ::android::hardware::audio::effect::V2_0::MessageQueueFlagBits;
using ::android::hardware::audio::effect::V2_0::Result;
using ::android::hardware::audio::common::V2_0::AudioChannelMask;
using ::android::hardware::audio::common::V2_0::AudioFormat;
using ::android::hardware::hidl_vec;
using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
@@ -56,6 +60,25 @@ void EffectHalHidl::effectDescriptorToHal(
            descriptor.implementor.data(), descriptor.implementor.size());
}

// TODO(mnaganov): These buffer conversion functions should be shared with Effect wrapper
// via HidlUtils. Move them there when hardware/interfaces will get un-frozen again.

// static
void EffectHalHidl::effectBufferConfigFromHal(
        const buffer_config_t& halConfig, EffectBufferConfig* config) {
    config->samplingRateHz = halConfig.samplingRate;
    config->channels = AudioChannelMask(halConfig.channels);
    config->format = AudioFormat(halConfig.format);
    config->accessMode = EffectBufferAccess(halConfig.accessMode);
    config->mask = EffectConfigParameters(halConfig.mask);
}

// static
void EffectHalHidl::effectConfigFromHal(const effect_config_t& halConfig, EffectConfig* config) {
    effectBufferConfigFromHal(halConfig.inputCfg, &config->inputCfg);
    effectBufferConfigFromHal(halConfig.outputCfg, &config->outputCfg);
}

// static
status_t EffectHalHidl::analyzeResult(const Result& result) {
    switch (result) {
@@ -166,6 +189,13 @@ status_t EffectHalHidl::setProcessBuffers() {
status_t EffectHalHidl::command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData,
        uint32_t *replySize, void *pReplyData) {
    if (mEffect == 0) return NO_INIT;

    // Special cases.
    if (cmdCode == EFFECT_CMD_SET_CONFIG || cmdCode == EFFECT_CMD_SET_CONFIG_REVERSE) {
        return setConfigImpl(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
    }

    // Common case.
    hidl_vec<uint8_t> hidlData;
    if (pCmdData != nullptr && cmdSize > 0) {
        hidlData.setToExternal(reinterpret_cast<uint8_t*>(pCmdData), cmdSize);
@@ -205,4 +235,30 @@ status_t EffectHalHidl::close() {
    return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION;
}

status_t EffectHalHidl::setConfigImpl(
        uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, uint32_t *replySize, void *pReplyData) {
    if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) ||
            replySize == NULL || *replySize != sizeof(int32_t) || pReplyData == NULL) {
        return BAD_VALUE;
    }
    const effect_config_t *halConfig = static_cast<effect_config_t*>(pCmdData);
    if (halConfig->inputCfg.bufferProvider.getBuffer != NULL ||
            halConfig->inputCfg.bufferProvider.releaseBuffer != NULL ||
            halConfig->outputCfg.bufferProvider.getBuffer != NULL ||
            halConfig->outputCfg.bufferProvider.releaseBuffer != NULL) {
        ALOGE("Buffer provider callbacks are not supported");
    }
    EffectConfig hidlConfig;
    effectConfigFromHal(*halConfig, &hidlConfig);
    Return<Result> ret = cmdCode == EFFECT_CMD_SET_CONFIG ?
            mEffect->setConfig(hidlConfig, nullptr, nullptr) :
            mEffect->setConfigReverse(hidlConfig, nullptr, nullptr);
    status_t result = FAILED_TRANSACTION;
    if (ret.isOk()) {
        result = analyzeResult(ret);
        *static_cast<int32_t*>(pReplyData) = result;
    }
    return result;
}

} // namespace android
+8 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <fmq/MessageQueue.h>
#include <system/audio_effect.h>

using ::android::hardware::audio::effect::V2_0::EffectBufferConfig;
using ::android::hardware::audio::effect::V2_0::EffectConfig;
using ::android::hardware::audio::effect::V2_0::EffectDescriptor;
using ::android::hardware::audio::effect::V2_0::IEffect;
using ::android::hardware::EventFlag;
@@ -75,6 +77,9 @@ class EffectHalHidl : public EffectHalInterface
    EventFlag* mEfGroup;

    static status_t analyzeResult(const hardware::audio::effect::V2_0::Result& result);
    static void effectBufferConfigFromHal(
            const buffer_config_t& halConfig, EffectBufferConfig* config);
    static void effectConfigFromHal(const effect_config_t& halConfig, EffectConfig* config);

    // Can not be constructed directly by clients.
    EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId);
@@ -84,6 +89,9 @@ class EffectHalHidl : public EffectHalInterface

    status_t prepareForProcessing();
    status_t processImpl(uint32_t mqFlag);
    status_t setConfigImpl(
            uint32_t cmdCode, uint32_t cmdSize, void *pCmdData,
            uint32_t *replySize, void *pReplyData);
    status_t setProcessBuffers();
};