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