blob: a919f986f7e91a5fa09feba328d709c29213c1d6 [file] [log] [blame]
Amy Zhang0f04c452020-10-30 13:36:44 -07001/**
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 "TunerFrontend"
18
19#include "TunerFrontend.h"
Amy Zhang0f04c452020-10-30 13:36:44 -070020
Amy Zhang0f04c452020-10-30 13:36:44 -070021using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3PlpSettings;
Amy Zhangd61491e2021-01-12 16:27:29 -080022using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
Amy Zhangb05f06d2021-02-03 16:08:43 -080023using ::aidl::android::media::tv::tuner::TunerFrontendStatusAtsc3PlpInfo;
Amy Zhangdd3177c2021-02-02 16:32:40 -080024using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhang0f04c452020-10-30 13:36:44 -070025using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
26using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
27using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
28using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
30using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
31using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
32using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
33using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
35using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
36using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
38using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
41using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
43using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
44using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
45using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
46using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
47using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
48using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
49using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
50using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
51using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
52using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
53using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
54using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
55using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
56using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
57using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
58using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
59using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
60using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
61using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
62using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
63using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
64using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
65using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
66using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
67using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
68using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
Amy Zhangb05f06d2021-02-03 16:08:43 -080069using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
Amy Zhang0f04c452020-10-30 13:36:44 -070070using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
71using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
Amy Zhangb05f06d2021-02-03 16:08:43 -080072using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
Amy Zhang0f04c452020-10-30 13:36:44 -070073using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangdd3177c2021-02-02 16:32:40 -080074using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
Amy Zhangb05f06d2021-02-03 16:08:43 -080075using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
Amy Zhangdd3177c2021-02-02 16:32:40 -080076using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
77using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangdd3177c2021-02-02 16:32:40 -080078using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
79using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCodeRate;
80using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
81using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
82using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
83using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
84using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
Amy Zhangb05f06d2021-02-03 16:08:43 -080085using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
86using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
87using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
88using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
89using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
Amy Zhangdd3177c2021-02-02 16:32:40 -080090using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhangb05f06d2021-02-03 16:08:43 -080091using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
Amy Zhang0f04c452020-10-30 13:36:44 -070092
93namespace android {
94
Amy Zhanga046eee2021-01-12 14:44:58 -080095TunerFrontend::TunerFrontend(sp<IFrontend> frontend, int id) {
96 mFrontend = frontend;
97 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
Amy Zhangd61491e2021-01-12 16:27:29 -080098 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -070099}
100
Amy Zhanga046eee2021-01-12 14:44:58 -0800101TunerFrontend::~TunerFrontend() {
102 mFrontend = NULL;
Amy Zhangeb292c12021-01-26 16:28:19 -0800103 mFrontend_1_1 = NULL;
Amy Zhanga046eee2021-01-12 14:44:58 -0800104 mId = -1;
105}
Amy Zhang0f04c452020-10-30 13:36:44 -0700106
107Status TunerFrontend::setCallback(
Amy Zhanga046eee2021-01-12 14:44:58 -0800108 const shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700109 if (mFrontend == NULL) {
110 ALOGE("IFrontend is not initialized");
111 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
112 }
113
114 if (tunerFrontendCallback == NULL) {
115 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
116 }
117
118 sp<IFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
119 Result status = mFrontend->setCallback(frontendCallback);
120 if (status == Result::SUCCESS) {
121 return Status::ok();
122 }
123
124 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
125}
126
Amy Zhangeb292c12021-01-26 16:28:19 -0800127Status TunerFrontend::tune(const TunerFrontendSettings& settings) {
128 if (mFrontend == NULL) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800129 ALOGE("IFrontend is not initialized");
Amy Zhangeb292c12021-01-26 16:28:19 -0800130 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
131 }
132
Amy Zhangdd3177c2021-02-02 16:32:40 -0800133 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800134 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800135 if (settings.isExtended) {
136 if (mFrontend_1_1 == NULL) {
137 ALOGE("IFrontend_1_1 is not initialized");
138 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
139 }
140 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
141 status = mFrontend_1_1->tune_1_1(frontendSettings, frontendSettingsExt);
142 } else {
143 status = mFrontend->tune(frontendSettings);
144 }
145
Amy Zhangeb292c12021-01-26 16:28:19 -0800146 if (status == Result::SUCCESS) {
147 return Status::ok();
148 }
149
150 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700151}
152
153Status TunerFrontend::stopTune() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800154 if (mFrontend == NULL) {
155 ALOGD("IFrontend is not initialized");
156 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
157 }
158
159 Result status = mFrontend->stopTune();
160 if (status == Result::SUCCESS) {
161 return Status::ok();
162 }
163
164 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700165}
166
167Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
168 if (mFrontend == NULL) {
169 ALOGD("IFrontend is not initialized");
170 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
171 }
172
Amy Zhangdd3177c2021-02-02 16:32:40 -0800173 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800174 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800175 if (settings.isExtended) {
176 if (mFrontend_1_1 == NULL) {
177 ALOGE("IFrontend_1_1 is not initialized");
178 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
179 }
180 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
181 status = mFrontend_1_1->scan_1_1(frontendSettings,
182 static_cast<FrontendScanType>(frontendScanType), frontendSettingsExt);
183 } else {
184 status = mFrontend->scan(
185 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
186 }
187
Amy Zhang0f04c452020-10-30 13:36:44 -0700188 if (status == Result::SUCCESS) {
189 return Status::ok();
190 }
191
192 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
193}
194
195Status TunerFrontend::stopScan() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800196 if (mFrontend == NULL) {
197 ALOGD("IFrontend is not initialized");
198 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
199 }
200
201 Result status = mFrontend->stopScan();
202 if (status == Result::SUCCESS) {
203 return Status::ok();
204 }
205
206 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700207}
208
209Status TunerFrontend::setLnb(int /*lnbHandle*/) {
210 return Status::ok();
211}
212
213Status TunerFrontend::setLna(bool /*bEnable*/) {
214 return Status::ok();
215}
216
217Status TunerFrontend::close() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800218 if (mFrontend == NULL) {
219 ALOGD("IFrontend is not initialized");
220 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
221 }
222
223 Result status = mFrontend->close();
224 if (status == Result::SUCCESS) {
225 return Status::ok();
226 }
227
228 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700229}
230
Amy Zhangb05f06d2021-02-03 16:08:43 -0800231Status TunerFrontend::getStatus(const vector<int32_t>& statusTypes,
232 vector<TunerFrontendStatus>* _aidl_return) {
233 if (mFrontend == NULL) {
234 ALOGD("IFrontend is not initialized");
235 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
236 }
237
238 Result res;
239 vector<FrontendStatus> status;
240 vector<FrontendStatusType> types;
241 for (auto s : statusTypes) {
242 types.push_back(static_cast<FrontendStatusType>(s));
243 }
244
245 mFrontend->getStatus(types, [&](Result r, const hidl_vec<FrontendStatus>& s) {
246 res = r;
247 status = s;
248 });
249 if (res != Result::SUCCESS) {
250 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
251 }
252
253 getAidlFrontendStatus(status, *_aidl_return);
254 return Status::ok();
255}
256
257Status TunerFrontend::getStatusExtended_1_1(const vector<int32_t>& statusTypes,
258 vector<TunerFrontendStatus>* _aidl_return) {
259 if (mFrontend_1_1 == NULL) {
260 ALOGD("IFrontend_1_1 is not initialized");
261 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
262 }
263
264 Result res;
265 vector<FrontendStatusExt1_1> status;
266 vector<FrontendStatusTypeExt1_1> types;
267 for (auto s : statusTypes) {
268 types.push_back(static_cast<FrontendStatusTypeExt1_1>(s));
269 }
270
271 mFrontend_1_1->getStatusExt1_1(types, [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
272 res = r;
273 status = s;
274 });
275 if (res != Result::SUCCESS) {
276 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
277 }
278
279 getAidlFrontendStatusExt(status, *_aidl_return);
Amy Zhang0f04c452020-10-30 13:36:44 -0700280 return Status::ok();
281}
282
Amy Zhangd61491e2021-01-12 16:27:29 -0800283Status TunerFrontend::getFrontendId(int* _aidl_return) {
284 *_aidl_return = mId;
285 return Status::ok();
286}
Amy Zhanga046eee2021-01-12 14:44:58 -0800287
Amy Zhang0f04c452020-10-30 13:36:44 -0700288/////////////// FrontendCallback ///////////////////////
289
290Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
291 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
292 mTunerFrontendCallback->onEvent((int)frontendEventType);
293 return Void();
294}
295
296Return<void> TunerFrontend::FrontendCallback::onScanMessage(
297 FrontendScanMessageType type, const FrontendScanMessage& message) {
298 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800299 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700300 switch(type) {
301 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800302 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700303 break;
304 }
305 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800306 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700307 break;
308 }
309 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800310 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700311 break;
312 }
313 case FrontendScanMessageType::FREQUENCY: {
314 auto f = message.frequencies();
Amy Zhanga046eee2021-01-12 14:44:58 -0800315 vector<int> frequencies(begin(f), end(f));
Amy Zhangd61491e2021-01-12 16:27:29 -0800316 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700317 break;
318 }
319 case FrontendScanMessageType::SYMBOL_RATE: {
320 auto s = message.symbolRates();
Amy Zhanga046eee2021-01-12 14:44:58 -0800321 vector<int> symbolRates(begin(s), end(s));
Amy Zhangd61491e2021-01-12 16:27:29 -0800322 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700323 break;
324 }
325 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800326 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700327 break;
328 }
329 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800330 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700331 break;
332 }
333 case FrontendScanMessageType::PLP_IDS: {
334 auto p = message.plpIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800335 vector<uint8_t> plpIds(begin(p), end(p));
Amy Zhangd61491e2021-01-12 16:27:29 -0800336 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700337 break;
338 }
339 case FrontendScanMessageType::GROUP_IDS: {
340 auto g = message.groupIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800341 vector<uint8_t> groupIds(begin(g), end(g));
Amy Zhangd61491e2021-01-12 16:27:29 -0800342 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700343 break;
344 }
345 case FrontendScanMessageType::INPUT_STREAM_IDS: {
346 auto i = message.inputStreamIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800347 vector<char16_t> streamIds(begin(i), end(i));
Amy Zhangd61491e2021-01-12 16:27:29 -0800348 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700349 break;
350 }
351 case FrontendScanMessageType::STANDARD: {
352 FrontendScanMessage::Standard std = message.std();
353 int standard;
354 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
355 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700356 } else if (std.getDiscriminator() ==
357 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
358 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700359 } else if (std.getDiscriminator() ==
360 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
361 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700362 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800363 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700364 break;
365 }
366 case FrontendScanMessageType::ATSC3_PLP_INFO: {
Amy Zhanga046eee2021-01-12 14:44:58 -0800367 vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
368 vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700369 for (int i = 0; i < plpInfos.size(); i++) {
370 auto info = plpInfos[i];
Amy Zhangb05f06d2021-02-03 16:08:43 -0800371 int8_t plpId = (int8_t) info.plpId;
Amy Zhang0f04c452020-10-30 13:36:44 -0700372 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800373 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700374 .plpId = plpId,
375 .llsFlag = lls,
376 };
377 tunerPlpInfos.push_back(plpInfo);
378 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800379 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700380 break;
381 }
382 default:
383 break;
384 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800385 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
386 return Void();
387}
388
389Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
390 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
391 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
392 TunerFrontendScanMessage scanMessage;
393 switch(type) {
394 case FrontendScanMessageTypeExt1_1::MODULATION: {
395 FrontendModulation m = message.modulation();
396 int modulation;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800397 switch (m.getDiscriminator()) {
398 case FrontendModulation::hidl_discriminator::dvbc:
399 modulation = (int) m.dvbc();
400 break;
401 case FrontendModulation::hidl_discriminator::dvbt:
402 modulation = (int) m.dvbt();
403 break;
404 case FrontendModulation::hidl_discriminator::dvbs:
405 modulation = (int) m.dvbs();
406 break;
407 case FrontendModulation::hidl_discriminator::isdbs:
408 modulation = (int) m.isdbs();
409 break;
410 case FrontendModulation::hidl_discriminator::isdbs3:
411 modulation = (int) m.isdbs3();
412 break;
413 case FrontendModulation::hidl_discriminator::isdbt:
414 modulation = (int) m.isdbt();
415 break;
416 case FrontendModulation::hidl_discriminator::atsc:
417 modulation = (int) m.atsc();
418 break;
419 case FrontendModulation::hidl_discriminator::atsc3:
420 modulation = (int) m.atsc3();
421 break;
422 case FrontendModulation::hidl_discriminator::dtmb:
423 modulation = (int) m.dtmb();
424 break;
Amy Zhangd61491e2021-01-12 16:27:29 -0800425 }
426 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
427 break;
428 }
429 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
430 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
431 break;
432 }
433 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
434 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
435 break;
436 }
437 default:
438 break;
439 }
440 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700441 return Void();
442}
443
Amy Zhanga046eee2021-01-12 14:44:58 -0800444/////////////// TunerFrontend Helper Methods ///////////////////////
Amy Zhang0f04c452020-10-30 13:36:44 -0700445
Amy Zhangb05f06d2021-02-03 16:08:43 -0800446void TunerFrontend::getAidlFrontendStatus(
447 vector<FrontendStatus>& hidlStatus, vector<TunerFrontendStatus>& aidlStatus) {
448 for (FrontendStatus s : hidlStatus) {
449 TunerFrontendStatus status;
450 switch (s.getDiscriminator()) {
451 case FrontendStatus::hidl_discriminator::isDemodLocked: {
452 status.set<TunerFrontendStatus::isDemodLocked>(s.isDemodLocked());
453 aidlStatus.push_back(status);
454 break;
455 }
456 case FrontendStatus::hidl_discriminator::snr: {
457 status.set<TunerFrontendStatus::snr>((int)s.snr());
458 aidlStatus.push_back(status);
459 break;
460 }
461 case FrontendStatus::hidl_discriminator::ber: {
462 status.set<TunerFrontendStatus::ber>((int)s.ber());
463 aidlStatus.push_back(status);
464 break;
465 }
466 case FrontendStatus::hidl_discriminator::per: {
467 status.set<TunerFrontendStatus::per>((int)s.per());
468 aidlStatus.push_back(status);
469 break;
470 }
471 case FrontendStatus::hidl_discriminator::preBer: {
472 status.set<TunerFrontendStatus::preBer>((int)s.preBer());
473 aidlStatus.push_back(status);
474 break;
475 }
476 case FrontendStatus::hidl_discriminator::signalQuality: {
477 status.set<TunerFrontendStatus::signalQuality>((int)s.signalQuality());
478 aidlStatus.push_back(status);
479 break;
480 }
481 case FrontendStatus::hidl_discriminator::signalStrength: {
482 status.set<TunerFrontendStatus::signalStrength>((int)s.signalStrength());
483 aidlStatus.push_back(status);
484 break;
485 }
486 case FrontendStatus::hidl_discriminator::symbolRate: {
487 status.set<TunerFrontendStatus::symbolRate>((int)s.symbolRate());
488 aidlStatus.push_back(status);
489 break;
490 }
491 case FrontendStatus::hidl_discriminator::innerFec: {
492 status.set<TunerFrontendStatus::innerFec>((long)s.innerFec());
493 aidlStatus.push_back(status);
494 break;
495 }
496 case FrontendStatus::hidl_discriminator::modulation: {
497 switch (s.modulation().getDiscriminator()) {
498 case FrontendModulationStatus::hidl_discriminator::dvbc:
499 status.set<TunerFrontendStatus::modulation>((int)s.modulation().dvbc());
500 aidlStatus.push_back(status);
501 break;
502 case FrontendModulationStatus::hidl_discriminator::dvbs:
503 status.set<TunerFrontendStatus::modulation>((int)s.modulation().dvbs());
504 aidlStatus.push_back(status);
505 break;
506 case FrontendModulationStatus::hidl_discriminator::isdbs:
507 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbs());
508 aidlStatus.push_back(status);
509 break;
510 case FrontendModulationStatus::hidl_discriminator::isdbs3:
511 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbs3());
512 aidlStatus.push_back(status);
513 break;
514 case FrontendModulationStatus::hidl_discriminator::isdbt:
515 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbt());
516 aidlStatus.push_back(status);
517 break;
518 }
519 break;
520 }
521 case FrontendStatus::hidl_discriminator::inversion: {
522 status.set<TunerFrontendStatus::inversion>((int)s.inversion());
523 aidlStatus.push_back(status);
524 break;
525 }
526 case FrontendStatus::hidl_discriminator::lnbVoltage: {
527 status.set<TunerFrontendStatus::lnbVoltage>((int)s.lnbVoltage());
528 aidlStatus.push_back(status);
529 break;
530 }
531 case FrontendStatus::hidl_discriminator::plpId: {
532 status.set<TunerFrontendStatus::plpId>((int8_t)s.plpId());
533 aidlStatus.push_back(status);
534 break;
535 }
536 case FrontendStatus::hidl_discriminator::isEWBS: {
537 status.set<TunerFrontendStatus::isEWBS>(s.isEWBS());
538 aidlStatus.push_back(status);
539 break;
540 }
541 case FrontendStatus::hidl_discriminator::agc: {
542 status.set<TunerFrontendStatus::agc>((int8_t)s.agc());
543 aidlStatus.push_back(status);
544 break;
545 }
546 case FrontendStatus::hidl_discriminator::isLnaOn: {
547 status.set<TunerFrontendStatus::isLnaOn>(s.isLnaOn());
548 aidlStatus.push_back(status);
549 break;
550 }
551 case FrontendStatus::hidl_discriminator::isLayerError: {
552 vector<bool> e(s.isLayerError().begin(), s.isLayerError().end());
553 status.set<TunerFrontendStatus::isLayerError>(e);
554 aidlStatus.push_back(status);
555 break;
556 }
557 case FrontendStatus::hidl_discriminator::mer: {
558 status.set<TunerFrontendStatus::mer>((int)s.mer());
559 aidlStatus.push_back(status);
560 break;
561 }
562 case FrontendStatus::hidl_discriminator::freqOffset: {
563 status.set<TunerFrontendStatus::freqOffset>((int)s.freqOffset());
564 aidlStatus.push_back(status);
565 break;
566 }
567 case FrontendStatus::hidl_discriminator::hierarchy: {
568 status.set<TunerFrontendStatus::hierarchy>((int)s.hierarchy());
569 aidlStatus.push_back(status);
570 break;
571 }
572 case FrontendStatus::hidl_discriminator::isRfLocked: {
573 status.set<TunerFrontendStatus::isRfLocked>(s.isRfLocked());
574 aidlStatus.push_back(status);
575 break;
576 }
577 case FrontendStatus::hidl_discriminator::plpInfo: {
578 vector<TunerFrontendStatusAtsc3PlpInfo> info;
579 for (auto i : s.plpInfo()) {
580 info.push_back({
581 .plpId = (int8_t)i.plpId,
582 .isLocked = i.isLocked,
583 .uec = (int)i.uec,
584 });
585 }
586 status.set<TunerFrontendStatus::plpInfo>(info);
587 aidlStatus.push_back(status);
588 break;
589 }
590 }
591 }
592}
593
594void TunerFrontend::getAidlFrontendStatusExt(
595 vector<FrontendStatusExt1_1>& hidlStatus, vector<TunerFrontendStatus>& aidlStatus) {
596 for (FrontendStatusExt1_1 s : hidlStatus) {
597 TunerFrontendStatus status;
598 switch (s.getDiscriminator()) {
599 case FrontendStatusExt1_1::hidl_discriminator::modulations: {
600 vector<int> aidlMod;
601 for (auto m : s.modulations()) {
602 switch (m.getDiscriminator()) {
603 case FrontendModulation::hidl_discriminator::dvbc:
604 aidlMod.push_back((int)m.dvbc());
605 break;
606 case FrontendModulation::hidl_discriminator::dvbs:
607 aidlMod.push_back((int)m.dvbs());
608 break;
609 case FrontendModulation::hidl_discriminator::dvbt:
610 aidlMod.push_back((int)m.dvbt());
611 break;
612 case FrontendModulation::hidl_discriminator::isdbs:
613 aidlMod.push_back((int)m.isdbs());
614 break;
615 case FrontendModulation::hidl_discriminator::isdbs3:
616 aidlMod.push_back((int)m.isdbs3());
617 break;
618 case FrontendModulation::hidl_discriminator::isdbt:
619 aidlMod.push_back((int)m.isdbt());
620 break;
621 case FrontendModulation::hidl_discriminator::atsc:
622 aidlMod.push_back((int)m.atsc());
623 break;
624 case FrontendModulation::hidl_discriminator::atsc3:
625 aidlMod.push_back((int)m.atsc3());
626 break;
627 case FrontendModulation::hidl_discriminator::dtmb:
628 aidlMod.push_back((int)m.dtmb());
629 break;
630 }
631 }
632 status.set<TunerFrontendStatus::modulations>(aidlMod);
633 aidlStatus.push_back(status);
634 break;
635 }
636 case FrontendStatusExt1_1::hidl_discriminator::bers: {
637 vector<int> b(s.bers().begin(), s.bers().end());
638 status.set<TunerFrontendStatus::bers>(b);
639 aidlStatus.push_back(status);
640 break;
641 }
642 case FrontendStatusExt1_1::hidl_discriminator::codeRates: {
643 vector<int64_t> codeRates;
644 for (auto c : s.codeRates()) {
645 codeRates.push_back((long)c);
646 }
647 status.set<TunerFrontendStatus::codeRates>(codeRates);
648 aidlStatus.push_back(status);
649 break;
650 }
651 case FrontendStatusExt1_1::hidl_discriminator::bandwidth: {
652 switch (s.bandwidth().getDiscriminator()) {
653 case FrontendBandwidth::hidl_discriminator::atsc3:
654 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().atsc3());
655 break;
656 case FrontendBandwidth::hidl_discriminator::dvbc:
657 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dvbc());
658 break;
659 case FrontendBandwidth::hidl_discriminator::dvbt:
660 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dvbt());
661 break;
662 case FrontendBandwidth::hidl_discriminator::isdbt:
663 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().isdbt());
664 break;
665 case FrontendBandwidth::hidl_discriminator::dtmb:
666 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dtmb());
667 break;
668 }
669 aidlStatus.push_back(status);
670 break;
671 }
672 case FrontendStatusExt1_1::hidl_discriminator::interval: {
673 switch (s.interval().getDiscriminator()) {
674 case FrontendGuardInterval::hidl_discriminator::dvbt:
675 status.set<TunerFrontendStatus::interval>((int)s.interval().dvbt());
676 break;
677 case FrontendGuardInterval::hidl_discriminator::isdbt:
678 status.set<TunerFrontendStatus::interval>((int)s.interval().isdbt());
679 break;
680 case FrontendGuardInterval::hidl_discriminator::dtmb:
681 status.set<TunerFrontendStatus::interval>((int)s.interval().dtmb());
682 break;
683 }
684 aidlStatus.push_back(status);
685 break;
686 }
687 case FrontendStatusExt1_1::hidl_discriminator::transmissionMode: {
688 switch (s.transmissionMode().getDiscriminator()) {
689 case FrontendTransmissionMode::hidl_discriminator::dvbt:
690 status.set<TunerFrontendStatus::transmissionMode>(
691 (int)s.transmissionMode().dvbt());
692 break;
693 case FrontendTransmissionMode::hidl_discriminator::isdbt:
694 status.set<TunerFrontendStatus::transmissionMode>(
695 (int)s.transmissionMode().isdbt());
696 break;
697 case FrontendTransmissionMode::hidl_discriminator::dtmb:
698 status.set<TunerFrontendStatus::transmissionMode>(
699 (int)s.transmissionMode().dtmb());
700 break;
701 }
702 aidlStatus.push_back(status);
703 break;
704 }
705 case FrontendStatusExt1_1::hidl_discriminator::uec: {
706 status.set<TunerFrontendStatus::uec>((int)s.uec());
707 aidlStatus.push_back(status);
708 break;
709 }
710 case FrontendStatusExt1_1::hidl_discriminator::systemId: {
711 status.set<TunerFrontendStatus::systemId>((char16_t)s.systemId());
712 aidlStatus.push_back(status);
713 break;
714 }
715 case FrontendStatusExt1_1::hidl_discriminator::interleaving: {
716 vector<int> aidlInter;
717 for (auto i : s.interleaving()) {
718 switch (i.getDiscriminator()) {
719 case FrontendInterleaveMode::hidl_discriminator::atsc3:
720 aidlInter.push_back((int)i.atsc3());
721 break;
722 case FrontendInterleaveMode::hidl_discriminator::dvbc:
723 aidlInter.push_back((int)i.dvbc());
724 break;
725 case FrontendInterleaveMode::hidl_discriminator::dtmb:
726 aidlInter.push_back((int)i.dtmb());
727 break;
728 }
729 }
730 status.set<TunerFrontendStatus::interleaving>(aidlInter);
731 aidlStatus.push_back(status);
732 break;
733 }
734 case FrontendStatusExt1_1::hidl_discriminator::isdbtSegment: {
735 auto seg = s.isdbtSegment();
736 vector<uint8_t> i(seg.begin(), seg.end());
737 status.set<TunerFrontendStatus::isdbtSegment>(i);
738 aidlStatus.push_back(status);
739 break;
740 }
741 case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: {
742 vector<int> ts(s.tsDataRate().begin(), s.tsDataRate().end());
743 status.set<TunerFrontendStatus::tsDataRate>(ts);
744 aidlStatus.push_back(status);
745 break;
746 }
747 case FrontendStatusExt1_1::hidl_discriminator::rollOff: {
748 switch (s.rollOff().getDiscriminator()) {
749 case FrontendRollOff::hidl_discriminator::dvbs:
750 status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().dvbs());
751 break;
752 case FrontendRollOff::hidl_discriminator::isdbs:
753 status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs());
754 break;
755 case FrontendRollOff::hidl_discriminator::isdbs3:
756 status.set<TunerFrontendStatus::interleaving>((int)s.rollOff().isdbs3());
757 break;
758 }
759 aidlStatus.push_back(status);
760 break;
761 }
762 case FrontendStatusExt1_1::hidl_discriminator::isMiso: {
763 status.set<TunerFrontendStatus::isMiso>(s.isMiso());
764 aidlStatus.push_back(status);
765 break;
766 }
767 case FrontendStatusExt1_1::hidl_discriminator::isLinear: {
768 status.set<TunerFrontendStatus::isLinear>(s.isLinear());
769 aidlStatus.push_back(status);
770 break;
771 }
772 case FrontendStatusExt1_1::hidl_discriminator::isShortFrames: {
773 status.set<TunerFrontendStatus::isShortFrames>(s.isShortFrames());
774 aidlStatus.push_back(status);
775 break;
776 }
777 }
778 }
779}
780
Amy Zhang0f04c452020-10-30 13:36:44 -0700781hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
782 const TunerFrontendAtsc3Settings& settings) {
783 int len = settings.plpSettings.size();
784 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
785 // parse PLP settings
786 for (int i = 0; i < len; i++) {
787 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
788 FrontendAtsc3Modulation modulation =
789 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
790 FrontendAtsc3TimeInterleaveMode interleaveMode =
791 static_cast<FrontendAtsc3TimeInterleaveMode>(
792 settings.plpSettings[i].interleaveMode);
793 FrontendAtsc3CodeRate codeRate =
794 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
795 FrontendAtsc3Fec fec =
796 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
797 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
798 .plpId = plpId,
799 .modulation = modulation,
800 .interleaveMode = interleaveMode,
801 .codeRate = codeRate,
802 .fec = fec,
803 };
804 plps[i] = frontendAtsc3PlpSettings;
805 }
806 return plps;
807}
808
809FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
810 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
811 bool isLinear = codeRate.isLinear;
812 bool isShortFrames = codeRate.isShortFrames;
813 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
814 FrontendDvbsCodeRate coderate {
815 .fec = innerFec,
816 .isLinear = isLinear,
817 .isShortFrames = isShortFrames,
818 .bitsPer1000Symbol = bitsPer1000Symbol,
819 };
820 return coderate;
821}
Amy Zhangeb292c12021-01-26 16:28:19 -0800822
Amy Zhangdd3177c2021-02-02 16:32:40 -0800823FrontendSettings TunerFrontend::getHidlFrontendSettings(const TunerFrontendSettings& aidlSettings) {
824 auto settings = aidlSettings.settings;
Amy Zhangeb292c12021-01-26 16:28:19 -0800825 FrontendSettings frontendSettings;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800826
Amy Zhangeb292c12021-01-26 16:28:19 -0800827 switch (settings.getTag()) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800828 case TunerFrontendUnionSettings::analog: {
829 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800830 frontendSettings.analog({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800831 .frequency = static_cast<uint32_t>(analog.frequency),
832 .type = static_cast<FrontendAnalogType>(analog.signalType),
833 .sifStandard = static_cast<FrontendAnalogSifStandard>(analog.sifStandard),
Amy Zhangeb292c12021-01-26 16:28:19 -0800834 });
835 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800836 }
837 case TunerFrontendUnionSettings::atsc: {
838 auto atsc = settings.get<TunerFrontendUnionSettings::atsc>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800839 frontendSettings.atsc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800840 .frequency = static_cast<uint32_t>(atsc.frequency),
841 .modulation = static_cast<FrontendAtscModulation>(atsc.modulation),
Amy Zhangeb292c12021-01-26 16:28:19 -0800842 });
843 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800844 }
845 case TunerFrontendUnionSettings::atsc3: {
846 auto atsc3 = settings.get<TunerFrontendUnionSettings::atsc3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800847 frontendSettings.atsc3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800848 .frequency = static_cast<uint32_t>(atsc3.frequency),
849 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(atsc3.bandwidth),
Amy Zhangeb292c12021-01-26 16:28:19 -0800850 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800851 atsc3.demodOutputFormat),
852 .plpSettings = getAtsc3PlpSettings(atsc3),
Amy Zhangeb292c12021-01-26 16:28:19 -0800853 });
854 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800855 }
856 case TunerFrontendUnionSettings::cable: {
857 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800858 frontendSettings.dvbc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800859 .frequency = static_cast<uint32_t>(dvbc.frequency),
860 .modulation = static_cast<FrontendDvbcModulation>(dvbc.modulation),
861 .fec = static_cast<FrontendInnerFec>(dvbc.innerFec),
862 .symbolRate = static_cast<uint32_t>(dvbc.symbolRate),
863 .outerFec = static_cast<FrontendDvbcOuterFec>(dvbc.outerFec),
864 .annex = static_cast<FrontendDvbcAnnex>(dvbc.annex),
Amy Zhangeb292c12021-01-26 16:28:19 -0800865 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800866 dvbc.spectralInversion),
Amy Zhangeb292c12021-01-26 16:28:19 -0800867 });
868 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800869 }
870 case TunerFrontendUnionSettings::dvbs: {
871 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800872 frontendSettings.dvbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800873 .frequency = static_cast<uint32_t>(dvbs.frequency),
874 .modulation = static_cast<FrontendDvbsModulation>(dvbs.modulation),
875 .coderate = getDvbsCodeRate(dvbs.codeRate),
876 .symbolRate = static_cast<uint32_t>(dvbs.symbolRate),
877 .rolloff = static_cast<FrontendDvbsRolloff>(dvbs.rolloff),
878 .pilot = static_cast<FrontendDvbsPilot>(dvbs.pilot),
879 .inputStreamId = static_cast<uint32_t>(dvbs.inputStreamId),
880 .standard = static_cast<FrontendDvbsStandard>(dvbs.standard),
881 .vcmMode = static_cast<FrontendDvbsVcmMode>(dvbs.vcm),
Amy Zhangeb292c12021-01-26 16:28:19 -0800882 });
883 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800884 }
885 case TunerFrontendUnionSettings::dvbt: {
886 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800887 frontendSettings.dvbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800888 .frequency = static_cast<uint32_t>(dvbt.frequency),
Amy Zhangeb292c12021-01-26 16:28:19 -0800889 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800890 dvbt.transmissionMode),
891 .bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt.bandwidth),
892 .constellation = static_cast<FrontendDvbtConstellation>(dvbt.constellation),
893 .hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt.hierarchy),
894 .hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.hpCodeRate),
895 .lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.lpCodeRate),
896 .guardInterval = static_cast<FrontendDvbtGuardInterval>(dvbt.guardInterval),
897 .isHighPriority = dvbt.isHighPriority,
898 .standard = static_cast<FrontendDvbtStandard>(dvbt.standard),
899 .isMiso = dvbt.isMiso,
900 .plpMode = static_cast<FrontendDvbtPlpMode>(dvbt.plpMode),
901 .plpId = static_cast<uint8_t>(dvbt.plpId),
902 .plpGroupId = static_cast<uint8_t>(dvbt.plpGroupId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800903 });
904 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800905 }
906 case TunerFrontendUnionSettings::isdbs: {
907 auto isdbs = settings.get<TunerFrontendUnionSettings::isdbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800908 frontendSettings.isdbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800909 .frequency = static_cast<uint32_t>(isdbs.frequency),
910 .streamId = static_cast<uint16_t>(isdbs.streamId),
911 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs.streamIdType),
912 .modulation = static_cast<FrontendIsdbsModulation>(isdbs.modulation),
913 .coderate = static_cast<FrontendIsdbsCoderate>(isdbs.codeRate),
914 .symbolRate = static_cast<uint32_t>(isdbs.symbolRate),
915 .rolloff = static_cast<FrontendIsdbsRolloff>(isdbs.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800916 });
917 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800918 }
919 case TunerFrontendUnionSettings::isdbs3: {
920 auto isdbs3 = settings.get<TunerFrontendUnionSettings::isdbs3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800921 frontendSettings.isdbs3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800922 .frequency = static_cast<uint32_t>(isdbs3.frequency),
923 .streamId = static_cast<uint16_t>(isdbs3.streamId),
924 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs3.streamIdType),
925 .modulation = static_cast<FrontendIsdbs3Modulation>(isdbs3.modulation),
926 .coderate = static_cast<FrontendIsdbs3Coderate>(isdbs3.codeRate),
927 .symbolRate = static_cast<uint32_t>(isdbs3.symbolRate),
928 .rolloff = static_cast<FrontendIsdbs3Rolloff>(isdbs3.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800929 });
930 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800931 }
932 case TunerFrontendUnionSettings::isdbt: {
933 auto isdbt = settings.get<TunerFrontendUnionSettings::isdbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800934 frontendSettings.isdbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800935 .frequency = static_cast<uint32_t>(isdbt.frequency),
936 .modulation = static_cast<FrontendIsdbtModulation>(isdbt.modulation),
937 .bandwidth = static_cast<FrontendIsdbtBandwidth>(isdbt.bandwidth),
938 .mode = static_cast<FrontendIsdbtMode>(isdbt.mode),
939 .coderate = static_cast<FrontendIsdbtCoderate>(isdbt.codeRate),
940 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(isdbt.guardInterval),
941 .serviceAreaId = static_cast<uint32_t>(isdbt.serviceAreaId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800942 });
943 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800944 }
Amy Zhangeb292c12021-01-26 16:28:19 -0800945 default:
946 break;
947 }
Amy Zhangdd3177c2021-02-02 16:32:40 -0800948
Amy Zhangeb292c12021-01-26 16:28:19 -0800949 return frontendSettings;
950}
Amy Zhangdd3177c2021-02-02 16:32:40 -0800951
952FrontendSettingsExt1_1 TunerFrontend::getHidlFrontendSettingsExt(
953 const TunerFrontendSettings& aidlSettings) {
954 FrontendSettingsExt1_1 frontendSettingsExt{
955 .endFrequency = static_cast<uint32_t>(aidlSettings.endFrequency),
956 .inversion = static_cast<FrontendSpectralInversion>(aidlSettings.inversion),
957 };
958
959 auto settings = aidlSettings.settings;
960 switch (settings.getTag()) {
961 case TunerFrontendUnionSettings::analog: {
962 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
963 if (analog.isExtended) {
964 frontendSettingsExt.settingExt.analog({
965 .aftFlag = static_cast<FrontendAnalogAftFlag>(analog.aftFlag),
966 });
967 } else {
968 frontendSettingsExt.settingExt.noinit();
969 }
970 break;
971 }
972 case TunerFrontendUnionSettings::cable: {
973 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
974 if (dvbc.isExtended) {
975 frontendSettingsExt.settingExt.dvbc({
976 .interleaveMode = static_cast<FrontendCableTimeInterleaveMode>(
977 dvbc.interleaveMode),
978 .bandwidth = static_cast<FrontendDvbcBandwidth>(
979 dvbc.bandwidth),
980 });
981 } else {
982 frontendSettingsExt.settingExt.noinit();
983 }
984 break;
985 }
986 case TunerFrontendUnionSettings::dvbs: {
987 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
988 if (dvbs.isExtended) {
989 frontendSettingsExt.settingExt.dvbs({
990 .scanType = static_cast<FrontendDvbsScanType>(dvbs.scanType),
991 .isDiseqcRxMessage = dvbs.isDiseqcRxMessage,
992 });
993 } else {
994 frontendSettingsExt.settingExt.noinit();
995 }
996 break;
997 }
998 case TunerFrontendUnionSettings::dvbt: {
999 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
1000 if (dvbt.isExtended) {
1001 frontendSettingsExt.settingExt.dvbt({
1002 .constellation =
1003 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
1004 dvbt.constellation),
1005 .transmissionMode =
1006 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
1007 dvbt.transmissionMode),
1008 });
1009 } else {
1010 frontendSettingsExt.settingExt.noinit();
1011 }
1012 break;
1013 }
1014 case TunerFrontendUnionSettings::dtmb: {
1015 auto dtmb = settings.get<TunerFrontendUnionSettings::dtmb>();
1016 frontendSettingsExt.settingExt.dtmb({
1017 .frequency = static_cast<uint32_t>(dtmb.frequency),
1018 .transmissionMode = static_cast<FrontendDtmbTransmissionMode>(
1019 dtmb.transmissionMode),
1020 .bandwidth = static_cast<FrontendDtmbBandwidth>(dtmb.bandwidth),
1021 .modulation = static_cast<FrontendDtmbModulation>(dtmb.modulation),
1022 .codeRate = static_cast<FrontendDtmbCodeRate>(dtmb.codeRate),
1023 .guardInterval = static_cast<FrontendDtmbGuardInterval>(dtmb.guardInterval),
1024 .interleaveMode = static_cast<FrontendDtmbTimeInterleaveMode>(dtmb.interleaveMode),
1025 });
1026 break;
1027 }
1028 default:
1029 frontendSettingsExt.settingExt.noinit();
1030 break;
1031 }
1032
1033 return frontendSettingsExt;
1034}
Amy Zhang0f04c452020-10-30 13:36:44 -07001035} // namespace android