xref: /aosp_15_r20/hardware/interfaces/tv/tuner/aidl/default/Tuner.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "android.hardware.tv.tuner-service.example-Tuner"
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <utils/Log.h>
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker #include "Demux.h"
25*4d7e907cSAndroid Build Coastguard Worker #include "Descrambler.h"
26*4d7e907cSAndroid Build Coastguard Worker #include "Frontend.h"
27*4d7e907cSAndroid Build Coastguard Worker #include "Lnb.h"
28*4d7e907cSAndroid Build Coastguard Worker #include "Tuner.h"
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
31*4d7e907cSAndroid Build Coastguard Worker namespace android {
32*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
33*4d7e907cSAndroid Build Coastguard Worker namespace tv {
34*4d7e907cSAndroid Build Coastguard Worker namespace tuner {
35*4d7e907cSAndroid Build Coastguard Worker 
Tuner()36*4d7e907cSAndroid Build Coastguard Worker Tuner::Tuner() {}
37*4d7e907cSAndroid Build Coastguard Worker 
init()38*4d7e907cSAndroid Build Coastguard Worker void Tuner::init() {
39*4d7e907cSAndroid Build Coastguard Worker     // Static Frontends array to maintain local frontends information
40*4d7e907cSAndroid Build Coastguard Worker     // Array index matches their FrontendId in the default impl
41*4d7e907cSAndroid Build Coastguard Worker     mFrontendSize = 11;
42*4d7e907cSAndroid Build Coastguard Worker     mFrontends[0] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS, 0);
43*4d7e907cSAndroid Build Coastguard Worker     mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1);
44*4d7e907cSAndroid Build Coastguard Worker     mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2);
45*4d7e907cSAndroid Build Coastguard Worker     mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3);
46*4d7e907cSAndroid Build Coastguard Worker     mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4);
47*4d7e907cSAndroid Build Coastguard Worker     mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5);
48*4d7e907cSAndroid Build Coastguard Worker     mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6);
49*4d7e907cSAndroid Build Coastguard Worker     mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7);
50*4d7e907cSAndroid Build Coastguard Worker     mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8);
51*4d7e907cSAndroid Build Coastguard Worker     mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9);
52*4d7e907cSAndroid Build Coastguard Worker     mFrontends[10] = ndk::SharedRefBase::make<Frontend>(FrontendType::IPTV, 10);
53*4d7e907cSAndroid Build Coastguard Worker 
54*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ISDBS] = 1;
55*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ATSC3] = 1;
56*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::DVBC] = 1;
57*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::DVBS] = 1;
58*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::DVBT] = 1;
59*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ISDBT] = 1;
60*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ANALOG] = 1;
61*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ATSC] = 1;
62*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::ISDBS3] = 1;
63*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::DTMB] = 1;
64*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[FrontendType::IPTV] = 1;
65*4d7e907cSAndroid Build Coastguard Worker 
66*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[0] =
67*4d7e907cSAndroid Build Coastguard Worker             ndk::SharedRefBase::make<Demux>(0, (static_cast<int32_t>(DemuxFilterMainType::TS) |
68*4d7e907cSAndroid Build Coastguard Worker                                                 static_cast<int32_t>(DemuxFilterMainType::MMTP) |
69*4d7e907cSAndroid Build Coastguard Worker                                                 static_cast<int32_t>(DemuxFilterMainType::TLV)));
70*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[1] =
71*4d7e907cSAndroid Build Coastguard Worker             ndk::SharedRefBase::make<Demux>(1, (static_cast<int32_t>(DemuxFilterMainType::MMTP) |
72*4d7e907cSAndroid Build Coastguard Worker                                                 static_cast<int32_t>(DemuxFilterMainType::TLV)));
73*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[2] = ndk::SharedRefBase::make<Demux>(2, static_cast<int32_t>(DemuxFilterMainType::IP));
74*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[3] = ndk::SharedRefBase::make<Demux>(3, static_cast<int32_t>(DemuxFilterMainType::TS));
75*4d7e907cSAndroid Build Coastguard Worker 
76*4d7e907cSAndroid Build Coastguard Worker     mLnbs.resize(2);
77*4d7e907cSAndroid Build Coastguard Worker     mLnbs[0] = ndk::SharedRefBase::make<Lnb>(0);
78*4d7e907cSAndroid Build Coastguard Worker     mLnbs[1] = ndk::SharedRefBase::make<Lnb>(1);
79*4d7e907cSAndroid Build Coastguard Worker }
80*4d7e907cSAndroid Build Coastguard Worker 
~Tuner()81*4d7e907cSAndroid Build Coastguard Worker Tuner::~Tuner() {}
82*4d7e907cSAndroid Build Coastguard Worker 
getFrontendIds(std::vector<int32_t> * _aidl_return)83*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getFrontendIds(std::vector<int32_t>* _aidl_return) {
84*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
85*4d7e907cSAndroid Build Coastguard Worker 
86*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->resize(mFrontendSize);
87*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < mFrontendSize; i++) {
88*4d7e907cSAndroid Build Coastguard Worker         (*_aidl_return)[i] = mFrontends[i]->getFrontendId();
89*4d7e907cSAndroid Build Coastguard Worker     }
90*4d7e907cSAndroid Build Coastguard Worker 
91*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
92*4d7e907cSAndroid Build Coastguard Worker }
93*4d7e907cSAndroid Build Coastguard Worker 
getDemuxInfo(int32_t in_demuxId,DemuxInfo * _aidl_return)94*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getDemuxInfo(int32_t in_demuxId, DemuxInfo* _aidl_return) {
95*4d7e907cSAndroid Build Coastguard Worker     if (mDemuxes.find(in_demuxId) == mDemuxes.end()) {
96*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
97*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
98*4d7e907cSAndroid Build Coastguard Worker     } else {
99*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[in_demuxId]->getDemuxInfo(_aidl_return);
100*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::ok();
101*4d7e907cSAndroid Build Coastguard Worker     }
102*4d7e907cSAndroid Build Coastguard Worker }
103*4d7e907cSAndroid Build Coastguard Worker 
getDemuxIds(std::vector<int32_t> * _aidl_return)104*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getDemuxIds(std::vector<int32_t>* _aidl_return) {
105*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
106*4d7e907cSAndroid Build Coastguard Worker 
107*4d7e907cSAndroid Build Coastguard Worker     int numOfDemuxes = mDemuxes.size();
108*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->resize(numOfDemuxes);
109*4d7e907cSAndroid Build Coastguard Worker     int i = 0;
110*4d7e907cSAndroid Build Coastguard Worker     for (auto e = mDemuxes.begin(); e != mDemuxes.end(); e++) {
111*4d7e907cSAndroid Build Coastguard Worker         (*_aidl_return)[i++] = e->first;
112*4d7e907cSAndroid Build Coastguard Worker     }
113*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
114*4d7e907cSAndroid Build Coastguard Worker }
115*4d7e907cSAndroid Build Coastguard Worker 
openFrontendById(int32_t in_frontendId,std::shared_ptr<IFrontend> * _aidl_return)116*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openFrontendById(int32_t in_frontendId,
117*4d7e907cSAndroid Build Coastguard Worker                                              std::shared_ptr<IFrontend>* _aidl_return) {
118*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
119*4d7e907cSAndroid Build Coastguard Worker 
120*4d7e907cSAndroid Build Coastguard Worker     if (in_frontendId >= mFrontendSize || in_frontendId < 0) {
121*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[   WARN   ] Frontend with id %d isn't available", in_frontendId);
122*4d7e907cSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
123*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
124*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
125*4d7e907cSAndroid Build Coastguard Worker     }
126*4d7e907cSAndroid Build Coastguard Worker 
127*4d7e907cSAndroid Build Coastguard Worker     mFrontends[in_frontendId]->setTunerService(this->ref<Tuner>());
128*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = mFrontends[in_frontendId];
129*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
130*4d7e907cSAndroid Build Coastguard Worker }
131*4d7e907cSAndroid Build Coastguard Worker 
openDemuxById(int32_t in_demuxId,std::shared_ptr<IDemux> * _aidl_return)132*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openDemuxById(int32_t in_demuxId,
133*4d7e907cSAndroid Build Coastguard Worker                                           std::shared_ptr<IDemux>* _aidl_return) {
134*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
135*4d7e907cSAndroid Build Coastguard Worker 
136*4d7e907cSAndroid Build Coastguard Worker     if (mDemuxes.find(in_demuxId) == mDemuxes.end()) {
137*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[   WARN   ] Demux with id %d isn't available", in_demuxId);
138*4d7e907cSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
139*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
140*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
141*4d7e907cSAndroid Build Coastguard Worker     }
142*4d7e907cSAndroid Build Coastguard Worker 
143*4d7e907cSAndroid Build Coastguard Worker     if (mDemuxes[in_demuxId]->isInUse()) {
144*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
145*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::UNAVAILABLE));
146*4d7e907cSAndroid Build Coastguard Worker     } else {
147*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[in_demuxId]->setTunerService(this->ref<Tuner>());
148*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[in_demuxId]->setInUse(true);
149*4d7e907cSAndroid Build Coastguard Worker 
150*4d7e907cSAndroid Build Coastguard Worker         *_aidl_return = mDemuxes[in_demuxId];
151*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::ok();
152*4d7e907cSAndroid Build Coastguard Worker     }
153*4d7e907cSAndroid Build Coastguard Worker }
154*4d7e907cSAndroid Build Coastguard Worker 
openDemux(std::vector<int32_t> * out_demuxId,std::shared_ptr<IDemux> * _aidl_return)155*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openDemux(std::vector<int32_t>* out_demuxId,
156*4d7e907cSAndroid Build Coastguard Worker                                       std::shared_ptr<IDemux>* _aidl_return) {
157*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
158*4d7e907cSAndroid Build Coastguard Worker 
159*4d7e907cSAndroid Build Coastguard Worker     bool found = false;
160*4d7e907cSAndroid Build Coastguard Worker     int32_t demuxId = 0;
161*4d7e907cSAndroid Build Coastguard Worker     for (auto e = mDemuxes.begin(); e != mDemuxes.end(); e++) {
162*4d7e907cSAndroid Build Coastguard Worker         if (!e->second->isInUse()) {
163*4d7e907cSAndroid Build Coastguard Worker             found = true;
164*4d7e907cSAndroid Build Coastguard Worker             demuxId = e->second->getDemuxId();
165*4d7e907cSAndroid Build Coastguard Worker         }
166*4d7e907cSAndroid Build Coastguard Worker     }
167*4d7e907cSAndroid Build Coastguard Worker 
168*4d7e907cSAndroid Build Coastguard Worker     if (found) {
169*4d7e907cSAndroid Build Coastguard Worker         out_demuxId->push_back(demuxId);
170*4d7e907cSAndroid Build Coastguard Worker         return openDemuxById(demuxId, _aidl_return);
171*4d7e907cSAndroid Build Coastguard Worker     } else {
172*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
173*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::UNAVAILABLE));
174*4d7e907cSAndroid Build Coastguard Worker     }
175*4d7e907cSAndroid Build Coastguard Worker }
176*4d7e907cSAndroid Build Coastguard Worker 
getDemuxCaps(DemuxCapabilities * _aidl_return)177*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getDemuxCaps(DemuxCapabilities* _aidl_return) {
178*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
179*4d7e907cSAndroid Build Coastguard Worker 
180*4d7e907cSAndroid Build Coastguard Worker     // IP filter can be an MMTP filter's data source.
181*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->linkCaps = {0x00, 0x00, 0x02, 0x00, 0x00};
182*4d7e907cSAndroid Build Coastguard Worker     // Support time filter testing
183*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->bTimeFilter = true;
184*4d7e907cSAndroid Build Coastguard Worker 
185*4d7e907cSAndroid Build Coastguard Worker     // set filterCaps as the bitwize OR of all the demux' caps
186*4d7e907cSAndroid Build Coastguard Worker     std::vector<int32_t> demuxIds;
187*4d7e907cSAndroid Build Coastguard Worker     getDemuxIds(&demuxIds);
188*4d7e907cSAndroid Build Coastguard Worker     int32_t filterCaps = 0;
189*4d7e907cSAndroid Build Coastguard Worker 
190*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < demuxIds.size(); i++) {
191*4d7e907cSAndroid Build Coastguard Worker         DemuxInfo demuxInfo;
192*4d7e907cSAndroid Build Coastguard Worker         getDemuxInfo(demuxIds[i], &demuxInfo);
193*4d7e907cSAndroid Build Coastguard Worker         filterCaps |= demuxInfo.filterTypes;
194*4d7e907cSAndroid Build Coastguard Worker     }
195*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->filterCaps = filterCaps;
196*4d7e907cSAndroid Build Coastguard Worker 
197*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
198*4d7e907cSAndroid Build Coastguard Worker }
199*4d7e907cSAndroid Build Coastguard Worker 
openDescrambler(std::shared_ptr<IDescrambler> * _aidl_return)200*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openDescrambler(std::shared_ptr<IDescrambler>* _aidl_return) {
201*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
202*4d7e907cSAndroid Build Coastguard Worker 
203*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = ndk::SharedRefBase::make<Descrambler>();
204*4d7e907cSAndroid Build Coastguard Worker 
205*4d7e907cSAndroid Build Coastguard Worker     return ndk::ScopedAStatus::ok();
206*4d7e907cSAndroid Build Coastguard Worker }
207*4d7e907cSAndroid Build Coastguard Worker 
getFrontendInfo(int32_t in_frontendId,FrontendInfo * _aidl_return)208*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getFrontendInfo(int32_t in_frontendId, FrontendInfo* _aidl_return) {
209*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
210*4d7e907cSAndroid Build Coastguard Worker 
211*4d7e907cSAndroid Build Coastguard Worker     if (in_frontendId < 0 || in_frontendId >= mFrontendSize) {
212*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
213*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
214*4d7e907cSAndroid Build Coastguard Worker     }
215*4d7e907cSAndroid Build Coastguard Worker 
216*4d7e907cSAndroid Build Coastguard Worker     mFrontends[in_frontendId]->getFrontendInfo(_aidl_return);
217*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
218*4d7e907cSAndroid Build Coastguard Worker }
219*4d7e907cSAndroid Build Coastguard Worker 
getLnbIds(std::vector<int32_t> * _aidl_return)220*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getLnbIds(std::vector<int32_t>* _aidl_return) {
221*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
222*4d7e907cSAndroid Build Coastguard Worker 
223*4d7e907cSAndroid Build Coastguard Worker     _aidl_return->resize(mLnbs.size());
224*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < mLnbs.size(); i++) {
225*4d7e907cSAndroid Build Coastguard Worker         (*_aidl_return)[i] = mLnbs[i]->getId();
226*4d7e907cSAndroid Build Coastguard Worker     }
227*4d7e907cSAndroid Build Coastguard Worker 
228*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
229*4d7e907cSAndroid Build Coastguard Worker }
230*4d7e907cSAndroid Build Coastguard Worker 
openLnbById(int32_t in_lnbId,std::shared_ptr<ILnb> * _aidl_return)231*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openLnbById(int32_t in_lnbId, std::shared_ptr<ILnb>* _aidl_return) {
232*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
233*4d7e907cSAndroid Build Coastguard Worker 
234*4d7e907cSAndroid Build Coastguard Worker     if (in_lnbId >= mLnbs.size()) {
235*4d7e907cSAndroid Build Coastguard Worker         *_aidl_return = nullptr;
236*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
237*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
238*4d7e907cSAndroid Build Coastguard Worker     }
239*4d7e907cSAndroid Build Coastguard Worker 
240*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = mLnbs[in_lnbId];
241*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
242*4d7e907cSAndroid Build Coastguard Worker }
243*4d7e907cSAndroid Build Coastguard Worker 
getFrontendById(int32_t frontendId)244*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<Frontend> Tuner::getFrontendById(int32_t frontendId) {
245*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
246*4d7e907cSAndroid Build Coastguard Worker 
247*4d7e907cSAndroid Build Coastguard Worker     return mFrontends[frontendId];
248*4d7e907cSAndroid Build Coastguard Worker }
249*4d7e907cSAndroid Build Coastguard Worker 
openLnbByName(const std::string &,std::vector<int32_t> * out_lnbId,std::shared_ptr<ILnb> * _aidl_return)250*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::openLnbByName(const std::string& /* in_lnbName */,
251*4d7e907cSAndroid Build Coastguard Worker                                           std::vector<int32_t>* out_lnbId,
252*4d7e907cSAndroid Build Coastguard Worker                                           std::shared_ptr<ILnb>* _aidl_return) {
253*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
254*4d7e907cSAndroid Build Coastguard Worker 
255*4d7e907cSAndroid Build Coastguard Worker     out_lnbId->push_back(1234);
256*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = ndk::SharedRefBase::make<Lnb>();
257*4d7e907cSAndroid Build Coastguard Worker 
258*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
259*4d7e907cSAndroid Build Coastguard Worker }
260*4d7e907cSAndroid Build Coastguard Worker 
setLna(bool)261*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::setLna(bool /* in_bEnable */) {
262*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
263*4d7e907cSAndroid Build Coastguard Worker 
264*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
265*4d7e907cSAndroid Build Coastguard Worker }
266*4d7e907cSAndroid Build Coastguard Worker 
setMaxNumberOfFrontends(FrontendType in_frontendType,int32_t in_maxNumber)267*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::setMaxNumberOfFrontends(FrontendType in_frontendType,
268*4d7e907cSAndroid Build Coastguard Worker                                                     int32_t in_maxNumber) {
269*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
270*4d7e907cSAndroid Build Coastguard Worker 
271*4d7e907cSAndroid Build Coastguard Worker     // In the default implementation, every type only has one frontend.
272*4d7e907cSAndroid Build Coastguard Worker     if (in_maxNumber < 0 || in_maxNumber > 1) {
273*4d7e907cSAndroid Build Coastguard Worker         return ::ndk::ScopedAStatus::fromServiceSpecificError(
274*4d7e907cSAndroid Build Coastguard Worker                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
275*4d7e907cSAndroid Build Coastguard Worker     }
276*4d7e907cSAndroid Build Coastguard Worker     mMaxUsableFrontends[in_frontendType] = in_maxNumber;
277*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker 
getMaxNumberOfFrontends(FrontendType in_frontendType,int32_t * _aidl_return)280*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::getMaxNumberOfFrontends(FrontendType in_frontendType,
281*4d7e907cSAndroid Build Coastguard Worker                                                     int32_t* _aidl_return) {
282*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = mMaxUsableFrontends[in_frontendType];
283*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
284*4d7e907cSAndroid Build Coastguard Worker }
285*4d7e907cSAndroid Build Coastguard Worker 
isLnaSupported(bool * _aidl_return)286*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Tuner::isLnaSupported(bool* _aidl_return) {
287*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
288*4d7e907cSAndroid Build Coastguard Worker 
289*4d7e907cSAndroid Build Coastguard Worker     *_aidl_return = true;
290*4d7e907cSAndroid Build Coastguard Worker     return ::ndk::ScopedAStatus::ok();
291*4d7e907cSAndroid Build Coastguard Worker }
292*4d7e907cSAndroid Build Coastguard Worker 
dump(int fd,const char ** args,uint32_t numArgs)293*4d7e907cSAndroid Build Coastguard Worker binder_status_t Tuner::dump(int fd, const char** args, uint32_t numArgs) {
294*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
295*4d7e907cSAndroid Build Coastguard Worker     {
296*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "Frontends:\n");
297*4d7e907cSAndroid Build Coastguard Worker         for (int i = 0; i < mFrontendSize; i++) {
298*4d7e907cSAndroid Build Coastguard Worker             mFrontends[i]->dump(fd, args, numArgs);
299*4d7e907cSAndroid Build Coastguard Worker         }
300*4d7e907cSAndroid Build Coastguard Worker     }
301*4d7e907cSAndroid Build Coastguard Worker     {
302*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "Demuxs:\n");
303*4d7e907cSAndroid Build Coastguard Worker         map<int32_t, std::shared_ptr<Demux>>::iterator it;
304*4d7e907cSAndroid Build Coastguard Worker         for (it = mDemuxes.begin(); it != mDemuxes.end(); it++) {
305*4d7e907cSAndroid Build Coastguard Worker             it->second->dump(fd, args, numArgs);
306*4d7e907cSAndroid Build Coastguard Worker         }
307*4d7e907cSAndroid Build Coastguard Worker     }
308*4d7e907cSAndroid Build Coastguard Worker     {
309*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "Lnbs:\n");
310*4d7e907cSAndroid Build Coastguard Worker         for (int i = 0; i < mLnbs.size(); i++) {
311*4d7e907cSAndroid Build Coastguard Worker             mLnbs[i]->dump(fd, args, numArgs);
312*4d7e907cSAndroid Build Coastguard Worker         }
313*4d7e907cSAndroid Build Coastguard Worker     }
314*4d7e907cSAndroid Build Coastguard Worker     return STATUS_OK;
315*4d7e907cSAndroid Build Coastguard Worker }
316*4d7e907cSAndroid Build Coastguard Worker 
setFrontendAsDemuxSource(int32_t frontendId,int32_t demuxId)317*4d7e907cSAndroid Build Coastguard Worker void Tuner::setFrontendAsDemuxSource(int32_t frontendId, int32_t demuxId) {
318*4d7e907cSAndroid Build Coastguard Worker     mFrontendToDemux[frontendId] = demuxId;
319*4d7e907cSAndroid Build Coastguard Worker     if (mFrontends[frontendId] != nullptr && mFrontends[frontendId]->isLocked()) {
320*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->startFrontendInputLoop();
321*4d7e907cSAndroid Build Coastguard Worker     }
322*4d7e907cSAndroid Build Coastguard Worker }
323*4d7e907cSAndroid Build Coastguard Worker 
removeDemux(int32_t demuxId)324*4d7e907cSAndroid Build Coastguard Worker void Tuner::removeDemux(int32_t demuxId) {
325*4d7e907cSAndroid Build Coastguard Worker     map<int32_t, int32_t>::iterator it;
326*4d7e907cSAndroid Build Coastguard Worker     for (it = mFrontendToDemux.begin(); it != mFrontendToDemux.end(); it++) {
327*4d7e907cSAndroid Build Coastguard Worker         if (it->second == demuxId) {
328*4d7e907cSAndroid Build Coastguard Worker             it = mFrontendToDemux.erase(it);
329*4d7e907cSAndroid Build Coastguard Worker             break;
330*4d7e907cSAndroid Build Coastguard Worker         }
331*4d7e907cSAndroid Build Coastguard Worker     }
332*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[demuxId]->setInUse(false);
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker 
removeFrontend(int32_t frontendId)335*4d7e907cSAndroid Build Coastguard Worker void Tuner::removeFrontend(int32_t frontendId) {
336*4d7e907cSAndroid Build Coastguard Worker     map<int32_t, int32_t>::iterator it = mFrontendToDemux.find(frontendId);
337*4d7e907cSAndroid Build Coastguard Worker     if (it != mFrontendToDemux.end()) {
338*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[it->second]->setInUse(false);
339*4d7e907cSAndroid Build Coastguard Worker     }
340*4d7e907cSAndroid Build Coastguard Worker     mFrontendToDemux.erase(frontendId);
341*4d7e907cSAndroid Build Coastguard Worker }
342*4d7e907cSAndroid Build Coastguard Worker 
frontendStopTune(int32_t frontendId)343*4d7e907cSAndroid Build Coastguard Worker void Tuner::frontendStopTune(int32_t frontendId) {
344*4d7e907cSAndroid Build Coastguard Worker     map<int32_t, int32_t>::iterator it = mFrontendToDemux.find(frontendId);
345*4d7e907cSAndroid Build Coastguard Worker     int32_t demuxId;
346*4d7e907cSAndroid Build Coastguard Worker     if (it != mFrontendToDemux.end()) {
347*4d7e907cSAndroid Build Coastguard Worker         demuxId = it->second;
348*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->stopFrontendInput();
349*4d7e907cSAndroid Build Coastguard Worker     }
350*4d7e907cSAndroid Build Coastguard Worker }
351*4d7e907cSAndroid Build Coastguard Worker 
frontendStartTune(int32_t frontendId)352*4d7e907cSAndroid Build Coastguard Worker void Tuner::frontendStartTune(int32_t frontendId) {
353*4d7e907cSAndroid Build Coastguard Worker     map<int32_t, int32_t>::iterator it = mFrontendToDemux.find(frontendId);
354*4d7e907cSAndroid Build Coastguard Worker     int32_t demuxId;
355*4d7e907cSAndroid Build Coastguard Worker     if (it != mFrontendToDemux.end()) {
356*4d7e907cSAndroid Build Coastguard Worker         demuxId = it->second;
357*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->startFrontendInputLoop();
358*4d7e907cSAndroid Build Coastguard Worker     }
359*4d7e907cSAndroid Build Coastguard Worker }
360*4d7e907cSAndroid Build Coastguard Worker 
361*4d7e907cSAndroid Build Coastguard Worker }  // namespace tuner
362*4d7e907cSAndroid Build Coastguard Worker }  // namespace tv
363*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
364*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
365*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl
366