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, <sId);
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