EffectHalHidl.h revision 40be8a343e8ceb7ae087bfb8988247731fa5ae75
1f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov/* 2f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Copyright (C) 2016 The Android Open Source Project 3f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 4f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 5f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * you may not use this file except in compliance with the License. 6f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * You may obtain a copy of the License at 7f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 8f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 9f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 10f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Unless required by applicable law or agreed to in writing, software 11f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 12f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * See the License for the specific language governing permissions and 14f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * limitations under the License. 15f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov */ 16f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 17f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#ifndef ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 18f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#define ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 19f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 20f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <android/hardware/audio/effect/2.0/IEffect.h> 21f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <media/audiohal/EffectHalInterface.h> 22022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov#include <fmq/EventFlag.h> 23022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov#include <fmq/MessageQueue.h> 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <system/audio_effect.h> 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 26f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::EffectBufferConfig; 27f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::EffectConfig; 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::EffectDescriptor; 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::IEffect; 30022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganovusing ::android::hardware::EventFlag; 31022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganovusing ::android::hardware::MessageQueue; 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 34f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovclass EffectHalHidl : public EffectHalInterface 36f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov{ 37f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov public: 38022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov // Set the input buffer. 39022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov virtual status_t setInBuffer(const sp<EffectBufferHalInterface>& buffer); 40022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 41022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov // Set the output buffer. 42022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov virtual status_t setOutBuffer(const sp<EffectBufferHalInterface>& buffer); 43022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 44022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov // Effect process function. 45022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov virtual status_t process(); 46f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Process reverse stream function. This function is used to pass 48f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // a reference stream to the effect engine. 49022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov virtual status_t processReverse(); 50f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Send a command and receive a response to/from effect engine. 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov virtual status_t command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint32_t *replySize, void *pReplyData); 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Returns the effect descriptor. 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov virtual status_t getDescriptor(effect_descriptor_t *pDescriptor); 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 58022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov // Free resources on the remote side. 59022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov virtual status_t close(); 60022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint64_t effectId() const { return mEffectId; } 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov static void effectDescriptorToHal( 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const EffectDescriptor& descriptor, effect_descriptor_t* halDescriptor); 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov private: 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov friend class EffectsFactoryHalHidl; 68022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov typedef MessageQueue< 69022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov hardware::audio::effect::V2_0::Result, hardware::kSynchronizedReadWrite> StatusMQ; 70022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov sp<IEffect> mEffect; 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const uint64_t mEffectId; 73022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov sp<EffectBufferHalInterface> mInBuffer; 74022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov sp<EffectBufferHalInterface> mOutBuffer; 75022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov bool mBuffersChanged; 76022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov std::unique_ptr<StatusMQ> mStatusMQ; 77022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov EventFlag* mEfGroup; 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov static status_t analyzeResult(const hardware::audio::effect::V2_0::Result& result); 80f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov static void effectBufferConfigFromHal( 81f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov const buffer_config_t& halConfig, EffectBufferConfig* config); 82ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov static void effectBufferConfigToHal( 83ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov const EffectBufferConfig& config, buffer_config_t* halConfig); 84f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov static void effectConfigFromHal(const effect_config_t& halConfig, EffectConfig* config); 85ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov static void effectConfigToHal(const EffectConfig& config, effect_config_t* halConfig); 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Can not be constructed directly by clients. 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId); 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // The destructor automatically releases the effect. 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov virtual ~EffectHalHidl(); 92022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 93ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov status_t getConfigImpl(uint32_t cmdCode, uint32_t *replySize, void *pReplyData); 94022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t prepareForProcessing(); 9540be8a343e8ceb7ae087bfb8988247731fa5ae75Mikhail Naganov bool needToResetBuffers(); 96022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t processImpl(uint32_t mqFlag); 97f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov status_t setConfigImpl( 98f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 99f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov uint32_t *replySize, void *pReplyData); 100022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t setProcessBuffers(); 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov}; 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 105f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#endif // ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 106