mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
Effect AIDL: Add default extension with vector<uint8_t>
Bug: 258124419 Test: atest --test-mapping hardware/interfaces/audio/aidl/vts:presubmit Change-Id: I3fa7f78ed2227d00b999c7e594d1b1d205f585e7
This commit is contained in:
@@ -230,6 +230,7 @@ aidl_interface {
|
||||
"android/hardware/audio/effect/BassBoost.aidl",
|
||||
"android/hardware/audio/effect/Capability.aidl",
|
||||
"android/hardware/audio/effect/CommandId.aidl",
|
||||
"android/hardware/audio/effect/DefaultExtension.aidl",
|
||||
"android/hardware/audio/effect/Descriptor.aidl",
|
||||
"android/hardware/audio/effect/Downmix.aidl",
|
||||
"android/hardware/audio/effect/DynamicsProcessing.aidl",
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// This file is a snapshot of an AIDL file. Do not edit it manually. There are
|
||||
// two cases:
|
||||
// 1). this is a frozen version file - do not edit this in any case.
|
||||
// 2). this is a 'current' file. If you make a backwards compatible change to
|
||||
// the interface (from the latest frozen version), the build system will
|
||||
// prompt you to update this file with `m <name>-update-api`.
|
||||
//
|
||||
// You must not make a backward incompatible change to any AIDL file built
|
||||
// with the aidl_interface module type with versions property set. The module
|
||||
// type is used to build AIDL files in a way that they can be used across
|
||||
// independently updatable components of the system. If a device is shipped
|
||||
// with such a backward incompatible change, it has a high risk of breaking
|
||||
// later when a module using the interface is updated, e.g., Mainline modules.
|
||||
|
||||
package android.hardware.audio.effect;
|
||||
@VintfStability
|
||||
parcelable DefaultExtension {
|
||||
byte[] bytes;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.
|
||||
*/
|
||||
|
||||
package android.hardware.audio.effect;
|
||||
|
||||
/**
|
||||
* The default extension used for Parameter.Specific.vendorEffect ParcelableHolder.
|
||||
*
|
||||
* The audio framework attach this default extension to the ParcelableHolder in VendorExtension,
|
||||
* and pass though all parameters it received from the client to audio HAL.
|
||||
*
|
||||
* For now it's not possible for vendor to define their own vendor extensions without changing the
|
||||
* audio framework. More specificly, in order to add a customized effect parameter AIDL parcelable,
|
||||
* vendors need to add the logic for conversion between AIDL and effect_param_t for the effect AIDL
|
||||
* in: frameworks/av/media/libaudiohal/impl/effectAidlConversion.
|
||||
*
|
||||
* There is no VTS test cases for the vendor extension effect implementation, however all effect
|
||||
* implementations must support the common parameters defined in Parameter.aidl, so vendor
|
||||
* extension effect implementation still need to support setting and getting of these common
|
||||
* parameters, which is enforced by VTS.
|
||||
*/
|
||||
@VintfStability
|
||||
parcelable DefaultExtension {
|
||||
byte[] bytes;
|
||||
}
|
||||
@@ -107,11 +107,8 @@ ndk::ScopedAStatus EffectImpl::getParameter(const Parameter::Id& id, Parameter*
|
||||
"CommonParamNotSupported");
|
||||
break;
|
||||
}
|
||||
case Parameter::Id::vendorEffectTag: {
|
||||
LOG(DEBUG) << __func__ << " noop for vendor tag";
|
||||
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
|
||||
"vendortagNotSupported");
|
||||
}
|
||||
case Parameter::Id::vendorEffectTag:
|
||||
FALLTHROUGH_INTENDED;
|
||||
default: {
|
||||
Parameter::Specific specific;
|
||||
RETURN_IF_ASTATUS_NOT_OK(getParameterSpecific(id, &specific), "SpecParamNotSupported");
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
<library name="virtualizersw" path="libvirtualizersw.so"/>
|
||||
<library name="visualizer" path="libvisualizeraidl.so"/>
|
||||
<library name="volumesw" path="libvolumesw.so"/>
|
||||
<library name="extensioneffect" path="libextensioneffect.so"/>
|
||||
</libraries>
|
||||
|
||||
<!-- list of effects to load.
|
||||
@@ -93,6 +94,7 @@
|
||||
<libsw library="equalizersw" uuid="0bed4300-847d-11df-bb17-0002a5d5c51b"/>
|
||||
<libsw library="bundle" uuid="ce772f20-847d-11df-bb17-0002a5d5c51b"/>
|
||||
</effectProxy>
|
||||
<effect name="extensioneffect" library="extensioneffect" uuid="fa81dd00-588b-11ed-9b6a-0242ac120002"/>
|
||||
</effects>
|
||||
|
||||
<!-- Audio pre processor configurations.
|
||||
|
||||
41
audio/aidl/default/extension/Android.bp
Normal file
41
audio/aidl/default/extension/Android.bp
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.
|
||||
*/
|
||||
|
||||
package {
|
||||
// See: http://go/android-license-faq
|
||||
// A large-scale-change added 'default_applicable_licenses' to import
|
||||
// all of the 'license_kinds' from "hardware_interfaces_license"
|
||||
// to get the below license kinds:
|
||||
// SPDX-license-identifier-Apache-2.0
|
||||
default_applicable_licenses: ["hardware_interfaces_license"],
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libextensioneffect",
|
||||
defaults: [
|
||||
"aidlaudioeffectservice_defaults",
|
||||
"latest_android_media_audio_common_types_ndk_shared",
|
||||
"latest_android_hardware_audio_effect_ndk_shared",
|
||||
],
|
||||
srcs: [
|
||||
"ExtensionEffect.cpp",
|
||||
":effectCommonFile",
|
||||
],
|
||||
relative_install_path: "soundfx",
|
||||
visibility: [
|
||||
"//hardware/interfaces/audio/aidl/default",
|
||||
],
|
||||
}
|
||||
142
audio/aidl/default/extension/ExtensionEffect.cpp
Normal file
142
audio/aidl/default/extension/ExtensionEffect.cpp
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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 <algorithm>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <unordered_set>
|
||||
|
||||
#define LOG_TAG "AHAL_ExtensionEffect"
|
||||
#include <Utils.h>
|
||||
#include <aidl/android/hardware/audio/effect/DefaultExtension.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <fmq/AidlMessageQueue.h>
|
||||
|
||||
#include "ExtensionEffect.h"
|
||||
|
||||
using aidl::android::hardware::audio::effect::DefaultExtension;
|
||||
using aidl::android::hardware::audio::effect::Descriptor;
|
||||
using aidl::android::hardware::audio::effect::ExtensionEffect;
|
||||
using aidl::android::hardware::audio::effect::IEffect;
|
||||
using aidl::android::hardware::audio::effect::kExtensionEffectImplUUID;
|
||||
using aidl::android::hardware::audio::effect::kExtensionEffectTypeUUID;
|
||||
using aidl::android::hardware::audio::effect::Range;
|
||||
using aidl::android::hardware::audio::effect::VendorExtension;
|
||||
using aidl::android::media::audio::common::AudioUuid;
|
||||
|
||||
extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
|
||||
std::shared_ptr<IEffect>* instanceSpp) {
|
||||
if (!in_impl_uuid || *in_impl_uuid != kExtensionEffectImplUUID) {
|
||||
LOG(ERROR) << __func__ << "uuid not supported";
|
||||
return EX_ILLEGAL_ARGUMENT;
|
||||
}
|
||||
if (instanceSpp) {
|
||||
*instanceSpp = ndk::SharedRefBase::make<ExtensionEffect>();
|
||||
LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
|
||||
return EX_NONE;
|
||||
} else {
|
||||
LOG(ERROR) << __func__ << " invalid input parameter!";
|
||||
return EX_ILLEGAL_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
|
||||
if (!in_impl_uuid || *in_impl_uuid != kExtensionEffectImplUUID) {
|
||||
LOG(ERROR) << __func__ << "uuid not supported";
|
||||
return EX_ILLEGAL_ARGUMENT;
|
||||
}
|
||||
*_aidl_return = ExtensionEffect::kDescriptor;
|
||||
return EX_NONE;
|
||||
}
|
||||
|
||||
namespace aidl::android::hardware::audio::effect {
|
||||
|
||||
const std::string ExtensionEffect::kEffectName = "ExtensionEffectExample";
|
||||
|
||||
const Descriptor ExtensionEffect::kDescriptor = {
|
||||
.common = {.id = {.type = kExtensionEffectTypeUUID,
|
||||
.uuid = kExtensionEffectImplUUID,
|
||||
.proxy = std::nullopt},
|
||||
.name = ExtensionEffect::kEffectName,
|
||||
.implementor = "The Android Open Source Project"}};
|
||||
|
||||
ndk::ScopedAStatus ExtensionEffect::getDescriptor(Descriptor* _aidl_return) {
|
||||
LOG(DEBUG) << __func__ << kDescriptor.toString();
|
||||
*_aidl_return = kDescriptor;
|
||||
return ndk::ScopedAStatus::ok();
|
||||
}
|
||||
|
||||
ndk::ScopedAStatus ExtensionEffect::setParameterSpecific(const Parameter::Specific& specific) {
|
||||
RETURN_IF(Parameter::Specific::vendorEffect != specific.getTag(), EX_ILLEGAL_ARGUMENT,
|
||||
"EffectNotSupported");
|
||||
RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
|
||||
|
||||
auto& vendorEffect = specific.get<Parameter::Specific::vendorEffect>();
|
||||
std::optional<DefaultExtension> defaultExt;
|
||||
RETURN_IF(STATUS_OK != vendorEffect.extension.getParcelable(&defaultExt), EX_ILLEGAL_ARGUMENT,
|
||||
"getParcelableFailed");
|
||||
RETURN_IF(!defaultExt.has_value(), EX_ILLEGAL_ARGUMENT, "parcelableNulld");
|
||||
RETURN_IF(mContext->setParams(defaultExt->bytes) != RetCode::SUCCESS, EX_ILLEGAL_ARGUMENT,
|
||||
"paramNotSupported");
|
||||
|
||||
return ndk::ScopedAStatus::ok();
|
||||
}
|
||||
|
||||
ndk::ScopedAStatus ExtensionEffect::getParameterSpecific(const Parameter::Id& id,
|
||||
Parameter::Specific* specific) {
|
||||
auto tag = id.getTag();
|
||||
RETURN_IF(Parameter::Id::vendorEffectTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
|
||||
auto specificId = id.get<Parameter::Id::vendorEffectTag>();
|
||||
VendorExtension extension;
|
||||
DefaultExtension defaultExt;
|
||||
defaultExt.bytes = mContext->getParams(specificId);
|
||||
RETURN_IF(STATUS_OK != extension.extension.setParcelable(defaultExt), EX_ILLEGAL_ARGUMENT,
|
||||
"setParcelableFailed");
|
||||
specific->set<Parameter::Specific::vendorEffect>(extension);
|
||||
return ndk::ScopedAStatus::ok();
|
||||
}
|
||||
|
||||
std::shared_ptr<EffectContext> ExtensionEffect::createContext(const Parameter::Common& common) {
|
||||
if (mContext) {
|
||||
LOG(DEBUG) << __func__ << " context already exist";
|
||||
} else {
|
||||
mContext = std::make_shared<ExtensionEffectContext>(1 /* statusFmqDepth */, common);
|
||||
}
|
||||
return mContext;
|
||||
}
|
||||
|
||||
std::shared_ptr<EffectContext> ExtensionEffect::getContext() {
|
||||
return mContext;
|
||||
}
|
||||
|
||||
RetCode ExtensionEffect::releaseContext() {
|
||||
if (mContext) {
|
||||
mContext.reset();
|
||||
}
|
||||
return RetCode::SUCCESS;
|
||||
}
|
||||
|
||||
// Processing method running in EffectWorker thread.
|
||||
IEffect::Status ExtensionEffect::effectProcessImpl(float* in, float* out, int samples) {
|
||||
// TODO: get data buffer and process.
|
||||
LOG(DEBUG) << __func__ << " in " << in << " out " << out << " samples " << samples;
|
||||
for (int i = 0; i < samples; i++) {
|
||||
*out++ = *in++;
|
||||
}
|
||||
return {STATUS_OK, samples, samples};
|
||||
}
|
||||
|
||||
} // namespace aidl::android::hardware::audio::effect
|
||||
72
audio/aidl/default/extension/ExtensionEffect.h
Normal file
72
audio/aidl/default/extension/ExtensionEffect.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <aidl/android/hardware/audio/effect/BnEffect.h>
|
||||
#include <fmq/AidlMessageQueue.h>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "effect-impl/EffectImpl.h"
|
||||
#include "effect-impl/EffectUUID.h"
|
||||
|
||||
namespace aidl::android::hardware::audio::effect {
|
||||
|
||||
class ExtensionEffectContext final : public EffectContext {
|
||||
public:
|
||||
ExtensionEffectContext(int statusDepth, const Parameter::Common& common)
|
||||
: EffectContext(statusDepth, common) {
|
||||
LOG(DEBUG) << __func__;
|
||||
}
|
||||
|
||||
RetCode setParams(const std::vector<uint8_t>& params) {
|
||||
mParams = params;
|
||||
return RetCode::SUCCESS;
|
||||
}
|
||||
std::vector<uint8_t> getParams(int tag __unused) const { return mParams; }
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> mParams;
|
||||
};
|
||||
|
||||
class ExtensionEffect final : public EffectImpl {
|
||||
public:
|
||||
static const std::string kEffectName;
|
||||
static const Capability kCapability;
|
||||
static const Descriptor kDescriptor;
|
||||
ExtensionEffect() { LOG(DEBUG) << __func__; }
|
||||
~ExtensionEffect() {
|
||||
cleanUp();
|
||||
LOG(DEBUG) << __func__;
|
||||
}
|
||||
|
||||
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
|
||||
ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
|
||||
ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
|
||||
Parameter::Specific* specific) override;
|
||||
|
||||
std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
|
||||
std::shared_ptr<EffectContext> getContext() override;
|
||||
RetCode releaseContext() override;
|
||||
|
||||
std::string getEffectName() override { return kEffectName; };
|
||||
IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<ExtensionEffectContext> mContext;
|
||||
};
|
||||
} // namespace aidl::android::hardware::audio::effect
|
||||
@@ -81,12 +81,12 @@ static const AudioUuid kBassBoostProxyUUID = {static_cast<int32_t>(0x14804144),
|
||||
0x4d24,
|
||||
0xaa88,
|
||||
{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
|
||||
// fa81862a-588b-11ed-9b6a-0242ac120002
|
||||
static const AudioUuid kDownmixTypeUUID = {static_cast<int32_t>(0xfa81862a),
|
||||
0x588b,
|
||||
0x11ed,
|
||||
0x9b6a,
|
||||
{0x02, 0x42, 0xac, 0x12, 0x00, 0x02}};
|
||||
// 381e49cc-a858-4aa2-87f6-e8388e7601b2
|
||||
static const AudioUuid kDownmixTypeUUID = {static_cast<int32_t>(0x381e49cc),
|
||||
0xa858,
|
||||
0x4aa2,
|
||||
0x87f6,
|
||||
{0xe8, 0x38, 0x8e, 0x76, 0x01, 0xb2}};
|
||||
// fa8187ba-588b-11ed-9b6a-0242ac120002
|
||||
static const AudioUuid kDownmixSwImplUUID = {static_cast<int32_t>(0xfa8187ba),
|
||||
0x588b,
|
||||
@@ -299,6 +299,18 @@ static const AudioUuid kVolumeBundleImplUUID = {static_cast<int32_t>(0x119341a0)
|
||||
0x81f9,
|
||||
{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
|
||||
|
||||
// fa81dbde-588b-11ed-9b6a-0242ac120002
|
||||
static const AudioUuid kExtensionEffectTypeUUID = {static_cast<int32_t>(0xfa81dbde),
|
||||
0x588b,
|
||||
0x11ed,
|
||||
0x9b6a,
|
||||
{0x02, 0x42, 0xac, 0x12, 0x00, 0x02}};
|
||||
// fa81dd00-588b-11ed-9b6a-0242ac120002
|
||||
static const AudioUuid kExtensionEffectImplUUID = {static_cast<int32_t>(0xfa81dd00),
|
||||
0x588b,
|
||||
0x11ed,
|
||||
0x9b6a,
|
||||
{0x02, 0x42, 0xac, 0x12, 0x00, 0x02}};
|
||||
/**
|
||||
* @brief A map between effect name and effect type UUID.
|
||||
* All <name> attribution in effect/effectProxy of audio_effects.xml should be listed in this map.
|
||||
@@ -311,6 +323,7 @@ static const std::map<const std::string /* effect type */, const AudioUuid&> kUu
|
||||
{"downmix", kDownmixTypeUUID},
|
||||
{"dynamics_processing", kDynamicsProcessingTypeUUID},
|
||||
{"equalizer", kEqualizerTypeUUID},
|
||||
{"extensioneffect", kExtensionEffectTypeUUID},
|
||||
{"haptic_generator", kHapticGeneratorTypeUUID},
|
||||
{"loudness_enhancer", kLoudnessEnhancerTypeUUID},
|
||||
{"env_reverb", kEnvReverbTypeUUID},
|
||||
|
||||
Reference in New Issue
Block a user