/* * Copyright (C) 2022 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 #include #include #include #include #include #include #include #include "EffectConfig.h" namespace aidl::android::hardware::audio::effect { class Factory : public BnFactory { public: explicit Factory(const std::string& file); /** * @brief Get identity of all effects supported by the device, with the optional filter by type * and/or by instance UUID. * * @param in_type Type UUID. * @param in_instance Instance UUID. * @param in_proxy Proxy UUID. * @param out_descriptor List of Descriptors. * @return ndk::ScopedAStatus */ ndk::ScopedAStatus queryEffects( const std::optional<::aidl::android::media::audio::common::AudioUuid>& in_type, const std::optional<::aidl::android::media::audio::common::AudioUuid>& in_instance, const std::optional<::aidl::android::media::audio::common::AudioUuid>& in_proxy, std::vector* out_descriptor) override; /** * @brief Query list of defined processing, with the optional filter by AudioStreamType * * @param in_type Type of processing, could be AudioStreamType or AudioSource. Optional. * @param _aidl_return List of processing filtered by in_type. * @return ndk::ScopedAStatus */ ndk::ScopedAStatus queryProcessing(const std::optional& in_type, std::vector* _aidl_return) override; /** * @brief Create an effect instance for a certain implementation (identified by UUID). * * @param in_impl_uuid Effect implementation UUID. * @param _aidl_return A pointer to created effect instance. * @return ndk::ScopedAStatus */ ndk::ScopedAStatus createEffect( const ::aidl::android::media::audio::common::AudioUuid& in_impl_uuid, std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>* _aidl_return) override; /** * @brief Destroy an effect instance. * * @param in_handle Effect instance handle. * @return ndk::ScopedAStatus */ ndk::ScopedAStatus destroyEffect( const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& in_handle) override; private: const EffectConfig mConfig; ~Factory(); std::mutex mMutex; // Set of effect descriptors supported by the devices. std::set mDescSet GUARDED_BY(mMutex); std::set mIdentitySet GUARDED_BY(mMutex); static constexpr int kMapEntryHandleIndex = 0; static constexpr int kMapEntryInterfaceIndex = 1; static constexpr int kMapEntryLibNameIndex = 2; typedef std::tuple> /* dlHandle */, std::unique_ptr /* interfaces */, std::string /* library name */> DlEntry; std::map mEffectLibMap GUARDED_BY(mMutex); typedef std::pair EffectEntry; std::map, EffectEntry, std::owner_less<>> mEffectMap GUARDED_BY(mMutex); ndk::ScopedAStatus destroyEffectImpl_l(const std::shared_ptr& in_handle) REQUIRES(mMutex); void cleanupEffectMap_l() REQUIRES(mMutex); bool openEffectLibrary(const ::aidl::android::media::audio::common::AudioUuid& impl, const std::string& path); void createIdentityWithConfig( const EffectConfig::Library& configLib, const ::aidl::android::media::audio::common::AudioUuid& typeUuidStr, const std::optional<::aidl::android::media::audio::common::AudioUuid> proxyUuid); ndk::ScopedAStatus getDescriptorWithUuid_l( const aidl::android::media::audio::common::AudioUuid& uuid, Descriptor* desc) REQUIRES(mMutex); void loadEffectLibs(); /* Get effect_dl_interface_s from library handle */ void getDlSyms_l(DlEntry& entry) REQUIRES(mMutex); }; } // namespace aidl::android::hardware::audio::effect