xref: /aosp_15_r20/frameworks/base/media/jni/tuner/FrontendClient.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "FrontendClient"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include "FrontendClient.h"
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Constant.h>
22*d57664e9SAndroid Build Coastguard Worker #include <android-base/logging.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Constant;
26*d57664e9SAndroid Build Coastguard Worker 
27*d57664e9SAndroid Build Coastguard Worker namespace android {
28*d57664e9SAndroid Build Coastguard Worker /////////////// FrontendClient ///////////////////////
FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend,FrontendType type)29*d57664e9SAndroid Build Coastguard Worker FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, FrontendType type) {
30*d57664e9SAndroid Build Coastguard Worker     mTunerFrontend = tunerFrontend;
31*d57664e9SAndroid Build Coastguard Worker     mType = type;
32*d57664e9SAndroid Build Coastguard Worker }
33*d57664e9SAndroid Build Coastguard Worker 
~FrontendClient()34*d57664e9SAndroid Build Coastguard Worker FrontendClient::~FrontendClient() {
35*d57664e9SAndroid Build Coastguard Worker     mTunerFrontend = nullptr;
36*d57664e9SAndroid Build Coastguard Worker     mType = FrontendType::UNDEFINED;
37*d57664e9SAndroid Build Coastguard Worker }
38*d57664e9SAndroid Build Coastguard Worker 
setCallback(sp<FrontendClientCallback> frontendClientCallback)39*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
40*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
41*d57664e9SAndroid Build Coastguard Worker         shared_ptr<TunerFrontendCallback> aidlCallback =
42*d57664e9SAndroid Build Coastguard Worker                 ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
43*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->setCallback(aidlCallback);
44*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
45*d57664e9SAndroid Build Coastguard Worker     }
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
48*d57664e9SAndroid Build Coastguard Worker }
49*d57664e9SAndroid Build Coastguard Worker 
tune(const FrontendSettings & settings)50*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::tune(const FrontendSettings& settings) {
51*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
52*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->tune(settings);
53*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
54*d57664e9SAndroid Build Coastguard Worker     }
55*d57664e9SAndroid Build Coastguard Worker 
56*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
57*d57664e9SAndroid Build Coastguard Worker }
58*d57664e9SAndroid Build Coastguard Worker 
stopTune()59*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::stopTune() {
60*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
61*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->stopTune();
62*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
63*d57664e9SAndroid Build Coastguard Worker     }
64*d57664e9SAndroid Build Coastguard Worker 
65*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
66*d57664e9SAndroid Build Coastguard Worker }
67*d57664e9SAndroid Build Coastguard Worker 
scan(const FrontendSettings & settings,FrontendScanType type)68*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type) {
69*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
70*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->scan(settings, type);
71*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
72*d57664e9SAndroid Build Coastguard Worker     }
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
75*d57664e9SAndroid Build Coastguard Worker }
76*d57664e9SAndroid Build Coastguard Worker 
stopScan()77*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::stopScan() {
78*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
79*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->stopScan();
80*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
81*d57664e9SAndroid Build Coastguard Worker     }
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
84*d57664e9SAndroid Build Coastguard Worker }
85*d57664e9SAndroid Build Coastguard Worker 
getStatus(vector<FrontendStatusType> statusTypes)86*d57664e9SAndroid Build Coastguard Worker vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
87*d57664e9SAndroid Build Coastguard Worker     vector<FrontendStatus> status;
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
90*d57664e9SAndroid Build Coastguard Worker         mTunerFrontend->getStatus(statusTypes, &status);
91*d57664e9SAndroid Build Coastguard Worker     }
92*d57664e9SAndroid Build Coastguard Worker 
93*d57664e9SAndroid Build Coastguard Worker     return status;
94*d57664e9SAndroid Build Coastguard Worker }
95*d57664e9SAndroid Build Coastguard Worker 
setLnb(sp<LnbClient> lnbClient)96*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
97*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
98*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
99*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
100*d57664e9SAndroid Build Coastguard Worker     }
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
103*d57664e9SAndroid Build Coastguard Worker }
104*d57664e9SAndroid Build Coastguard Worker 
linkCiCamToFrontend(int32_t ciCamId)105*d57664e9SAndroid Build Coastguard Worker int32_t FrontendClient::linkCiCamToFrontend(int32_t ciCamId) {
106*d57664e9SAndroid Build Coastguard Worker     int32_t ltsId = static_cast<int32_t>(Constant::INVALID_LTS_ID);
107*d57664e9SAndroid Build Coastguard Worker 
108*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
109*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
110*d57664e9SAndroid Build Coastguard Worker         if (!s.isOk()) {
111*d57664e9SAndroid Build Coastguard Worker             return static_cast<int32_t>(Constant::INVALID_LTS_ID);
112*d57664e9SAndroid Build Coastguard Worker         }
113*d57664e9SAndroid Build Coastguard Worker     }
114*d57664e9SAndroid Build Coastguard Worker 
115*d57664e9SAndroid Build Coastguard Worker     return ltsId;
116*d57664e9SAndroid Build Coastguard Worker }
117*d57664e9SAndroid Build Coastguard Worker 
unlinkCiCamToFrontend(int32_t ciCamId)118*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::unlinkCiCamToFrontend(int32_t ciCamId) {
119*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
120*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
121*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
122*d57664e9SAndroid Build Coastguard Worker     }
123*d57664e9SAndroid Build Coastguard Worker 
124*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
125*d57664e9SAndroid Build Coastguard Worker }
126*d57664e9SAndroid Build Coastguard Worker 
close()127*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::close() {
128*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
129*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->close();
130*d57664e9SAndroid Build Coastguard Worker         mTunerFrontend = nullptr;
131*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
132*d57664e9SAndroid Build Coastguard Worker     }
133*d57664e9SAndroid Build Coastguard Worker 
134*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
135*d57664e9SAndroid Build Coastguard Worker }
136*d57664e9SAndroid Build Coastguard Worker 
getHardwareInfo(string & info)137*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::getHardwareInfo(string& info) {
138*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
139*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->getHardwareInfo(&info);
140*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
141*d57664e9SAndroid Build Coastguard Worker     }
142*d57664e9SAndroid Build Coastguard Worker 
143*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
144*d57664e9SAndroid Build Coastguard Worker }
145*d57664e9SAndroid Build Coastguard Worker 
removeOutputPid(int32_t pid)146*d57664e9SAndroid Build Coastguard Worker Result FrontendClient::removeOutputPid(int32_t pid) {
147*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
148*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->removeOutputPid(pid);
149*d57664e9SAndroid Build Coastguard Worker         return ClientHelper::getServiceSpecificErrorCode(s);
150*d57664e9SAndroid Build Coastguard Worker     }
151*d57664e9SAndroid Build Coastguard Worker 
152*d57664e9SAndroid Build Coastguard Worker     return Result::INVALID_STATE;
153*d57664e9SAndroid Build Coastguard Worker }
154*d57664e9SAndroid Build Coastguard Worker 
getStatusReadiness(const std::vector<FrontendStatusType> & statusTypes)155*d57664e9SAndroid Build Coastguard Worker vector<FrontendStatusReadiness> FrontendClient::getStatusReadiness(
156*d57664e9SAndroid Build Coastguard Worker         const std::vector<FrontendStatusType>& statusTypes) {
157*d57664e9SAndroid Build Coastguard Worker     vector<FrontendStatusReadiness> readiness;
158*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
159*d57664e9SAndroid Build Coastguard Worker         mTunerFrontend->getFrontendStatusReadiness(statusTypes, &readiness);
160*d57664e9SAndroid Build Coastguard Worker     }
161*d57664e9SAndroid Build Coastguard Worker 
162*d57664e9SAndroid Build Coastguard Worker     return readiness;
163*d57664e9SAndroid Build Coastguard Worker }
164*d57664e9SAndroid Build Coastguard Worker 
getAidlFrontend()165*d57664e9SAndroid Build Coastguard Worker shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
166*d57664e9SAndroid Build Coastguard Worker     return mTunerFrontend;
167*d57664e9SAndroid Build Coastguard Worker }
168*d57664e9SAndroid Build Coastguard Worker 
getId()169*d57664e9SAndroid Build Coastguard Worker int32_t FrontendClient::getId() {
170*d57664e9SAndroid Build Coastguard Worker     if (mTunerFrontend != nullptr) {
171*d57664e9SAndroid Build Coastguard Worker         int32_t id;
172*d57664e9SAndroid Build Coastguard Worker         Status s = mTunerFrontend->getFrontendId(&id);
173*d57664e9SAndroid Build Coastguard Worker         if (s.isOk()) {
174*d57664e9SAndroid Build Coastguard Worker             return id;
175*d57664e9SAndroid Build Coastguard Worker         }
176*d57664e9SAndroid Build Coastguard Worker     }
177*d57664e9SAndroid Build Coastguard Worker 
178*d57664e9SAndroid Build Coastguard Worker     return static_cast<int32_t>(Constant::INVALID_FRONTEND_ID);
179*d57664e9SAndroid Build Coastguard Worker }
180*d57664e9SAndroid Build Coastguard Worker 
181*d57664e9SAndroid Build Coastguard Worker /////////////// IFrontendCallback ///////////////////////
TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)182*d57664e9SAndroid Build Coastguard Worker TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
183*d57664e9SAndroid Build Coastguard Worker         : mFrontendClientCallback(frontendClientCallback) {}
184*d57664e9SAndroid Build Coastguard Worker 
onEvent(FrontendEventType frontendEventType)185*d57664e9SAndroid Build Coastguard Worker Status TunerFrontendCallback::onEvent(FrontendEventType frontendEventType) {
186*d57664e9SAndroid Build Coastguard Worker     if (mFrontendClientCallback != nullptr) {
187*d57664e9SAndroid Build Coastguard Worker         mFrontendClientCallback->onEvent(frontendEventType);
188*d57664e9SAndroid Build Coastguard Worker         return Status::ok();
189*d57664e9SAndroid Build Coastguard Worker     }
190*d57664e9SAndroid Build Coastguard Worker     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
191*d57664e9SAndroid Build Coastguard Worker }
192*d57664e9SAndroid Build Coastguard Worker 
onScanMessage(FrontendScanMessageType messageType,const FrontendScanMessage & message)193*d57664e9SAndroid Build Coastguard Worker Status TunerFrontendCallback::onScanMessage(FrontendScanMessageType messageType,
194*d57664e9SAndroid Build Coastguard Worker                                             const FrontendScanMessage& message) {
195*d57664e9SAndroid Build Coastguard Worker     if (mFrontendClientCallback != nullptr) {
196*d57664e9SAndroid Build Coastguard Worker         mFrontendClientCallback->onScanMessage(messageType, message);
197*d57664e9SAndroid Build Coastguard Worker         return Status::ok();
198*d57664e9SAndroid Build Coastguard Worker     }
199*d57664e9SAndroid Build Coastguard Worker     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
200*d57664e9SAndroid Build Coastguard Worker }
201*d57664e9SAndroid Build Coastguard Worker 
202*d57664e9SAndroid Build Coastguard Worker }  // namespace android
203