xref: /aosp_15_r20/hardware/interfaces/tv/tuner/1.1/default/Tuner.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright 2020 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_TAG "[email protected]"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "Tuner.h"
20*4d7e907cSAndroid Build Coastguard Worker #include <utils/Log.h>
21*4d7e907cSAndroid Build Coastguard Worker #include "Demux.h"
22*4d7e907cSAndroid Build Coastguard Worker #include "Descrambler.h"
23*4d7e907cSAndroid Build Coastguard Worker #include "Frontend.h"
24*4d7e907cSAndroid Build Coastguard Worker #include "Lnb.h"
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker namespace android {
27*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
28*4d7e907cSAndroid Build Coastguard Worker namespace tv {
29*4d7e907cSAndroid Build Coastguard Worker namespace tuner {
30*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
31*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
32*4d7e907cSAndroid Build Coastguard Worker 
Tuner()33*4d7e907cSAndroid Build Coastguard Worker Tuner::Tuner() {
34*4d7e907cSAndroid Build Coastguard Worker     // Static Frontends array to maintain local frontends information
35*4d7e907cSAndroid Build Coastguard Worker     // Array index matches their FrontendId in the default impl
36*4d7e907cSAndroid Build Coastguard Worker     mFrontendSize = 10;
37*4d7e907cSAndroid Build Coastguard Worker     mFrontends[0] = new Frontend(FrontendType::ISDBS, 0, this);
38*4d7e907cSAndroid Build Coastguard Worker     mFrontends[1] = new Frontend(FrontendType::ATSC3, 1, this);
39*4d7e907cSAndroid Build Coastguard Worker     mFrontends[2] = new Frontend(FrontendType::DVBC, 2, this);
40*4d7e907cSAndroid Build Coastguard Worker     mFrontends[3] = new Frontend(FrontendType::DVBS, 3, this);
41*4d7e907cSAndroid Build Coastguard Worker     mFrontends[4] = new Frontend(FrontendType::DVBT, 4, this);
42*4d7e907cSAndroid Build Coastguard Worker     mFrontends[5] = new Frontend(FrontendType::ISDBT, 5, this);
43*4d7e907cSAndroid Build Coastguard Worker     mFrontends[6] = new Frontend(FrontendType::ANALOG, 6, this);
44*4d7e907cSAndroid Build Coastguard Worker     mFrontends[7] = new Frontend(FrontendType::ATSC, 7, this);
45*4d7e907cSAndroid Build Coastguard Worker     mFrontends[8] = new Frontend(FrontendType::ISDBS3, 8, this);
46*4d7e907cSAndroid Build Coastguard Worker     mFrontends[9] =
47*4d7e907cSAndroid Build Coastguard Worker             new Frontend(static_cast<V1_0::FrontendType>(V1_1::FrontendType::DTMB), 9, this);
48*4d7e907cSAndroid Build Coastguard Worker 
49*4d7e907cSAndroid Build Coastguard Worker     FrontendInfo::FrontendCapabilities caps;
50*4d7e907cSAndroid Build Coastguard Worker     vector<FrontendStatusType> statusCaps;
51*4d7e907cSAndroid Build Coastguard Worker 
52*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
53*4d7e907cSAndroid Build Coastguard Worker     caps.isdbsCaps(FrontendIsdbsCapabilities());
54*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[0] = caps;
55*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
56*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::DEMOD_LOCK,
57*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::SNR,
58*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::FEC,
59*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MODULATION,
60*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
61*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::ROLL_OFF),
62*4d7e907cSAndroid Build Coastguard Worker     };
63*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[0] = statusCaps;
64*4d7e907cSAndroid Build Coastguard Worker 
65*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
66*4d7e907cSAndroid Build Coastguard Worker     caps.atsc3Caps(FrontendAtsc3Capabilities());
67*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[1] = caps;
68*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
69*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::BER,
70*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::PER,
71*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::ATSC3_PLP_INFO,
72*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
73*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BERS),
74*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::INTERLEAVINGS),
75*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BANDWIDTH),
76*4d7e907cSAndroid Build Coastguard Worker     };
77*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[1] = statusCaps;
78*4d7e907cSAndroid Build Coastguard Worker 
79*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
80*4d7e907cSAndroid Build Coastguard Worker     caps.dvbcCaps(FrontendDvbcCapabilities());
81*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[2] = caps;
82*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
83*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::PRE_BER,
84*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::SIGNAL_QUALITY,
85*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MODULATION,
86*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::SPECTRAL,
87*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
88*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::CODERATES),
89*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::INTERLEAVINGS),
90*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BANDWIDTH),
91*4d7e907cSAndroid Build Coastguard Worker     };
92*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[2] = statusCaps;
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
95*4d7e907cSAndroid Build Coastguard Worker     caps.dvbsCaps(FrontendDvbsCapabilities());
96*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[3] = caps;
97*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
98*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::SIGNAL_STRENGTH,
99*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::SYMBOL_RATE,
100*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MODULATION,
101*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
102*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::ROLL_OFF),
103*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::IS_MISO),
104*4d7e907cSAndroid Build Coastguard Worker     };
105*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[3] = statusCaps;
106*4d7e907cSAndroid Build Coastguard Worker 
107*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
108*4d7e907cSAndroid Build Coastguard Worker     caps.dvbtCaps(FrontendDvbtCapabilities());
109*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[4] = caps;
110*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
111*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::EWBS,
112*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::PLP_ID,
113*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::HIERARCHY,
114*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
115*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BANDWIDTH),
116*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::GUARD_INTERVAL),
117*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::TRANSMISSION_MODE),
118*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::T2_SYSTEM_ID),
119*4d7e907cSAndroid Build Coastguard Worker     };
120*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[4] = statusCaps;
121*4d7e907cSAndroid Build Coastguard Worker 
122*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
123*4d7e907cSAndroid Build Coastguard Worker     FrontendIsdbtCapabilities isdbtCaps{
124*4d7e907cSAndroid Build Coastguard Worker             .modeCap = FrontendIsdbtMode::MODE_1 | FrontendIsdbtMode::MODE_2,
125*4d7e907cSAndroid Build Coastguard Worker             .bandwidthCap = (unsigned int)FrontendIsdbtBandwidth::BANDWIDTH_6MHZ,
126*4d7e907cSAndroid Build Coastguard Worker             .modulationCap = (unsigned int)FrontendIsdbtModulation::MOD_16QAM,
127*4d7e907cSAndroid Build Coastguard Worker             // ISDBT shares coderate and guard interval with DVBT
128*4d7e907cSAndroid Build Coastguard Worker             .coderateCap = FrontendDvbtCoderate::CODERATE_4_5 | FrontendDvbtCoderate::CODERATE_6_7,
129*4d7e907cSAndroid Build Coastguard Worker             .guardIntervalCap = (unsigned int)FrontendDvbtGuardInterval::INTERVAL_1_128,
130*4d7e907cSAndroid Build Coastguard Worker     };
131*4d7e907cSAndroid Build Coastguard Worker     caps.isdbtCaps(isdbtCaps);
132*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[5] = caps;
133*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
134*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::AGC,
135*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::LNA,
136*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MODULATION,
137*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
138*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BANDWIDTH),
139*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::GUARD_INTERVAL),
140*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::TRANSMISSION_MODE),
141*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::ISDBT_SEGMENTS),
142*4d7e907cSAndroid Build Coastguard Worker     };
143*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[5] = statusCaps;
144*4d7e907cSAndroid Build Coastguard Worker 
145*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
146*4d7e907cSAndroid Build Coastguard Worker     caps.analogCaps(FrontendAnalogCapabilities());
147*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[6] = caps;
148*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
149*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::LAYER_ERROR,
150*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MER,
151*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::UEC),
152*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::TS_DATA_RATES),
153*4d7e907cSAndroid Build Coastguard Worker     };
154*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[6] = statusCaps;
155*4d7e907cSAndroid Build Coastguard Worker 
156*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
157*4d7e907cSAndroid Build Coastguard Worker     caps.atscCaps(FrontendAtscCapabilities());
158*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[7] = caps;
159*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
160*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::FREQ_OFFSET,
161*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::RF_LOCK,
162*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
163*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::IS_LINEAR),
164*4d7e907cSAndroid Build Coastguard Worker     };
165*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[7] = statusCaps;
166*4d7e907cSAndroid Build Coastguard Worker 
167*4d7e907cSAndroid Build Coastguard Worker     caps = FrontendInfo::FrontendCapabilities();
168*4d7e907cSAndroid Build Coastguard Worker     caps.isdbs3Caps(FrontendIsdbs3Capabilities());
169*4d7e907cSAndroid Build Coastguard Worker     mFrontendCaps[8] = caps;
170*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
171*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::DEMOD_LOCK,
172*4d7e907cSAndroid Build Coastguard Worker             FrontendStatusType::MODULATION,
173*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
174*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::ROLL_OFF),
175*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::IS_SHORT_FRAMES),
176*4d7e907cSAndroid Build Coastguard Worker     };
177*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[8] = statusCaps;
178*4d7e907cSAndroid Build Coastguard Worker 
179*4d7e907cSAndroid Build Coastguard Worker     statusCaps = {
180*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::MODULATIONS),
181*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::INTERLEAVINGS),
182*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::BANDWIDTH),
183*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::GUARD_INTERVAL),
184*4d7e907cSAndroid Build Coastguard Worker             static_cast<FrontendStatusType>(V1_1::FrontendStatusTypeExt1_1::TRANSMISSION_MODE),
185*4d7e907cSAndroid Build Coastguard Worker     };
186*4d7e907cSAndroid Build Coastguard Worker     mFrontendStatusCaps[9] = statusCaps;
187*4d7e907cSAndroid Build Coastguard Worker 
188*4d7e907cSAndroid Build Coastguard Worker     mLnbs.resize(2);
189*4d7e907cSAndroid Build Coastguard Worker     mLnbs[0] = new Lnb(0);
190*4d7e907cSAndroid Build Coastguard Worker     mLnbs[1] = new Lnb(1);
191*4d7e907cSAndroid Build Coastguard Worker }
192*4d7e907cSAndroid Build Coastguard Worker 
~Tuner()193*4d7e907cSAndroid Build Coastguard Worker Tuner::~Tuner() {}
194*4d7e907cSAndroid Build Coastguard Worker 
getFrontendIds(getFrontendIds_cb _hidl_cb)195*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::getFrontendIds(getFrontendIds_cb _hidl_cb) {
196*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
197*4d7e907cSAndroid Build Coastguard Worker 
198*4d7e907cSAndroid Build Coastguard Worker     vector<FrontendId> frontendIds;
199*4d7e907cSAndroid Build Coastguard Worker     frontendIds.resize(mFrontendSize);
200*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < mFrontendSize; i++) {
201*4d7e907cSAndroid Build Coastguard Worker         frontendIds[i] = mFrontends[i]->getFrontendId();
202*4d7e907cSAndroid Build Coastguard Worker     }
203*4d7e907cSAndroid Build Coastguard Worker 
204*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, frontendIds);
205*4d7e907cSAndroid Build Coastguard Worker     return Void();
206*4d7e907cSAndroid Build Coastguard Worker }
207*4d7e907cSAndroid Build Coastguard Worker 
openFrontendById(uint32_t frontendId,openFrontendById_cb _hidl_cb)208*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::openFrontendById(uint32_t frontendId, openFrontendById_cb _hidl_cb) {
209*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
210*4d7e907cSAndroid Build Coastguard Worker 
211*4d7e907cSAndroid Build Coastguard Worker     if (frontendId >= mFrontendSize || frontendId < 0) {
212*4d7e907cSAndroid Build Coastguard Worker         ALOGW("[   WARN   ] Frontend with id %d isn't available", frontendId);
213*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Result::UNAVAILABLE, nullptr);
214*4d7e907cSAndroid Build Coastguard Worker         return Void();
215*4d7e907cSAndroid Build Coastguard Worker     }
216*4d7e907cSAndroid Build Coastguard Worker 
217*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, mFrontends[frontendId]);
218*4d7e907cSAndroid Build Coastguard Worker     return Void();
219*4d7e907cSAndroid Build Coastguard Worker }
220*4d7e907cSAndroid Build Coastguard Worker 
openDemux(openDemux_cb _hidl_cb)221*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::openDemux(openDemux_cb _hidl_cb) {
222*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
223*4d7e907cSAndroid Build Coastguard Worker 
224*4d7e907cSAndroid Build Coastguard Worker     uint32_t demuxId = mLastUsedId + 1;
225*4d7e907cSAndroid Build Coastguard Worker     mLastUsedId += 1;
226*4d7e907cSAndroid Build Coastguard Worker     sp<Demux> demux = new Demux(demuxId, this);
227*4d7e907cSAndroid Build Coastguard Worker     mDemuxes[demuxId] = demux;
228*4d7e907cSAndroid Build Coastguard Worker 
229*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, demuxId, demux);
230*4d7e907cSAndroid Build Coastguard Worker     return Void();
231*4d7e907cSAndroid Build Coastguard Worker }
232*4d7e907cSAndroid Build Coastguard Worker 
getDemuxCaps(getDemuxCaps_cb _hidl_cb)233*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::getDemuxCaps(getDemuxCaps_cb _hidl_cb) {
234*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
235*4d7e907cSAndroid Build Coastguard Worker 
236*4d7e907cSAndroid Build Coastguard Worker     DemuxCapabilities caps;
237*4d7e907cSAndroid Build Coastguard Worker 
238*4d7e907cSAndroid Build Coastguard Worker     // IP filter can be an MMTP filter's data source.
239*4d7e907cSAndroid Build Coastguard Worker     caps.linkCaps = {0x00, 0x00, 0x02, 0x00, 0x00};
240*4d7e907cSAndroid Build Coastguard Worker     // Support time filter testing
241*4d7e907cSAndroid Build Coastguard Worker     caps.bTimeFilter = true;
242*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, caps);
243*4d7e907cSAndroid Build Coastguard Worker     return Void();
244*4d7e907cSAndroid Build Coastguard Worker }
245*4d7e907cSAndroid Build Coastguard Worker 
openDescrambler(openDescrambler_cb _hidl_cb)246*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::openDescrambler(openDescrambler_cb _hidl_cb) {
247*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
248*4d7e907cSAndroid Build Coastguard Worker 
249*4d7e907cSAndroid Build Coastguard Worker     sp<V1_0::IDescrambler> descrambler = new Descrambler();
250*4d7e907cSAndroid Build Coastguard Worker 
251*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, descrambler);
252*4d7e907cSAndroid Build Coastguard Worker     return Void();
253*4d7e907cSAndroid Build Coastguard Worker }
254*4d7e907cSAndroid Build Coastguard Worker 
getFrontendInfo(FrontendId frontendId,getFrontendInfo_cb _hidl_cb)255*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::getFrontendInfo(FrontendId frontendId, getFrontendInfo_cb _hidl_cb) {
256*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
257*4d7e907cSAndroid Build Coastguard Worker 
258*4d7e907cSAndroid Build Coastguard Worker     FrontendInfo info;
259*4d7e907cSAndroid Build Coastguard Worker     if (frontendId >= mFrontendSize) {
260*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Result::INVALID_ARGUMENT, info);
261*4d7e907cSAndroid Build Coastguard Worker         return Void();
262*4d7e907cSAndroid Build Coastguard Worker     }
263*4d7e907cSAndroid Build Coastguard Worker 
264*4d7e907cSAndroid Build Coastguard Worker     // assign randomly selected values for testing.
265*4d7e907cSAndroid Build Coastguard Worker     info = {
266*4d7e907cSAndroid Build Coastguard Worker             .type = mFrontends[frontendId]->getFrontendType(),
267*4d7e907cSAndroid Build Coastguard Worker             .minFrequency = 139000000,
268*4d7e907cSAndroid Build Coastguard Worker             .maxFrequency = 1139000000,
269*4d7e907cSAndroid Build Coastguard Worker             .minSymbolRate = 45,
270*4d7e907cSAndroid Build Coastguard Worker             .maxSymbolRate = 1145,
271*4d7e907cSAndroid Build Coastguard Worker             .acquireRange = 30,
272*4d7e907cSAndroid Build Coastguard Worker             .exclusiveGroupId = 57,
273*4d7e907cSAndroid Build Coastguard Worker             .statusCaps = mFrontendStatusCaps[frontendId],
274*4d7e907cSAndroid Build Coastguard Worker             .frontendCaps = mFrontendCaps[frontendId],
275*4d7e907cSAndroid Build Coastguard Worker     };
276*4d7e907cSAndroid Build Coastguard Worker 
277*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, info);
278*4d7e907cSAndroid Build Coastguard Worker     return Void();
279*4d7e907cSAndroid Build Coastguard Worker }
280*4d7e907cSAndroid Build Coastguard Worker 
getLnbIds(getLnbIds_cb _hidl_cb)281*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::getLnbIds(getLnbIds_cb _hidl_cb) {
282*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
283*4d7e907cSAndroid Build Coastguard Worker 
284*4d7e907cSAndroid Build Coastguard Worker     vector<V1_0::LnbId> lnbIds;
285*4d7e907cSAndroid Build Coastguard Worker     lnbIds.resize(mLnbs.size());
286*4d7e907cSAndroid Build Coastguard Worker     for (int i = 0; i < lnbIds.size(); i++) {
287*4d7e907cSAndroid Build Coastguard Worker         lnbIds[i] = mLnbs[i]->getId();
288*4d7e907cSAndroid Build Coastguard Worker     }
289*4d7e907cSAndroid Build Coastguard Worker 
290*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, lnbIds);
291*4d7e907cSAndroid Build Coastguard Worker     return Void();
292*4d7e907cSAndroid Build Coastguard Worker }
293*4d7e907cSAndroid Build Coastguard Worker 
openLnbById(V1_0::LnbId lnbId,openLnbById_cb _hidl_cb)294*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::openLnbById(V1_0::LnbId lnbId, openLnbById_cb _hidl_cb) {
295*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
296*4d7e907cSAndroid Build Coastguard Worker 
297*4d7e907cSAndroid Build Coastguard Worker     if (lnbId >= mLnbs.size()) {
298*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Result::INVALID_ARGUMENT, nullptr);
299*4d7e907cSAndroid Build Coastguard Worker         return Void();
300*4d7e907cSAndroid Build Coastguard Worker     }
301*4d7e907cSAndroid Build Coastguard Worker 
302*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, mLnbs[lnbId]);
303*4d7e907cSAndroid Build Coastguard Worker     return Void();
304*4d7e907cSAndroid Build Coastguard Worker }
305*4d7e907cSAndroid Build Coastguard Worker 
getFrontendById(uint32_t frontendId)306*4d7e907cSAndroid Build Coastguard Worker sp<Frontend> Tuner::getFrontendById(uint32_t frontendId) {
307*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
308*4d7e907cSAndroid Build Coastguard Worker 
309*4d7e907cSAndroid Build Coastguard Worker     return mFrontends[frontendId];
310*4d7e907cSAndroid Build Coastguard Worker }
311*4d7e907cSAndroid Build Coastguard Worker 
openLnbByName(const hidl_string &,openLnbByName_cb _hidl_cb)312*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::openLnbByName(const hidl_string& /*lnbName*/, openLnbByName_cb _hidl_cb) {
313*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
314*4d7e907cSAndroid Build Coastguard Worker 
315*4d7e907cSAndroid Build Coastguard Worker     sp<V1_0::ILnb> lnb = new Lnb();
316*4d7e907cSAndroid Build Coastguard Worker 
317*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(Result::SUCCESS, 1234, lnb);
318*4d7e907cSAndroid Build Coastguard Worker     return Void();
319*4d7e907cSAndroid Build Coastguard Worker }
320*4d7e907cSAndroid Build Coastguard Worker 
getFrontendDtmbCapabilities(uint32_t frontendId,getFrontendDtmbCapabilities_cb _hidl_cb)321*4d7e907cSAndroid Build Coastguard Worker Return<void> Tuner::getFrontendDtmbCapabilities(uint32_t frontendId,
322*4d7e907cSAndroid Build Coastguard Worker                                                 getFrontendDtmbCapabilities_cb _hidl_cb) {
323*4d7e907cSAndroid Build Coastguard Worker     ALOGV("%s", __FUNCTION__);
324*4d7e907cSAndroid Build Coastguard Worker 
325*4d7e907cSAndroid Build Coastguard Worker     if (mFrontends[frontendId] != nullptr &&
326*4d7e907cSAndroid Build Coastguard Worker         (mFrontends[frontendId]->getFrontendType() ==
327*4d7e907cSAndroid Build Coastguard Worker          static_cast<V1_0::FrontendType>(V1_1::FrontendType::DTMB))) {
328*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Result::SUCCESS, mDtmbCaps);
329*4d7e907cSAndroid Build Coastguard Worker     } else {
330*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Result::UNAVAILABLE, mDtmbCaps);
331*4d7e907cSAndroid Build Coastguard Worker     }
332*4d7e907cSAndroid Build Coastguard Worker     return Void();
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker 
setFrontendAsDemuxSource(uint32_t frontendId,uint32_t demuxId)335*4d7e907cSAndroid Build Coastguard Worker void Tuner::setFrontendAsDemuxSource(uint32_t frontendId, uint32_t demuxId) {
336*4d7e907cSAndroid Build Coastguard Worker     mFrontendToDemux[frontendId] = demuxId;
337*4d7e907cSAndroid Build Coastguard Worker     if (mFrontends[frontendId] != nullptr && mFrontends[frontendId]->isLocked()) {
338*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->startFrontendInputLoop();
339*4d7e907cSAndroid Build Coastguard Worker     }
340*4d7e907cSAndroid Build Coastguard Worker }
341*4d7e907cSAndroid Build Coastguard Worker 
removeDemux(uint32_t demuxId)342*4d7e907cSAndroid Build Coastguard Worker void Tuner::removeDemux(uint32_t demuxId) {
343*4d7e907cSAndroid Build Coastguard Worker     map<uint32_t, uint32_t>::iterator it;
344*4d7e907cSAndroid Build Coastguard Worker     for (it = mFrontendToDemux.begin(); it != mFrontendToDemux.end(); it++) {
345*4d7e907cSAndroid Build Coastguard Worker         if (it->second == demuxId) {
346*4d7e907cSAndroid Build Coastguard Worker             it = mFrontendToDemux.erase(it);
347*4d7e907cSAndroid Build Coastguard Worker             break;
348*4d7e907cSAndroid Build Coastguard Worker         }
349*4d7e907cSAndroid Build Coastguard Worker     }
350*4d7e907cSAndroid Build Coastguard Worker     mDemuxes.erase(demuxId);
351*4d7e907cSAndroid Build Coastguard Worker }
352*4d7e907cSAndroid Build Coastguard Worker 
removeFrontend(uint32_t frontendId)353*4d7e907cSAndroid Build Coastguard Worker void Tuner::removeFrontend(uint32_t frontendId) {
354*4d7e907cSAndroid Build Coastguard Worker     mFrontendToDemux.erase(frontendId);
355*4d7e907cSAndroid Build Coastguard Worker }
356*4d7e907cSAndroid Build Coastguard Worker 
frontendStopTune(uint32_t frontendId)357*4d7e907cSAndroid Build Coastguard Worker void Tuner::frontendStopTune(uint32_t frontendId) {
358*4d7e907cSAndroid Build Coastguard Worker     map<uint32_t, uint32_t>::iterator it = mFrontendToDemux.find(frontendId);
359*4d7e907cSAndroid Build Coastguard Worker     uint32_t demuxId;
360*4d7e907cSAndroid Build Coastguard Worker     if (it != mFrontendToDemux.end()) {
361*4d7e907cSAndroid Build Coastguard Worker         demuxId = it->second;
362*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->stopFrontendInput();
363*4d7e907cSAndroid Build Coastguard Worker     }
364*4d7e907cSAndroid Build Coastguard Worker }
365*4d7e907cSAndroid Build Coastguard Worker 
frontendStartTune(uint32_t frontendId)366*4d7e907cSAndroid Build Coastguard Worker void Tuner::frontendStartTune(uint32_t frontendId) {
367*4d7e907cSAndroid Build Coastguard Worker     map<uint32_t, uint32_t>::iterator it = mFrontendToDemux.find(frontendId);
368*4d7e907cSAndroid Build Coastguard Worker     uint32_t demuxId;
369*4d7e907cSAndroid Build Coastguard Worker     if (it != mFrontendToDemux.end()) {
370*4d7e907cSAndroid Build Coastguard Worker         demuxId = it->second;
371*4d7e907cSAndroid Build Coastguard Worker         mDemuxes[demuxId]->startFrontendInputLoop();
372*4d7e907cSAndroid Build Coastguard Worker     }
373*4d7e907cSAndroid Build Coastguard Worker }
374*4d7e907cSAndroid Build Coastguard Worker 
375*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
376*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_0
377*4d7e907cSAndroid Build Coastguard Worker }  // namespace tuner
378*4d7e907cSAndroid Build Coastguard Worker }  // namespace tv
379*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
380*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
381