blob: 275378e9b8a4641cb2588f87f3897dca256b9116 [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 Yao7e2c3712024-02-03 06:47:18 +000047 void setVersion(int version) { mVersion = version; }
Shunkai Yao65c7c702024-01-09 20:50:53 +000048 std::shared_ptr<StatusMQ> getStatusFmq() const;
49 std::shared_ptr<DataMQ> getInputDataFmq() const;
50 std::shared_ptr<DataMQ> getOutputDataFmq() const;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000051
Shunkai Yao65c7c702024-01-09 20:50:53 +000052 float* getWorkBuffer();
Shunkai Yao08c05dd2024-01-25 00:45:55 +000053 size_t getWorkBufferSize() const;
Shunkai Yao6afc8552022-10-26 22:47:20 +000054
Shunkai Yaocb0fc412022-12-15 20:34:32 +000055 // reset buffer status by abandon input data in FMQ
Shunkai Yao65c7c702024-01-09 20:50:53 +000056 void resetBuffer();
57 void dupeFmq(IEffect::OpenEffectReturn* effectRet);
58 size_t getInputFrameSize() const;
59 size_t getOutputFrameSize() const;
60 int getSessionId() const;
61 int getIoHandle() const;
Shunkai Yao6afc8552022-10-26 22:47:20 +000062
Shunkai Yao65c7c702024-01-09 20:50:53 +000063 virtual void dupeFmqWithReopen(IEffect::OpenEffectReturn* effectRet);
Shunkai Yao6afc8552022-10-26 22:47:20 +000064
65 virtual RetCode setOutputDevice(
Shunkai Yao65c7c702024-01-09 20:50:53 +000066 const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>& device);
Shunkai Yao1d2d51a2023-01-19 16:55:02 +053067
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000068 virtual std::vector<aidl::android::media::audio::common::AudioDeviceDescription>
Shunkai Yao65c7c702024-01-09 20:50:53 +000069 getOutputDevice();
Shunkai Yao6afc8552022-10-26 22:47:20 +000070
Shunkai Yao65c7c702024-01-09 20:50:53 +000071 virtual RetCode setAudioMode(const aidl::android::media::audio::common::AudioMode& mode);
72 virtual aidl::android::media::audio::common::AudioMode getAudioMode();
Shunkai Yao6afc8552022-10-26 22:47:20 +000073
Shunkai Yao65c7c702024-01-09 20:50:53 +000074 virtual RetCode setAudioSource(const aidl::android::media::audio::common::AudioSource& source);
75 virtual aidl::android::media::audio::common::AudioSource getAudioSource();
Shunkai Yao6afc8552022-10-26 22:47:20 +000076
Shunkai Yao65c7c702024-01-09 20:50:53 +000077 virtual RetCode setVolumeStereo(const Parameter::VolumeStereo& volumeStereo);
78 virtual Parameter::VolumeStereo getVolumeStereo();
Shunkai Yao6afc8552022-10-26 22:47:20 +000079
Shunkai Yao65c7c702024-01-09 20:50:53 +000080 virtual RetCode setCommon(const Parameter::Common& common);
81 virtual Parameter::Common getCommon();
82
83 virtual ::android::hardware::EventFlag* getStatusEventFlag();
Shunkai Yao6afc8552022-10-26 22:47:20 +000084
85 protected:
Shunkai Yao7e2c3712024-02-03 06:47:18 +000086 int mVersion = 0;
87 size_t mInputFrameSize = 0;
88 size_t mOutputFrameSize = 0;
89 size_t mInputChannelCount = 0;
90 size_t mOutputChannelCount = 0;
Shunkai Yao65c7c702024-01-09 20:50:53 +000091 Parameter::Common mCommon = {};
92 std::vector<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice = {};
93 aidl::android::media::audio::common::AudioMode mMode =
94 aidl::android::media::audio::common::AudioMode::SYS_RESERVED_INVALID;
95 aidl::android::media::audio::common::AudioSource mSource =
96 aidl::android::media::audio::common::AudioSource::SYS_RESERVED_INVALID;
97 Parameter::VolumeStereo mVolumeStereo = {};
98 RetCode updateIOFrameSize(const Parameter::Common& common);
99 RetCode notifyDataMqUpdate();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000100
101 private:
Shunkai Yao6afc8552022-10-26 22:47:20 +0000102 // fmq and buffers
Shunkai Yao7e2c3712024-02-03 06:47:18 +0000103 std::shared_ptr<StatusMQ> mStatusMQ = nullptr;
104 std::shared_ptr<DataMQ> mInputMQ = nullptr;
105 std::shared_ptr<DataMQ> mOutputMQ = nullptr;
Shunkai Yao65c7c702024-01-09 20:50:53 +0000106 // std::shared_ptr<IEffect::OpenEffectReturn> mRet;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000107 // work buffer set by effect instances, the access and update are in same thread
Shunkai Yao7e2c3712024-02-03 06:47:18 +0000108 std::vector<float> mWorkBuffer = {};
Shunkai Yao65c7c702024-01-09 20:50:53 +0000109
Shunkai Yao7e2c3712024-02-03 06:47:18 +0000110 ::android::hardware::EventFlag* mEfGroup = nullptr;
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000111};
112} // namespace aidl::android::hardware::audio::effect