blob: 4a72eba91cf96898be78b0bb7687d30312c8d1cd [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
2 * Copyright 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "FrontendClient"
18
19#include <android-base/logging.h>
20#include <utils/Log.h>
21
22#include "FrontendClient.h"
23
Amy Zhangb9f3cab2021-01-13 15:24:14 -080024using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080025using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080026
27using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
28using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080030using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080031using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080032using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080033using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080035using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080036using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080038using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080041using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
Amy Zhang46c31ec2021-02-03 18:19:10 -080043using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080044using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080045using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080046using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080047using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
48using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
49using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
50using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080051using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
52using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -080053using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
Amy Zhangd08c2732021-01-08 17:22:59 -080054using ::android::hardware::tv::tuner::V1_1::Constant;
Amy Zhang46c31ec2021-02-03 18:19:10 -080055using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
56using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
57using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080058using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080059using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
60using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
61using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080062using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
Amy Zhang46c31ec2021-02-03 18:19:10 -080063using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080064using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080065using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhang46c31ec2021-02-03 18:19:10 -080066using ::android::hardware::tv::tuner::V1_1::FrontendType;
Amy Zhanga6734682020-11-30 16:14:38 -080067
Amy Zhangbf68a162020-11-23 17:42:40 -080068namespace android {
69
Amy Zhanga6734682020-11-30 16:14:38 -080070/////////////// FrontendClient ///////////////////////
71
Amy Zhangb9f3cab2021-01-13 15:24:14 -080072FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type) {
Amy Zhangbf68a162020-11-23 17:42:40 -080073 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080074 mAidlCallback = NULL;
75 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080076 mId = id;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080077 mType = type;
Amy Zhangbf68a162020-11-23 17:42:40 -080078}
79
80FrontendClient::~FrontendClient() {
81 mTunerFrontend = NULL;
82 mFrontend = NULL;
83 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080084 mAidlCallback = NULL;
85 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080086 mId = -1;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080087 mType = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080088}
89
90Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
91 if (mTunerFrontend != NULL) {
92 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
Amy Zhangb9f3cab2021-01-13 15:24:14 -080093 mAidlCallback->setFrontendType(mType);
Amy Zhang379cb482021-02-04 21:05:11 -080094 Status s = mTunerFrontend->setCallback(mAidlCallback);
95 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -080096 }
97
98 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
99 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -0800100}
101
102void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
103 mFrontend = frontend;
104 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
105}
Amy Zhanga6734682020-11-30 16:14:38 -0800106
107Result FrontendClient::tune(const FrontendSettings& settings,
108 const FrontendSettingsExt1_1& settingsExt1_1) {
109 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800110 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
111 Status s = mTunerFrontend->tune(tunerFeSettings);
Amy Zhang4a07e802021-01-21 17:10:21 -0800112 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800113 }
114
115 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800116 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhanga6734682020-11-30 16:14:38 -0800117 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
118 return result;
119 }
120
121 if (mFrontend != NULL) {
122 result = mFrontend->tune(settings);
123 return result;
124 }
125
126 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -0800127}
Amy Zhanga6734682020-11-30 16:14:38 -0800128
129Result FrontendClient::stopTune() {
130 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800131 Status s = mTunerFrontend->stopTune();
132 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800133 }
134
135 if (mFrontend != NULL) {
136 Result result = mFrontend->stopTune();
137 return result;
138 }
139
140 return Result::INVALID_STATE;
141}
142
Amy Zhangd08c2732021-01-08 17:22:59 -0800143Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
144 const FrontendSettingsExt1_1& settingsExt1_1) {
145 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800146 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
147 Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
Amy Zhang4a07e802021-01-21 17:10:21 -0800148 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800149 }
150
151 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800152 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhangd08c2732021-01-08 17:22:59 -0800153 result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
154 return result;
155 }
156
157 if (mFrontend != NULL) {
158 result = mFrontend->scan(settings, type);
159 return result;
160 }
161
162 return Result::INVALID_STATE;
163}
164
165Result FrontendClient::stopScan() {
166 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800167 Status s = mTunerFrontend->stopScan();
168 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800169 }
170
171 if (mFrontend != NULL) {
172 Result result = mFrontend->stopScan();
173 return result;
174 }
175
176 return Result::INVALID_STATE;
177}
178
179vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
180 vector<FrontendStatus> status;
181
182 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800183 vector<TunerFrontendStatus> aidlStatus;
184 vector<int> types;
185 for (auto t : statusTypes) {
186 types.push_back((int)t);
187 }
188 Status s = mTunerFrontend->getStatus(types, &aidlStatus);
189 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
190 return status;
191 }
192 return getHidlStatus(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800193 }
194
195 if (mFrontend != NULL && statusTypes.size() > 0) {
196 Result res;
197 mFrontend->getStatus(statusTypes,
198 [&](Result r, const hidl_vec<FrontendStatus>& s) {
199 res = r;
200 status = s;
201 });
202 if (res != Result::SUCCESS) {
203 status.clear();
204 return status;
205 }
206 }
207
208 return status;
209}
Amy Zhang46c31ec2021-02-03 18:19:10 -0800210
Amy Zhangd08c2732021-01-08 17:22:59 -0800211vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
212 vector<FrontendStatusTypeExt1_1> statusTypes) {
213 vector<FrontendStatusExt1_1> status;
214
215 if (mTunerFrontend != NULL) {
Amy Zhang46c31ec2021-02-03 18:19:10 -0800216 vector<TunerFrontendStatus> aidlStatus;
217 vector<int> types;
218 for (auto t : statusTypes) {
219 types.push_back((int)t);
220 }
221 Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus);
222 if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
223 return status;
224 }
225 return getHidlStatusExt(aidlStatus);
Amy Zhangd08c2732021-01-08 17:22:59 -0800226 }
227
228 if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
229 Result res;
230 mFrontend_1_1->getStatusExt1_1(statusTypes,
231 [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
232 res = r;
233 status = s;
234 });
235 if (res != Result::SUCCESS) {
236 status.clear();
237 return status;
238 }
239 }
240
241 return status;
242}
243
Amy Zhangd3d57b42021-01-07 11:14:43 -0800244Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
245 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800246 Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
247 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800248 }
249
250 if (mFrontend != NULL) {
251 Result result = mFrontend->setLnb(lnbClient->getId());
252 return result;
253 }
254
255 return Result::INVALID_STATE;
256}
257
Amy Zhangd08c2732021-01-08 17:22:59 -0800258Result FrontendClient::setLna(bool bEnable) {
259 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800260 Status s = mTunerFrontend->setLna(bEnable);
261 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800262 }
263
264 if (mFrontend != NULL) {
265 Result result = mFrontend->setLna(bEnable);
266 return result;
267 }
268
269 return Result::INVALID_STATE;
270}
271
272int FrontendClient::linkCiCamToFrontend(int ciCamId) {
273 int ltsId = (int)Constant::INVALID_LTS_ID;
274
275 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800276 Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
277 if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
278 return ltsId;
279 }
280 return (int)Constant::INVALID_LTS_ID;
Amy Zhangd08c2732021-01-08 17:22:59 -0800281 }
282
283 if (mFrontend_1_1 != NULL) {
284 Result res;
285 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
286 [&](Result r, uint32_t id) {
287 res = r;
288 ltsId = id;
289 });
290 if (res != Result::SUCCESS) {
291 return (int)Constant::INVALID_LTS_ID;
292 }
293 }
294
295 return ltsId;
296}
297
298Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
299 if (mTunerFrontend != NULL) {
Amy Zhang379cb482021-02-04 21:05:11 -0800300 Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
301 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800302 }
303
304 if (mFrontend_1_1 != NULL) {
305 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
306 }
307
308 return Result::INVALID_STATE;
309}
310
Amy Zhanga6734682020-11-30 16:14:38 -0800311Result FrontendClient::close() {
312 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800313 Status s = mTunerFrontend->close();
Amy Zhangec3b4872021-02-11 15:38:20 -0800314 mTunerFrontend = NULL;
Amy Zhang4a07e802021-01-21 17:10:21 -0800315 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800316 }
317
318 if (mFrontend != NULL) {
319 Result result = mFrontend->close();
Amy Zhangec3b4872021-02-11 15:38:20 -0800320 mFrontend = NULL;
321 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -0800322 return result;
323 }
324
325 return Result::INVALID_STATE;
326}
327
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800328/////////////// TunerFrontend Helper Methods ///////////////////////
329
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800330shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
331 return mTunerFrontend;
332}
333
334int FrontendClient::getId() {
Amy Zhang210c26a2021-01-12 11:25:27 -0800335 return mId;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800336}
337
Amy Zhang46c31ec2021-02-03 18:19:10 -0800338vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
339 vector<FrontendStatus> hidlStatus;
340 for (TunerFrontendStatus s : aidlStatus) {
341 FrontendStatus status;
342 switch (s.getTag()) {
343 case TunerFrontendStatus::isDemodLocked: {
344 status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
345 hidlStatus.push_back(status);
346 break;
347 }
348 case TunerFrontendStatus::snr: {
349 status.snr(s.get<TunerFrontendStatus::snr>());
350 hidlStatus.push_back(status);
351 break;
352 }
353 case TunerFrontendStatus::ber: {
354 status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
355 hidlStatus.push_back(status);
356 break;
357 }
358 case TunerFrontendStatus::per: {
359 status.per((uint32_t)s.get<TunerFrontendStatus::per>());
360 hidlStatus.push_back(status);
361 break;
362 }
363 case TunerFrontendStatus::preBer: {
364 status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
365 hidlStatus.push_back(status);
366 break;
367 }
368 case TunerFrontendStatus::signalQuality: {
369 status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
370 hidlStatus.push_back(status);
371 break;
372 }
373 case TunerFrontendStatus::signalStrength: {
374 status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
375 hidlStatus.push_back(status);
376 break;
377 }
378 case TunerFrontendStatus::symbolRate: {
379 status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
380 hidlStatus.push_back(status);
381 break;
382 }
383 case TunerFrontendStatus::innerFec: {
384 status.innerFec(static_cast<FrontendInnerFec>(
385 s.get<TunerFrontendStatus::innerFec>()));
386 hidlStatus.push_back(status);
387 break;
388 }
389 case TunerFrontendStatus::modulation: {
390 auto aidlMod = s.get<TunerFrontendStatus::modulation>();
391 switch (mType) {
392 case (int)FrontendType::DVBC:
393 status.modulation().dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
394 hidlStatus.push_back(status);
395 break;
396 case (int)FrontendType::DVBS:
397 status.modulation().dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
398 hidlStatus.push_back(status);
399 break;
400 case (int)FrontendType::ISDBS:
401 status.modulation().isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
402 hidlStatus.push_back(status);
403 break;
404 case (int)FrontendType::ISDBS3:
405 status.modulation().isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
406 hidlStatus.push_back(status);
407 break;
408 case (int)FrontendType::ISDBT:
409 status.modulation().isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
410 hidlStatus.push_back(status);
411 break;
412 default:
413 break;
414 }
415 break;
416 }
417 case TunerFrontendStatus::inversion: {
418 status.inversion(static_cast<FrontendDvbcSpectralInversion>(
419 s.get<TunerFrontendStatus::inversion>()));
420 hidlStatus.push_back(status);
421 break;
422 }
423 case TunerFrontendStatus::lnbVoltage: {
424 status.lnbVoltage(static_cast<LnbVoltage>(
425 s.get<TunerFrontendStatus::lnbVoltage>()));
426 hidlStatus.push_back(status);
427 break;
428 }
429 case TunerFrontendStatus::plpId: {
430 status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
431 hidlStatus.push_back(status);
432 break;
433 }
434 case TunerFrontendStatus::isEWBS: {
435 status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
436 hidlStatus.push_back(status);
437 break;
438 }
439 case TunerFrontendStatus::agc: {
440 status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
441 hidlStatus.push_back(status);
442 break;
443 }
444 case TunerFrontendStatus::isLnaOn: {
445 status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
446 hidlStatus.push_back(status);
447 break;
448 }
449 case TunerFrontendStatus::isLayerError: {
450 auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
451 hidl_vec<bool> e(aidlE.begin(), aidlE.end());
452 status.isLayerError(e);
453 hidlStatus.push_back(status);
454 break;
455 }
456 case TunerFrontendStatus::mer: {
457 status.mer(s.get<TunerFrontendStatus::mer>());
458 hidlStatus.push_back(status);
459 break;
460 }
461 case TunerFrontendStatus::freqOffset: {
462 status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
463 hidlStatus.push_back(status);
464 break;
465 }
466 case TunerFrontendStatus::hierarchy: {
467 status.hierarchy(static_cast<FrontendDvbtHierarchy>(
468 s.get<TunerFrontendStatus::freqOffset>()));
469 hidlStatus.push_back(status);
470 break;
471 }
472 case TunerFrontendStatus::isRfLocked: {
473 status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
474 hidlStatus.push_back(status);
475 break;
476 }
477 case TunerFrontendStatus::plpInfo: {
478 int size = s.get<TunerFrontendStatus::plpInfo>().size();
479 status.plpInfo().resize(size);
480 for (int i = 0; i < size; i++) {
481 auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
482 status.plpInfo()[i] = {
483 .plpId = (uint8_t)aidlInfo.plpId,
484 .isLocked = aidlInfo.isLocked,
485 .uec = (uint32_t)aidlInfo.uec,
486 };
487 }
488 hidlStatus.push_back(status);
489 break;
490 }
491 default:
492 break;
493 }
494 }
495 return hidlStatus;
496}
497
498vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
499 vector<TunerFrontendStatus>& aidlStatus) {
500 vector<FrontendStatusExt1_1> hidlStatus;
501 for (TunerFrontendStatus s : aidlStatus) {
502 FrontendStatusExt1_1 status;
503 switch (s.getTag()) {
504 case TunerFrontendStatus::modulations: {
505 for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
506 int size = status.modulations().size();
507 status.modulations().resize(size + 1);
508 switch (mType) {
509 case (int)FrontendType::DVBC:
510 status.modulations()[size].dvbc(
511 static_cast<FrontendDvbcModulation>(aidlMod));
512 break;
513 case (int)FrontendType::DVBS:
514 status.modulations()[size].dvbs(
515 static_cast<FrontendDvbsModulation>(aidlMod));
516 break;
517 case (int)FrontendType::DVBT:
518 status.modulations()[size].dvbt(
519 static_cast<FrontendDvbtConstellation>(aidlMod));
520 break;
521 case (int)FrontendType::ISDBS:
522 status.modulations()[size].isdbs(
523 static_cast<FrontendIsdbsModulation>(aidlMod));
524 break;
525 case (int)FrontendType::ISDBS3:
526 status.modulations()[size].isdbs3(
527 static_cast<FrontendIsdbs3Modulation>(aidlMod));
528 break;
529 case (int)FrontendType::ISDBT:
530 status.modulations()[size].isdbt(
531 static_cast<FrontendIsdbtModulation>(aidlMod));
532 break;
533 case (int)FrontendType::ATSC:
534 status.modulations()[size].atsc(
535 static_cast<FrontendAtscModulation>(aidlMod));
536 break;
537 case (int)FrontendType::ATSC3:
538 status.modulations()[size].atsc3(
539 static_cast<FrontendAtsc3Modulation>(aidlMod));
540 break;
541 case (int)FrontendType::DTMB:
542 status.modulations()[size].dtmb(
543 static_cast<FrontendDtmbModulation>(aidlMod));
544 break;
545 default:
546 status.modulations().resize(size);
547 break;
548 }
549 }
550 hidlStatus.push_back(status);
551 break;
552 }
553 case TunerFrontendStatus::bers: {
554 auto aidlB = s.get<TunerFrontendStatus::bers>();
555 hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
556 status.bers(b);
557 hidlStatus.push_back(status);
558 break;
559 }
560 case TunerFrontendStatus::codeRates: {
561 int size = s.get<TunerFrontendStatus::codeRates>().size();
562 status.codeRates().resize(size);
563 for (int i = 0; i < size; i++) {
564 auto aidlCodeRate = s.get<TunerFrontendStatus::codeRates>()[i];
565 status.codeRates()[i] =
566 static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate);
567 }
568 hidlStatus.push_back(status);
569 break;
570 }
571 case TunerFrontendStatus::bandwidth: {
572 auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
573 switch (mType) {
574 case (int)FrontendType::ATSC3:
575 status.bandwidth().atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
576 hidlStatus.push_back(status);
577 break;
578 case (int)FrontendType::DVBC:
579 status.bandwidth().dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
580 hidlStatus.push_back(status);
581 break;
582 case (int)FrontendType::DVBT:
583 status.bandwidth().dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
584 hidlStatus.push_back(status);
585 break;
586 case (int)FrontendType::ISDBT:
587 status.bandwidth().isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
588 hidlStatus.push_back(status);
589 break;
590 case (int)FrontendType::DTMB:
591 status.bandwidth().dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
592 hidlStatus.push_back(status);
593 break;
594 default:
595 break;
596 }
597 break;
598 }
599 case TunerFrontendStatus::interval: {
600 auto aidlInter = s.get<TunerFrontendStatus::interval>();
601 switch (mType) {
602 case (int)FrontendType::DVBT:
603 status.interval().dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
604 hidlStatus.push_back(status);
605 break;
606 case (int)FrontendType::ISDBT:
607 status.interval().isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
608 hidlStatus.push_back(status);
609 break;
610 case (int)FrontendType::DTMB:
611 status.interval().dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
612 hidlStatus.push_back(status);
613 break;
614 default:
615 break;
616 }
617 break;
618 }
619 case TunerFrontendStatus::transmissionMode: {
620 auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
621 switch (mType) {
622 case (int)FrontendType::DVBT:
623 status.transmissionMode().dvbt(
624 static_cast<FrontendDvbtTransmissionMode>(aidlTran));
625 hidlStatus.push_back(status);
626 break;
627 case (int)FrontendType::ISDBT:
628 status.transmissionMode().isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
629 hidlStatus.push_back(status);
630 break;
631 case (int)FrontendType::DTMB:
632 status.transmissionMode().dtmb(
633 static_cast<FrontendDtmbTransmissionMode>(aidlTran));
634 hidlStatus.push_back(status);
635 break;
636 default:
637 break;
638 }
639 break;
640 }
641 case TunerFrontendStatus::uec: {
642 status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
643 hidlStatus.push_back(status);
644 break;
645 }
646 case TunerFrontendStatus::systemId: {
647 status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
648 hidlStatus.push_back(status);
649 break;
650 }
651 case TunerFrontendStatus::interleaving: {
652 for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
653 int size = status.interleaving().size();
654 status.interleaving().resize(size + 1);
655 switch (mType) {
656 case (int)FrontendType::DVBC:
657 status.interleaving()[size].dvbc(
658 static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
659 break;
660 case (int)FrontendType::ATSC3:
661 status.interleaving()[size].atsc3(
662 static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
663 break;
664 case (int)FrontendType::DTMB:
665 status.interleaving()[size].dtmb(
666 static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
667 break;
668 default:
669 status.interleaving().resize(size);
670 break;
671 }
672 }
673 hidlStatus.push_back(status);
674 break;
675 }
676 case TunerFrontendStatus::isdbtSegment: {
677 auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
678 hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
679 status.isdbtSegment(s);
680 hidlStatus.push_back(status);
681 break;
682 }
683 case TunerFrontendStatus::tsDataRate: {
684 auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
685 hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
686 status.tsDataRate(ts);
687 hidlStatus.push_back(status);
688 break;
689 }
690 case TunerFrontendStatus::rollOff: {
691 auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
692 switch (mType) {
693 case (int)FrontendType::DVBS:
694 status.rollOff().dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
695 hidlStatus.push_back(status);
696 break;
697 case (int)FrontendType::ISDBS:
698 status.rollOff().isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
699 hidlStatus.push_back(status);
700 break;
701 case (int)FrontendType::ISDBS3:
702 status.rollOff().isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
703 hidlStatus.push_back(status);
704 break;
705 default:
706 break;
707 }
708 break;
709 }
710 case TunerFrontendStatus::isMiso: {
711 status.isMiso(s.get<TunerFrontendStatus::isMiso>());
712 hidlStatus.push_back(status);
713 break;
714 }
715 case TunerFrontendStatus::isLinear: {
716 status.isLinear(s.get<TunerFrontendStatus::isLinear>());
717 hidlStatus.push_back(status);
718 break;
719 }
720 case TunerFrontendStatus::isShortFrames: {
721 status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
722 hidlStatus.push_back(status);
723 break;
724 }
725 default:
726 break;
727 }
728 }
729 return hidlStatus;
730}
731
Amy Zhangb5809be2021-01-26 16:27:23 -0800732TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800733 const FrontendSettingsExt1_1& settingsExt1_1) {
734 bool isExtended = validateExtendedSettings(settingsExt1_1);
735 TunerFrontendSettings s{
736 .isExtended = isExtended,
737 .endFrequency = (int) settingsExt1_1.endFrequency,
738 .inversion = (int) settingsExt1_1.inversion,
739 };
740
741 if (settingsExt1_1.settingExt.getDiscriminator()
742 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
743 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
744 return s;
745 }
746
Amy Zhangb5809be2021-01-26 16:27:23 -0800747 switch (settings.getDiscriminator()) {
748 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800749 s.settings.set<TunerFrontendUnionSettings::analog>(
750 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800751 break;
752 }
753 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800754 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800755 break;
756 }
757 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800758 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800759 break;
760 }
761 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800762 s.settings.set<TunerFrontendUnionSettings::dvbs>(
763 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800764 break;
765 }
766 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800767 s.settings.set<TunerFrontendUnionSettings::cable>(
768 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800769 break;
770 }
771 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800772 s.settings.set<TunerFrontendUnionSettings::dvbt>(
773 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800774 break;
775 }
776 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800777 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800778 break;
779 }
780 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800781 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800782 break;
783 }
784 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800785 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800786 break;
787 }
788 default:
789 break;
790 }
791 return s;
792}
793
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800794TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
795 const FrontendSettingsExt1_1& settingsExt1_1) {
796 TunerFrontendAnalogSettings analogSettings{
797 .frequency = (int)settings.analog().frequency,
798 .signalType = (int)settings.analog().type,
799 .sifStandard = (int)settings.analog().sifStandard,
800 };
801 if (settingsExt1_1.settingExt.getDiscriminator()
802 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
803 analogSettings.isExtended = true;
804 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
805 } else {
806 analogSettings.isExtended = false;
807 }
808 return analogSettings;
809}
810
811TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
812 const FrontendSettingsExt1_1& settingsExt1_1) {
813 TunerFrontendDvbsSettings dvbsSettings{
814 .frequency = (int)settings.dvbs().frequency,
815 .modulation = (int)settings.dvbs().modulation,
816 .codeRate = {
817 .fec = (long)settings.dvbs().coderate.fec,
818 .isLinear = settings.dvbs().coderate.isLinear,
819 .isShortFrames = settings.dvbs().coderate.isShortFrames,
820 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
821 },
822 .symbolRate = (int)settings.dvbs().symbolRate,
823 .rolloff = (int)settings.dvbs().rolloff,
824 .pilot = (int)settings.dvbs().pilot,
825 .inputStreamId = (int)settings.dvbs().inputStreamId,
826 .standard = (int)settings.dvbs().standard,
827 .vcm = (int)settings.dvbs().vcmMode,
828 };
829 if (settingsExt1_1.settingExt.getDiscriminator()
830 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
831 dvbsSettings.isExtended = true;
832 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
833 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
834 } else {
835 dvbsSettings.isExtended = false;
836 }
837 return dvbsSettings;
838}
839
840TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
841 const FrontendSettingsExt1_1& settingsExt1_1) {
842 TunerFrontendCableSettings cableSettings{
843 .frequency = (int)settings.dvbc().frequency,
844 .modulation = (int)settings.dvbc().modulation,
845 .innerFec = (long)settings.dvbc().fec,
846 .symbolRate = (int)settings.dvbc().symbolRate,
847 .outerFec = (int)settings.dvbc().outerFec,
848 .annex = (int)settings.dvbc().annex,
849 .spectralInversion = (int)settings.dvbc().spectralInversion,
850 };
851 if (settingsExt1_1.settingExt.getDiscriminator()
852 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
853 cableSettings.isExtended = true;
854 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
855 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
856 } else {
857 cableSettings.isExtended = false;
858 }
859 return cableSettings;
860}
861
862TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
863 const FrontendSettingsExt1_1& settingsExt1_1) {
864 TunerFrontendDvbtSettings dvbtSettings{
865 .frequency = (int)settings.dvbt().frequency,
866 .transmissionMode = (int)settings.dvbt().transmissionMode,
867 .bandwidth = (int)settings.dvbt().bandwidth,
868 .constellation = (int)settings.dvbt().constellation,
869 .hierarchy = (int)settings.dvbt().hierarchy,
870 .hpCodeRate = (int)settings.dvbt().hpCoderate,
871 .lpCodeRate = (int)settings.dvbt().lpCoderate,
872 .guardInterval = (int)settings.dvbt().guardInterval,
873 .isHighPriority = settings.dvbt().isHighPriority,
874 .standard = (int)settings.dvbt().standard,
875 .isMiso = settings.dvbt().isMiso,
876 .plpMode = (int)settings.dvbt().plpMode,
877 .plpId = (int)settings.dvbt().plpId,
878 .plpGroupId = (int)settings.dvbt().plpGroupId,
879 };
880 if (settingsExt1_1.settingExt.getDiscriminator()
881 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
882 dvbtSettings.isExtended = true;
883 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
884 dvbtSettings.transmissionMode =
885 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
886 } else {
887 dvbtSettings.isExtended = false;
888 }
889 return dvbtSettings;
890}
891
892TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
893 const FrontendSettingsExt1_1& settingsExt1_1) {
894 TunerFrontendDtmbSettings dtmbSettings{
895 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
896 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
897 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
898 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
899 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
900 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
901 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
902 };
903 return dtmbSettings;
904}
905
906TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
907 TunerFrontendAtscSettings atscSettings{
908 .frequency = (int)settings.atsc().frequency,
909 .modulation = (int)settings.atsc().modulation,
910 };
911 return atscSettings;
912}
913
914TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
915 TunerFrontendAtsc3Settings atsc3Settings{
916 .frequency = (int)settings.atsc3().frequency,
917 .bandwidth = (int)settings.atsc3().bandwidth,
918 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
919 };
920 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
921 for (auto plpSetting : settings.atsc3().plpSettings) {
922 atsc3Settings.plpSettings.push_back({
923 .plpId = (int)plpSetting.plpId,
924 .modulation = (int)plpSetting.modulation,
925 .interleaveMode = (int)plpSetting.interleaveMode,
926 .codeRate = (int)plpSetting.codeRate,
927 .fec = (int)plpSetting.fec,
928 });
929 }
930 return atsc3Settings;
931}
932
933TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
934 TunerFrontendIsdbsSettings isdbsSettings{
935 .frequency = (int)settings.isdbs().frequency,
936 .streamId = (int)settings.isdbs().streamId,
937 .streamIdType = (int)settings.isdbs().streamIdType,
938 .modulation = (int)settings.isdbs().modulation,
939 .codeRate = (int)settings.isdbs().coderate,
940 .symbolRate = (int)settings.isdbs().symbolRate,
941 .rolloff = (int)settings.isdbs().rolloff,
942 };
943 return isdbsSettings;
944}
945
946TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
947 const FrontendSettings& settings) {
948 TunerFrontendIsdbs3Settings isdbs3Settings{
949 .frequency = (int)settings.isdbs3().frequency,
950 .streamId = (int)settings.isdbs3().streamId,
951 .streamIdType = (int)settings.isdbs3().streamIdType,
952 .modulation = (int)settings.isdbs3().modulation,
953 .codeRate = (int)settings.isdbs3().coderate,
954 .symbolRate = (int)settings.isdbs3().symbolRate,
955 .rolloff = (int)settings.isdbs3().rolloff,
956 };
957 return isdbs3Settings;
958}
959
960TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
961 TunerFrontendIsdbtSettings isdbtSettings{
962 .frequency = (int)settings.isdbt().frequency,
963 .modulation = (int)settings.isdbt().modulation,
964 .bandwidth = (int)settings.isdbt().bandwidth,
965 .mode = (int)settings.isdbt().mode,
966 .codeRate = (int)settings.isdbt().coderate,
967 .guardInterval = (int)settings.isdbt().guardInterval,
968 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
969 };
970 return isdbtSettings;
971}
972
973bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
974 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
975 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
976 || settingsExt1_1.settingExt.getDiscriminator()
977 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
978}
979
Amy Zhanga6734682020-11-30 16:14:38 -0800980/////////////// TunerFrontendCallback ///////////////////////
981
982TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
983 : mFrontendClientCallback(frontendClientCallback) {}
984
985Status TunerFrontendCallback::onEvent(int frontendEventType) {
986 if (mFrontendClientCallback != NULL) {
987 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
988 return Status::ok();
989 }
990 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
991}
992
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800993Status TunerFrontendCallback::onScanMessage(int messageType,
994 const TunerFrontendScanMessage& message) {
995 if (mFrontendClientCallback != NULL) {
996 if (!is1_1ExtendedScanMessage(messageType)) {
997 mFrontendClientCallback->onScanMessage(
998 static_cast<FrontendScanMessageType>(messageType),
999 getHalScanMessage(messageType, message));
1000 } else {
1001 mFrontendClientCallback->onScanMessageExt1_1(
1002 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
1003 getHalScanMessageExt1_1(messageType, message));
1004 }
1005 return Status::ok();
1006 }
1007 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -08001008}
1009
1010/////////////// IFrontendCallback ///////////////////////
1011
1012HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
1013 : mFrontendClientCallback(frontendClientCallback) {}
1014
1015Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
1016 if (mFrontendClientCallback != NULL) {
1017 mFrontendClientCallback->onEvent(frontendEventType);
1018 }
1019 return Void();
1020}
1021
1022Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
1023 const FrontendScanMessage& message) {
1024 if (mFrontendClientCallback != NULL) {
1025 mFrontendClientCallback->onScanMessage(type, message);
1026 }
1027 return Void();
1028}
1029
1030Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
1031 const FrontendScanMessageExt1_1& message) {
1032 if (mFrontendClientCallback != NULL) {
1033 mFrontendClientCallback->onScanMessageExt1_1(type, message);
1034 }
1035 return Void();
1036}
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001037
1038/////////////// FrontendClientCallback Helper Methods ///////////////////////
1039
1040FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
1041 int messageType, const TunerFrontendScanMessage& message) {
1042 FrontendScanMessage scanMessage;
1043 switch (messageType) {
1044 case (int) FrontendScanMessageType::LOCKED:
1045 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
1046 break;
1047 case (int) FrontendScanMessageType::END:
1048 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
1049 break;
1050 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
1051 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
1052 break;
1053 case (int) FrontendScanMessageType::FREQUENCY: {
1054 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
1055 hidl_vec<uint32_t> frequencies(begin(f), end(f));
1056 scanMessage.frequencies(frequencies);
1057 break;
1058 }
1059 case (int) FrontendScanMessageType::SYMBOL_RATE: {
1060 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
1061 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
1062 scanMessage.symbolRates(symbolRates);
1063 break;
1064 }
1065 case (int) FrontendScanMessageType::HIERARCHY:
1066 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
1067 message.get<TunerFrontendScanMessage::hierarchy>()));
1068 break;
1069 case (int) FrontendScanMessageType::ANALOG_TYPE:
1070 scanMessage.analogType(static_cast<FrontendAnalogType>(
1071 message.get<TunerFrontendScanMessage::analogType>()));
1072 break;
1073 case (int) FrontendScanMessageType::PLP_IDS: {
1074 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
1075 hidl_vec<uint8_t> plpIds(begin(p), end(p));
1076 scanMessage.plpIds(plpIds);
1077 break;
1078 }
1079 case (int) FrontendScanMessageType::GROUP_IDS: {
1080 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
1081 hidl_vec<uint8_t> groupIds(begin(g), end(g));
1082 scanMessage.groupIds(groupIds);
1083 break;
1084 }
1085 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
1086 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
1087 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
1088 scanMessage.inputStreamIds(inputStreamIds);
1089 break;
1090 }
1091 case (int) FrontendScanMessageType::STANDARD: {
1092 FrontendScanMessage::Standard std;
1093 int standard = message.get<TunerFrontendScanMessage::std>();
1094 switch (mType) {
1095 case (int) FrontendType::DVBS:
1096 std.sStd(static_cast<FrontendDvbsStandard>(standard));
1097 scanMessage.std(std);
1098 break;
1099 case (int) FrontendType::DVBT:
1100 std.tStd(static_cast<FrontendDvbtStandard>(standard));
1101 scanMessage.std(std);
1102 break;
1103 case (int) FrontendType::ANALOG:
1104 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
1105 scanMessage.std(std);
1106 break;
1107 default:
1108 break;
1109 }
1110 break;
1111 }
1112 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
1113 vector<TunerFrontendScanAtsc3PlpInfo> plp =
1114 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
1115 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
Amy Zhang46c31ec2021-02-03 18:19:10 -08001116 int size = plp.size();
1117 plpInfo.resize(size);
1118 for (int i = 0; i < size; i++) {
1119 auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001120 FrontendScanAtsc3PlpInfo p{
1121 .plpId = static_cast<uint8_t>(info.plpId),
1122 .bLlsFlag = info.llsFlag,
1123 };
Amy Zhang46c31ec2021-02-03 18:19:10 -08001124 plpInfo[i] = p;
Amy Zhangb9f3cab2021-01-13 15:24:14 -08001125 }
1126 scanMessage.atsc3PlpInfos(plpInfo);
1127 break;
1128 }
1129 default:
1130 break;
1131 }
1132 return scanMessage;
1133}
1134
1135FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
1136 int messageType, const TunerFrontendScanMessage& message) {
1137 FrontendScanMessageExt1_1 scanMessage;
1138 switch (messageType) {
1139 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
1140 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
1141 break;
1142 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
1143 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
1144 message.get<TunerFrontendScanMessage::annex>()));
1145 break;
1146 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
1147 FrontendModulation m;
1148 int modulation = message.get<TunerFrontendScanMessage::modulation>();
1149 switch (mType) {
1150 case (int) FrontendType::DVBC:
1151 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
1152 scanMessage.modulation(m);
1153 break;
1154 case (int) FrontendType::DVBS:
1155 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
1156 scanMessage.modulation(m);
1157 break;
1158 case (int) FrontendType::DVBT:
1159 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
1160 scanMessage.modulation(m);
1161 break;
1162 case (int) FrontendType::ISDBS:
1163 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
1164 scanMessage.modulation(m);
1165 break;
1166 case (int) FrontendType::ISDBS3:
1167 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
1168 scanMessage.modulation(m);
1169 break;
1170 case (int) FrontendType::ISDBT:
1171 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
1172 scanMessage.modulation(m);
1173 break;
1174 case (int) FrontendType::ATSC:
1175 m.atsc(static_cast<FrontendAtscModulation>(modulation));
1176 scanMessage.modulation(m);
1177 break;
1178 case (int) FrontendType::ATSC3:
1179 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
1180 scanMessage.modulation(m);
1181 break;
1182 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
1183 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
1184 scanMessage.modulation(m);
1185 break;
1186 default:
1187 break;
1188 }
1189 break;
1190 }
1191 default:
1192 break;
1193 }
1194 return scanMessage;
1195}
1196
1197bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
1198 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
1199 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
1200}
Amy Zhanga6734682020-11-30 16:14:38 -08001201} // namespace android