mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
The use of fixed size char arrays was a direct copy of the C structure approach. In HIDL, the canonical approach is to use strings. Bug: 181883090 Test: atest android.hardware.audio.effect@7.0-util_tests Change-Id: I468810e07e5ba8b3bd6f03c5acfa24009ef2e48a
157 lines
6.6 KiB
C++
157 lines
6.6 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#include <string>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#define LOG_TAG "EffectUtils_Test"
|
|
#include <log/log.h>
|
|
|
|
#include <android_audio_policy_configuration_V7_0-enums.h>
|
|
#include <system/audio_effect.h>
|
|
#include <util/EffectUtils.h>
|
|
#include <xsdc/XsdcSupport.h>
|
|
|
|
using namespace android;
|
|
using namespace ::android::hardware::audio::common::CPP_VERSION;
|
|
using namespace ::android::hardware::audio::effect::CPP_VERSION;
|
|
using ::android::hardware::audio::effect::CPP_VERSION::implementation::EffectUtils;
|
|
namespace xsd {
|
|
using namespace ::android::audio::policy::configuration::V7_0;
|
|
}
|
|
|
|
static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID;
|
|
static constexpr audio_format_t kInvalidHalFormat = AUDIO_FORMAT_INVALID;
|
|
|
|
// Not generated automatically because AudioBuffer contains
|
|
// instances of hidl_memory which can't be compared properly
|
|
// in general case due to presence of handles.
|
|
//
|
|
// However, in this particular case, handles must not present
|
|
// thus comparison is possible.
|
|
//
|
|
// operator== must be defined in the same namespace as the structures.
|
|
namespace android {
|
|
namespace hardware {
|
|
namespace audio {
|
|
namespace effect {
|
|
namespace CPP_VERSION {
|
|
inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
|
|
return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
|
|
rhs.data.handle() == nullptr;
|
|
}
|
|
|
|
inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
|
|
return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
|
|
(lhs.buffer.getDiscriminator() ==
|
|
EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
|
|
lhs.buffer.buf() == rhs.buffer.buf()) &&
|
|
lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
|
|
}
|
|
|
|
inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
|
|
return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
|
|
}
|
|
} // namespace CPP_VERSION
|
|
} // namespace effect
|
|
} // namespace audio
|
|
} // namespace hardware
|
|
} // namespace android
|
|
|
|
TEST(EffectUtils, ConvertInvalidBufferConfig) {
|
|
buffer_config_t halInvalid;
|
|
EffectBufferConfig invalidChannelMask;
|
|
invalidChannelMask.base.channelMask.value("random string");
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectBufferConfigToHal(invalidChannelMask, &halInvalid));
|
|
EffectBufferConfig invalidFormat;
|
|
invalidFormat.base.format.value("random string");
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectBufferConfigToHal(invalidFormat, &halInvalid));
|
|
|
|
buffer_config_t halInvalidChannelMask;
|
|
EffectBufferConfig invalid;
|
|
halInvalidChannelMask.channels = kInvalidHalChannelMask;
|
|
halInvalidChannelMask.mask = EFFECT_CONFIG_CHANNELS;
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectBufferConfigFromHal(halInvalidChannelMask,
|
|
false /*isInput*/, &invalid));
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectBufferConfigFromHal(halInvalidChannelMask,
|
|
true /*isInput*/, &invalid));
|
|
buffer_config_t halInvalidFormat;
|
|
halInvalidFormat.format = (uint8_t)kInvalidHalFormat;
|
|
halInvalidFormat.mask = EFFECT_CONFIG_FORMAT;
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectBufferConfigFromHal(halInvalidFormat, false /*isInput*/,
|
|
&invalid));
|
|
EXPECT_EQ(BAD_VALUE,
|
|
EffectUtils::effectBufferConfigFromHal(halInvalidFormat, true /*isInput*/, &invalid));
|
|
}
|
|
|
|
TEST(EffectUtils, ConvertBufferConfig) {
|
|
EffectBufferConfig empty;
|
|
buffer_config_t halEmpty;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectBufferConfigToHal(empty, &halEmpty));
|
|
EffectBufferConfig emptyBackOut;
|
|
EXPECT_EQ(NO_ERROR,
|
|
EffectUtils::effectBufferConfigFromHal(halEmpty, false /*isInput*/, &emptyBackOut));
|
|
EXPECT_EQ(empty, emptyBackOut);
|
|
EffectBufferConfig emptyBackIn;
|
|
EXPECT_EQ(NO_ERROR,
|
|
EffectUtils::effectBufferConfigFromHal(halEmpty, true /*isInput*/, &emptyBackIn));
|
|
EXPECT_EQ(empty, emptyBackIn);
|
|
|
|
EffectBufferConfig chanMask;
|
|
chanMask.base.channelMask.value(toString(xsd::AudioChannelMask::AUDIO_CHANNEL_OUT_STEREO));
|
|
buffer_config_t halChanMask;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectBufferConfigToHal(chanMask, &halChanMask));
|
|
EffectBufferConfig chanMaskBack;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectBufferConfigFromHal(halChanMask, false /*isInput*/,
|
|
&chanMaskBack));
|
|
EXPECT_EQ(chanMask, chanMaskBack);
|
|
|
|
EffectBufferConfig format;
|
|
format.base.format.value(toString(xsd::AudioFormat::AUDIO_FORMAT_PCM_16_BIT));
|
|
buffer_config_t halFormat;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectBufferConfigToHal(format, &halFormat));
|
|
EffectBufferConfig formatBackOut;
|
|
EXPECT_EQ(NO_ERROR,
|
|
EffectUtils::effectBufferConfigFromHal(halFormat, false /*isInput*/, &formatBackOut));
|
|
EXPECT_EQ(format, formatBackOut);
|
|
EffectBufferConfig formatBackIn;
|
|
EXPECT_EQ(NO_ERROR,
|
|
EffectUtils::effectBufferConfigFromHal(halFormat, true /*isInput*/, &formatBackIn));
|
|
EXPECT_EQ(format, formatBackIn);
|
|
}
|
|
|
|
TEST(EffectUtils, ConvertInvalidDescriptor) {
|
|
effect_descriptor_t halDesc;
|
|
EffectDescriptor longName{};
|
|
longName.name = std::string(EFFECT_STRING_LEN_MAX, 'x');
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectDescriptorToHal(longName, &halDesc));
|
|
EffectDescriptor longImplementor{};
|
|
longImplementor.implementor = std::string(EFFECT_STRING_LEN_MAX, 'x');
|
|
EXPECT_EQ(BAD_VALUE, EffectUtils::effectDescriptorToHal(longImplementor, &halDesc));
|
|
}
|
|
|
|
TEST(EffectUtils, ConvertDescriptor) {
|
|
EffectDescriptor desc{};
|
|
desc.name = "test";
|
|
desc.implementor = "foo";
|
|
effect_descriptor_t halDesc;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectDescriptorToHal(desc, &halDesc));
|
|
EffectDescriptor descBack;
|
|
EXPECT_EQ(NO_ERROR, EffectUtils::effectDescriptorFromHal(halDesc, &descBack));
|
|
EXPECT_EQ(desc, descBack);
|
|
}
|