blob: 17c60c09578d5397c6a1533126db15ccca896dcf [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"
20#include "TunerService.h"
21
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 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;
70using ::android::hardware::tv::tuner::V1_0::FrontendSettings;;
71using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangd61491e2021-01-12 16:27:29 -080072using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang0f04c452020-10-30 13:36:44 -070073
74namespace android {
75
Amy Zhangd61491e2021-01-12 16:27:29 -080076TunerFrontend::TunerFrontend(sp<ITuner> tuner, int id) {
Amy Zhang0f04c452020-10-30 13:36:44 -070077 mTuner = tuner;
Amy Zhangd61491e2021-01-12 16:27:29 -080078 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -070079
80 if (mTuner != NULL) {
81 Result status;
82 mTuner->openFrontendById(mId, [&](Result result, const sp<IFrontend>& frontend) {
83 mFrontend = frontend;
84 status = result;
85 });
86 if (status != Result::SUCCESS) {
87 mFrontend = NULL;
88 }
89 }
90}
91
92TunerFrontend::~TunerFrontend() {}
93
94Status TunerFrontend::setCallback(
95 const std::shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
96 if (mFrontend == NULL) {
97 ALOGE("IFrontend is not initialized");
98 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
99 }
100
101 if (tunerFrontendCallback == NULL) {
102 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
103 }
104
105 sp<IFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
106 Result status = mFrontend->setCallback(frontendCallback);
107 if (status == Result::SUCCESS) {
108 return Status::ok();
109 }
110
111 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
112}
113
114Status TunerFrontend::tune(const TunerFrontendSettings& /*settings*/) {
115 return Status::ok();
116}
117
118Status TunerFrontend::stopTune() {
119 return Status::ok();
120}
121
122Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
123 if (mFrontend == NULL) {
124 ALOGD("IFrontend is not initialized");
125 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
126 }
127
128 FrontendSettings frontendSettings;
129 switch (settings.getTag()) {
130 case TunerFrontendSettings::analog:
131 frontendSettings.analog({
132 .frequency = static_cast<uint32_t>(
133 settings.get<TunerFrontendSettings::analog>().frequency),
134 .type = static_cast<FrontendAnalogType>(
135 settings.get<TunerFrontendSettings::analog>().signalType),
136 .sifStandard = static_cast<FrontendAnalogSifStandard>(
137 settings.get<TunerFrontendSettings::analog>().sifStandard),
138 });
139 break;
140 case TunerFrontendSettings::atsc:
141 frontendSettings.atsc({
142 .frequency = static_cast<uint32_t>(
143 settings.get<TunerFrontendSettings::atsc>().frequency),
144 .modulation = static_cast<FrontendAtscModulation>(
145 settings.get<TunerFrontendSettings::atsc>().modulation),
146 });
147 break;
148 case TunerFrontendSettings::atsc3:
149 frontendSettings.atsc3({
150 .frequency = static_cast<uint32_t>(
151 settings.get<TunerFrontendSettings::atsc3>().frequency),
152 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(
153 settings.get<TunerFrontendSettings::atsc3>().bandwidth),
154 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
155 settings.get<TunerFrontendSettings::atsc3>().demodOutputFormat),
156 .plpSettings = getAtsc3PlpSettings(settings.get<TunerFrontendSettings::atsc3>()),
157 });
158 break;
159 case TunerFrontendSettings::cable:
160 frontendSettings.dvbc({
161 .frequency = static_cast<uint32_t>(
162 settings.get<TunerFrontendSettings::cable>().frequency),
163 .modulation = static_cast<FrontendDvbcModulation>(
164 settings.get<TunerFrontendSettings::cable>().modulation),
165 .fec = static_cast<FrontendInnerFec>(
166 settings.get<TunerFrontendSettings::cable>().innerFec),
167 .symbolRate = static_cast<uint32_t>(
168 settings.get<TunerFrontendSettings::cable>().symbolRate),
169 .outerFec = static_cast<FrontendDvbcOuterFec>(
170 settings.get<TunerFrontendSettings::cable>().outerFec),
171 .annex = static_cast<FrontendDvbcAnnex>(
172 settings.get<TunerFrontendSettings::cable>().annex),
173 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
174 settings.get<TunerFrontendSettings::cable>().spectralInversion),
175 });
176 break;
177 case TunerFrontendSettings::dvbs:
178 frontendSettings.dvbs({
179 .frequency = static_cast<uint32_t>(
180 settings.get<TunerFrontendSettings::dvbs>().frequency),
181 .modulation = static_cast<FrontendDvbsModulation>(
182 settings.get<TunerFrontendSettings::dvbs>().modulation),
183 .coderate = getDvbsCodeRate(
184 settings.get<TunerFrontendSettings::dvbs>().codeRate),
185 .symbolRate = static_cast<uint32_t>(
186 settings.get<TunerFrontendSettings::dvbs>().symbolRate),
187 .rolloff = static_cast<FrontendDvbsRolloff>(
188 settings.get<TunerFrontendSettings::dvbs>().rolloff),
189 .pilot = static_cast<FrontendDvbsPilot>(
190 settings.get<TunerFrontendSettings::dvbs>().pilot),
191 .inputStreamId = static_cast<uint32_t>(
192 settings.get<TunerFrontendSettings::dvbs>().inputStreamId),
193 .standard = static_cast<FrontendDvbsStandard>(
194 settings.get<TunerFrontendSettings::dvbs>().standard),
195 .vcmMode = static_cast<FrontendDvbsVcmMode>(
196 settings.get<TunerFrontendSettings::dvbs>().vcm),
197 });
198 break;
199 case TunerFrontendSettings::dvbt:
200 frontendSettings.dvbt({
201 .frequency = static_cast<uint32_t>(
202 settings.get<TunerFrontendSettings::dvbt>().frequency),
203 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
204 settings.get<TunerFrontendSettings::dvbt>().transmissionMode),
205 .bandwidth = static_cast<FrontendDvbtBandwidth>(
206 settings.get<TunerFrontendSettings::dvbt>().bandwidth),
207 .constellation = static_cast<FrontendDvbtConstellation>(
208 settings.get<TunerFrontendSettings::dvbt>().constellation),
209 .hierarchy = static_cast<FrontendDvbtHierarchy>(
210 settings.get<TunerFrontendSettings::dvbt>().hierarchy),
211 .hpCoderate = static_cast<FrontendDvbtCoderate>(
212 settings.get<TunerFrontendSettings::dvbt>().hpCodeRate),
213 .lpCoderate = static_cast<FrontendDvbtCoderate>(
214 settings.get<TunerFrontendSettings::dvbt>().lpCodeRate),
215 .guardInterval = static_cast<FrontendDvbtGuardInterval>(
216 settings.get<TunerFrontendSettings::dvbt>().guardInterval),
217 .isHighPriority = settings.get<TunerFrontendSettings::dvbt>().isHighPriority,
218 .standard = static_cast<FrontendDvbtStandard>(
219 settings.get<TunerFrontendSettings::dvbt>().standard),
220 .isMiso = settings.get<TunerFrontendSettings::dvbt>().isMiso,
221 .plpMode = static_cast<FrontendDvbtPlpMode>(
222 settings.get<TunerFrontendSettings::dvbt>().plpMode),
223 .plpId = static_cast<uint8_t>(
224 settings.get<TunerFrontendSettings::dvbt>().plpId),
225 .plpGroupId = static_cast<uint8_t>(
226 settings.get<TunerFrontendSettings::dvbt>().plpGroupId),
227 });
228 break;
229 case TunerFrontendSettings::isdbs:
230 frontendSettings.isdbs({
231 .frequency = static_cast<uint32_t>(
232 settings.get<TunerFrontendSettings::isdbs>().frequency),
233 .streamId = static_cast<uint16_t>(
234 settings.get<TunerFrontendSettings::isdbs>().streamId),
235 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
236 settings.get<TunerFrontendSettings::isdbs>().streamIdType),
237 .modulation = static_cast<FrontendIsdbsModulation>(
238 settings.get<TunerFrontendSettings::isdbs>().modulation),
239 .coderate = static_cast<FrontendIsdbsCoderate>(
240 settings.get<TunerFrontendSettings::isdbs>().codeRate),
241 .symbolRate = static_cast<uint32_t>(
242 settings.get<TunerFrontendSettings::isdbs>().symbolRate),
243 .rolloff = static_cast<FrontendIsdbsRolloff>(
244 settings.get<TunerFrontendSettings::isdbs>().rolloff),
245 });
246 break;
247 case TunerFrontendSettings::isdbs3:
248 frontendSettings.isdbs3({
249 .frequency = static_cast<uint32_t>(
250 settings.get<TunerFrontendSettings::isdbs3>().frequency),
251 .streamId = static_cast<uint16_t>(
252 settings.get<TunerFrontendSettings::isdbs3>().streamId),
253 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
254 settings.get<TunerFrontendSettings::isdbs3>().streamIdType),
255 .modulation = static_cast<FrontendIsdbs3Modulation>(
256 settings.get<TunerFrontendSettings::isdbs3>().modulation),
257 .coderate = static_cast<FrontendIsdbs3Coderate>(
258 settings.get<TunerFrontendSettings::isdbs3>().codeRate),
259 .symbolRate = static_cast<uint32_t>(
260 settings.get<TunerFrontendSettings::isdbs3>().symbolRate),
261 .rolloff = static_cast<FrontendIsdbs3Rolloff>(
262 settings.get<TunerFrontendSettings::isdbs3>().rolloff),
263 });
264 break;
265 case TunerFrontendSettings::isdbt:
266 frontendSettings.isdbt({
267 .frequency = static_cast<uint32_t>(
268 settings.get<TunerFrontendSettings::isdbt>().frequency),
269 .modulation = static_cast<FrontendIsdbtModulation>(
270 settings.get<TunerFrontendSettings::isdbt>().modulation),
271 .bandwidth = static_cast<FrontendIsdbtBandwidth>(
272 settings.get<TunerFrontendSettings::isdbt>().bandwidth),
273 .mode = static_cast<FrontendIsdbtMode>(
274 settings.get<TunerFrontendSettings::isdbt>().mode),
275 .coderate = static_cast<FrontendIsdbtCoderate>(
276 settings.get<TunerFrontendSettings::isdbt>().codeRate),
277 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(
278 settings.get<TunerFrontendSettings::isdbt>().guardInterval),
279 .serviceAreaId = static_cast<uint32_t>(
280 settings.get<TunerFrontendSettings::isdbt>().serviceAreaId),
281 });
282 break;
283 default:
284 break;
285 }
286 Result status = mFrontend->scan(
287 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
288 if (status == Result::SUCCESS) {
289 return Status::ok();
290 }
291
292 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
293}
294
295Status TunerFrontend::stopScan() {
296 return Status::ok();
297}
298
299Status TunerFrontend::setLnb(int /*lnbHandle*/) {
300 return Status::ok();
301}
302
303Status TunerFrontend::setLna(bool /*bEnable*/) {
304 return Status::ok();
305}
306
307Status TunerFrontend::close() {
308 return Status::ok();
309}
310
311Status TunerFrontend::getStatus(const std::vector<int32_t>& /*statusTypes*/,
Amy Zhangd61491e2021-01-12 16:27:29 -0800312 std::vector<TunerFrontendStatus>* /*_aidl_return*/) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700313 return Status::ok();
314}
315
Amy Zhangd61491e2021-01-12 16:27:29 -0800316Status TunerFrontend::getFrontendId(int* _aidl_return) {
317 *_aidl_return = mId;
318 return Status::ok();
319}
Amy Zhang0f04c452020-10-30 13:36:44 -0700320/////////////// FrontendCallback ///////////////////////
321
322Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
323 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
324 mTunerFrontendCallback->onEvent((int)frontendEventType);
325 return Void();
326}
327
328Return<void> TunerFrontend::FrontendCallback::onScanMessage(
329 FrontendScanMessageType type, const FrontendScanMessage& message) {
330 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800331 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700332 switch(type) {
333 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800334 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700335 break;
336 }
337 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800338 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700339 break;
340 }
341 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800342 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700343 break;
344 }
345 case FrontendScanMessageType::FREQUENCY: {
346 auto f = message.frequencies();
Amy Zhangd61491e2021-01-12 16:27:29 -0800347 std::vector<int> frequencies(std::begin(f), std::end(f));
348 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700349 break;
350 }
351 case FrontendScanMessageType::SYMBOL_RATE: {
352 auto s = message.symbolRates();
Amy Zhangd61491e2021-01-12 16:27:29 -0800353 std::vector<int> symbolRates(std::begin(s), std::end(s));
354 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700355 break;
356 }
357 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800358 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700359 break;
360 }
361 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800362 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700363 break;
364 }
365 case FrontendScanMessageType::PLP_IDS: {
366 auto p = message.plpIds();
Amy Zhangd61491e2021-01-12 16:27:29 -0800367 std::vector<uint8_t> plpIds(std::begin(p), std::end(p));
368 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700369 break;
370 }
371 case FrontendScanMessageType::GROUP_IDS: {
372 auto g = message.groupIds();
Amy Zhangd61491e2021-01-12 16:27:29 -0800373 std::vector<uint8_t> groupIds(std::begin(g), std::end(g));
374 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700375 break;
376 }
377 case FrontendScanMessageType::INPUT_STREAM_IDS: {
378 auto i = message.inputStreamIds();
Amy Zhangd61491e2021-01-12 16:27:29 -0800379 std::vector<char16_t> streamIds(std::begin(i), std::end(i));
380 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700381 break;
382 }
383 case FrontendScanMessageType::STANDARD: {
384 FrontendScanMessage::Standard std = message.std();
385 int standard;
386 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
387 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700388 } else if (std.getDiscriminator() ==
389 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
390 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700391 } else if (std.getDiscriminator() ==
392 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
393 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700394 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800395 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700396 break;
397 }
398 case FrontendScanMessageType::ATSC3_PLP_INFO: {
399 std::vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
Amy Zhangd61491e2021-01-12 16:27:29 -0800400 std::vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700401 for (int i = 0; i < plpInfos.size(); i++) {
402 auto info = plpInfos[i];
403 int plpId = (int) info.plpId;
404 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800405 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700406 .plpId = plpId,
407 .llsFlag = lls,
408 };
409 tunerPlpInfos.push_back(plpInfo);
410 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800411 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700412 break;
413 }
414 default:
415 break;
416 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800417 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
418 return Void();
419}
420
421Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
422 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
423 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
424 TunerFrontendScanMessage scanMessage;
425 switch(type) {
426 case FrontendScanMessageTypeExt1_1::MODULATION: {
427 FrontendModulation m = message.modulation();
428 int modulation;
429 if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbc) {
430 modulation = (int) m.dvbc();
431 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbt) {
432 modulation = (int) m.dvbt();
433 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbs) {
434 modulation = (int) m.dvbs();
435 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs) {
436 modulation = (int) m.isdbs();
437 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs3) {
438 modulation = (int) m.isdbs3();
439 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbt) {
440 modulation = (int) m.isdbt();
441 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc) {
442 modulation = (int) m.atsc();
443 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc3) {
444 modulation = (int) m.atsc3();
445 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dtmb) {
446 modulation = (int) m.dtmb();
447 }
448 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
449 break;
450 }
451 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
452 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
453 break;
454 }
455 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
456 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
457 break;
458 }
459 default:
460 break;
461 }
462 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700463 return Void();
464}
465
466////////////////////////////////////////////////////////////////////////////////
467
468hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
469 const TunerFrontendAtsc3Settings& settings) {
470 int len = settings.plpSettings.size();
471 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
472 // parse PLP settings
473 for (int i = 0; i < len; i++) {
474 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
475 FrontendAtsc3Modulation modulation =
476 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
477 FrontendAtsc3TimeInterleaveMode interleaveMode =
478 static_cast<FrontendAtsc3TimeInterleaveMode>(
479 settings.plpSettings[i].interleaveMode);
480 FrontendAtsc3CodeRate codeRate =
481 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
482 FrontendAtsc3Fec fec =
483 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
484 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
485 .plpId = plpId,
486 .modulation = modulation,
487 .interleaveMode = interleaveMode,
488 .codeRate = codeRate,
489 .fec = fec,
490 };
491 plps[i] = frontendAtsc3PlpSettings;
492 }
493 return plps;
494}
495
496FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
497 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
498 bool isLinear = codeRate.isLinear;
499 bool isShortFrames = codeRate.isShortFrames;
500 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
501 FrontendDvbsCodeRate coderate {
502 .fec = innerFec,
503 .isLinear = isLinear,
504 .isShortFrames = isShortFrames,
505 .bitsPer1000Symbol = bitsPer1000Symbol,
506 };
507 return coderate;
508}
509} // namespace android