blob: 08573a61c623136088c4086e0f6910fabc2a0d53 [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;
30using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
31using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
32using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
33using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
35using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
36using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
37using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
38using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
39using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
40using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
41using ::android::hardware::tv::tuner::V1_0::FrontendType;
Amy Zhangd08c2732021-01-08 17:22:59 -080042using ::android::hardware::tv::tuner::V1_1::Constant;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080043using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
44using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
45using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080046using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhanga6734682020-11-30 16:14:38 -080047
Amy Zhangbf68a162020-11-23 17:42:40 -080048namespace android {
49
Amy Zhanga6734682020-11-30 16:14:38 -080050/////////////// FrontendClient ///////////////////////
51
Amy Zhangb9f3cab2021-01-13 15:24:14 -080052FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type) {
Amy Zhangbf68a162020-11-23 17:42:40 -080053 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080054 mAidlCallback = NULL;
55 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080056 mId = id;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080057 mType = type;
Amy Zhangbf68a162020-11-23 17:42:40 -080058}
59
60FrontendClient::~FrontendClient() {
61 mTunerFrontend = NULL;
62 mFrontend = NULL;
63 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080064 mAidlCallback = NULL;
65 mHidlCallback = NULL;
Amy Zhang210c26a2021-01-12 11:25:27 -080066 mId = -1;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080067 mType = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080068}
69
70Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
71 if (mTunerFrontend != NULL) {
72 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
Amy Zhangb9f3cab2021-01-13 15:24:14 -080073 mAidlCallback->setFrontendType(mType);
Amy Zhanga6734682020-11-30 16:14:38 -080074 mTunerFrontend->setCallback(mAidlCallback);
75 return Result::SUCCESS;
76 }
77
78 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
79 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -080080}
81
82void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
83 mFrontend = frontend;
84 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
85}
Amy Zhanga6734682020-11-30 16:14:38 -080086
87Result FrontendClient::tune(const FrontendSettings& settings,
88 const FrontendSettingsExt1_1& settingsExt1_1) {
89 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -080090 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
91 Status s = mTunerFrontend->tune(tunerFeSettings);
Amy Zhang4a07e802021-01-21 17:10:21 -080092 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -080093 }
94
95 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -080096 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhanga6734682020-11-30 16:14:38 -080097 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
98 return result;
99 }
100
101 if (mFrontend != NULL) {
102 result = mFrontend->tune(settings);
103 return result;
104 }
105
106 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -0800107}
Amy Zhanga6734682020-11-30 16:14:38 -0800108
109Result FrontendClient::stopTune() {
110 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800111 Status s = mTunerFrontend->stopTune();
112 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800113 }
114
115 if (mFrontend != NULL) {
116 Result result = mFrontend->stopTune();
117 return result;
118 }
119
120 return Result::INVALID_STATE;
121}
122
Amy Zhangd08c2732021-01-08 17:22:59 -0800123Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
124 const FrontendSettingsExt1_1& settingsExt1_1) {
125 if (mTunerFrontend != NULL) {
Amy Zhangb5809be2021-01-26 16:27:23 -0800126 TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
127 Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
Amy Zhang4a07e802021-01-21 17:10:21 -0800128 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800129 }
130
131 Result result;
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800132 if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
Amy Zhangd08c2732021-01-08 17:22:59 -0800133 result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
134 return result;
135 }
136
137 if (mFrontend != NULL) {
138 result = mFrontend->scan(settings, type);
139 return result;
140 }
141
142 return Result::INVALID_STATE;
143}
144
145Result FrontendClient::stopScan() {
146 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800147 Status s = mTunerFrontend->stopScan();
148 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhangd08c2732021-01-08 17:22:59 -0800149 }
150
151 if (mFrontend != NULL) {
152 Result result = mFrontend->stopScan();
153 return result;
154 }
155
156 return Result::INVALID_STATE;
157}
158
159vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
160 vector<FrontendStatus> status;
161
162 if (mTunerFrontend != NULL) {
163 // TODO: handle error message.
164 /*status = mTunerFrontend->getStatus(statusTypes);
165 return status;*/
166 }
167
168 if (mFrontend != NULL && statusTypes.size() > 0) {
169 Result res;
170 mFrontend->getStatus(statusTypes,
171 [&](Result r, const hidl_vec<FrontendStatus>& s) {
172 res = r;
173 status = s;
174 });
175 if (res != Result::SUCCESS) {
176 status.clear();
177 return status;
178 }
179 }
180
181 return status;
182}
183vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
184 vector<FrontendStatusTypeExt1_1> statusTypes) {
185 vector<FrontendStatusExt1_1> status;
186
187 if (mTunerFrontend != NULL) {
188 // TODO: handle error message.
189 /*status = mTunerFrontend->getStatusExtended_1_1(statusTypes);
190 return status;*/
191 }
192
193 if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
194 Result res;
195 mFrontend_1_1->getStatusExt1_1(statusTypes,
196 [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
197 res = r;
198 status = s;
199 });
200 if (res != Result::SUCCESS) {
201 status.clear();
202 return status;
203 }
204 }
205
206 return status;
207}
208
Amy Zhangd3d57b42021-01-07 11:14:43 -0800209Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
210 if (mTunerFrontend != NULL) {
211 // TODO: handle error message.
212 /*mTunerFrontend->setLnb(lnbClient->getAidlLnb());
213 return Result::SUCCESS;*/
214 }
215
216 if (mFrontend != NULL) {
217 Result result = mFrontend->setLnb(lnbClient->getId());
218 return result;
219 }
220
221 return Result::INVALID_STATE;
222}
223
Amy Zhangd08c2732021-01-08 17:22:59 -0800224Result FrontendClient::setLna(bool bEnable) {
225 if (mTunerFrontend != NULL) {
226 // TODO: handle error message.
227 /*mTunerFrontend->setLna(bEnable);
228 return Result::SUCCESS;*/
229 }
230
231 if (mFrontend != NULL) {
232 Result result = mFrontend->setLna(bEnable);
233 return result;
234 }
235
236 return Result::INVALID_STATE;
237}
238
239int FrontendClient::linkCiCamToFrontend(int ciCamId) {
240 int ltsId = (int)Constant::INVALID_LTS_ID;
241
242 if (mTunerFrontend != NULL) {
243 // TODO: handle error message.
244 /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId);
245 return ltsId;*/
246 }
247
248 if (mFrontend_1_1 != NULL) {
249 Result res;
250 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
251 [&](Result r, uint32_t id) {
252 res = r;
253 ltsId = id;
254 });
255 if (res != Result::SUCCESS) {
256 return (int)Constant::INVALID_LTS_ID;
257 }
258 }
259
260 return ltsId;
261}
262
263Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
264 if (mTunerFrontend != NULL) {
265 // TODO: handle error message.
266 /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
267 return Result::SUCCESS;*/
268 }
269
270 if (mFrontend_1_1 != NULL) {
271 return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
272 }
273
274 return Result::INVALID_STATE;
275}
276
Amy Zhanga6734682020-11-30 16:14:38 -0800277Result FrontendClient::close() {
278 if (mTunerFrontend != NULL) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800279 Status s = mTunerFrontend->close();
280 return ClientHelper::getServiceSpecificErrorCode(s);
Amy Zhanga6734682020-11-30 16:14:38 -0800281 }
282
283 if (mFrontend != NULL) {
284 Result result = mFrontend->close();
285 if (result == Result::SUCCESS) {
286 mFrontend = NULL;
287 mFrontend_1_1 = NULL;
288 }
289 return result;
290 }
291
292 return Result::INVALID_STATE;
293}
294
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800295/////////////// TunerFrontend Helper Methods ///////////////////////
296
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800297shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
298 return mTunerFrontend;
299}
300
301int FrontendClient::getId() {
Amy Zhang210c26a2021-01-12 11:25:27 -0800302 return mId;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800303}
304
Amy Zhangb5809be2021-01-26 16:27:23 -0800305TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800306 const FrontendSettingsExt1_1& settingsExt1_1) {
307 bool isExtended = validateExtendedSettings(settingsExt1_1);
308 TunerFrontendSettings s{
309 .isExtended = isExtended,
310 .endFrequency = (int) settingsExt1_1.endFrequency,
311 .inversion = (int) settingsExt1_1.inversion,
312 };
313
314 if (settingsExt1_1.settingExt.getDiscriminator()
315 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
316 s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
317 return s;
318 }
319
Amy Zhangb5809be2021-01-26 16:27:23 -0800320 switch (settings.getDiscriminator()) {
321 case FrontendSettings::hidl_discriminator::analog: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800322 s.settings.set<TunerFrontendUnionSettings::analog>(
323 getAidlAnalogSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800324 break;
325 }
326 case FrontendSettings::hidl_discriminator::atsc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800327 s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800328 break;
329 }
330 case FrontendSettings::hidl_discriminator::atsc3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800331 s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800332 break;
333 }
334 case FrontendSettings::hidl_discriminator::dvbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800335 s.settings.set<TunerFrontendUnionSettings::dvbs>(
336 getAidlDvbsSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800337 break;
338 }
339 case FrontendSettings::hidl_discriminator::dvbc: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800340 s.settings.set<TunerFrontendUnionSettings::cable>(
341 getAidlCableSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800342 break;
343 }
344 case FrontendSettings::hidl_discriminator::dvbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800345 s.settings.set<TunerFrontendUnionSettings::dvbt>(
346 getAidlDvbtSettings(settings, settingsExt1_1));
Amy Zhangb5809be2021-01-26 16:27:23 -0800347 break;
348 }
349 case FrontendSettings::hidl_discriminator::isdbs: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800350 s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800351 break;
352 }
353 case FrontendSettings::hidl_discriminator::isdbs3: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800354 s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800355 break;
356 }
357 case FrontendSettings::hidl_discriminator::isdbt: {
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800358 s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
Amy Zhangb5809be2021-01-26 16:27:23 -0800359 break;
360 }
361 default:
362 break;
363 }
364 return s;
365}
366
Amy Zhang2f3c64a2021-02-02 20:39:05 -0800367TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
368 const FrontendSettingsExt1_1& settingsExt1_1) {
369 TunerFrontendAnalogSettings analogSettings{
370 .frequency = (int)settings.analog().frequency,
371 .signalType = (int)settings.analog().type,
372 .sifStandard = (int)settings.analog().sifStandard,
373 };
374 if (settingsExt1_1.settingExt.getDiscriminator()
375 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
376 analogSettings.isExtended = true;
377 analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
378 } else {
379 analogSettings.isExtended = false;
380 }
381 return analogSettings;
382}
383
384TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
385 const FrontendSettingsExt1_1& settingsExt1_1) {
386 TunerFrontendDvbsSettings dvbsSettings{
387 .frequency = (int)settings.dvbs().frequency,
388 .modulation = (int)settings.dvbs().modulation,
389 .codeRate = {
390 .fec = (long)settings.dvbs().coderate.fec,
391 .isLinear = settings.dvbs().coderate.isLinear,
392 .isShortFrames = settings.dvbs().coderate.isShortFrames,
393 .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
394 },
395 .symbolRate = (int)settings.dvbs().symbolRate,
396 .rolloff = (int)settings.dvbs().rolloff,
397 .pilot = (int)settings.dvbs().pilot,
398 .inputStreamId = (int)settings.dvbs().inputStreamId,
399 .standard = (int)settings.dvbs().standard,
400 .vcm = (int)settings.dvbs().vcmMode,
401 };
402 if (settingsExt1_1.settingExt.getDiscriminator()
403 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
404 dvbsSettings.isExtended = true;
405 dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
406 dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
407 } else {
408 dvbsSettings.isExtended = false;
409 }
410 return dvbsSettings;
411}
412
413TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
414 const FrontendSettingsExt1_1& settingsExt1_1) {
415 TunerFrontendCableSettings cableSettings{
416 .frequency = (int)settings.dvbc().frequency,
417 .modulation = (int)settings.dvbc().modulation,
418 .innerFec = (long)settings.dvbc().fec,
419 .symbolRate = (int)settings.dvbc().symbolRate,
420 .outerFec = (int)settings.dvbc().outerFec,
421 .annex = (int)settings.dvbc().annex,
422 .spectralInversion = (int)settings.dvbc().spectralInversion,
423 };
424 if (settingsExt1_1.settingExt.getDiscriminator()
425 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
426 cableSettings.isExtended = true;
427 cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
428 cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
429 } else {
430 cableSettings.isExtended = false;
431 }
432 return cableSettings;
433}
434
435TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
436 const FrontendSettingsExt1_1& settingsExt1_1) {
437 TunerFrontendDvbtSettings dvbtSettings{
438 .frequency = (int)settings.dvbt().frequency,
439 .transmissionMode = (int)settings.dvbt().transmissionMode,
440 .bandwidth = (int)settings.dvbt().bandwidth,
441 .constellation = (int)settings.dvbt().constellation,
442 .hierarchy = (int)settings.dvbt().hierarchy,
443 .hpCodeRate = (int)settings.dvbt().hpCoderate,
444 .lpCodeRate = (int)settings.dvbt().lpCoderate,
445 .guardInterval = (int)settings.dvbt().guardInterval,
446 .isHighPriority = settings.dvbt().isHighPriority,
447 .standard = (int)settings.dvbt().standard,
448 .isMiso = settings.dvbt().isMiso,
449 .plpMode = (int)settings.dvbt().plpMode,
450 .plpId = (int)settings.dvbt().plpId,
451 .plpGroupId = (int)settings.dvbt().plpGroupId,
452 };
453 if (settingsExt1_1.settingExt.getDiscriminator()
454 == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
455 dvbtSettings.isExtended = true;
456 dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
457 dvbtSettings.transmissionMode =
458 (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
459 } else {
460 dvbtSettings.isExtended = false;
461 }
462 return dvbtSettings;
463}
464
465TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
466 const FrontendSettingsExt1_1& settingsExt1_1) {
467 TunerFrontendDtmbSettings dtmbSettings{
468 .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
469 .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
470 .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
471 .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
472 .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
473 .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
474 .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
475 };
476 return dtmbSettings;
477}
478
479TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
480 TunerFrontendAtscSettings atscSettings{
481 .frequency = (int)settings.atsc().frequency,
482 .modulation = (int)settings.atsc().modulation,
483 };
484 return atscSettings;
485}
486
487TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
488 TunerFrontendAtsc3Settings atsc3Settings{
489 .frequency = (int)settings.atsc3().frequency,
490 .bandwidth = (int)settings.atsc3().bandwidth,
491 .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
492 };
493 atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
494 for (auto plpSetting : settings.atsc3().plpSettings) {
495 atsc3Settings.plpSettings.push_back({
496 .plpId = (int)plpSetting.plpId,
497 .modulation = (int)plpSetting.modulation,
498 .interleaveMode = (int)plpSetting.interleaveMode,
499 .codeRate = (int)plpSetting.codeRate,
500 .fec = (int)plpSetting.fec,
501 });
502 }
503 return atsc3Settings;
504}
505
506TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
507 TunerFrontendIsdbsSettings isdbsSettings{
508 .frequency = (int)settings.isdbs().frequency,
509 .streamId = (int)settings.isdbs().streamId,
510 .streamIdType = (int)settings.isdbs().streamIdType,
511 .modulation = (int)settings.isdbs().modulation,
512 .codeRate = (int)settings.isdbs().coderate,
513 .symbolRate = (int)settings.isdbs().symbolRate,
514 .rolloff = (int)settings.isdbs().rolloff,
515 };
516 return isdbsSettings;
517}
518
519TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
520 const FrontendSettings& settings) {
521 TunerFrontendIsdbs3Settings isdbs3Settings{
522 .frequency = (int)settings.isdbs3().frequency,
523 .streamId = (int)settings.isdbs3().streamId,
524 .streamIdType = (int)settings.isdbs3().streamIdType,
525 .modulation = (int)settings.isdbs3().modulation,
526 .codeRate = (int)settings.isdbs3().coderate,
527 .symbolRate = (int)settings.isdbs3().symbolRate,
528 .rolloff = (int)settings.isdbs3().rolloff,
529 };
530 return isdbs3Settings;
531}
532
533TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
534 TunerFrontendIsdbtSettings isdbtSettings{
535 .frequency = (int)settings.isdbt().frequency,
536 .modulation = (int)settings.isdbt().modulation,
537 .bandwidth = (int)settings.isdbt().bandwidth,
538 .mode = (int)settings.isdbt().mode,
539 .codeRate = (int)settings.isdbt().coderate,
540 .guardInterval = (int)settings.isdbt().guardInterval,
541 .serviceAreaId = (int)settings.isdbt().serviceAreaId,
542 };
543 return isdbtSettings;
544}
545
546bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
547 return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
548 || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
549 || settingsExt1_1.settingExt.getDiscriminator()
550 != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
551}
552
Amy Zhanga6734682020-11-30 16:14:38 -0800553/////////////// TunerFrontendCallback ///////////////////////
554
555TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
556 : mFrontendClientCallback(frontendClientCallback) {}
557
558Status TunerFrontendCallback::onEvent(int frontendEventType) {
559 if (mFrontendClientCallback != NULL) {
560 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
561 return Status::ok();
562 }
563 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
564}
565
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800566Status TunerFrontendCallback::onScanMessage(int messageType,
567 const TunerFrontendScanMessage& message) {
568 if (mFrontendClientCallback != NULL) {
569 if (!is1_1ExtendedScanMessage(messageType)) {
570 mFrontendClientCallback->onScanMessage(
571 static_cast<FrontendScanMessageType>(messageType),
572 getHalScanMessage(messageType, message));
573 } else {
574 mFrontendClientCallback->onScanMessageExt1_1(
575 static_cast<FrontendScanMessageTypeExt1_1>(messageType),
576 getHalScanMessageExt1_1(messageType, message));
577 }
578 return Status::ok();
579 }
580 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
Amy Zhanga6734682020-11-30 16:14:38 -0800581}
582
583/////////////// IFrontendCallback ///////////////////////
584
585HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
586 : mFrontendClientCallback(frontendClientCallback) {}
587
588Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
589 if (mFrontendClientCallback != NULL) {
590 mFrontendClientCallback->onEvent(frontendEventType);
591 }
592 return Void();
593}
594
595Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
596 const FrontendScanMessage& message) {
597 if (mFrontendClientCallback != NULL) {
598 mFrontendClientCallback->onScanMessage(type, message);
599 }
600 return Void();
601}
602
603Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
604 const FrontendScanMessageExt1_1& message) {
605 if (mFrontendClientCallback != NULL) {
606 mFrontendClientCallback->onScanMessageExt1_1(type, message);
607 }
608 return Void();
609}
Amy Zhangb9f3cab2021-01-13 15:24:14 -0800610
611/////////////// FrontendClientCallback Helper Methods ///////////////////////
612
613FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
614 int messageType, const TunerFrontendScanMessage& message) {
615 FrontendScanMessage scanMessage;
616 switch (messageType) {
617 case (int) FrontendScanMessageType::LOCKED:
618 scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
619 break;
620 case (int) FrontendScanMessageType::END:
621 scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
622 break;
623 case (int) FrontendScanMessageType::PROGRESS_PERCENT:
624 scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
625 break;
626 case (int) FrontendScanMessageType::FREQUENCY: {
627 vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
628 hidl_vec<uint32_t> frequencies(begin(f), end(f));
629 scanMessage.frequencies(frequencies);
630 break;
631 }
632 case (int) FrontendScanMessageType::SYMBOL_RATE: {
633 vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
634 hidl_vec<uint32_t> symbolRates(begin(s), end(s));
635 scanMessage.symbolRates(symbolRates);
636 break;
637 }
638 case (int) FrontendScanMessageType::HIERARCHY:
639 scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
640 message.get<TunerFrontendScanMessage::hierarchy>()));
641 break;
642 case (int) FrontendScanMessageType::ANALOG_TYPE:
643 scanMessage.analogType(static_cast<FrontendAnalogType>(
644 message.get<TunerFrontendScanMessage::analogType>()));
645 break;
646 case (int) FrontendScanMessageType::PLP_IDS: {
647 vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
648 hidl_vec<uint8_t> plpIds(begin(p), end(p));
649 scanMessage.plpIds(plpIds);
650 break;
651 }
652 case (int) FrontendScanMessageType::GROUP_IDS: {
653 vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
654 hidl_vec<uint8_t> groupIds(begin(g), end(g));
655 scanMessage.groupIds(groupIds);
656 break;
657 }
658 case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
659 vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
660 hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
661 scanMessage.inputStreamIds(inputStreamIds);
662 break;
663 }
664 case (int) FrontendScanMessageType::STANDARD: {
665 FrontendScanMessage::Standard std;
666 int standard = message.get<TunerFrontendScanMessage::std>();
667 switch (mType) {
668 case (int) FrontendType::DVBS:
669 std.sStd(static_cast<FrontendDvbsStandard>(standard));
670 scanMessage.std(std);
671 break;
672 case (int) FrontendType::DVBT:
673 std.tStd(static_cast<FrontendDvbtStandard>(standard));
674 scanMessage.std(std);
675 break;
676 case (int) FrontendType::ANALOG:
677 std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
678 scanMessage.std(std);
679 break;
680 default:
681 break;
682 }
683 break;
684 }
685 case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
686 vector<TunerFrontendScanAtsc3PlpInfo> plp =
687 message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
688 hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
689 for (TunerFrontendScanAtsc3PlpInfo info : plp) {
690 FrontendScanAtsc3PlpInfo p{
691 .plpId = static_cast<uint8_t>(info.plpId),
692 .bLlsFlag = info.llsFlag,
693 };
694 int size = plpInfo.size();
695 plpInfo.resize(size + 1);
696 plpInfo[size] = p;
697 }
698 scanMessage.atsc3PlpInfos(plpInfo);
699 break;
700 }
701 default:
702 break;
703 }
704 return scanMessage;
705}
706
707FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
708 int messageType, const TunerFrontendScanMessage& message) {
709 FrontendScanMessageExt1_1 scanMessage;
710 switch (messageType) {
711 case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
712 scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
713 break;
714 case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
715 scanMessage.annex(static_cast<FrontendDvbcAnnex>(
716 message.get<TunerFrontendScanMessage::annex>()));
717 break;
718 case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
719 FrontendModulation m;
720 int modulation = message.get<TunerFrontendScanMessage::modulation>();
721 switch (mType) {
722 case (int) FrontendType::DVBC:
723 m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
724 scanMessage.modulation(m);
725 break;
726 case (int) FrontendType::DVBS:
727 m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
728 scanMessage.modulation(m);
729 break;
730 case (int) FrontendType::DVBT:
731 m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
732 scanMessage.modulation(m);
733 break;
734 case (int) FrontendType::ISDBS:
735 m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
736 scanMessage.modulation(m);
737 break;
738 case (int) FrontendType::ISDBS3:
739 m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
740 scanMessage.modulation(m);
741 break;
742 case (int) FrontendType::ISDBT:
743 m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
744 scanMessage.modulation(m);
745 break;
746 case (int) FrontendType::ATSC:
747 m.atsc(static_cast<FrontendAtscModulation>(modulation));
748 scanMessage.modulation(m);
749 break;
750 case (int) FrontendType::ATSC3:
751 m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
752 scanMessage.modulation(m);
753 break;
754 case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
755 m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
756 scanMessage.modulation(m);
757 break;
758 default:
759 break;
760 }
761 break;
762 }
763 default:
764 break;
765 }
766 return scanMessage;
767}
768
769bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
770 return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
771 && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
772}
Amy Zhanga6734682020-11-30 16:14:38 -0800773} // namespace android