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