blob: 9b847abe24ccd8e571062b12d3b27099c9349cbe [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 Zhangdd3177c2021-02-02 16:32:40 -080023using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
Amy Zhang0f04c452020-10-30 13:36:44 -070024using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
25using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
26using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
27using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
28using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
30using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
31using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
32using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
33using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
35using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
36using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
38using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
41using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
43using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
44using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
45using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
46using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
47using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
48using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
49using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
50using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
51using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
52using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
53using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
54using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
55using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
56using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
57using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
58using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
59using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
60using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
61using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
62using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
63using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
64using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
65using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
66using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
67using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
68using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
69using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
Amy Zhang0f04c452020-10-30 13:36:44 -070070using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangdd3177c2021-02-02 16:32:40 -080071using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
72using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
73using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
Amy Zhangd61491e2021-01-12 16:27:29 -080074using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhangdd3177c2021-02-02 16:32:40 -080075using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
76using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCodeRate;
77using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
78using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
79using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
80using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
81using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
82using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
Amy Zhang0f04c452020-10-30 13:36:44 -070083
84namespace android {
85
Amy Zhanga046eee2021-01-12 14:44:58 -080086TunerFrontend::TunerFrontend(sp<IFrontend> frontend, int id) {
87 mFrontend = frontend;
88 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
Amy Zhangd61491e2021-01-12 16:27:29 -080089 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -070090}
91
Amy Zhanga046eee2021-01-12 14:44:58 -080092TunerFrontend::~TunerFrontend() {
93 mFrontend = NULL;
Amy Zhangeb292c12021-01-26 16:28:19 -080094 mFrontend_1_1 = NULL;
Amy Zhanga046eee2021-01-12 14:44:58 -080095 mId = -1;
96}
Amy Zhang0f04c452020-10-30 13:36:44 -070097
98Status TunerFrontend::setCallback(
Amy Zhanga046eee2021-01-12 14:44:58 -080099 const shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700100 if (mFrontend == NULL) {
101 ALOGE("IFrontend is not initialized");
102 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
103 }
104
105 if (tunerFrontendCallback == NULL) {
106 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
107 }
108
109 sp<IFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
110 Result status = mFrontend->setCallback(frontendCallback);
111 if (status == Result::SUCCESS) {
112 return Status::ok();
113 }
114
115 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
116}
117
Amy Zhangeb292c12021-01-26 16:28:19 -0800118Status TunerFrontend::tune(const TunerFrontendSettings& settings) {
119 if (mFrontend == NULL) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800120 ALOGE("IFrontend is not initialized");
Amy Zhangeb292c12021-01-26 16:28:19 -0800121 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
122 }
123
Amy Zhangdd3177c2021-02-02 16:32:40 -0800124 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800125 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800126 if (settings.isExtended) {
127 if (mFrontend_1_1 == NULL) {
128 ALOGE("IFrontend_1_1 is not initialized");
129 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
130 }
131 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
132 status = mFrontend_1_1->tune_1_1(frontendSettings, frontendSettingsExt);
133 } else {
134 status = mFrontend->tune(frontendSettings);
135 }
136
Amy Zhangeb292c12021-01-26 16:28:19 -0800137 if (status == Result::SUCCESS) {
138 return Status::ok();
139 }
140
141 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700142}
143
144Status TunerFrontend::stopTune() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800145 if (mFrontend == NULL) {
146 ALOGD("IFrontend is not initialized");
147 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
148 }
149
150 Result status = mFrontend->stopTune();
151 if (status == Result::SUCCESS) {
152 return Status::ok();
153 }
154
155 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700156}
157
158Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
159 if (mFrontend == NULL) {
160 ALOGD("IFrontend is not initialized");
161 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
162 }
163
Amy Zhangdd3177c2021-02-02 16:32:40 -0800164 Result status;
Amy Zhangeb292c12021-01-26 16:28:19 -0800165 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhangdd3177c2021-02-02 16:32:40 -0800166 if (settings.isExtended) {
167 if (mFrontend_1_1 == NULL) {
168 ALOGE("IFrontend_1_1 is not initialized");
169 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
170 }
171 FrontendSettingsExt1_1 frontendSettingsExt = getHidlFrontendSettingsExt(settings);
172 status = mFrontend_1_1->scan_1_1(frontendSettings,
173 static_cast<FrontendScanType>(frontendScanType), frontendSettingsExt);
174 } else {
175 status = mFrontend->scan(
176 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
177 }
178
Amy Zhang0f04c452020-10-30 13:36:44 -0700179 if (status == Result::SUCCESS) {
180 return Status::ok();
181 }
182
183 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
184}
185
186Status TunerFrontend::stopScan() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800187 if (mFrontend == NULL) {
188 ALOGD("IFrontend is not initialized");
189 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
190 }
191
192 Result status = mFrontend->stopScan();
193 if (status == Result::SUCCESS) {
194 return Status::ok();
195 }
196
197 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700198}
199
200Status TunerFrontend::setLnb(int /*lnbHandle*/) {
201 return Status::ok();
202}
203
204Status TunerFrontend::setLna(bool /*bEnable*/) {
205 return Status::ok();
206}
207
208Status TunerFrontend::close() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800209 if (mFrontend == NULL) {
210 ALOGD("IFrontend is not initialized");
211 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
212 }
213
214 Result status = mFrontend->close();
215 if (status == Result::SUCCESS) {
216 return Status::ok();
217 }
218
219 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700220}
221
Amy Zhanga046eee2021-01-12 14:44:58 -0800222Status TunerFrontend::getStatus(const vector<int32_t>& /*statusTypes*/,
223 vector<TunerFrontendStatus>* /*_aidl_return*/) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700224 return Status::ok();
225}
226
Amy Zhangd61491e2021-01-12 16:27:29 -0800227Status TunerFrontend::getFrontendId(int* _aidl_return) {
228 *_aidl_return = mId;
229 return Status::ok();
230}
Amy Zhanga046eee2021-01-12 14:44:58 -0800231
Amy Zhang0f04c452020-10-30 13:36:44 -0700232/////////////// FrontendCallback ///////////////////////
233
234Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
235 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
236 mTunerFrontendCallback->onEvent((int)frontendEventType);
237 return Void();
238}
239
240Return<void> TunerFrontend::FrontendCallback::onScanMessage(
241 FrontendScanMessageType type, const FrontendScanMessage& message) {
242 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800243 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700244 switch(type) {
245 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800246 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700247 break;
248 }
249 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800250 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700251 break;
252 }
253 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800254 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700255 break;
256 }
257 case FrontendScanMessageType::FREQUENCY: {
258 auto f = message.frequencies();
Amy Zhanga046eee2021-01-12 14:44:58 -0800259 vector<int> frequencies(begin(f), end(f));
Amy Zhangd61491e2021-01-12 16:27:29 -0800260 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700261 break;
262 }
263 case FrontendScanMessageType::SYMBOL_RATE: {
264 auto s = message.symbolRates();
Amy Zhanga046eee2021-01-12 14:44:58 -0800265 vector<int> symbolRates(begin(s), end(s));
Amy Zhangd61491e2021-01-12 16:27:29 -0800266 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700267 break;
268 }
269 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800270 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700271 break;
272 }
273 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800274 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700275 break;
276 }
277 case FrontendScanMessageType::PLP_IDS: {
278 auto p = message.plpIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800279 vector<uint8_t> plpIds(begin(p), end(p));
Amy Zhangd61491e2021-01-12 16:27:29 -0800280 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700281 break;
282 }
283 case FrontendScanMessageType::GROUP_IDS: {
284 auto g = message.groupIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800285 vector<uint8_t> groupIds(begin(g), end(g));
Amy Zhangd61491e2021-01-12 16:27:29 -0800286 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700287 break;
288 }
289 case FrontendScanMessageType::INPUT_STREAM_IDS: {
290 auto i = message.inputStreamIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800291 vector<char16_t> streamIds(begin(i), end(i));
Amy Zhangd61491e2021-01-12 16:27:29 -0800292 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700293 break;
294 }
295 case FrontendScanMessageType::STANDARD: {
296 FrontendScanMessage::Standard std = message.std();
297 int standard;
298 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
299 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700300 } else if (std.getDiscriminator() ==
301 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
302 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700303 } else if (std.getDiscriminator() ==
304 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
305 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700306 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800307 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700308 break;
309 }
310 case FrontendScanMessageType::ATSC3_PLP_INFO: {
Amy Zhanga046eee2021-01-12 14:44:58 -0800311 vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
312 vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700313 for (int i = 0; i < plpInfos.size(); i++) {
314 auto info = plpInfos[i];
315 int plpId = (int) info.plpId;
316 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800317 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700318 .plpId = plpId,
319 .llsFlag = lls,
320 };
321 tunerPlpInfos.push_back(plpInfo);
322 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800323 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700324 break;
325 }
326 default:
327 break;
328 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800329 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
330 return Void();
331}
332
333Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
334 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
335 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
336 TunerFrontendScanMessage scanMessage;
337 switch(type) {
338 case FrontendScanMessageTypeExt1_1::MODULATION: {
339 FrontendModulation m = message.modulation();
340 int modulation;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800341 switch (m.getDiscriminator()) {
342 case FrontendModulation::hidl_discriminator::dvbc:
343 modulation = (int) m.dvbc();
344 break;
345 case FrontendModulation::hidl_discriminator::dvbt:
346 modulation = (int) m.dvbt();
347 break;
348 case FrontendModulation::hidl_discriminator::dvbs:
349 modulation = (int) m.dvbs();
350 break;
351 case FrontendModulation::hidl_discriminator::isdbs:
352 modulation = (int) m.isdbs();
353 break;
354 case FrontendModulation::hidl_discriminator::isdbs3:
355 modulation = (int) m.isdbs3();
356 break;
357 case FrontendModulation::hidl_discriminator::isdbt:
358 modulation = (int) m.isdbt();
359 break;
360 case FrontendModulation::hidl_discriminator::atsc:
361 modulation = (int) m.atsc();
362 break;
363 case FrontendModulation::hidl_discriminator::atsc3:
364 modulation = (int) m.atsc3();
365 break;
366 case FrontendModulation::hidl_discriminator::dtmb:
367 modulation = (int) m.dtmb();
368 break;
Amy Zhangd61491e2021-01-12 16:27:29 -0800369 }
370 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
371 break;
372 }
373 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
374 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
375 break;
376 }
377 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
378 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
379 break;
380 }
381 default:
382 break;
383 }
384 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700385 return Void();
386}
387
Amy Zhanga046eee2021-01-12 14:44:58 -0800388/////////////// TunerFrontend Helper Methods ///////////////////////
Amy Zhang0f04c452020-10-30 13:36:44 -0700389
390hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
391 const TunerFrontendAtsc3Settings& settings) {
392 int len = settings.plpSettings.size();
393 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
394 // parse PLP settings
395 for (int i = 0; i < len; i++) {
396 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
397 FrontendAtsc3Modulation modulation =
398 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
399 FrontendAtsc3TimeInterleaveMode interleaveMode =
400 static_cast<FrontendAtsc3TimeInterleaveMode>(
401 settings.plpSettings[i].interleaveMode);
402 FrontendAtsc3CodeRate codeRate =
403 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
404 FrontendAtsc3Fec fec =
405 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
406 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
407 .plpId = plpId,
408 .modulation = modulation,
409 .interleaveMode = interleaveMode,
410 .codeRate = codeRate,
411 .fec = fec,
412 };
413 plps[i] = frontendAtsc3PlpSettings;
414 }
415 return plps;
416}
417
418FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
419 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
420 bool isLinear = codeRate.isLinear;
421 bool isShortFrames = codeRate.isShortFrames;
422 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
423 FrontendDvbsCodeRate coderate {
424 .fec = innerFec,
425 .isLinear = isLinear,
426 .isShortFrames = isShortFrames,
427 .bitsPer1000Symbol = bitsPer1000Symbol,
428 };
429 return coderate;
430}
Amy Zhangeb292c12021-01-26 16:28:19 -0800431
Amy Zhangdd3177c2021-02-02 16:32:40 -0800432FrontendSettings TunerFrontend::getHidlFrontendSettings(const TunerFrontendSettings& aidlSettings) {
433 auto settings = aidlSettings.settings;
Amy Zhangeb292c12021-01-26 16:28:19 -0800434 FrontendSettings frontendSettings;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800435
Amy Zhangeb292c12021-01-26 16:28:19 -0800436 switch (settings.getTag()) {
Amy Zhangdd3177c2021-02-02 16:32:40 -0800437 case TunerFrontendUnionSettings::analog: {
438 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800439 frontendSettings.analog({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800440 .frequency = static_cast<uint32_t>(analog.frequency),
441 .type = static_cast<FrontendAnalogType>(analog.signalType),
442 .sifStandard = static_cast<FrontendAnalogSifStandard>(analog.sifStandard),
Amy Zhangeb292c12021-01-26 16:28:19 -0800443 });
444 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800445 }
446 case TunerFrontendUnionSettings::atsc: {
447 auto atsc = settings.get<TunerFrontendUnionSettings::atsc>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800448 frontendSettings.atsc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800449 .frequency = static_cast<uint32_t>(atsc.frequency),
450 .modulation = static_cast<FrontendAtscModulation>(atsc.modulation),
Amy Zhangeb292c12021-01-26 16:28:19 -0800451 });
452 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800453 }
454 case TunerFrontendUnionSettings::atsc3: {
455 auto atsc3 = settings.get<TunerFrontendUnionSettings::atsc3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800456 frontendSettings.atsc3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800457 .frequency = static_cast<uint32_t>(atsc3.frequency),
458 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(atsc3.bandwidth),
Amy Zhangeb292c12021-01-26 16:28:19 -0800459 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800460 atsc3.demodOutputFormat),
461 .plpSettings = getAtsc3PlpSettings(atsc3),
Amy Zhangeb292c12021-01-26 16:28:19 -0800462 });
463 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800464 }
465 case TunerFrontendUnionSettings::cable: {
466 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800467 frontendSettings.dvbc({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800468 .frequency = static_cast<uint32_t>(dvbc.frequency),
469 .modulation = static_cast<FrontendDvbcModulation>(dvbc.modulation),
470 .fec = static_cast<FrontendInnerFec>(dvbc.innerFec),
471 .symbolRate = static_cast<uint32_t>(dvbc.symbolRate),
472 .outerFec = static_cast<FrontendDvbcOuterFec>(dvbc.outerFec),
473 .annex = static_cast<FrontendDvbcAnnex>(dvbc.annex),
Amy Zhangeb292c12021-01-26 16:28:19 -0800474 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800475 dvbc.spectralInversion),
Amy Zhangeb292c12021-01-26 16:28:19 -0800476 });
477 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800478 }
479 case TunerFrontendUnionSettings::dvbs: {
480 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800481 frontendSettings.dvbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800482 .frequency = static_cast<uint32_t>(dvbs.frequency),
483 .modulation = static_cast<FrontendDvbsModulation>(dvbs.modulation),
484 .coderate = getDvbsCodeRate(dvbs.codeRate),
485 .symbolRate = static_cast<uint32_t>(dvbs.symbolRate),
486 .rolloff = static_cast<FrontendDvbsRolloff>(dvbs.rolloff),
487 .pilot = static_cast<FrontendDvbsPilot>(dvbs.pilot),
488 .inputStreamId = static_cast<uint32_t>(dvbs.inputStreamId),
489 .standard = static_cast<FrontendDvbsStandard>(dvbs.standard),
490 .vcmMode = static_cast<FrontendDvbsVcmMode>(dvbs.vcm),
Amy Zhangeb292c12021-01-26 16:28:19 -0800491 });
492 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800493 }
494 case TunerFrontendUnionSettings::dvbt: {
495 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800496 frontendSettings.dvbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800497 .frequency = static_cast<uint32_t>(dvbt.frequency),
Amy Zhangeb292c12021-01-26 16:28:19 -0800498 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
Amy Zhangdd3177c2021-02-02 16:32:40 -0800499 dvbt.transmissionMode),
500 .bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt.bandwidth),
501 .constellation = static_cast<FrontendDvbtConstellation>(dvbt.constellation),
502 .hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt.hierarchy),
503 .hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.hpCodeRate),
504 .lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt.lpCodeRate),
505 .guardInterval = static_cast<FrontendDvbtGuardInterval>(dvbt.guardInterval),
506 .isHighPriority = dvbt.isHighPriority,
507 .standard = static_cast<FrontendDvbtStandard>(dvbt.standard),
508 .isMiso = dvbt.isMiso,
509 .plpMode = static_cast<FrontendDvbtPlpMode>(dvbt.plpMode),
510 .plpId = static_cast<uint8_t>(dvbt.plpId),
511 .plpGroupId = static_cast<uint8_t>(dvbt.plpGroupId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800512 });
513 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800514 }
515 case TunerFrontendUnionSettings::isdbs: {
516 auto isdbs = settings.get<TunerFrontendUnionSettings::isdbs>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800517 frontendSettings.isdbs({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800518 .frequency = static_cast<uint32_t>(isdbs.frequency),
519 .streamId = static_cast<uint16_t>(isdbs.streamId),
520 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs.streamIdType),
521 .modulation = static_cast<FrontendIsdbsModulation>(isdbs.modulation),
522 .coderate = static_cast<FrontendIsdbsCoderate>(isdbs.codeRate),
523 .symbolRate = static_cast<uint32_t>(isdbs.symbolRate),
524 .rolloff = static_cast<FrontendIsdbsRolloff>(isdbs.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800525 });
526 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800527 }
528 case TunerFrontendUnionSettings::isdbs3: {
529 auto isdbs3 = settings.get<TunerFrontendUnionSettings::isdbs3>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800530 frontendSettings.isdbs3({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800531 .frequency = static_cast<uint32_t>(isdbs3.frequency),
532 .streamId = static_cast<uint16_t>(isdbs3.streamId),
533 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(isdbs3.streamIdType),
534 .modulation = static_cast<FrontendIsdbs3Modulation>(isdbs3.modulation),
535 .coderate = static_cast<FrontendIsdbs3Coderate>(isdbs3.codeRate),
536 .symbolRate = static_cast<uint32_t>(isdbs3.symbolRate),
537 .rolloff = static_cast<FrontendIsdbs3Rolloff>(isdbs3.rolloff),
Amy Zhangeb292c12021-01-26 16:28:19 -0800538 });
539 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800540 }
541 case TunerFrontendUnionSettings::isdbt: {
542 auto isdbt = settings.get<TunerFrontendUnionSettings::isdbt>();
Amy Zhangeb292c12021-01-26 16:28:19 -0800543 frontendSettings.isdbt({
Amy Zhangdd3177c2021-02-02 16:32:40 -0800544 .frequency = static_cast<uint32_t>(isdbt.frequency),
545 .modulation = static_cast<FrontendIsdbtModulation>(isdbt.modulation),
546 .bandwidth = static_cast<FrontendIsdbtBandwidth>(isdbt.bandwidth),
547 .mode = static_cast<FrontendIsdbtMode>(isdbt.mode),
548 .coderate = static_cast<FrontendIsdbtCoderate>(isdbt.codeRate),
549 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(isdbt.guardInterval),
550 .serviceAreaId = static_cast<uint32_t>(isdbt.serviceAreaId),
Amy Zhangeb292c12021-01-26 16:28:19 -0800551 });
552 break;
Amy Zhangdd3177c2021-02-02 16:32:40 -0800553 }
Amy Zhangeb292c12021-01-26 16:28:19 -0800554 default:
555 break;
556 }
Amy Zhangdd3177c2021-02-02 16:32:40 -0800557
Amy Zhangeb292c12021-01-26 16:28:19 -0800558 return frontendSettings;
559}
Amy Zhangdd3177c2021-02-02 16:32:40 -0800560
561FrontendSettingsExt1_1 TunerFrontend::getHidlFrontendSettingsExt(
562 const TunerFrontendSettings& aidlSettings) {
563 FrontendSettingsExt1_1 frontendSettingsExt{
564 .endFrequency = static_cast<uint32_t>(aidlSettings.endFrequency),
565 .inversion = static_cast<FrontendSpectralInversion>(aidlSettings.inversion),
566 };
567
568 auto settings = aidlSettings.settings;
569 switch (settings.getTag()) {
570 case TunerFrontendUnionSettings::analog: {
571 auto analog = settings.get<TunerFrontendUnionSettings::analog>();
572 if (analog.isExtended) {
573 frontendSettingsExt.settingExt.analog({
574 .aftFlag = static_cast<FrontendAnalogAftFlag>(analog.aftFlag),
575 });
576 } else {
577 frontendSettingsExt.settingExt.noinit();
578 }
579 break;
580 }
581 case TunerFrontendUnionSettings::cable: {
582 auto dvbc = settings.get<TunerFrontendUnionSettings::cable>();
583 if (dvbc.isExtended) {
584 frontendSettingsExt.settingExt.dvbc({
585 .interleaveMode = static_cast<FrontendCableTimeInterleaveMode>(
586 dvbc.interleaveMode),
587 .bandwidth = static_cast<FrontendDvbcBandwidth>(
588 dvbc.bandwidth),
589 });
590 } else {
591 frontendSettingsExt.settingExt.noinit();
592 }
593 break;
594 }
595 case TunerFrontendUnionSettings::dvbs: {
596 auto dvbs = settings.get<TunerFrontendUnionSettings::dvbs>();
597 if (dvbs.isExtended) {
598 frontendSettingsExt.settingExt.dvbs({
599 .scanType = static_cast<FrontendDvbsScanType>(dvbs.scanType),
600 .isDiseqcRxMessage = dvbs.isDiseqcRxMessage,
601 });
602 } else {
603 frontendSettingsExt.settingExt.noinit();
604 }
605 break;
606 }
607 case TunerFrontendUnionSettings::dvbt: {
608 auto dvbt = settings.get<TunerFrontendUnionSettings::dvbt>();
609 if (dvbt.isExtended) {
610 frontendSettingsExt.settingExt.dvbt({
611 .constellation =
612 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
613 dvbt.constellation),
614 .transmissionMode =
615 static_cast<hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
616 dvbt.transmissionMode),
617 });
618 } else {
619 frontendSettingsExt.settingExt.noinit();
620 }
621 break;
622 }
623 case TunerFrontendUnionSettings::dtmb: {
624 auto dtmb = settings.get<TunerFrontendUnionSettings::dtmb>();
625 frontendSettingsExt.settingExt.dtmb({
626 .frequency = static_cast<uint32_t>(dtmb.frequency),
627 .transmissionMode = static_cast<FrontendDtmbTransmissionMode>(
628 dtmb.transmissionMode),
629 .bandwidth = static_cast<FrontendDtmbBandwidth>(dtmb.bandwidth),
630 .modulation = static_cast<FrontendDtmbModulation>(dtmb.modulation),
631 .codeRate = static_cast<FrontendDtmbCodeRate>(dtmb.codeRate),
632 .guardInterval = static_cast<FrontendDtmbGuardInterval>(dtmb.guardInterval),
633 .interleaveMode = static_cast<FrontendDtmbTimeInterleaveMode>(dtmb.interleaveMode),
634 });
635 break;
636 }
637 default:
638 frontendSettingsExt.settingExt.noinit();
639 break;
640 }
641
642 return frontendSettingsExt;
643}
Amy Zhang0f04c452020-10-30 13:36:44 -0700644} // namespace android