xref: /aosp_15_r20/frameworks/av/services/tuner/hidl/TunerHidlService.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /**
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (c) 2021, The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "TunerHidlService"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlService.h"
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <binder/PermissionCache.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker #include "TunerHelper.h"
31*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlDemux.h"
32*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlDescrambler.h"
33*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlFrontend.h"
34*ec779b8eSAndroid Build Coastguard Worker #include "TunerHidlLnb.h"
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendAnalogCapabilities;
37*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Capabilities;
38*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendAtscCapabilities;
39*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendCapabilities;
40*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendDtmbCapabilities;
41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendDvbcCapabilities;
42*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendDvbsCapabilities;
43*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendDvbtCapabilities;
44*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Capabilities;
45*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendIsdbsCapabilities;
46*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendIsdbtCapabilities;
47*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendIsdbtTimeInterleaveMode;
48*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::FrontendType;
49*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Result;
50*ec779b8eSAndroid Build Coastguard Worker using ::android::IPCThreadState;
51*ec779b8eSAndroid Build Coastguard Worker using ::android::PermissionCache;
52*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker using HidlFrontendId = ::android::hardware::tv::tuner::V1_0::FrontendId;
55*ec779b8eSAndroid Build Coastguard Worker using HidlLnbId = ::android::hardware::tv::tuner::V1_0::LnbId;
56*ec779b8eSAndroid Build Coastguard Worker using HidlFrontendType = ::android::hardware::tv::tuner::V1_1::FrontendType;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker using namespace std;
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
61*ec779b8eSAndroid Build Coastguard Worker namespace android {
62*ec779b8eSAndroid Build Coastguard Worker namespace media {
63*ec779b8eSAndroid Build Coastguard Worker namespace tv {
64*ec779b8eSAndroid Build Coastguard Worker namespace tuner {
65*ec779b8eSAndroid Build Coastguard Worker 
TunerHidlService()66*ec779b8eSAndroid Build Coastguard Worker TunerHidlService::TunerHidlService() {
67*ec779b8eSAndroid Build Coastguard Worker     mTuner = HidlITuner::getService();
68*ec779b8eSAndroid Build Coastguard Worker     ALOGE_IF(mTuner == nullptr, "Failed to get ITuner service");
69*ec779b8eSAndroid Build Coastguard Worker     mTunerVersion = TUNER_HAL_VERSION_1_0;
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
72*ec779b8eSAndroid Build Coastguard Worker     if (mTuner_1_1 != nullptr) {
73*ec779b8eSAndroid Build Coastguard Worker         mTunerVersion = TUNER_HAL_VERSION_1_1;
74*ec779b8eSAndroid Build Coastguard Worker     } else {
75*ec779b8eSAndroid Build Coastguard Worker         ALOGD("Failed to get ITuner_1_1 service");
76*ec779b8eSAndroid Build Coastguard Worker     }
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker     // Register tuner resources to TRM.
79*ec779b8eSAndroid Build Coastguard Worker     updateTunerResources();
80*ec779b8eSAndroid Build Coastguard Worker }
81*ec779b8eSAndroid Build Coastguard Worker 
~TunerHidlService()82*ec779b8eSAndroid Build Coastguard Worker TunerHidlService::~TunerHidlService() {
83*ec779b8eSAndroid Build Coastguard Worker     mOpenedFrontends.clear();
84*ec779b8eSAndroid Build Coastguard Worker     mLnaStatus = -1;
85*ec779b8eSAndroid Build Coastguard Worker     mTuner = nullptr;
86*ec779b8eSAndroid Build Coastguard Worker     mTuner_1_1 = nullptr;
87*ec779b8eSAndroid Build Coastguard Worker }
88*ec779b8eSAndroid Build Coastguard Worker 
instantiate()89*ec779b8eSAndroid Build Coastguard Worker binder_status_t TunerHidlService::instantiate() {
90*ec779b8eSAndroid Build Coastguard Worker     if (HidlITuner::getService() == nullptr) {
91*ec779b8eSAndroid Build Coastguard Worker         ALOGD("Failed to get ITuner HIDL HAL");
92*ec779b8eSAndroid Build Coastguard Worker         return STATUS_NAME_NOT_FOUND;
93*ec779b8eSAndroid Build Coastguard Worker     }
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     shared_ptr<TunerHidlService> tunerService = ::ndk::SharedRefBase::make<TunerHidlService>();
96*ec779b8eSAndroid Build Coastguard Worker     bool lazyHal = property_get_bool("ro.tuner.lazyhal", false);
97*ec779b8eSAndroid Build Coastguard Worker     if (lazyHal) {
98*ec779b8eSAndroid Build Coastguard Worker         return AServiceManager_registerLazyService(tunerService->asBinder().get(),
99*ec779b8eSAndroid Build Coastguard Worker                                                    getServiceName());
100*ec779b8eSAndroid Build Coastguard Worker     }
101*ec779b8eSAndroid Build Coastguard Worker     return AServiceManager_addService(tunerService->asBinder().get(), getServiceName());
102*ec779b8eSAndroid Build Coastguard Worker }
103*ec779b8eSAndroid Build Coastguard Worker 
openDemux(int64_t,shared_ptr<ITunerDemux> * _aidl_return)104*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openDemux(int64_t /* in_demuxHandle */,
105*ec779b8eSAndroid Build Coastguard Worker                                                  shared_ptr<ITunerDemux>* _aidl_return) {
106*ec779b8eSAndroid Build Coastguard Worker     ALOGV("openDemux");
107*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
108*ec779b8eSAndroid Build Coastguard Worker     uint32_t id;
109*ec779b8eSAndroid Build Coastguard Worker     sp<IDemux> demuxSp = nullptr;
110*ec779b8eSAndroid Build Coastguard Worker     mTuner->openDemux([&](HidlResult r, uint32_t demuxId, const sp<IDemux>& demux) {
111*ec779b8eSAndroid Build Coastguard Worker         demuxSp = demux;
112*ec779b8eSAndroid Build Coastguard Worker         id = demuxId;
113*ec779b8eSAndroid Build Coastguard Worker         res = r;
114*ec779b8eSAndroid Build Coastguard Worker         ALOGD("open demux, id = %d", demuxId);
115*ec779b8eSAndroid Build Coastguard Worker     });
116*ec779b8eSAndroid Build Coastguard Worker     if (res == HidlResult::SUCCESS) {
117*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlDemux>(demuxSp, id,
118*ec779b8eSAndroid Build Coastguard Worker                                                                    this->ref<TunerHidlService>());
119*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::ok();
120*ec779b8eSAndroid Build Coastguard Worker     }
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker     ALOGW("open demux failed, res = %d", res);
123*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
124*ec779b8eSAndroid Build Coastguard Worker }
125*ec779b8eSAndroid Build Coastguard Worker 
getDemuxInfo(int64_t,DemuxInfo *)126*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getDemuxInfo(int64_t /* in_demuxHandle */,
127*ec779b8eSAndroid Build Coastguard Worker                                                     DemuxInfo* /* _aidl_return */) {
128*ec779b8eSAndroid Build Coastguard Worker     ALOGE("getDemuxInfo is not supported");
129*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
130*ec779b8eSAndroid Build Coastguard Worker             static_cast<int32_t>(HidlResult::UNAVAILABLE));
131*ec779b8eSAndroid Build Coastguard Worker }
132*ec779b8eSAndroid Build Coastguard Worker 
getDemuxInfoList(vector<DemuxInfo> *)133*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getDemuxInfoList(
134*ec779b8eSAndroid Build Coastguard Worker         vector<DemuxInfo>* /* _aidle_return */) {
135*ec779b8eSAndroid Build Coastguard Worker     ALOGE("getDemuxInfoList is not supported");
136*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
137*ec779b8eSAndroid Build Coastguard Worker             static_cast<int32_t>(HidlResult::UNAVAILABLE));
138*ec779b8eSAndroid Build Coastguard Worker }
139*ec779b8eSAndroid Build Coastguard Worker 
getDemuxCaps(DemuxCapabilities * _aidl_return)140*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
141*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getDemuxCaps");
142*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
143*ec779b8eSAndroid Build Coastguard Worker     HidlDemuxCapabilities caps;
144*ec779b8eSAndroid Build Coastguard Worker     mTuner->getDemuxCaps([&](HidlResult r, const HidlDemuxCapabilities& demuxCaps) {
145*ec779b8eSAndroid Build Coastguard Worker         caps = demuxCaps;
146*ec779b8eSAndroid Build Coastguard Worker         res = r;
147*ec779b8eSAndroid Build Coastguard Worker     });
148*ec779b8eSAndroid Build Coastguard Worker     if (res == HidlResult::SUCCESS) {
149*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = getAidlDemuxCaps(caps);
150*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::ok();
151*ec779b8eSAndroid Build Coastguard Worker     }
152*ec779b8eSAndroid Build Coastguard Worker 
153*ec779b8eSAndroid Build Coastguard Worker     ALOGW("Get demux caps failed, res = %d", res);
154*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
155*ec779b8eSAndroid Build Coastguard Worker }
156*ec779b8eSAndroid Build Coastguard Worker 
getFrontendIds(vector<int32_t> * ids)157*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getFrontendIds(vector<int32_t>* ids) {
158*ec779b8eSAndroid Build Coastguard Worker     hidl_vec<HidlFrontendId> feIds;
159*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = getHidlFrontendIds(feIds);
160*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
161*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
162*ec779b8eSAndroid Build Coastguard Worker     }
163*ec779b8eSAndroid Build Coastguard Worker     ids->resize(feIds.size());
164*ec779b8eSAndroid Build Coastguard Worker     copy(feIds.begin(), feIds.end(), ids->begin());
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
167*ec779b8eSAndroid Build Coastguard Worker }
168*ec779b8eSAndroid Build Coastguard Worker 
getFrontendInfo(int32_t id,FrontendInfo * _aidl_return)169*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
170*ec779b8eSAndroid Build Coastguard Worker     HidlFrontendInfo info;
171*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = getHidlFrontendInfo(id, info);
172*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
173*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
174*ec779b8eSAndroid Build Coastguard Worker     }
175*ec779b8eSAndroid Build Coastguard Worker 
176*ec779b8eSAndroid Build Coastguard Worker     HidlFrontendDtmbCapabilities dtmbCaps;
177*ec779b8eSAndroid Build Coastguard Worker     if (static_cast<HidlFrontendType>(info.type) == HidlFrontendType::DTMB) {
178*ec779b8eSAndroid Build Coastguard Worker         if (mTuner_1_1 == nullptr) {
179*ec779b8eSAndroid Build Coastguard Worker             ALOGE("ITuner_1_1 service is not init.");
180*ec779b8eSAndroid Build Coastguard Worker             return ::ndk::ScopedAStatus::fromServiceSpecificError(
181*ec779b8eSAndroid Build Coastguard Worker                     static_cast<int32_t>(Result::UNAVAILABLE));
182*ec779b8eSAndroid Build Coastguard Worker         }
183*ec779b8eSAndroid Build Coastguard Worker 
184*ec779b8eSAndroid Build Coastguard Worker         mTuner_1_1->getFrontendDtmbCapabilities(
185*ec779b8eSAndroid Build Coastguard Worker                 id, [&](HidlResult r, const HidlFrontendDtmbCapabilities& caps) {
186*ec779b8eSAndroid Build Coastguard Worker                     dtmbCaps = caps;
187*ec779b8eSAndroid Build Coastguard Worker                     res = r;
188*ec779b8eSAndroid Build Coastguard Worker                 });
189*ec779b8eSAndroid Build Coastguard Worker         if (res != HidlResult::SUCCESS) {
190*ec779b8eSAndroid Build Coastguard Worker             return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
191*ec779b8eSAndroid Build Coastguard Worker         }
192*ec779b8eSAndroid Build Coastguard Worker     }
193*ec779b8eSAndroid Build Coastguard Worker 
194*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = getAidlFrontendInfo(info, dtmbCaps);
195*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
196*ec779b8eSAndroid Build Coastguard Worker }
197*ec779b8eSAndroid Build Coastguard Worker 
openFrontend(int64_t frontendHandle,shared_ptr<ITunerFrontend> * _aidl_return)198*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openFrontend(int64_t frontendHandle,
199*ec779b8eSAndroid Build Coastguard Worker                                                     shared_ptr<ITunerFrontend>* _aidl_return) {
200*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
201*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIFrontend> frontend;
202*ec779b8eSAndroid Build Coastguard Worker     int id = TunerHelper::getResourceIdFromHandle(frontendHandle, FRONTEND);
203*ec779b8eSAndroid Build Coastguard Worker     mTuner->openFrontendById(id, [&](HidlResult result, const sp<HidlIFrontend>& fe) {
204*ec779b8eSAndroid Build Coastguard Worker         frontend = fe;
205*ec779b8eSAndroid Build Coastguard Worker         status = result;
206*ec779b8eSAndroid Build Coastguard Worker     });
207*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
208*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
209*ec779b8eSAndroid Build Coastguard Worker     }
210*ec779b8eSAndroid Build Coastguard Worker 
211*ec779b8eSAndroid Build Coastguard Worker     shared_ptr<TunerHidlFrontend> tunerFrontend = ::ndk::SharedRefBase::make<TunerHidlFrontend>(
212*ec779b8eSAndroid Build Coastguard Worker             frontend, id, this->ref<TunerHidlService>());
213*ec779b8eSAndroid Build Coastguard Worker     if (mLnaStatus != -1) {
214*ec779b8eSAndroid Build Coastguard Worker         tunerFrontend->setLna(mLnaStatus == 1);
215*ec779b8eSAndroid Build Coastguard Worker     }
216*ec779b8eSAndroid Build Coastguard Worker     {
217*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mOpenedFrontendsLock);
218*ec779b8eSAndroid Build Coastguard Worker         mOpenedFrontends.insert(tunerFrontend);
219*ec779b8eSAndroid Build Coastguard Worker     }
220*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = tunerFrontend;
221*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
222*ec779b8eSAndroid Build Coastguard Worker }
223*ec779b8eSAndroid Build Coastguard Worker 
openLnb(int64_t lnbHandle,shared_ptr<ITunerLnb> * _aidl_return)224*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openLnb(int64_t lnbHandle,
225*ec779b8eSAndroid Build Coastguard Worker                                                shared_ptr<ITunerLnb>* _aidl_return) {
226*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
227*ec779b8eSAndroid Build Coastguard Worker     sp<HidlILnb> lnb;
228*ec779b8eSAndroid Build Coastguard Worker     int id = TunerHelper::getResourceIdFromHandle(lnbHandle, LNB);
229*ec779b8eSAndroid Build Coastguard Worker     mTuner->openLnbById(id, [&](HidlResult result, const sp<HidlILnb>& lnbSp) {
230*ec779b8eSAndroid Build Coastguard Worker         lnb = lnbSp;
231*ec779b8eSAndroid Build Coastguard Worker         status = result;
232*ec779b8eSAndroid Build Coastguard Worker     });
233*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
234*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
235*ec779b8eSAndroid Build Coastguard Worker     }
236*ec779b8eSAndroid Build Coastguard Worker 
237*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlLnb>(lnb, id);
238*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
239*ec779b8eSAndroid Build Coastguard Worker }
240*ec779b8eSAndroid Build Coastguard Worker 
openLnbByName(const string & lnbName,shared_ptr<ITunerLnb> * _aidl_return)241*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openLnbByName(const string& lnbName,
242*ec779b8eSAndroid Build Coastguard Worker                                                      shared_ptr<ITunerLnb>* _aidl_return) {
243*ec779b8eSAndroid Build Coastguard Worker     int lnbId;
244*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
245*ec779b8eSAndroid Build Coastguard Worker     sp<HidlILnb> lnb;
246*ec779b8eSAndroid Build Coastguard Worker     mTuner->openLnbByName(lnbName, [&](HidlResult r, HidlLnbId id, const sp<HidlILnb>& lnbSp) {
247*ec779b8eSAndroid Build Coastguard Worker         status = r;
248*ec779b8eSAndroid Build Coastguard Worker         lnb = lnbSp;
249*ec779b8eSAndroid Build Coastguard Worker         lnbId = static_cast<int32_t>(id);
250*ec779b8eSAndroid Build Coastguard Worker     });
251*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
252*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
253*ec779b8eSAndroid Build Coastguard Worker     }
254*ec779b8eSAndroid Build Coastguard Worker 
255*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlLnb>(lnb, lnbId);
256*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
257*ec779b8eSAndroid Build Coastguard Worker }
258*ec779b8eSAndroid Build Coastguard Worker 
openDescrambler(int64_t,shared_ptr<ITunerDescrambler> * _aidl_return)259*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openDescrambler(
260*ec779b8eSAndroid Build Coastguard Worker         int64_t /*descramblerHandle*/, shared_ptr<ITunerDescrambler>* _aidl_return) {
261*ec779b8eSAndroid Build Coastguard Worker     HidlResult status;
262*ec779b8eSAndroid Build Coastguard Worker     sp<HidlIDescrambler> descrambler;
263*ec779b8eSAndroid Build Coastguard Worker     //int id = TunerHelper::getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
264*ec779b8eSAndroid Build Coastguard Worker     mTuner->openDescrambler([&](HidlResult r, const sp<HidlIDescrambler>& descramblerSp) {
265*ec779b8eSAndroid Build Coastguard Worker         status = r;
266*ec779b8eSAndroid Build Coastguard Worker         descrambler = descramblerSp;
267*ec779b8eSAndroid Build Coastguard Worker     });
268*ec779b8eSAndroid Build Coastguard Worker     if (status != HidlResult::SUCCESS) {
269*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
270*ec779b8eSAndroid Build Coastguard Worker     }
271*ec779b8eSAndroid Build Coastguard Worker 
272*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = ::ndk::SharedRefBase::make<TunerHidlDescrambler>(descrambler);
273*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
274*ec779b8eSAndroid Build Coastguard Worker }
275*ec779b8eSAndroid Build Coastguard Worker 
getTunerHalVersion(int * _aidl_return)276*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getTunerHalVersion(int* _aidl_return) {
277*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mTunerVersion;
278*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
279*ec779b8eSAndroid Build Coastguard Worker }
280*ec779b8eSAndroid Build Coastguard Worker 
openSharedFilter(const string & in_filterToken,const shared_ptr<ITunerFilterCallback> & in_cb,shared_ptr<ITunerFilter> * _aidl_return)281*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::openSharedFilter(
282*ec779b8eSAndroid Build Coastguard Worker         const string& in_filterToken, const shared_ptr<ITunerFilterCallback>& in_cb,
283*ec779b8eSAndroid Build Coastguard Worker         shared_ptr<ITunerFilter>* _aidl_return) {
284*ec779b8eSAndroid Build Coastguard Worker     if (mTuner == nullptr) {
285*ec779b8eSAndroid Build Coastguard Worker         ALOGE("get ITuner failed");
286*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
287*ec779b8eSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::UNAVAILABLE));
288*ec779b8eSAndroid Build Coastguard Worker     }
289*ec779b8eSAndroid Build Coastguard Worker 
290*ec779b8eSAndroid Build Coastguard Worker     if (!PermissionCache::checkCallingPermission(sSharedFilterPermission)) {
291*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Request requires android.permission.ACCESS_TV_SHARED_FILTER");
292*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
293*ec779b8eSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::UNAVAILABLE));
294*ec779b8eSAndroid Build Coastguard Worker     }
295*ec779b8eSAndroid Build Coastguard Worker 
296*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mSharedFiltersLock);
297*ec779b8eSAndroid Build Coastguard Worker     if (mSharedFilters.find(in_filterToken) == mSharedFilters.end()) {
298*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
299*ec779b8eSAndroid Build Coastguard Worker         ALOGD("fail to find %s", in_filterToken.c_str());
300*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
301*ec779b8eSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_STATE));
302*ec779b8eSAndroid Build Coastguard Worker     }
303*ec779b8eSAndroid Build Coastguard Worker 
304*ec779b8eSAndroid Build Coastguard Worker     shared_ptr<TunerHidlFilter> filter = mSharedFilters.at(in_filterToken);
305*ec779b8eSAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
306*ec779b8eSAndroid Build Coastguard Worker     const int pid = ipc->getCallingPid();
307*ec779b8eSAndroid Build Coastguard Worker     if (!filter->isSharedFilterAllowed(pid)) {
308*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
309*ec779b8eSAndroid Build Coastguard Worker         ALOGD("shared filter %s is opened in the same process", in_filterToken.c_str());
310*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
311*ec779b8eSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_STATE));
312*ec779b8eSAndroid Build Coastguard Worker     }
313*ec779b8eSAndroid Build Coastguard Worker 
314*ec779b8eSAndroid Build Coastguard Worker     filter->attachSharedFilterCallback(in_cb);
315*ec779b8eSAndroid Build Coastguard Worker 
316*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = filter;
317*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
318*ec779b8eSAndroid Build Coastguard Worker }
319*ec779b8eSAndroid Build Coastguard Worker 
isLnaSupported(bool *)320*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::isLnaSupported(bool* /* _aidl_return */) {
321*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
322*ec779b8eSAndroid Build Coastguard Worker             static_cast<int32_t>(Result::UNAVAILABLE));
323*ec779b8eSAndroid Build Coastguard Worker }
324*ec779b8eSAndroid Build Coastguard Worker 
setLna(bool bEnable)325*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::setLna(bool bEnable) {
326*ec779b8eSAndroid Build Coastguard Worker     if (mTuner == nullptr) {
327*ec779b8eSAndroid Build Coastguard Worker         ALOGE("get ITuner failed");
328*ec779b8eSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
329*ec779b8eSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::UNAVAILABLE));
330*ec779b8eSAndroid Build Coastguard Worker     }
331*ec779b8eSAndroid Build Coastguard Worker 
332*ec779b8eSAndroid Build Coastguard Worker     mLnaStatus = bEnable ? 1 : 0;
333*ec779b8eSAndroid Build Coastguard Worker 
334*ec779b8eSAndroid Build Coastguard Worker     {
335*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mOpenedFrontendsLock);
336*ec779b8eSAndroid Build Coastguard Worker         for (auto it = mOpenedFrontends.begin(); it != mOpenedFrontends.end(); ++it) {
337*ec779b8eSAndroid Build Coastguard Worker             (*it)->setLna(mLnaStatus == 1);
338*ec779b8eSAndroid Build Coastguard Worker         }
339*ec779b8eSAndroid Build Coastguard Worker     }
340*ec779b8eSAndroid Build Coastguard Worker 
341*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
342*ec779b8eSAndroid Build Coastguard Worker }
343*ec779b8eSAndroid Build Coastguard Worker 
setMaxNumberOfFrontends(FrontendType,int32_t)344*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::setMaxNumberOfFrontends(FrontendType /* in_frontendType */,
345*ec779b8eSAndroid Build Coastguard Worker                                                                int32_t /* in_maxNumber */) {
346*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
347*ec779b8eSAndroid Build Coastguard Worker             static_cast<int32_t>(Result::UNAVAILABLE));
348*ec779b8eSAndroid Build Coastguard Worker }
349*ec779b8eSAndroid Build Coastguard Worker 
getMaxNumberOfFrontends(FrontendType,int32_t * _aidl_return)350*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerHidlService::getMaxNumberOfFrontends(FrontendType /* in_frontendType */,
351*ec779b8eSAndroid Build Coastguard Worker                                                                int32_t* _aidl_return) {
352*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = -1;
353*ec779b8eSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::fromServiceSpecificError(
354*ec779b8eSAndroid Build Coastguard Worker             static_cast<int32_t>(Result::UNAVAILABLE));
355*ec779b8eSAndroid Build Coastguard Worker }
356*ec779b8eSAndroid Build Coastguard Worker 
addFilterToShared(const shared_ptr<TunerHidlFilter> & sharedFilter)357*ec779b8eSAndroid Build Coastguard Worker string TunerHidlService::addFilterToShared(const shared_ptr<TunerHidlFilter>& sharedFilter) {
358*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mSharedFiltersLock);
359*ec779b8eSAndroid Build Coastguard Worker 
360*ec779b8eSAndroid Build Coastguard Worker     // Use sharedFilter address as token.
361*ec779b8eSAndroid Build Coastguard Worker     string token = to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get()));
362*ec779b8eSAndroid Build Coastguard Worker     mSharedFilters[token] = sharedFilter;
363*ec779b8eSAndroid Build Coastguard Worker 
364*ec779b8eSAndroid Build Coastguard Worker     return token;
365*ec779b8eSAndroid Build Coastguard Worker }
366*ec779b8eSAndroid Build Coastguard Worker 
removeSharedFilter(const shared_ptr<TunerHidlFilter> & sharedFilter)367*ec779b8eSAndroid Build Coastguard Worker void TunerHidlService::removeSharedFilter(const shared_ptr<TunerHidlFilter>& sharedFilter) {
368*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mSharedFiltersLock);
369*ec779b8eSAndroid Build Coastguard Worker 
370*ec779b8eSAndroid Build Coastguard Worker     // Use sharedFilter address as token.
371*ec779b8eSAndroid Build Coastguard Worker     mSharedFilters.erase(to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get())));
372*ec779b8eSAndroid Build Coastguard Worker }
373*ec779b8eSAndroid Build Coastguard Worker 
removeFrontend(const shared_ptr<TunerHidlFrontend> & frontend)374*ec779b8eSAndroid Build Coastguard Worker void TunerHidlService::removeFrontend(const shared_ptr<TunerHidlFrontend>& frontend) {
375*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mOpenedFrontendsLock);
376*ec779b8eSAndroid Build Coastguard Worker     for (auto it = mOpenedFrontends.begin(); it != mOpenedFrontends.end(); ++it) {
377*ec779b8eSAndroid Build Coastguard Worker         if (it->get() == frontend.get()) {
378*ec779b8eSAndroid Build Coastguard Worker             mOpenedFrontends.erase(it);
379*ec779b8eSAndroid Build Coastguard Worker             break;
380*ec779b8eSAndroid Build Coastguard Worker         }
381*ec779b8eSAndroid Build Coastguard Worker     }
382*ec779b8eSAndroid Build Coastguard Worker }
383*ec779b8eSAndroid Build Coastguard Worker 
updateTunerResources()384*ec779b8eSAndroid Build Coastguard Worker void TunerHidlService::updateTunerResources() {
385*ec779b8eSAndroid Build Coastguard Worker     TunerHelper::updateTunerResources(getTRMFrontendInfos(), getTRMLnbHandles());
386*ec779b8eSAndroid Build Coastguard Worker }
387*ec779b8eSAndroid Build Coastguard Worker 
getTRMFrontendInfos()388*ec779b8eSAndroid Build Coastguard Worker vector<TunerFrontendInfo> TunerHidlService::getTRMFrontendInfos() {
389*ec779b8eSAndroid Build Coastguard Worker     vector<TunerFrontendInfo> infos;
390*ec779b8eSAndroid Build Coastguard Worker     hidl_vec<HidlFrontendId> ids;
391*ec779b8eSAndroid Build Coastguard Worker     HidlResult res = getHidlFrontendIds(ids);
392*ec779b8eSAndroid Build Coastguard Worker     if (res != HidlResult::SUCCESS) {
393*ec779b8eSAndroid Build Coastguard Worker         return infos;
394*ec779b8eSAndroid Build Coastguard Worker     }
395*ec779b8eSAndroid Build Coastguard Worker 
396*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < ids.size(); i++) {
397*ec779b8eSAndroid Build Coastguard Worker         HidlFrontendInfo frontendInfo;
398*ec779b8eSAndroid Build Coastguard Worker         HidlResult res = getHidlFrontendInfo(static_cast<int32_t>(ids[i]), frontendInfo);
399*ec779b8eSAndroid Build Coastguard Worker         if (res != HidlResult::SUCCESS) {
400*ec779b8eSAndroid Build Coastguard Worker             continue;
401*ec779b8eSAndroid Build Coastguard Worker         }
402*ec779b8eSAndroid Build Coastguard Worker         TunerFrontendInfo tunerFrontendInfo{
403*ec779b8eSAndroid Build Coastguard Worker                 .handle = TunerHelper::getResourceHandleFromId(static_cast<int32_t>(ids[i]),
404*ec779b8eSAndroid Build Coastguard Worker                                                                FRONTEND),
405*ec779b8eSAndroid Build Coastguard Worker                 .type = static_cast<int32_t>(frontendInfo.type),
406*ec779b8eSAndroid Build Coastguard Worker                 .exclusiveGroupId = static_cast<int32_t>(frontendInfo.exclusiveGroupId),
407*ec779b8eSAndroid Build Coastguard Worker         };
408*ec779b8eSAndroid Build Coastguard Worker         infos.push_back(tunerFrontendInfo);
409*ec779b8eSAndroid Build Coastguard Worker     }
410*ec779b8eSAndroid Build Coastguard Worker 
411*ec779b8eSAndroid Build Coastguard Worker     return infos;
412*ec779b8eSAndroid Build Coastguard Worker }
413*ec779b8eSAndroid Build Coastguard Worker 
getTRMLnbHandles()414*ec779b8eSAndroid Build Coastguard Worker vector<int64_t> TunerHidlService::getTRMLnbHandles() {
415*ec779b8eSAndroid Build Coastguard Worker     vector<int64_t> lnbHandles;
416*ec779b8eSAndroid Build Coastguard Worker     if (mTuner != nullptr) {
417*ec779b8eSAndroid Build Coastguard Worker         HidlResult res;
418*ec779b8eSAndroid Build Coastguard Worker         vector<HidlLnbId> lnbIds;
419*ec779b8eSAndroid Build Coastguard Worker         mTuner->getLnbIds([&](HidlResult r, const hidl_vec<HidlLnbId>& ids) {
420*ec779b8eSAndroid Build Coastguard Worker             lnbIds = ids;
421*ec779b8eSAndroid Build Coastguard Worker             res = r;
422*ec779b8eSAndroid Build Coastguard Worker         });
423*ec779b8eSAndroid Build Coastguard Worker         if (res == HidlResult::SUCCESS && lnbIds.size() > 0) {
424*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < lnbIds.size(); i++) {
425*ec779b8eSAndroid Build Coastguard Worker                 lnbHandles.push_back(
426*ec779b8eSAndroid Build Coastguard Worker                         TunerHelper::getResourceHandleFromId(static_cast<int32_t>(lnbIds[i]), LNB));
427*ec779b8eSAndroid Build Coastguard Worker             }
428*ec779b8eSAndroid Build Coastguard Worker         }
429*ec779b8eSAndroid Build Coastguard Worker     }
430*ec779b8eSAndroid Build Coastguard Worker 
431*ec779b8eSAndroid Build Coastguard Worker     return lnbHandles;
432*ec779b8eSAndroid Build Coastguard Worker }
433*ec779b8eSAndroid Build Coastguard Worker 
getHidlFrontendIds(hidl_vec<HidlFrontendId> & ids)434*ec779b8eSAndroid Build Coastguard Worker HidlResult TunerHidlService::getHidlFrontendIds(hidl_vec<HidlFrontendId>& ids) {
435*ec779b8eSAndroid Build Coastguard Worker     if (mTuner == nullptr) {
436*ec779b8eSAndroid Build Coastguard Worker         return HidlResult::NOT_INITIALIZED;
437*ec779b8eSAndroid Build Coastguard Worker     }
438*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
439*ec779b8eSAndroid Build Coastguard Worker     mTuner->getFrontendIds([&](HidlResult r, const hidl_vec<HidlFrontendId>& frontendIds) {
440*ec779b8eSAndroid Build Coastguard Worker         ids = frontendIds;
441*ec779b8eSAndroid Build Coastguard Worker         res = r;
442*ec779b8eSAndroid Build Coastguard Worker     });
443*ec779b8eSAndroid Build Coastguard Worker     return res;
444*ec779b8eSAndroid Build Coastguard Worker }
445*ec779b8eSAndroid Build Coastguard Worker 
getHidlFrontendInfo(const int id,HidlFrontendInfo & info)446*ec779b8eSAndroid Build Coastguard Worker HidlResult TunerHidlService::getHidlFrontendInfo(const int id, HidlFrontendInfo& info) {
447*ec779b8eSAndroid Build Coastguard Worker     if (mTuner == nullptr) {
448*ec779b8eSAndroid Build Coastguard Worker         return HidlResult::NOT_INITIALIZED;
449*ec779b8eSAndroid Build Coastguard Worker     }
450*ec779b8eSAndroid Build Coastguard Worker     HidlResult res;
451*ec779b8eSAndroid Build Coastguard Worker     mTuner->getFrontendInfo(id, [&](HidlResult r, const HidlFrontendInfo& feInfo) {
452*ec779b8eSAndroid Build Coastguard Worker         info = feInfo;
453*ec779b8eSAndroid Build Coastguard Worker         res = r;
454*ec779b8eSAndroid Build Coastguard Worker     });
455*ec779b8eSAndroid Build Coastguard Worker     return res;
456*ec779b8eSAndroid Build Coastguard Worker }
457*ec779b8eSAndroid Build Coastguard Worker 
getAidlDemuxCaps(const HidlDemuxCapabilities & caps)458*ec779b8eSAndroid Build Coastguard Worker DemuxCapabilities TunerHidlService::getAidlDemuxCaps(const HidlDemuxCapabilities& caps) {
459*ec779b8eSAndroid Build Coastguard Worker     DemuxCapabilities aidlCaps{
460*ec779b8eSAndroid Build Coastguard Worker             .numDemux = static_cast<int32_t>(caps.numDemux),
461*ec779b8eSAndroid Build Coastguard Worker             .numRecord = static_cast<int32_t>(caps.numRecord),
462*ec779b8eSAndroid Build Coastguard Worker             .numPlayback = static_cast<int32_t>(caps.numPlayback),
463*ec779b8eSAndroid Build Coastguard Worker             .numTsFilter = static_cast<int32_t>(caps.numTsFilter),
464*ec779b8eSAndroid Build Coastguard Worker             .numSectionFilter = static_cast<int32_t>(caps.numSectionFilter),
465*ec779b8eSAndroid Build Coastguard Worker             .numAudioFilter = static_cast<int32_t>(caps.numAudioFilter),
466*ec779b8eSAndroid Build Coastguard Worker             .numVideoFilter = static_cast<int32_t>(caps.numVideoFilter),
467*ec779b8eSAndroid Build Coastguard Worker             .numPesFilter = static_cast<int32_t>(caps.numPesFilter),
468*ec779b8eSAndroid Build Coastguard Worker             .numPcrFilter = static_cast<int32_t>(caps.numPcrFilter),
469*ec779b8eSAndroid Build Coastguard Worker             .numBytesInSectionFilter = static_cast<int64_t>(caps.numBytesInSectionFilter),
470*ec779b8eSAndroid Build Coastguard Worker             .filterCaps = static_cast<int32_t>(caps.filterCaps),
471*ec779b8eSAndroid Build Coastguard Worker             .bTimeFilter = caps.bTimeFilter,
472*ec779b8eSAndroid Build Coastguard Worker     };
473*ec779b8eSAndroid Build Coastguard Worker     aidlCaps.linkCaps.resize(caps.linkCaps.size());
474*ec779b8eSAndroid Build Coastguard Worker     copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
475*ec779b8eSAndroid Build Coastguard Worker     return aidlCaps;
476*ec779b8eSAndroid Build Coastguard Worker }
477*ec779b8eSAndroid Build Coastguard Worker 
getAidlFrontendInfo(const HidlFrontendInfo & halInfo,const HidlFrontendDtmbCapabilities & halDtmbCaps)478*ec779b8eSAndroid Build Coastguard Worker FrontendInfo TunerHidlService::getAidlFrontendInfo(
479*ec779b8eSAndroid Build Coastguard Worker         const HidlFrontendInfo& halInfo, const HidlFrontendDtmbCapabilities& halDtmbCaps) {
480*ec779b8eSAndroid Build Coastguard Worker     FrontendInfo info{
481*ec779b8eSAndroid Build Coastguard Worker             .type = static_cast<FrontendType>(halInfo.type),
482*ec779b8eSAndroid Build Coastguard Worker             .minFrequency = static_cast<int64_t>(halInfo.minFrequency),
483*ec779b8eSAndroid Build Coastguard Worker             .maxFrequency = static_cast<int64_t>(halInfo.maxFrequency),
484*ec779b8eSAndroid Build Coastguard Worker             .minSymbolRate = static_cast<int32_t>(halInfo.minSymbolRate),
485*ec779b8eSAndroid Build Coastguard Worker             .maxSymbolRate = static_cast<int32_t>(halInfo.maxSymbolRate),
486*ec779b8eSAndroid Build Coastguard Worker             .acquireRange = static_cast<int64_t>(halInfo.acquireRange),
487*ec779b8eSAndroid Build Coastguard Worker             .exclusiveGroupId = static_cast<int32_t>(halInfo.exclusiveGroupId),
488*ec779b8eSAndroid Build Coastguard Worker     };
489*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < halInfo.statusCaps.size(); i++) {
490*ec779b8eSAndroid Build Coastguard Worker         info.statusCaps.push_back(static_cast<FrontendStatusType>(halInfo.statusCaps[i]));
491*ec779b8eSAndroid Build Coastguard Worker     }
492*ec779b8eSAndroid Build Coastguard Worker 
493*ec779b8eSAndroid Build Coastguard Worker     FrontendCapabilities caps;
494*ec779b8eSAndroid Build Coastguard Worker     switch (halInfo.type) {
495*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ANALOG: {
496*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::analogCaps ==
497*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
498*ec779b8eSAndroid Build Coastguard Worker             FrontendAnalogCapabilities analogCaps{
499*ec779b8eSAndroid Build Coastguard Worker                     .typeCap = static_cast<int32_t>(halInfo.frontendCaps.analogCaps().typeCap),
500*ec779b8eSAndroid Build Coastguard Worker                     .sifStandardCap =
501*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.analogCaps().sifStandardCap),
502*ec779b8eSAndroid Build Coastguard Worker             };
503*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::analogCaps>(analogCaps);
504*ec779b8eSAndroid Build Coastguard Worker         }
505*ec779b8eSAndroid Build Coastguard Worker         break;
506*ec779b8eSAndroid Build Coastguard Worker     }
507*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ATSC: {
508*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::atscCaps ==
509*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
510*ec779b8eSAndroid Build Coastguard Worker             FrontendAtscCapabilities atscCaps{
511*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
512*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.atscCaps().modulationCap),
513*ec779b8eSAndroid Build Coastguard Worker             };
514*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::atscCaps>(atscCaps);
515*ec779b8eSAndroid Build Coastguard Worker         }
516*ec779b8eSAndroid Build Coastguard Worker         break;
517*ec779b8eSAndroid Build Coastguard Worker     }
518*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ATSC3: {
519*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::atsc3Caps ==
520*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
521*ec779b8eSAndroid Build Coastguard Worker             FrontendAtsc3Capabilities atsc3Caps{
522*ec779b8eSAndroid Build Coastguard Worker                     .bandwidthCap =
523*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().bandwidthCap),
524*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
525*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().modulationCap),
526*ec779b8eSAndroid Build Coastguard Worker                     .timeInterleaveModeCap = static_cast<int32_t>(
527*ec779b8eSAndroid Build Coastguard Worker                             halInfo.frontendCaps.atsc3Caps().timeInterleaveModeCap),
528*ec779b8eSAndroid Build Coastguard Worker                     .codeRateCap =
529*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().codeRateCap),
530*ec779b8eSAndroid Build Coastguard Worker                     .demodOutputFormatCap = static_cast<int8_t>(
531*ec779b8eSAndroid Build Coastguard Worker                             halInfo.frontendCaps.atsc3Caps().demodOutputFormatCap),
532*ec779b8eSAndroid Build Coastguard Worker                     .fecCap = static_cast<int32_t>(halInfo.frontendCaps.atsc3Caps().fecCap),
533*ec779b8eSAndroid Build Coastguard Worker             };
534*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::atsc3Caps>(atsc3Caps);
535*ec779b8eSAndroid Build Coastguard Worker         }
536*ec779b8eSAndroid Build Coastguard Worker         break;
537*ec779b8eSAndroid Build Coastguard Worker     }
538*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBC: {
539*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbcCaps ==
540*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
541*ec779b8eSAndroid Build Coastguard Worker             FrontendDvbcCapabilities dvbcCaps{
542*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
543*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbcCaps().modulationCap),
544*ec779b8eSAndroid Build Coastguard Worker                     .fecCap = static_cast<int64_t>(halInfo.frontendCaps.dvbcCaps().fecCap),
545*ec779b8eSAndroid Build Coastguard Worker                     .annexCap = static_cast<int8_t>(halInfo.frontendCaps.dvbcCaps().annexCap),
546*ec779b8eSAndroid Build Coastguard Worker             };
547*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::dvbcCaps>(dvbcCaps);
548*ec779b8eSAndroid Build Coastguard Worker         }
549*ec779b8eSAndroid Build Coastguard Worker         break;
550*ec779b8eSAndroid Build Coastguard Worker     }
551*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBS: {
552*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbsCaps ==
553*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
554*ec779b8eSAndroid Build Coastguard Worker             FrontendDvbsCapabilities dvbsCaps{
555*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
556*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbsCaps().modulationCap),
557*ec779b8eSAndroid Build Coastguard Worker                     .innerfecCap =
558*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int64_t>(halInfo.frontendCaps.dvbsCaps().innerfecCap),
559*ec779b8eSAndroid Build Coastguard Worker                     .standard = static_cast<int8_t>(halInfo.frontendCaps.dvbsCaps().standard),
560*ec779b8eSAndroid Build Coastguard Worker             };
561*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::dvbsCaps>(dvbsCaps);
562*ec779b8eSAndroid Build Coastguard Worker         }
563*ec779b8eSAndroid Build Coastguard Worker         break;
564*ec779b8eSAndroid Build Coastguard Worker     }
565*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::DVBT: {
566*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::dvbtCaps ==
567*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
568*ec779b8eSAndroid Build Coastguard Worker             FrontendDvbtCapabilities dvbtCaps{
569*ec779b8eSAndroid Build Coastguard Worker                     .transmissionModeCap = static_cast<int32_t>(
570*ec779b8eSAndroid Build Coastguard Worker                             halInfo.frontendCaps.dvbtCaps().transmissionModeCap),
571*ec779b8eSAndroid Build Coastguard Worker                     .bandwidthCap =
572*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().bandwidthCap),
573*ec779b8eSAndroid Build Coastguard Worker                     .constellationCap =
574*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().constellationCap),
575*ec779b8eSAndroid Build Coastguard Worker                     .coderateCap =
576*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().coderateCap),
577*ec779b8eSAndroid Build Coastguard Worker                     .hierarchyCap =
578*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().hierarchyCap),
579*ec779b8eSAndroid Build Coastguard Worker                     .guardIntervalCap =
580*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.dvbtCaps().guardIntervalCap),
581*ec779b8eSAndroid Build Coastguard Worker                     .isT2Supported = halInfo.frontendCaps.dvbtCaps().isT2Supported,
582*ec779b8eSAndroid Build Coastguard Worker                     .isMisoSupported = halInfo.frontendCaps.dvbtCaps().isMisoSupported,
583*ec779b8eSAndroid Build Coastguard Worker             };
584*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::dvbtCaps>(dvbtCaps);
585*ec779b8eSAndroid Build Coastguard Worker         }
586*ec779b8eSAndroid Build Coastguard Worker         break;
587*ec779b8eSAndroid Build Coastguard Worker     }
588*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBS: {
589*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbsCaps ==
590*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
591*ec779b8eSAndroid Build Coastguard Worker             FrontendIsdbsCapabilities isdbsCaps{
592*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
593*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbsCaps().modulationCap),
594*ec779b8eSAndroid Build Coastguard Worker                     .coderateCap =
595*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbsCaps().coderateCap),
596*ec779b8eSAndroid Build Coastguard Worker             };
597*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::isdbsCaps>(isdbsCaps);
598*ec779b8eSAndroid Build Coastguard Worker         }
599*ec779b8eSAndroid Build Coastguard Worker         break;
600*ec779b8eSAndroid Build Coastguard Worker     }
601*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBS3: {
602*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbs3Caps ==
603*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
604*ec779b8eSAndroid Build Coastguard Worker             FrontendIsdbs3Capabilities isdbs3Caps{
605*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
606*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbs3Caps().modulationCap),
607*ec779b8eSAndroid Build Coastguard Worker                     .coderateCap =
608*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbs3Caps().coderateCap),
609*ec779b8eSAndroid Build Coastguard Worker             };
610*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::isdbs3Caps>(isdbs3Caps);
611*ec779b8eSAndroid Build Coastguard Worker         }
612*ec779b8eSAndroid Build Coastguard Worker         break;
613*ec779b8eSAndroid Build Coastguard Worker     }
614*ec779b8eSAndroid Build Coastguard Worker     case ::android::hardware::tv::tuner::V1_0::FrontendType::ISDBT: {
615*ec779b8eSAndroid Build Coastguard Worker         if (HidlFrontendInfo::FrontendCapabilities::hidl_discriminator::isdbtCaps ==
616*ec779b8eSAndroid Build Coastguard Worker             halInfo.frontendCaps.getDiscriminator()) {
617*ec779b8eSAndroid Build Coastguard Worker             FrontendIsdbtCapabilities isdbtCaps{
618*ec779b8eSAndroid Build Coastguard Worker                     .modeCap = static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().modeCap),
619*ec779b8eSAndroid Build Coastguard Worker                     .bandwidthCap =
620*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().bandwidthCap),
621*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap =
622*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().modulationCap),
623*ec779b8eSAndroid Build Coastguard Worker                     .coderateCap =
624*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().coderateCap),
625*ec779b8eSAndroid Build Coastguard Worker                     .guardIntervalCap =
626*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(halInfo.frontendCaps.isdbtCaps().guardIntervalCap),
627*ec779b8eSAndroid Build Coastguard Worker                     .timeInterleaveCap =
628*ec779b8eSAndroid Build Coastguard Worker                             static_cast<int32_t>(FrontendIsdbtTimeInterleaveMode::UNDEFINED),
629*ec779b8eSAndroid Build Coastguard Worker                     .isSegmentAuto = false,
630*ec779b8eSAndroid Build Coastguard Worker                     .isFullSegment = false,
631*ec779b8eSAndroid Build Coastguard Worker             };
632*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::isdbtCaps>(isdbtCaps);
633*ec779b8eSAndroid Build Coastguard Worker         }
634*ec779b8eSAndroid Build Coastguard Worker         break;
635*ec779b8eSAndroid Build Coastguard Worker     }
636*ec779b8eSAndroid Build Coastguard Worker     default: {
637*ec779b8eSAndroid Build Coastguard Worker         if (static_cast<HidlFrontendType>(info.type) == HidlFrontendType::DTMB) {
638*ec779b8eSAndroid Build Coastguard Worker             FrontendDtmbCapabilities dtmbCaps{
639*ec779b8eSAndroid Build Coastguard Worker                     .transmissionModeCap = static_cast<int32_t>(halDtmbCaps.transmissionModeCap),
640*ec779b8eSAndroid Build Coastguard Worker                     .bandwidthCap = static_cast<int32_t>(halDtmbCaps.bandwidthCap),
641*ec779b8eSAndroid Build Coastguard Worker                     .modulationCap = static_cast<int32_t>(halDtmbCaps.modulationCap),
642*ec779b8eSAndroid Build Coastguard Worker                     .codeRateCap = static_cast<int32_t>(halDtmbCaps.codeRateCap),
643*ec779b8eSAndroid Build Coastguard Worker                     .guardIntervalCap = static_cast<int32_t>(halDtmbCaps.guardIntervalCap),
644*ec779b8eSAndroid Build Coastguard Worker                     .interleaveModeCap = static_cast<int32_t>(halDtmbCaps.interleaveModeCap),
645*ec779b8eSAndroid Build Coastguard Worker             };
646*ec779b8eSAndroid Build Coastguard Worker             caps.set<FrontendCapabilities::dtmbCaps>(dtmbCaps);
647*ec779b8eSAndroid Build Coastguard Worker         }
648*ec779b8eSAndroid Build Coastguard Worker         break;
649*ec779b8eSAndroid Build Coastguard Worker     }
650*ec779b8eSAndroid Build Coastguard Worker     }
651*ec779b8eSAndroid Build Coastguard Worker 
652*ec779b8eSAndroid Build Coastguard Worker     info.frontendCaps = caps;
653*ec779b8eSAndroid Build Coastguard Worker     return info;
654*ec779b8eSAndroid Build Coastguard Worker }
655*ec779b8eSAndroid Build Coastguard Worker 
656*ec779b8eSAndroid Build Coastguard Worker }  // namespace tuner
657*ec779b8eSAndroid Build Coastguard Worker }  // namespace tv
658*ec779b8eSAndroid Build Coastguard Worker }  // namespace media
659*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
660*ec779b8eSAndroid Build Coastguard Worker }  // namespace aidl
661