blob: bb8b07da56422d8b8b9c03a7b653585b8c92f10a [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 Zhang0f04c452020-10-30 13:36:44 -070023using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
24using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
25using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
26using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
27using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
28using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
29using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
30using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
31using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
32using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
33using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
34using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
35using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
36using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
37using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
38using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
39using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
40using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
41using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
42using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
43using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
44using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
45using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
46using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
47using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
48using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
49using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
50using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
51using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
52using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
53using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
54using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
55using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
56using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
57using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
58using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
59using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
60using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
61using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
62using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
63using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
64using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
65using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
66using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
67using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
68using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
Amy Zhang0f04c452020-10-30 13:36:44 -070069using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangd61491e2021-01-12 16:27:29 -080070using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang0f04c452020-10-30 13:36:44 -070071
72namespace android {
73
Amy Zhanga046eee2021-01-12 14:44:58 -080074TunerFrontend::TunerFrontend(sp<IFrontend> frontend, int id) {
75 mFrontend = frontend;
76 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
Amy Zhangd61491e2021-01-12 16:27:29 -080077 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -070078}
79
Amy Zhanga046eee2021-01-12 14:44:58 -080080TunerFrontend::~TunerFrontend() {
81 mFrontend = NULL;
Amy Zhangeb292c12021-01-26 16:28:19 -080082 mFrontend_1_1 = NULL;
Amy Zhanga046eee2021-01-12 14:44:58 -080083 mId = -1;
84}
Amy Zhang0f04c452020-10-30 13:36:44 -070085
86Status TunerFrontend::setCallback(
Amy Zhanga046eee2021-01-12 14:44:58 -080087 const shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
Amy Zhang0f04c452020-10-30 13:36:44 -070088 if (mFrontend == NULL) {
89 ALOGE("IFrontend is not initialized");
90 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
91 }
92
93 if (tunerFrontendCallback == NULL) {
94 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
95 }
96
97 sp<IFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
98 Result status = mFrontend->setCallback(frontendCallback);
99 if (status == Result::SUCCESS) {
100 return Status::ok();
101 }
102
103 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
104}
105
Amy Zhangeb292c12021-01-26 16:28:19 -0800106Status TunerFrontend::tune(const TunerFrontendSettings& settings) {
107 if (mFrontend == NULL) {
108 ALOGD("IFrontend is not initialized");
109 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
110 }
111
112 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
113 Result status = mFrontend->tune(frontendSettings);
114 if (status == Result::SUCCESS) {
115 return Status::ok();
116 }
117
118 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700119}
120
121Status TunerFrontend::stopTune() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800122 if (mFrontend == NULL) {
123 ALOGD("IFrontend is not initialized");
124 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
125 }
126
127 Result status = mFrontend->stopTune();
128 if (status == Result::SUCCESS) {
129 return Status::ok();
130 }
131
132 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700133}
134
135Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
136 if (mFrontend == NULL) {
137 ALOGD("IFrontend is not initialized");
138 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
139 }
140
Amy Zhangeb292c12021-01-26 16:28:19 -0800141 FrontendSettings frontendSettings = getHidlFrontendSettings(settings);
Amy Zhang0f04c452020-10-30 13:36:44 -0700142 Result status = mFrontend->scan(
143 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
144 if (status == Result::SUCCESS) {
145 return Status::ok();
146 }
147
148 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
149}
150
151Status TunerFrontend::stopScan() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800152 if (mFrontend == NULL) {
153 ALOGD("IFrontend is not initialized");
154 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
155 }
156
157 Result status = mFrontend->stopScan();
158 if (status == Result::SUCCESS) {
159 return Status::ok();
160 }
161
162 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700163}
164
165Status TunerFrontend::setLnb(int /*lnbHandle*/) {
166 return Status::ok();
167}
168
169Status TunerFrontend::setLna(bool /*bEnable*/) {
170 return Status::ok();
171}
172
173Status TunerFrontend::close() {
Amy Zhangeb292c12021-01-26 16:28:19 -0800174 if (mFrontend == NULL) {
175 ALOGD("IFrontend is not initialized");
176 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
177 }
178
179 Result status = mFrontend->close();
180 if (status == Result::SUCCESS) {
181 return Status::ok();
182 }
183
184 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
Amy Zhang0f04c452020-10-30 13:36:44 -0700185}
186
Amy Zhanga046eee2021-01-12 14:44:58 -0800187Status TunerFrontend::getStatus(const vector<int32_t>& /*statusTypes*/,
188 vector<TunerFrontendStatus>* /*_aidl_return*/) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700189 return Status::ok();
190}
191
Amy Zhangd61491e2021-01-12 16:27:29 -0800192Status TunerFrontend::getFrontendId(int* _aidl_return) {
193 *_aidl_return = mId;
194 return Status::ok();
195}
Amy Zhanga046eee2021-01-12 14:44:58 -0800196
Amy Zhang0f04c452020-10-30 13:36:44 -0700197/////////////// FrontendCallback ///////////////////////
198
199Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
200 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
201 mTunerFrontendCallback->onEvent((int)frontendEventType);
202 return Void();
203}
204
205Return<void> TunerFrontend::FrontendCallback::onScanMessage(
206 FrontendScanMessageType type, const FrontendScanMessage& message) {
207 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800208 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700209 switch(type) {
210 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800211 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700212 break;
213 }
214 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800215 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700216 break;
217 }
218 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800219 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700220 break;
221 }
222 case FrontendScanMessageType::FREQUENCY: {
223 auto f = message.frequencies();
Amy Zhanga046eee2021-01-12 14:44:58 -0800224 vector<int> frequencies(begin(f), end(f));
Amy Zhangd61491e2021-01-12 16:27:29 -0800225 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700226 break;
227 }
228 case FrontendScanMessageType::SYMBOL_RATE: {
229 auto s = message.symbolRates();
Amy Zhanga046eee2021-01-12 14:44:58 -0800230 vector<int> symbolRates(begin(s), end(s));
Amy Zhangd61491e2021-01-12 16:27:29 -0800231 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700232 break;
233 }
234 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800235 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700236 break;
237 }
238 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800239 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700240 break;
241 }
242 case FrontendScanMessageType::PLP_IDS: {
243 auto p = message.plpIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800244 vector<uint8_t> plpIds(begin(p), end(p));
Amy Zhangd61491e2021-01-12 16:27:29 -0800245 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700246 break;
247 }
248 case FrontendScanMessageType::GROUP_IDS: {
249 auto g = message.groupIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800250 vector<uint8_t> groupIds(begin(g), end(g));
Amy Zhangd61491e2021-01-12 16:27:29 -0800251 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700252 break;
253 }
254 case FrontendScanMessageType::INPUT_STREAM_IDS: {
255 auto i = message.inputStreamIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800256 vector<char16_t> streamIds(begin(i), end(i));
Amy Zhangd61491e2021-01-12 16:27:29 -0800257 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700258 break;
259 }
260 case FrontendScanMessageType::STANDARD: {
261 FrontendScanMessage::Standard std = message.std();
262 int standard;
263 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
264 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700265 } else if (std.getDiscriminator() ==
266 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
267 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700268 } else if (std.getDiscriminator() ==
269 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
270 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700271 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800272 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700273 break;
274 }
275 case FrontendScanMessageType::ATSC3_PLP_INFO: {
Amy Zhanga046eee2021-01-12 14:44:58 -0800276 vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
277 vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700278 for (int i = 0; i < plpInfos.size(); i++) {
279 auto info = plpInfos[i];
280 int plpId = (int) info.plpId;
281 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800282 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700283 .plpId = plpId,
284 .llsFlag = lls,
285 };
286 tunerPlpInfos.push_back(plpInfo);
287 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800288 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700289 break;
290 }
291 default:
292 break;
293 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800294 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
295 return Void();
296}
297
298Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
299 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
300 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
301 TunerFrontendScanMessage scanMessage;
302 switch(type) {
303 case FrontendScanMessageTypeExt1_1::MODULATION: {
304 FrontendModulation m = message.modulation();
305 int modulation;
306 if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbc) {
307 modulation = (int) m.dvbc();
308 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbt) {
309 modulation = (int) m.dvbt();
310 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbs) {
311 modulation = (int) m.dvbs();
312 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs) {
313 modulation = (int) m.isdbs();
314 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs3) {
315 modulation = (int) m.isdbs3();
316 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbt) {
317 modulation = (int) m.isdbt();
318 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc) {
319 modulation = (int) m.atsc();
320 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc3) {
321 modulation = (int) m.atsc3();
322 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dtmb) {
323 modulation = (int) m.dtmb();
324 }
325 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
326 break;
327 }
328 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
329 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
330 break;
331 }
332 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
333 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
334 break;
335 }
336 default:
337 break;
338 }
339 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700340 return Void();
341}
342
Amy Zhanga046eee2021-01-12 14:44:58 -0800343/////////////// TunerFrontend Helper Methods ///////////////////////
Amy Zhang0f04c452020-10-30 13:36:44 -0700344
345hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
346 const TunerFrontendAtsc3Settings& settings) {
347 int len = settings.plpSettings.size();
348 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
349 // parse PLP settings
350 for (int i = 0; i < len; i++) {
351 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
352 FrontendAtsc3Modulation modulation =
353 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
354 FrontendAtsc3TimeInterleaveMode interleaveMode =
355 static_cast<FrontendAtsc3TimeInterleaveMode>(
356 settings.plpSettings[i].interleaveMode);
357 FrontendAtsc3CodeRate codeRate =
358 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
359 FrontendAtsc3Fec fec =
360 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
361 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
362 .plpId = plpId,
363 .modulation = modulation,
364 .interleaveMode = interleaveMode,
365 .codeRate = codeRate,
366 .fec = fec,
367 };
368 plps[i] = frontendAtsc3PlpSettings;
369 }
370 return plps;
371}
372
373FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
374 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
375 bool isLinear = codeRate.isLinear;
376 bool isShortFrames = codeRate.isShortFrames;
377 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
378 FrontendDvbsCodeRate coderate {
379 .fec = innerFec,
380 .isLinear = isLinear,
381 .isShortFrames = isShortFrames,
382 .bitsPer1000Symbol = bitsPer1000Symbol,
383 };
384 return coderate;
385}
Amy Zhangeb292c12021-01-26 16:28:19 -0800386
387FrontendSettings TunerFrontend::getHidlFrontendSettings(const TunerFrontendSettings& settings) {
388 // TODO: extend TunerFrontendSettings to use 1.1 types
389 FrontendSettings frontendSettings;
390 switch (settings.getTag()) {
391 case TunerFrontendSettings::analog:
392 frontendSettings.analog({
393 .frequency = static_cast<uint32_t>(
394 settings.get<TunerFrontendSettings::analog>().frequency),
395 .type = static_cast<FrontendAnalogType>(
396 settings.get<TunerFrontendSettings::analog>().signalType),
397 .sifStandard = static_cast<FrontendAnalogSifStandard>(
398 settings.get<TunerFrontendSettings::analog>().sifStandard),
399 });
400 break;
401 case TunerFrontendSettings::atsc:
402 frontendSettings.atsc({
403 .frequency = static_cast<uint32_t>(
404 settings.get<TunerFrontendSettings::atsc>().frequency),
405 .modulation = static_cast<FrontendAtscModulation>(
406 settings.get<TunerFrontendSettings::atsc>().modulation),
407 });
408 break;
409 case TunerFrontendSettings::atsc3:
410 frontendSettings.atsc3({
411 .frequency = static_cast<uint32_t>(
412 settings.get<TunerFrontendSettings::atsc3>().frequency),
413 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(
414 settings.get<TunerFrontendSettings::atsc3>().bandwidth),
415 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
416 settings.get<TunerFrontendSettings::atsc3>().demodOutputFormat),
417 .plpSettings = getAtsc3PlpSettings(settings.get<TunerFrontendSettings::atsc3>()),
418 });
419 break;
420 case TunerFrontendSettings::cable:
421 frontendSettings.dvbc({
422 .frequency = static_cast<uint32_t>(
423 settings.get<TunerFrontendSettings::cable>().frequency),
424 .modulation = static_cast<FrontendDvbcModulation>(
425 settings.get<TunerFrontendSettings::cable>().modulation),
426 .fec = static_cast<FrontendInnerFec>(
427 settings.get<TunerFrontendSettings::cable>().innerFec),
428 .symbolRate = static_cast<uint32_t>(
429 settings.get<TunerFrontendSettings::cable>().symbolRate),
430 .outerFec = static_cast<FrontendDvbcOuterFec>(
431 settings.get<TunerFrontendSettings::cable>().outerFec),
432 .annex = static_cast<FrontendDvbcAnnex>(
433 settings.get<TunerFrontendSettings::cable>().annex),
434 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
435 settings.get<TunerFrontendSettings::cable>().spectralInversion),
436 });
437 break;
438 case TunerFrontendSettings::dvbs:
439 frontendSettings.dvbs({
440 .frequency = static_cast<uint32_t>(
441 settings.get<TunerFrontendSettings::dvbs>().frequency),
442 .modulation = static_cast<FrontendDvbsModulation>(
443 settings.get<TunerFrontendSettings::dvbs>().modulation),
444 .coderate = getDvbsCodeRate(
445 settings.get<TunerFrontendSettings::dvbs>().codeRate),
446 .symbolRate = static_cast<uint32_t>(
447 settings.get<TunerFrontendSettings::dvbs>().symbolRate),
448 .rolloff = static_cast<FrontendDvbsRolloff>(
449 settings.get<TunerFrontendSettings::dvbs>().rolloff),
450 .pilot = static_cast<FrontendDvbsPilot>(
451 settings.get<TunerFrontendSettings::dvbs>().pilot),
452 .inputStreamId = static_cast<uint32_t>(
453 settings.get<TunerFrontendSettings::dvbs>().inputStreamId),
454 .standard = static_cast<FrontendDvbsStandard>(
455 settings.get<TunerFrontendSettings::dvbs>().standard),
456 .vcmMode = static_cast<FrontendDvbsVcmMode>(
457 settings.get<TunerFrontendSettings::dvbs>().vcm),
458 });
459 break;
460 case TunerFrontendSettings::dvbt:
461 frontendSettings.dvbt({
462 .frequency = static_cast<uint32_t>(
463 settings.get<TunerFrontendSettings::dvbt>().frequency),
464 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
465 settings.get<TunerFrontendSettings::dvbt>().transmissionMode),
466 .bandwidth = static_cast<FrontendDvbtBandwidth>(
467 settings.get<TunerFrontendSettings::dvbt>().bandwidth),
468 .constellation = static_cast<FrontendDvbtConstellation>(
469 settings.get<TunerFrontendSettings::dvbt>().constellation),
470 .hierarchy = static_cast<FrontendDvbtHierarchy>(
471 settings.get<TunerFrontendSettings::dvbt>().hierarchy),
472 .hpCoderate = static_cast<FrontendDvbtCoderate>(
473 settings.get<TunerFrontendSettings::dvbt>().hpCodeRate),
474 .lpCoderate = static_cast<FrontendDvbtCoderate>(
475 settings.get<TunerFrontendSettings::dvbt>().lpCodeRate),
476 .guardInterval = static_cast<FrontendDvbtGuardInterval>(
477 settings.get<TunerFrontendSettings::dvbt>().guardInterval),
478 .isHighPriority = settings.get<TunerFrontendSettings::dvbt>().isHighPriority,
479 .standard = static_cast<FrontendDvbtStandard>(
480 settings.get<TunerFrontendSettings::dvbt>().standard),
481 .isMiso = settings.get<TunerFrontendSettings::dvbt>().isMiso,
482 .plpMode = static_cast<FrontendDvbtPlpMode>(
483 settings.get<TunerFrontendSettings::dvbt>().plpMode),
484 .plpId = static_cast<uint8_t>(
485 settings.get<TunerFrontendSettings::dvbt>().plpId),
486 .plpGroupId = static_cast<uint8_t>(
487 settings.get<TunerFrontendSettings::dvbt>().plpGroupId),
488 });
489 break;
490 case TunerFrontendSettings::isdbs:
491 frontendSettings.isdbs({
492 .frequency = static_cast<uint32_t>(
493 settings.get<TunerFrontendSettings::isdbs>().frequency),
494 .streamId = static_cast<uint16_t>(
495 settings.get<TunerFrontendSettings::isdbs>().streamId),
496 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
497 settings.get<TunerFrontendSettings::isdbs>().streamIdType),
498 .modulation = static_cast<FrontendIsdbsModulation>(
499 settings.get<TunerFrontendSettings::isdbs>().modulation),
500 .coderate = static_cast<FrontendIsdbsCoderate>(
501 settings.get<TunerFrontendSettings::isdbs>().codeRate),
502 .symbolRate = static_cast<uint32_t>(
503 settings.get<TunerFrontendSettings::isdbs>().symbolRate),
504 .rolloff = static_cast<FrontendIsdbsRolloff>(
505 settings.get<TunerFrontendSettings::isdbs>().rolloff),
506 });
507 break;
508 case TunerFrontendSettings::isdbs3:
509 frontendSettings.isdbs3({
510 .frequency = static_cast<uint32_t>(
511 settings.get<TunerFrontendSettings::isdbs3>().frequency),
512 .streamId = static_cast<uint16_t>(
513 settings.get<TunerFrontendSettings::isdbs3>().streamId),
514 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
515 settings.get<TunerFrontendSettings::isdbs3>().streamIdType),
516 .modulation = static_cast<FrontendIsdbs3Modulation>(
517 settings.get<TunerFrontendSettings::isdbs3>().modulation),
518 .coderate = static_cast<FrontendIsdbs3Coderate>(
519 settings.get<TunerFrontendSettings::isdbs3>().codeRate),
520 .symbolRate = static_cast<uint32_t>(
521 settings.get<TunerFrontendSettings::isdbs3>().symbolRate),
522 .rolloff = static_cast<FrontendIsdbs3Rolloff>(
523 settings.get<TunerFrontendSettings::isdbs3>().rolloff),
524 });
525 break;
526 case TunerFrontendSettings::isdbt:
527 frontendSettings.isdbt({
528 .frequency = static_cast<uint32_t>(
529 settings.get<TunerFrontendSettings::isdbt>().frequency),
530 .modulation = static_cast<FrontendIsdbtModulation>(
531 settings.get<TunerFrontendSettings::isdbt>().modulation),
532 .bandwidth = static_cast<FrontendIsdbtBandwidth>(
533 settings.get<TunerFrontendSettings::isdbt>().bandwidth),
534 .mode = static_cast<FrontendIsdbtMode>(
535 settings.get<TunerFrontendSettings::isdbt>().mode),
536 .coderate = static_cast<FrontendIsdbtCoderate>(
537 settings.get<TunerFrontendSettings::isdbt>().codeRate),
538 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(
539 settings.get<TunerFrontendSettings::isdbt>().guardInterval),
540 .serviceAreaId = static_cast<uint32_t>(
541 settings.get<TunerFrontendSettings::isdbt>().serviceAreaId),
542 });
543 break;
544 default:
545 break;
546 }
547 return frontendSettings;
548}
Amy Zhang0f04c452020-10-30 13:36:44 -0700549} // namespace android