blob: b3d730df17981eb04b453389d0632929a509f34d [file] [log] [blame]
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000018#include <memory>
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000019#include <vector>
20
Mikhail Naganov872d4a62023-03-09 18:19:01 -080021#include <Utils.h>
Shraddha Basantwanif627d802022-11-08 14:45:07 +053022#include <android-base/logging.h>
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000023#include <fmq/AidlMessageQueue.h>
Shunkai Yao65c7c702024-01-09 20:50:53 +000024#include <fmq/EventFlag.h>
Shraddha Basantwanif627d802022-11-08 14:45:07 +053025
26#include <aidl/android/hardware/audio/effect/BnEffect.h>
Shunkai Yao6afc8552022-10-26 22:47:20 +000027#include "EffectTypes.h"
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000028
29namespace aidl::android::hardware::audio::effect {
30
31class EffectContext {
32 public:
33 typedef ::android::AidlMessageQueue<
34 IEffect::Status, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>
35 StatusMQ;
36 typedef ::android::AidlMessageQueue<
Shunkai Yao6afc8552022-10-26 22:47:20 +000037 float, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000038 DataMQ;
39
Shunkai Yao65c7c702024-01-09 20:50:53 +000040 EffectContext(size_t statusDepth, const Parameter::Common& common);
41 virtual ~EffectContext() {
42 if (mEfGroup) {
43 ::android::hardware::EventFlag::deleteEventFlag(&mEfGroup);
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000044 }
Shunkai Yao6afc8552022-10-26 22:47:20 +000045 }
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000046
Shunkai Yao65c7c702024-01-09 20:50:53 +000047 std::shared_ptr<StatusMQ> getStatusFmq() const;
48 std::shared_ptr<DataMQ> getInputDataFmq() const;
49 std::shared_ptr<DataMQ> getOutputDataFmq() const;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000050
Shunkai Yao65c7c702024-01-09 20:50:53 +000051 float* getWorkBuffer();
Shunkai Yao08c05dd2024-01-25 00:45:55 +000052 size_t getWorkBufferSize() const;
Shunkai Yao6afc8552022-10-26 22:47:20 +000053
Shunkai Yaocb0fc412022-12-15 20:34:32 +000054 // reset buffer status by abandon input data in FMQ
Shunkai Yao65c7c702024-01-09 20:50:53 +000055 void resetBuffer();
56 void dupeFmq(IEffect::OpenEffectReturn* effectRet);
57 size_t getInputFrameSize() const;
58 size_t getOutputFrameSize() const;
59 int getSessionId() const;
60 int getIoHandle() const;
Shunkai Yao6afc8552022-10-26 22:47:20 +000061
Shunkai Yao65c7c702024-01-09 20:50:53 +000062 virtual void dupeFmqWithReopen(IEffect::OpenEffectReturn* effectRet);
Shunkai Yao6afc8552022-10-26 22:47:20 +000063
64 virtual RetCode setOutputDevice(
Shunkai Yao65c7c702024-01-09 20:50:53 +000065 const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>& device);
Shunkai Yao1d2d51a2023-01-19 16:55:02 +053066
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000067 virtual std::vector<aidl::android::media::audio::common::AudioDeviceDescription>
Shunkai Yao65c7c702024-01-09 20:50:53 +000068 getOutputDevice();
Shunkai Yao6afc8552022-10-26 22:47:20 +000069
Shunkai Yao65c7c702024-01-09 20:50:53 +000070 virtual RetCode setAudioMode(const aidl::android::media::audio::common::AudioMode& mode);
71 virtual aidl::android::media::audio::common::AudioMode getAudioMode();
Shunkai Yao6afc8552022-10-26 22:47:20 +000072
Shunkai Yao65c7c702024-01-09 20:50:53 +000073 virtual RetCode setAudioSource(const aidl::android::media::audio::common::AudioSource& source);
74 virtual aidl::android::media::audio::common::AudioSource getAudioSource();
Shunkai Yao6afc8552022-10-26 22:47:20 +000075
Shunkai Yao65c7c702024-01-09 20:50:53 +000076 virtual RetCode setVolumeStereo(const Parameter::VolumeStereo& volumeStereo);
77 virtual Parameter::VolumeStereo getVolumeStereo();
Shunkai Yao6afc8552022-10-26 22:47:20 +000078
Shunkai Yao65c7c702024-01-09 20:50:53 +000079 virtual RetCode setCommon(const Parameter::Common& common);
80 virtual Parameter::Common getCommon();
81
82 virtual ::android::hardware::EventFlag* getStatusEventFlag();
Shunkai Yao6afc8552022-10-26 22:47:20 +000083
84 protected:
Shraddha Basantwanif627d802022-11-08 14:45:07 +053085 size_t mInputFrameSize;
86 size_t mOutputFrameSize;
Shunkai Yao65c7c702024-01-09 20:50:53 +000087 size_t mInputChannelCount;
88 size_t mOutputChannelCount;
89 Parameter::Common mCommon = {};
90 std::vector<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice = {};
91 aidl::android::media::audio::common::AudioMode mMode =
92 aidl::android::media::audio::common::AudioMode::SYS_RESERVED_INVALID;
93 aidl::android::media::audio::common::AudioSource mSource =
94 aidl::android::media::audio::common::AudioSource::SYS_RESERVED_INVALID;
95 Parameter::VolumeStereo mVolumeStereo = {};
96 RetCode updateIOFrameSize(const Parameter::Common& common);
97 RetCode notifyDataMqUpdate();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000098
99 private:
Shunkai Yao6afc8552022-10-26 22:47:20 +0000100 // fmq and buffers
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000101 std::shared_ptr<StatusMQ> mStatusMQ;
102 std::shared_ptr<DataMQ> mInputMQ;
103 std::shared_ptr<DataMQ> mOutputMQ;
Shunkai Yao65c7c702024-01-09 20:50:53 +0000104 // std::shared_ptr<IEffect::OpenEffectReturn> mRet;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000105 // work buffer set by effect instances, the access and update are in same thread
Shunkai Yao6afc8552022-10-26 22:47:20 +0000106 std::vector<float> mWorkBuffer;
Shunkai Yao65c7c702024-01-09 20:50:53 +0000107
108 ::android::hardware::EventFlag* mEfGroup;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000109};
110} // namespace aidl::android::hardware::audio::effect