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 616b111f32247800dccd34dd396e731b9e7888b185Mikhail Naganov // Whether it's a local implementation. 626b111f32247800dccd34dd396e731b9e7888b185Mikhail Naganov virtual bool isLocal() const { return false; } 636b111f32247800dccd34dd396e731b9e7888b185Mikhail Naganov 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint64_t effectId() const { return mEffectId; } 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov static void effectDescriptorToHal( 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const EffectDescriptor& descriptor, effect_descriptor_t* halDescriptor); 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov private: 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov friend class EffectsFactoryHalHidl; 71022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov typedef MessageQueue< 72022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov hardware::audio::effect::V2_0::Result, hardware::kSynchronizedReadWrite> StatusMQ; 73022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov sp<IEffect> mEffect; 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const uint64_t mEffectId; 76022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov sp<EffectBufferHalInterface> mInBuffer; 77022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov sp<EffectBufferHalInterface> mOutBuffer; 78022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov bool mBuffersChanged; 79022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov std::unique_ptr<StatusMQ> mStatusMQ; 80022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov EventFlag* mEfGroup; 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov static status_t analyzeResult(const hardware::audio::effect::V2_0::Result& result); 83f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov static void effectBufferConfigFromHal( 84f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov const buffer_config_t& halConfig, EffectBufferConfig* config); 85ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov static void effectBufferConfigToHal( 86ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov const EffectBufferConfig& config, buffer_config_t* halConfig); 87f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov static void effectConfigFromHal(const effect_config_t& halConfig, EffectConfig* config); 88ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov static void effectConfigToHal(const EffectConfig& config, effect_config_t* halConfig); 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Can not be constructed directly by clients. 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId); 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // The destructor automatically releases the effect. 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov virtual ~EffectHalHidl(); 95022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov 96ed01be521e6e265dd8a27e43b581d13342e2528bMikhail Naganov status_t getConfigImpl(uint32_t cmdCode, uint32_t *replySize, void *pReplyData); 97022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t prepareForProcessing(); 9840be8a343e8ceb7ae087bfb8988247731fa5ae75Mikhail Naganov bool needToResetBuffers(); 99022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t processImpl(uint32_t mqFlag); 100f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov status_t setConfigImpl( 101f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 102f508bd4692736e1455553099f3276f43f4229e27Mikhail Naganov uint32_t *replySize, void *pReplyData); 103022b9953153bdb1984f0abb17d21ef8c1826ad49Mikhail Naganov status_t setProcessBuffers(); 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov}; 105f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 106f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 107f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 108f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#endif // ANDROID_HARDWARE_EFFECT_HAL_HIDL_H 109