blob: 68c35f6e24b3b34effb3c7ffca64e3b2fd415ef3 [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 Zhang5af84142021-02-04 18:36:54 -080020#include "TunerLnb.h"
Amy Zhang0f04c452020-10-30 13:36:44 -070021
Amy Zhang0f04c452020-10-30 13:36:44 -070022using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3PlpSettings;
Amy Zhangd61491e2021-01-12 16:27:29 -080023using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
Amy Zhangb05f06d2021-02-03 16:08:43 -080024using ::aidl::android::media::tv::tuner::TunerFrontendStatusAtsc3PlpInfo;
Amy Zhangdd3177c2021-02-02 16:32:40 -080025using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhang0f04c452020-10-30 13:36:44 -070026using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
27using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
28using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
30using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
31using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
32using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
33using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
34using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
35using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
36using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
38using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
41using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
43using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
44using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
45using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
46using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
47using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
48using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
49using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
50using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
51using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
52using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
53using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
54using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
55using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
56using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
57using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
58using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
59using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
60using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
61using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
62using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
63using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
64using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
65using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
66using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
67using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
68using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
69using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
Amy Zhangb05f06d2021-02-03 16:08:43 -080070using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
Amy Zhang0f04c452020-10-30 13:36:44 -070071using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
72using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
Amy Zhangb05f06d2021-02-03 16:08:43 -080073using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
Amy Zhang0f04c452020-10-30 13:36:44 -070074using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangdd3177c2021-02-02 16:32:40 -080075using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
Amy Zhangb05f06d2021-02-03 16:08:43 -080076using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
Amy Zhangdd3177c2021-02-02 16:32:40 -080077using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
78using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangdd3177c2021-02-02 16:32:40 -080079using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
80using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCodeRate;
81using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
82using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
83using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
84using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
85using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
Amy Zhangb05f06d2021-02-03 16:08:43 -080086using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
87using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
88using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
89using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
90using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
Amy Zhangdd3177c2021-02-02 16:32:40 -080091using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhangb05f06d2021-02-03 16:08:43 -080092using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
Amy Zhang0f04c452020-10-30 13:36:44 -070093
94namespace android {
95
Amy Zhanga046eee2021-01-12 14:44:58 -080096TunerFrontend::TunerFrontend(sp<IFrontend> frontend, int id) {
97 mFrontend = frontend;
98 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
Amy Zhangd61491e2021-01-12 16:27:29 -080099 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -0700100}
101
Amy Zhanga046eee2021-01-12 14:44:58 -0800102TunerFrontend::~TunerFrontend() {
103 mFrontend = NULL;
Amy Zhangeb292c12021-01-26 16:28:19 -0800104 mFrontend_1_1 = NULL;
Amy Zhanga046eee2021-01-12 14:44:58 -0800105 mId = -1;
106}
Amy Zhang0f04c452020-10-30 13:36:44 -0700107
108Status TunerFrontend::setCallback(
Amy Zhanga046eee2021-01-12 14:44:58 -0800109 const shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700110 if (mFrontend == NULL) {
111 ALOGE("IFrontend is not initialized");
112 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
113 }
114
115 if (tunerFrontendCallback == NULL) {
116 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
117 }
118
119 sp<IFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
120 Result status = mFrontend->setCallback(frontendCallback);
121 if (status == Result::SUCCESS) {
122 return Status::ok();
123 }
124
125 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
126}
127
Amy Zhangeb292c12021-01-26 16:28:19 -0800128Status TunerFrontend::tune(const TunerFrontendSettings& settings) {
129 if (mFrontend == NULL) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800130 ALOGE("IFrontend is not initialized");
Amy Zhangeb292c12021-01-26 16:28:19 -0800131 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
132 }
133
Amy Zhangdd3177c2021-02-02 16:32:40 -0800134 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800135 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800136 if (settings.isExtended) {
137 if (mFrontend_1_1 == NULL) {
138 ALOGE("IFrontend_1_1 is not initialized");
139 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
140 }
141 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
142 status = mFrontend_1_1->tune_1_1(frontendSettings, frontendSettingsExt);
143 } else {
144 status = mFrontend->tune(frontendSettings);
145 }
146
Amy Zhangeb292c12021-01-26 16:28:19 -0800147 if (status == Result::SUCCESS) {
148 return Status::ok();
149 }
150
151 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700152}
153
154Status TunerFrontend::stopTune() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800155 if (mFrontend == NULL) {
156 ALOGD("IFrontend is not initialized");
157 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
158 }
159
160 Result status = mFrontend->stopTune();
161 if (status == Result::SUCCESS) {
162 return Status::ok();
163 }
164
165 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700166}
167
168Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
169 if (mFrontend == NULL) {
170 ALOGD("IFrontend is not initialized");
171 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
172 }
173
Amy Zhangdd3177c2021-02-02 16:32:40 -0800174 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800175 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800176 if (settings.isExtended) {
177 if (mFrontend_1_1 == NULL) {
178 ALOGE("IFrontend_1_1 is not initialized");
179 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
180 }
181 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
182 status = mFrontend_1_1->scan_1_1(frontendSettings,
183 static_cast<FrontendScanType>(frontendScanType), frontendSettingsExt);
184 } else {
185 status = mFrontend->scan(
186 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
187 }
188
Amy Zhang0f04c452020-10-30 13:36:44 -0700189 if (status == Result::SUCCESS) {
190 return Status::ok();
191 }
192
193 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
194}
195
196Status TunerFrontend::stopScan() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800197 if (mFrontend == NULL) {
198 ALOGD("IFrontend is not initialized");
199 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
200 }
201
202 Result status = mFrontend->stopScan();
203 if (status == Result::SUCCESS) {
204 return Status::ok();
205 }
206
207 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700208}
209
Amy Zhang5af84142021-02-04 18:36:54 -0800210Status TunerFrontend::setLnb(const shared_ptr<ITunerLnb>& lnb) {
211 if (mFrontend == NULL) {
212 ALOGD("IFrontend is not initialized");
213 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
214 }
215
216 Result status = mFrontend->setLnb(static_cast<TunerLnb*>(lnb.get())->getId());
217 if (status == Result::SUCCESS) {
218 return Status::ok();
219 }
220
221 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700222}
223
Amy Zhang5af84142021-02-04 18:36:54 -0800224Status TunerFrontend::setLna(bool bEnable) {
225 if (mFrontend == NULL) {
226 ALOGD("IFrontend is not initialized");
227 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
228 }
229
230 Result status = mFrontend->setLna(bEnable);
231 if (status == Result::SUCCESS) {
232 return Status::ok();
233 }
234
235 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
236}
237
238Status TunerFrontend::linkCiCamToFrontend(int ciCamId, int32_t* _aidl_return) {
239 if (mFrontend_1_1 == NULL) {
240 ALOGD("IFrontend_1_1 is not initialized");
241 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
242 }
243
244 int ltsId;
245 Result status;
246 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
247 [&](Result r, uint32_t id) {
248 status = r;
249 ltsId = id;
250 });
251
252 if (status == Result::SUCCESS) {
253 *_aidl_return = ltsId;
254 return Status::ok();
255 }
256
257 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
258}
259
260Status TunerFrontend::unlinkCiCamToFrontend(int ciCamId) {
261 if (mFrontend_1_1 == NULL) {
262 ALOGD("IFrontend_1_1 is not initialized");
263 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
264 }
265
266 Result status = mFrontend_1_1->unlinkCiCam(ciCamId);
267 if (status == Result::SUCCESS) {
268 return Status::ok();
269 }
270
271 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700272}
273
274Status TunerFrontend::close() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800275 if (mFrontend == NULL) {
276 ALOGD("IFrontend is not initialized");
277 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
278 }
279
280 Result status = mFrontend->close();
281 if (status == Result::SUCCESS) {
282 return Status::ok();
283 }
284
285 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700286}
287
Amy Zhangb05f06d2021-02-03 16:08:43 -0800288Status TunerFrontend::getStatus(const vector<int32_t>& statusTypes,
289 vector<TunerFrontendStatus>* _aidl_return) {
290 if (mFrontend == NULL) {
291 ALOGD("IFrontend is not initialized");
292 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
293 }
294
295 Result res;
296 vector<FrontendStatus> status;
297 vector<FrontendStatusType> types;
298 for (auto s : statusTypes) {
299 types.push_back(static_cast<FrontendStatusType>(s));
300 }
301
302 mFrontend->getStatus(types, [&](Result r, const hidl_vec<FrontendStatus>& s) {
303 res = r;
304 status = s;
305 });
306 if (res != Result::SUCCESS) {
307 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
308 }
309
310 getAidlFrontendStatus(status, *_aidl_return);
311 return Status::ok();
312}
313
314Status TunerFrontend::getStatusExtended_1_1(const vector<int32_t>& statusTypes,
315 vector<TunerFrontendStatus>* _aidl_return) {
316 if (mFrontend_1_1 == NULL) {
317 ALOGD("IFrontend_1_1 is not initialized");
318 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
319 }
320
321 Result res;
322 vector<FrontendStatusExt1_1> status;
323 vector<FrontendStatusTypeExt1_1> types;
324 for (auto s : statusTypes) {
325 types.push_back(static_cast<FrontendStatusTypeExt1_1>(s));
326 }
327
328 mFrontend_1_1->getStatusExt1_1(types, [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
329 res = r;
330 status = s;
331 });
332 if (res != Result::SUCCESS) {
333 return Status::fromServiceSpecificError(static_cast<int32_t>(res));
334 }
335
336 getAidlFrontendStatusExt(status, *_aidl_return);
Amy Zhang0f04c452020-10-30 13:36:44 -0700337 return Status::ok();
338}
339
Amy Zhangd61491e2021-01-12 16:27:29 -0800340Status TunerFrontend::getFrontendId(int* _aidl_return) {
341 *_aidl_return = mId;
342 return Status::ok();
343}
Amy Zhanga046eee2021-01-12 14:44:58 -0800344
Amy Zhang0f04c452020-10-30 13:36:44 -0700345/////////////// FrontendCallback ///////////////////////
346
347Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
348 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
349 mTunerFrontendCallback->onEvent((int)frontendEventType);
350 return Void();
351}
352
353Return<void> TunerFrontend::FrontendCallback::onScanMessage(
354 FrontendScanMessageType type, const FrontendScanMessage& message) {
355 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800356 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700357 switch(type) {
358 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800359 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700360 break;
361 }
362 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800363 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700364 break;
365 }
366 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800367 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700368 break;
369 }
370 case FrontendScanMessageType::FREQUENCY: {
371 auto f = message.frequencies();
Amy Zhanga046eee2021-01-12 14:44:58 -0800372 vector<int> frequencies(begin(f), end(f));
Amy Zhangd61491e2021-01-12 16:27:29 -0800373 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700374 break;
375 }
376 case FrontendScanMessageType::SYMBOL_RATE: {
377 auto s = message.symbolRates();
Amy Zhanga046eee2021-01-12 14:44:58 -0800378 vector<int> symbolRates(begin(s), end(s));
Amy Zhangd61491e2021-01-12 16:27:29 -0800379 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700380 break;
381 }
382 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800383 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700384 break;
385 }
386 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800387 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700388 break;
389 }
390 case FrontendScanMessageType::PLP_IDS: {
391 auto p = message.plpIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800392 vector<uint8_t> plpIds(begin(p), end(p));
Amy Zhangd61491e2021-01-12 16:27:29 -0800393 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700394 break;
395 }
396 case FrontendScanMessageType::GROUP_IDS: {
397 auto g = message.groupIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800398 vector<uint8_t> groupIds(begin(g), end(g));
Amy Zhangd61491e2021-01-12 16:27:29 -0800399 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700400 break;
401 }
402 case FrontendScanMessageType::INPUT_STREAM_IDS: {
403 auto i = message.inputStreamIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800404 vector<char16_t> streamIds(begin(i), end(i));
Amy Zhangd61491e2021-01-12 16:27:29 -0800405 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700406 break;
407 }
408 case FrontendScanMessageType::STANDARD: {
409 FrontendScanMessage::Standard std = message.std();
410 int standard;
411 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
412 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700413 } else if (std.getDiscriminator() ==
414 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
415 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700416 } else if (std.getDiscriminator() ==
417 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
418 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700419 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800420 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700421 break;
422 }
423 case FrontendScanMessageType::ATSC3_PLP_INFO: {
Amy Zhanga046eee2021-01-12 14:44:58 -0800424 vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
425 vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700426 for (int i = 0; i < plpInfos.size(); i++) {
427 auto info = plpInfos[i];
Amy Zhangb05f06d2021-02-03 16:08:43 -0800428 int8_t plpId = (int8_t) info.plpId;
Amy Zhang0f04c452020-10-30 13:36:44 -0700429 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800430 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700431 .plpId = plpId,
432 .llsFlag = lls,
433 };
434 tunerPlpInfos.push_back(plpInfo);
435 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800436 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700437 break;
438 }
439 default:
440 break;
441 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800442 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
443 return Void();
444}
445
446Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
447 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
448 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
449 TunerFrontendScanMessage scanMessage;
450 switch(type) {
451 case FrontendScanMessageTypeExt1_1::MODULATION: {
452 FrontendModulation m = message.modulation();
453 int modulation;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800454 switch (m.getDiscriminator()) {
455 case FrontendModulation::hidl_discriminator::dvbc:
456 modulation = (int) m.dvbc();
457 break;
458 case FrontendModulation::hidl_discriminator::dvbt:
459 modulation = (int) m.dvbt();
460 break;
461 case FrontendModulation::hidl_discriminator::dvbs:
462 modulation = (int) m.dvbs();
463 break;
464 case FrontendModulation::hidl_discriminator::isdbs:
465 modulation = (int) m.isdbs();
466 break;
467 case FrontendModulation::hidl_discriminator::isdbs3:
468 modulation = (int) m.isdbs3();
469 break;
470 case FrontendModulation::hidl_discriminator::isdbt:
471 modulation = (int) m.isdbt();
472 break;
473 case FrontendModulation::hidl_discriminator::atsc:
474 modulation = (int) m.atsc();
475 break;
476 case FrontendModulation::hidl_discriminator::atsc3:
477 modulation = (int) m.atsc3();
478 break;
479 case FrontendModulation::hidl_discriminator::dtmb:
480 modulation = (int) m.dtmb();
481 break;
Amy Zhangd61491e2021-01-12 16:27:29 -0800482 }
483 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
484 break;
485 }
486 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
487 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
488 break;
489 }
490 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
491 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
492 break;
493 }
494 default:
495 break;
496 }
497 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700498 return Void();
499}
500
Amy Zhanga046eee2021-01-12 14:44:58 -0800501/////////////// TunerFrontend Helper Methods ///////////////////////
Amy Zhang0f04c452020-10-30 13:36:44 -0700502
Amy Zhangb05f06d2021-02-03 16:08:43 -0800503void TunerFrontend::getAidlFrontendStatus(
504 vector<FrontendStatus>& hidlStatus, vector<TunerFrontendStatus>& aidlStatus) {
505 for (FrontendStatus s : hidlStatus) {
506 TunerFrontendStatus status;
507 switch (s.getDiscriminator()) {
508 case FrontendStatus::hidl_discriminator::isDemodLocked: {
509 status.set<TunerFrontendStatus::isDemodLocked>(s.isDemodLocked());
510 aidlStatus.push_back(status);
511 break;
512 }
513 case FrontendStatus::hidl_discriminator::snr: {
514 status.set<TunerFrontendStatus::snr>((int)s.snr());
515 aidlStatus.push_back(status);
516 break;
517 }
518 case FrontendStatus::hidl_discriminator::ber: {
519 status.set<TunerFrontendStatus::ber>((int)s.ber());
520 aidlStatus.push_back(status);
521 break;
522 }
523 case FrontendStatus::hidl_discriminator::per: {
524 status.set<TunerFrontendStatus::per>((int)s.per());
525 aidlStatus.push_back(status);
526 break;
527 }
528 case FrontendStatus::hidl_discriminator::preBer: {
529 status.set<TunerFrontendStatus::preBer>((int)s.preBer());
530 aidlStatus.push_back(status);
531 break;
532 }
533 case FrontendStatus::hidl_discriminator::signalQuality: {
534 status.set<TunerFrontendStatus::signalQuality>((int)s.signalQuality());
535 aidlStatus.push_back(status);
536 break;
537 }
538 case FrontendStatus::hidl_discriminator::signalStrength: {
539 status.set<TunerFrontendStatus::signalStrength>((int)s.signalStrength());
540 aidlStatus.push_back(status);
541 break;
542 }
543 case FrontendStatus::hidl_discriminator::symbolRate: {
544 status.set<TunerFrontendStatus::symbolRate>((int)s.symbolRate());
545 aidlStatus.push_back(status);
546 break;
547 }
548 case FrontendStatus::hidl_discriminator::innerFec: {
549 status.set<TunerFrontendStatus::innerFec>((long)s.innerFec());
550 aidlStatus.push_back(status);
551 break;
552 }
553 case FrontendStatus::hidl_discriminator::modulation: {
554 switch (s.modulation().getDiscriminator()) {
555 case FrontendModulationStatus::hidl_discriminator::dvbc:
556 status.set<TunerFrontendStatus::modulation>((int)s.modulation().dvbc());
557 aidlStatus.push_back(status);
558 break;
559 case FrontendModulationStatus::hidl_discriminator::dvbs:
560 status.set<TunerFrontendStatus::modulation>((int)s.modulation().dvbs());
561 aidlStatus.push_back(status);
562 break;
563 case FrontendModulationStatus::hidl_discriminator::isdbs:
564 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbs());
565 aidlStatus.push_back(status);
566 break;
567 case FrontendModulationStatus::hidl_discriminator::isdbs3:
568 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbs3());
569 aidlStatus.push_back(status);
570 break;
571 case FrontendModulationStatus::hidl_discriminator::isdbt:
572 status.set<TunerFrontendStatus::modulation>((int)s.modulation().isdbt());
573 aidlStatus.push_back(status);
574 break;
575 }
576 break;
577 }
578 case FrontendStatus::hidl_discriminator::inversion: {
579 status.set<TunerFrontendStatus::inversion>((int)s.inversion());
580 aidlStatus.push_back(status);
581 break;
582 }
583 case FrontendStatus::hidl_discriminator::lnbVoltage: {
584 status.set<TunerFrontendStatus::lnbVoltage>((int)s.lnbVoltage());
585 aidlStatus.push_back(status);
586 break;
587 }
588 case FrontendStatus::hidl_discriminator::plpId: {
589 status.set<TunerFrontendStatus::plpId>((int8_t)s.plpId());
590 aidlStatus.push_back(status);
591 break;
592 }
593 case FrontendStatus::hidl_discriminator::isEWBS: {
594 status.set<TunerFrontendStatus::isEWBS>(s.isEWBS());
595 aidlStatus.push_back(status);
596 break;
597 }
598 case FrontendStatus::hidl_discriminator::agc: {
599 status.set<TunerFrontendStatus::agc>((int8_t)s.agc());
600 aidlStatus.push_back(status);
601 break;
602 }
603 case FrontendStatus::hidl_discriminator::isLnaOn: {
604 status.set<TunerFrontendStatus::isLnaOn>(s.isLnaOn());
605 aidlStatus.push_back(status);
606 break;
607 }
608 case FrontendStatus::hidl_discriminator::isLayerError: {
609 vector<bool> e(s.isLayerError().begin(), s.isLayerError().end());
610 status.set<TunerFrontendStatus::isLayerError>(e);
611 aidlStatus.push_back(status);
612 break;
613 }
614 case FrontendStatus::hidl_discriminator::mer: {
615 status.set<TunerFrontendStatus::mer>((int)s.mer());
616 aidlStatus.push_back(status);
617 break;
618 }
619 case FrontendStatus::hidl_discriminator::freqOffset: {
620 status.set<TunerFrontendStatus::freqOffset>((int)s.freqOffset());
621 aidlStatus.push_back(status);
622 break;
623 }
624 case FrontendStatus::hidl_discriminator::hierarchy: {
625 status.set<TunerFrontendStatus::hierarchy>((int)s.hierarchy());
626 aidlStatus.push_back(status);
627 break;
628 }
629 case FrontendStatus::hidl_discriminator::isRfLocked: {
630 status.set<TunerFrontendStatus::isRfLocked>(s.isRfLocked());
631 aidlStatus.push_back(status);
632 break;
633 }
634 case FrontendStatus::hidl_discriminator::plpInfo: {
635 vector<TunerFrontendStatusAtsc3PlpInfo> info;
636 for (auto i : s.plpInfo()) {
637 info.push_back({
638 .plpId = (int8_t)i.plpId,
639 .isLocked = i.isLocked,
640 .uec = (int)i.uec,
641 });
642 }
643 status.set<TunerFrontendStatus::plpInfo>(info);
644 aidlStatus.push_back(status);
645 break;
646 }
647 }
648 }
649}
650
651void TunerFrontend::getAidlFrontendStatusExt(
652 vector<FrontendStatusExt1_1>& hidlStatus, vector<TunerFrontendStatus>& aidlStatus) {
653 for (FrontendStatusExt1_1 s : hidlStatus) {
654 TunerFrontendStatus status;
655 switch (s.getDiscriminator()) {
656 case FrontendStatusExt1_1::hidl_discriminator::modulations: {
657 vector<int> aidlMod;
658 for (auto m : s.modulations()) {
659 switch (m.getDiscriminator()) {
660 case FrontendModulation::hidl_discriminator::dvbc:
661 aidlMod.push_back((int)m.dvbc());
662 break;
663 case FrontendModulation::hidl_discriminator::dvbs:
664 aidlMod.push_back((int)m.dvbs());
665 break;
666 case FrontendModulation::hidl_discriminator::dvbt:
667 aidlMod.push_back((int)m.dvbt());
668 break;
669 case FrontendModulation::hidl_discriminator::isdbs:
670 aidlMod.push_back((int)m.isdbs());
671 break;
672 case FrontendModulation::hidl_discriminator::isdbs3:
673 aidlMod.push_back((int)m.isdbs3());
674 break;
675 case FrontendModulation::hidl_discriminator::isdbt:
676 aidlMod.push_back((int)m.isdbt());
677 break;
678 case FrontendModulation::hidl_discriminator::atsc:
679 aidlMod.push_back((int)m.atsc());
680 break;
681 case FrontendModulation::hidl_discriminator::atsc3:
682 aidlMod.push_back((int)m.atsc3());
683 break;
684 case FrontendModulation::hidl_discriminator::dtmb:
685 aidlMod.push_back((int)m.dtmb());
686 break;
687 }
688 }
689 status.set<TunerFrontendStatus::modulations>(aidlMod);
690 aidlStatus.push_back(status);
691 break;
692 }
693 case FrontendStatusExt1_1::hidl_discriminator::bers: {
694 vector<int> b(s.bers().begin(), s.bers().end());
695 status.set<TunerFrontendStatus::bers>(b);
696 aidlStatus.push_back(status);
697 break;
698 }
699 case FrontendStatusExt1_1::hidl_discriminator::codeRates: {
700 vector<int64_t> codeRates;
701 for (auto c : s.codeRates()) {
702 codeRates.push_back((long)c);
703 }
704 status.set<TunerFrontendStatus::codeRates>(codeRates);
705 aidlStatus.push_back(status);
706 break;
707 }
708 case FrontendStatusExt1_1::hidl_discriminator::bandwidth: {
709 switch (s.bandwidth().getDiscriminator()) {
710 case FrontendBandwidth::hidl_discriminator::atsc3:
711 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().atsc3());
712 break;
713 case FrontendBandwidth::hidl_discriminator::dvbc:
714 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dvbc());
715 break;
716 case FrontendBandwidth::hidl_discriminator::dvbt:
717 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dvbt());
718 break;
719 case FrontendBandwidth::hidl_discriminator::isdbt:
720 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().isdbt());
721 break;
722 case FrontendBandwidth::hidl_discriminator::dtmb:
723 status.set<TunerFrontendStatus::bandwidth>((int)s.bandwidth().dtmb());
724 break;
725 }
726 aidlStatus.push_back(status);
727 break;
728 }
729 case FrontendStatusExt1_1::hidl_discriminator::interval: {
730 switch (s.interval().getDiscriminator()) {
731 case FrontendGuardInterval::hidl_discriminator::dvbt:
732 status.set<TunerFrontendStatus::interval>((int)s.interval().dvbt());
733 break;
734 case FrontendGuardInterval::hidl_discriminator::isdbt:
735 status.set<TunerFrontendStatus::interval>((int)s.interval().isdbt());
736 break;
737 case FrontendGuardInterval::hidl_discriminator::dtmb:
738 status.set<TunerFrontendStatus::interval>((int)s.interval().dtmb());
739 break;
740 }
741 aidlStatus.push_back(status);
742 break;
743 }
744 case FrontendStatusExt1_1::hidl_discriminator::transmissionMode: {
745 switch (s.transmissionMode().getDiscriminator()) {
746 case FrontendTransmissionMode::hidl_discriminator::dvbt:
747 status.set<TunerFrontendStatus::transmissionMode>(
748 (int)s.transmissionMode().dvbt());
749 break;
750 case FrontendTransmissionMode::hidl_discriminator::isdbt:
751 status.set<TunerFrontendStatus::transmissionMode>(
752 (int)s.transmissionMode().isdbt());
753 break;
754 case FrontendTransmissionMode::hidl_discriminator::dtmb:
755 status.set<TunerFrontendStatus::transmissionMode>(
756 (int)s.transmissionMode().dtmb());
757 break;
758 }
759 aidlStatus.push_back(status);
760 break;
761 }
762 case FrontendStatusExt1_1::hidl_discriminator::uec: {
763 status.set<TunerFrontendStatus::uec>((int)s.uec());
764 aidlStatus.push_back(status);
765 break;
766 }
767 case FrontendStatusExt1_1::hidl_discriminator::systemId: {
768 status.set<TunerFrontendStatus::systemId>((char16_t)s.systemId());
769 aidlStatus.push_back(status);
770 break;
771 }
772 case FrontendStatusExt1_1::hidl_discriminator::interleaving: {
773 vector<int> aidlInter;
774 for (auto i : s.interleaving()) {
775 switch (i.getDiscriminator()) {
776 case FrontendInterleaveMode::hidl_discriminator::atsc3:
777 aidlInter.push_back((int)i.atsc3());
778 break;
779 case FrontendInterleaveMode::hidl_discriminator::dvbc:
780 aidlInter.push_back((int)i.dvbc());
781 break;
782 case FrontendInterleaveMode::hidl_discriminator::dtmb:
783 aidlInter.push_back((int)i.dtmb());
784 break;
785 }
786 }
787 status.set<TunerFrontendStatus::interleaving>(aidlInter);
788 aidlStatus.push_back(status);
789 break;
790 }
791 case FrontendStatusExt1_1::hidl_discriminator::isdbtSegment: {
792 auto seg = s.isdbtSegment();
793 vector<uint8_t> i(seg.begin(), seg.end());
794 status.set<TunerFrontendStatus::isdbtSegment>(i);
795 aidlStatus.push_back(status);
796 break;
797 }
798 case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: {
799 vector<int> ts(s.tsDataRate().begin(), s.tsDataRate().end());
800 status.set<TunerFrontendStatus::tsDataRate>(ts);
801 aidlStatus.push_back(status);
802 break;
803 }
804 case FrontendStatusExt1_1::hidl_discriminator::rollOff: {
805 switch (s.rollOff().getDiscriminator()) {
806 case FrontendRollOff::hidl_discriminator::dvbs:
Amy Zhangb1baabb2021-02-08 19:54:28 -0800807 status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().dvbs());
Amy Zhangb05f06d2021-02-03 16:08:43 -0800808 break;
809 case FrontendRollOff::hidl_discriminator::isdbs:
Amy Zhangb1baabb2021-02-08 19:54:28 -0800810 status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs());
Amy Zhangb05f06d2021-02-03 16:08:43 -0800811 break;
812 case FrontendRollOff::hidl_discriminator::isdbs3:
Amy Zhangb1baabb2021-02-08 19:54:28 -0800813 status.set<TunerFrontendStatus::rollOff>((int)s.rollOff().isdbs3());
Amy Zhangb05f06d2021-02-03 16:08:43 -0800814 break;
815 }
816 aidlStatus.push_back(status);
817 break;
818 }
819 case FrontendStatusExt1_1::hidl_discriminator::isMiso: {
820 status.set<TunerFrontendStatus::isMiso>(s.isMiso());
821 aidlStatus.push_back(status);
822 break;
823 }
824 case FrontendStatusExt1_1::hidl_discriminator::isLinear: {
825 status.set<TunerFrontendStatus::isLinear>(s.isLinear());
826 aidlStatus.push_back(status);
827 break;
828 }
829 case FrontendStatusExt1_1::hidl_discriminator::isShortFrames: {
830 status.set<TunerFrontendStatus::isShortFrames>(s.isShortFrames());
831 aidlStatus.push_back(status);
832 break;
833 }
834 }
835 }
836}
837
Amy Zhang0f04c452020-10-30 13:36:44 -0700838hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
839 const TunerFrontendAtsc3Settings& settings) {
840 int len = settings.plpSettings.size();
841 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
842 // parse PLP settings
843 for (int i = 0; i < len; i++) {
844 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
845 FrontendAtsc3Modulation modulation =
846 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
847 FrontendAtsc3TimeInterleaveMode interleaveMode =
848 static_cast<FrontendAtsc3TimeInterleaveMode>(
849 settings.plpSettings[i].interleaveMode);
850 FrontendAtsc3CodeRate codeRate =
851 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
852 FrontendAtsc3Fec fec =
853 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
854 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
855 .plpId = plpId,
856 .modulation = modulation,
857 .interleaveMode = interleaveMode,
858 .codeRate = codeRate,
859 .fec = fec,
860 };
861 plps[i] = frontendAtsc3PlpSettings;
862 }
863 return plps;
864}
865
866FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
867 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
868 bool isLinear = codeRate.isLinear;
869 bool isShortFrames = codeRate.isShortFrames;
870 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
871 FrontendDvbsCodeRate coderate {
872 .fec = innerFec,
873 .isLinear = isLinear,
874 .isShortFrames = isShortFrames,
875 .bitsPer1000Symbol = bitsPer1000Symbol,
876 };
877 return coderate;
878}
Amy Zhangeb292c12021-01-26 16:28:19 -0800879
Amy Zhangdd3177c2021-02-02 16:32:40 -0800880FrontendSettings TunerFrontend::getHidlFrontendSettings(const TunerFrontendSettings& aidlSettings) {
881 auto settings = aidlSettings.settings;
Amy Zhangeb292c12021-01-26 16:28:19 -0800882 FrontendSettings frontendSettings;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800883
Amy Zhangeb292c12021-01-26 16:28:19 -0800884 switch (settings.getTag()) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800885 case TunerFrontendUnionSettings::analog: {
886 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800887 frontendSettings.analog({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800888 .frequency = static_cast<uint32_t>(analog.frequency),
889 .type = static_cast<FrontendAnalogType>(analog.signalType),
890 .sifStandard = static_cast<FrontendAnalogSifStandard>(analog.sifStandard),
Amy Zhangeb292c12021-01-26 16:28:19 -0800891 });
892 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800893 }
894 case TunerFrontendUnionSettings::atsc: {
895 auto atsc = settings.get<TunerFrontendUnionSettings::atsc>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800896 frontendSettings.atsc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800897 .frequency = static_cast<uint32_t>(atsc.frequency),
898 .modulation = static_cast<FrontendAtscModulation>(atsc.modulation),
Amy Zhangeb292c12021-01-26 16:28:19 -0800899 });
900 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800901 }
902 case TunerFrontendUnionSettings::atsc3: {
903 auto atsc3 = settings.get<TunerFrontendUnionSettings::atsc3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800904 frontendSettings.atsc3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800905 .frequency = static_cast<uint32_t>(atsc3.frequency),
906 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(atsc3.bandwidth),
Amy Zhangeb292c12021-01-26 16:28:19 -0800907 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800908 atsc3.demodOutputFormat),
909 .plpSettings = getAtsc3PlpSettings(atsc3),
Amy Zhangeb292c12021-01-26 16:28:19 -0800910 });
911 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800912 }
913 case TunerFrontendUnionSettings::cable: {
914 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800915 frontendSettings.dvbc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800916 .frequency = static_cast<uint32_t>(dvbc.frequency),
917 .modulation = static_cast<FrontendDvbcModulation>(dvbc.modulation),
918 .fec = static_cast<FrontendInnerFec>(dvbc.innerFec),
919 .symbolRate = static_cast<uint32_t>(dvbc.symbolRate),
920 .outerFec = static_cast<FrontendDvbcOuterFec>(dvbc.outerFec),
921 .annex = static_cast<FrontendDvbcAnnex>(dvbc.annex),
Amy Zhangeb292c12021-01-26 16:28:19 -0800922 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800923 dvbc.spectralInversion),
Amy Zhangeb292c12021-01-26 16:28:19 -0800924 });
925 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800926 }
927 case TunerFrontendUnionSettings::dvbs: {
928 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800929 frontendSettings.dvbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800930 .frequency = static_cast<uint32_t>(dvbs.frequency),
931 .modulation = static_cast<FrontendDvbsModulation>(dvbs.modulation),
932 .coderate = getDvbsCodeRate(dvbs.codeRate),
933 .symbolRate = static_cast<uint32_t>(dvbs.symbolRate),
934 .rolloff = static_cast<FrontendDvbsRolloff>(dvbs.rolloff),
935 .pilot = static_cast<FrontendDvbsPilot>(dvbs.pilot),
936 .inputStreamId = static_cast<uint32_t>(dvbs.inputStreamId),
937 .standard = static_cast<FrontendDvbsStandard>(dvbs.standard),
938 .vcmMode = static_cast<FrontendDvbsVcmMode>(dvbs.vcm),
Amy Zhangeb292c12021-01-26 16:28:19 -0800939 });
940 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800941 }
942 case TunerFrontendUnionSettings::dvbt: {
943 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800944 frontendSettings.dvbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800945 .frequency = static_cast<uint32_t>(dvbt.frequency),
Amy Zhangeb292c12021-01-26 16:28:19 -0800946 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800947 dvbt.transmissionMode),
948 .bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt.bandwidth),
949 .constellation = static_cast<FrontendDvbtConstellation>(dvbt.constellation),
950 .hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt.hierarchy),
951 .hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.hpCodeRate),
952 .lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.lpCodeRate),
953 .guardInterval = static_cast<FrontendDvbtGuardInterval>(dvbt.guardInterval),
954 .isHighPriority = dvbt.isHighPriority,
955 .standard = static_cast<FrontendDvbtStandard>(dvbt.standard),
956 .isMiso = dvbt.isMiso,
957 .plpMode = static_cast<FrontendDvbtPlpMode>(dvbt.plpMode),
958 .plpId = static_cast<uint8_t>(dvbt.plpId),
959 .plpGroupId = static_cast<uint8_t>(dvbt.plpGroupId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800960 });
961 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800962 }
963 case TunerFrontendUnionSettings::isdbs: {
964 auto isdbs = settings.get<TunerFrontendUnionSettings::isdbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800965 frontendSettings.isdbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800966 .frequency = static_cast<uint32_t>(isdbs.frequency),
967 .streamId = static_cast<uint16_t>(isdbs.streamId),
968 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs.streamIdType),
969 .modulation = static_cast<FrontendIsdbsModulation>(isdbs.modulation),
970 .coderate = static_cast<FrontendIsdbsCoderate>(isdbs.codeRate),
971 .symbolRate = static_cast<uint32_t>(isdbs.symbolRate),
972 .rolloff = static_cast<FrontendIsdbsRolloff>(isdbs.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800973 });
974 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800975 }
976 case TunerFrontendUnionSettings::isdbs3: {
977 auto isdbs3 = settings.get<TunerFrontendUnionSettings::isdbs3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800978 frontendSettings.isdbs3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800979 .frequency = static_cast<uint32_t>(isdbs3.frequency),
980 .streamId = static_cast<uint16_t>(isdbs3.streamId),
981 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs3.streamIdType),
982 .modulation = static_cast<FrontendIsdbs3Modulation>(isdbs3.modulation),
983 .coderate = static_cast<FrontendIsdbs3Coderate>(isdbs3.codeRate),
984 .symbolRate = static_cast<uint32_t>(isdbs3.symbolRate),
985 .rolloff = static_cast<FrontendIsdbs3Rolloff>(isdbs3.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800986 });
987 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800988 }
989 case TunerFrontendUnionSettings::isdbt: {
990 auto isdbt = settings.get<TunerFrontendUnionSettings::isdbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800991 frontendSettings.isdbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800992 .frequency = static_cast<uint32_t>(isdbt.frequency),
993 .modulation = static_cast<FrontendIsdbtModulation>(isdbt.modulation),
994 .bandwidth = static_cast<FrontendIsdbtBandwidth>(isdbt.bandwidth),
995 .mode = static_cast<FrontendIsdbtMode>(isdbt.mode),
996 .coderate = static_cast<FrontendIsdbtCoderate>(isdbt.codeRate),
997 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(isdbt.guardInterval),
998 .serviceAreaId = static_cast<uint32_t>(isdbt.serviceAreaId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800999 });
1000 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -08001001 }
Amy Zhangeb292c12021-01-26 16:28:19 -08001002 default:
1003 break;
1004 }
Amy Zhangdd3177c2021-02-02 16:32:40 -08001005
Amy Zhangeb292c12021-01-26 16:28:19 -08001006 return frontendSettings;
1007}
Amy Zhangdd3177c2021-02-02 16:32:40 -08001008
1009FrontendSettingsExt1_1 TunerFrontend::getHidlFrontendSettingsExt(
1010 const TunerFrontendSettings& aidlSettings) {
1011 FrontendSettingsExt1_1 frontendSettingsExt{
1012 .endFrequency = static_cast<uint32_t>(aidlSettings.endFrequency),
1013 .inversion = static_cast<FrontendSpectralInversion>(aidlSettings.inversion),
1014 };
1015
1016 auto settings = aidlSettings.settings;
1017 switch (settings.getTag()) {
1018 case TunerFrontendUnionSettings::analog: {
1019 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
1020 if (analog.isExtended) {
1021 frontendSettingsExt.settingExt.analog({
1022 .aftFlag = static_cast<FrontendAnalogAftFlag>(analog.aftFlag),
1023 });
1024 } else {
1025 frontendSettingsExt.settingExt.noinit();
1026 }
1027 break;
1028 }
1029 case TunerFrontendUnionSettings::cable: {
1030 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
1031 if (dvbc.isExtended) {
1032 frontendSettingsExt.settingExt.dvbc({
1033 .interleaveMode = static_cast<FrontendCableTimeInterleaveMode>(
1034 dvbc.interleaveMode),
1035 .bandwidth = static_cast<FrontendDvbcBandwidth>(
1036 dvbc.bandwidth),
1037 });
1038 } else {
1039 frontendSettingsExt.settingExt.noinit();
1040 }
1041 break;
1042 }
1043 case TunerFrontendUnionSettings::dvbs: {
1044 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
1045 if (dvbs.isExtended) {
1046 frontendSettingsExt.settingExt.dvbs({
1047 .scanType = static_cast<FrontendDvbsScanType>(dvbs.scanType),
1048 .isDiseqcRxMessage = dvbs.isDiseqcRxMessage,
1049 });
1050 } else {
1051 frontendSettingsExt.settingExt.noinit();
1052 }
1053 break;
1054 }
1055 case TunerFrontendUnionSettings::dvbt: {
1056 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
1057 if (dvbt.isExtended) {
1058 frontendSettingsExt.settingExt.dvbt({
1059 .constellation =
1060 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
1061 dvbt.constellation),
1062 .transmissionMode =
1063 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
1064 dvbt.transmissionMode),
1065 });
1066 } else {
1067 frontendSettingsExt.settingExt.noinit();
1068 }
1069 break;
1070 }
1071 case TunerFrontendUnionSettings::dtmb: {
1072 auto dtmb = settings.get<TunerFrontendUnionSettings::dtmb>();
1073 frontendSettingsExt.settingExt.dtmb({
1074 .frequency = static_cast<uint32_t>(dtmb.frequency),
1075 .transmissionMode = static_cast<FrontendDtmbTransmissionMode>(
1076 dtmb.transmissionMode),
1077 .bandwidth = static_cast<FrontendDtmbBandwidth>(dtmb.bandwidth),
1078 .modulation = static_cast<FrontendDtmbModulation>(dtmb.modulation),
1079 .codeRate = static_cast<FrontendDtmbCodeRate>(dtmb.codeRate),
1080 .guardInterval = static_cast<FrontendDtmbGuardInterval>(dtmb.guardInterval),
1081 .interleaveMode = static_cast<FrontendDtmbTimeInterleaveMode>(dtmb.interleaveMode),
1082 });
1083 break;
1084 }
1085 default:
1086 frontendSettingsExt.settingExt.noinit();
1087 break;
1088 }
1089
1090 return frontendSettingsExt;
1091}
Amy Zhang0f04c452020-10-30 13:36:44 -07001092} // namespace android