blob: e92489d6e6e8ad531c2414b161b1c2db0c8c0c61 [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;
69using ::android::hardware::tv::tuner::V1_0::FrontendSettings;;
70using ::android::hardware::tv::tuner::V1_0::Result;
Amy Zhangd61491e2021-01-12 16:27:29 -080071using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
Amy Zhang0f04c452020-10-30 13:36:44 -070072
73namespace android {
74
Amy Zhanga046eee2021-01-12 14:44:58 -080075TunerFrontend::TunerFrontend(sp<IFrontend> frontend, int id) {
76 mFrontend = frontend;
77 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
Amy Zhangd61491e2021-01-12 16:27:29 -080078 mId = id;
Amy Zhang0f04c452020-10-30 13:36:44 -070079}
80
Amy Zhanga046eee2021-01-12 14:44:58 -080081TunerFrontend::~TunerFrontend() {
82 mFrontend = NULL;
83 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
106Status TunerFrontend::tune(const TunerFrontendSettings& /*settings*/) {
107 return Status::ok();
108}
109
110Status TunerFrontend::stopTune() {
111 return Status::ok();
112}
113
114Status TunerFrontend::scan(const TunerFrontendSettings& settings, int frontendScanType) {
115 if (mFrontend == NULL) {
116 ALOGD("IFrontend is not initialized");
117 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
118 }
119
Amy Zhanga046eee2021-01-12 14:44:58 -0800120 // TODO: extend TunerFrontendSettings to use 1.1 types
Amy Zhang0f04c452020-10-30 13:36:44 -0700121 FrontendSettings frontendSettings;
122 switch (settings.getTag()) {
123 case TunerFrontendSettings::analog:
124 frontendSettings.analog({
125 .frequency = static_cast<uint32_t>(
126 settings.get<TunerFrontendSettings::analog>().frequency),
127 .type = static_cast<FrontendAnalogType>(
128 settings.get<TunerFrontendSettings::analog>().signalType),
129 .sifStandard = static_cast<FrontendAnalogSifStandard>(
130 settings.get<TunerFrontendSettings::analog>().sifStandard),
131 });
132 break;
133 case TunerFrontendSettings::atsc:
134 frontendSettings.atsc({
135 .frequency = static_cast<uint32_t>(
136 settings.get<TunerFrontendSettings::atsc>().frequency),
137 .modulation = static_cast<FrontendAtscModulation>(
138 settings.get<TunerFrontendSettings::atsc>().modulation),
139 });
140 break;
141 case TunerFrontendSettings::atsc3:
142 frontendSettings.atsc3({
143 .frequency = static_cast<uint32_t>(
144 settings.get<TunerFrontendSettings::atsc3>().frequency),
145 .bandwidth = static_cast<FrontendAtsc3Bandwidth>(
146 settings.get<TunerFrontendSettings::atsc3>().bandwidth),
147 .demodOutputFormat = static_cast<FrontendAtsc3DemodOutputFormat>(
148 settings.get<TunerFrontendSettings::atsc3>().demodOutputFormat),
149 .plpSettings = getAtsc3PlpSettings(settings.get<TunerFrontendSettings::atsc3>()),
150 });
151 break;
152 case TunerFrontendSettings::cable:
153 frontendSettings.dvbc({
154 .frequency = static_cast<uint32_t>(
155 settings.get<TunerFrontendSettings::cable>().frequency),
156 .modulation = static_cast<FrontendDvbcModulation>(
157 settings.get<TunerFrontendSettings::cable>().modulation),
158 .fec = static_cast<FrontendInnerFec>(
159 settings.get<TunerFrontendSettings::cable>().innerFec),
160 .symbolRate = static_cast<uint32_t>(
161 settings.get<TunerFrontendSettings::cable>().symbolRate),
162 .outerFec = static_cast<FrontendDvbcOuterFec>(
163 settings.get<TunerFrontendSettings::cable>().outerFec),
164 .annex = static_cast<FrontendDvbcAnnex>(
165 settings.get<TunerFrontendSettings::cable>().annex),
166 .spectralInversion = static_cast<FrontendDvbcSpectralInversion>(
167 settings.get<TunerFrontendSettings::cable>().spectralInversion),
168 });
169 break;
170 case TunerFrontendSettings::dvbs:
171 frontendSettings.dvbs({
172 .frequency = static_cast<uint32_t>(
173 settings.get<TunerFrontendSettings::dvbs>().frequency),
174 .modulation = static_cast<FrontendDvbsModulation>(
175 settings.get<TunerFrontendSettings::dvbs>().modulation),
176 .coderate = getDvbsCodeRate(
177 settings.get<TunerFrontendSettings::dvbs>().codeRate),
178 .symbolRate = static_cast<uint32_t>(
179 settings.get<TunerFrontendSettings::dvbs>().symbolRate),
180 .rolloff = static_cast<FrontendDvbsRolloff>(
181 settings.get<TunerFrontendSettings::dvbs>().rolloff),
182 .pilot = static_cast<FrontendDvbsPilot>(
183 settings.get<TunerFrontendSettings::dvbs>().pilot),
184 .inputStreamId = static_cast<uint32_t>(
185 settings.get<TunerFrontendSettings::dvbs>().inputStreamId),
186 .standard = static_cast<FrontendDvbsStandard>(
187 settings.get<TunerFrontendSettings::dvbs>().standard),
188 .vcmMode = static_cast<FrontendDvbsVcmMode>(
189 settings.get<TunerFrontendSettings::dvbs>().vcm),
190 });
191 break;
192 case TunerFrontendSettings::dvbt:
193 frontendSettings.dvbt({
194 .frequency = static_cast<uint32_t>(
195 settings.get<TunerFrontendSettings::dvbt>().frequency),
196 .transmissionMode = static_cast<FrontendDvbtTransmissionMode>(
197 settings.get<TunerFrontendSettings::dvbt>().transmissionMode),
198 .bandwidth = static_cast<FrontendDvbtBandwidth>(
199 settings.get<TunerFrontendSettings::dvbt>().bandwidth),
200 .constellation = static_cast<FrontendDvbtConstellation>(
201 settings.get<TunerFrontendSettings::dvbt>().constellation),
202 .hierarchy = static_cast<FrontendDvbtHierarchy>(
203 settings.get<TunerFrontendSettings::dvbt>().hierarchy),
204 .hpCoderate = static_cast<FrontendDvbtCoderate>(
205 settings.get<TunerFrontendSettings::dvbt>().hpCodeRate),
206 .lpCoderate = static_cast<FrontendDvbtCoderate>(
207 settings.get<TunerFrontendSettings::dvbt>().lpCodeRate),
208 .guardInterval = static_cast<FrontendDvbtGuardInterval>(
209 settings.get<TunerFrontendSettings::dvbt>().guardInterval),
210 .isHighPriority = settings.get<TunerFrontendSettings::dvbt>().isHighPriority,
211 .standard = static_cast<FrontendDvbtStandard>(
212 settings.get<TunerFrontendSettings::dvbt>().standard),
213 .isMiso = settings.get<TunerFrontendSettings::dvbt>().isMiso,
214 .plpMode = static_cast<FrontendDvbtPlpMode>(
215 settings.get<TunerFrontendSettings::dvbt>().plpMode),
216 .plpId = static_cast<uint8_t>(
217 settings.get<TunerFrontendSettings::dvbt>().plpId),
218 .plpGroupId = static_cast<uint8_t>(
219 settings.get<TunerFrontendSettings::dvbt>().plpGroupId),
220 });
221 break;
222 case TunerFrontendSettings::isdbs:
223 frontendSettings.isdbs({
224 .frequency = static_cast<uint32_t>(
225 settings.get<TunerFrontendSettings::isdbs>().frequency),
226 .streamId = static_cast<uint16_t>(
227 settings.get<TunerFrontendSettings::isdbs>().streamId),
228 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
229 settings.get<TunerFrontendSettings::isdbs>().streamIdType),
230 .modulation = static_cast<FrontendIsdbsModulation>(
231 settings.get<TunerFrontendSettings::isdbs>().modulation),
232 .coderate = static_cast<FrontendIsdbsCoderate>(
233 settings.get<TunerFrontendSettings::isdbs>().codeRate),
234 .symbolRate = static_cast<uint32_t>(
235 settings.get<TunerFrontendSettings::isdbs>().symbolRate),
236 .rolloff = static_cast<FrontendIsdbsRolloff>(
237 settings.get<TunerFrontendSettings::isdbs>().rolloff),
238 });
239 break;
240 case TunerFrontendSettings::isdbs3:
241 frontendSettings.isdbs3({
242 .frequency = static_cast<uint32_t>(
243 settings.get<TunerFrontendSettings::isdbs3>().frequency),
244 .streamId = static_cast<uint16_t>(
245 settings.get<TunerFrontendSettings::isdbs3>().streamId),
246 .streamIdType = static_cast<FrontendIsdbsStreamIdType>(
247 settings.get<TunerFrontendSettings::isdbs3>().streamIdType),
248 .modulation = static_cast<FrontendIsdbs3Modulation>(
249 settings.get<TunerFrontendSettings::isdbs3>().modulation),
250 .coderate = static_cast<FrontendIsdbs3Coderate>(
251 settings.get<TunerFrontendSettings::isdbs3>().codeRate),
252 .symbolRate = static_cast<uint32_t>(
253 settings.get<TunerFrontendSettings::isdbs3>().symbolRate),
254 .rolloff = static_cast<FrontendIsdbs3Rolloff>(
255 settings.get<TunerFrontendSettings::isdbs3>().rolloff),
256 });
257 break;
258 case TunerFrontendSettings::isdbt:
259 frontendSettings.isdbt({
260 .frequency = static_cast<uint32_t>(
261 settings.get<TunerFrontendSettings::isdbt>().frequency),
262 .modulation = static_cast<FrontendIsdbtModulation>(
263 settings.get<TunerFrontendSettings::isdbt>().modulation),
264 .bandwidth = static_cast<FrontendIsdbtBandwidth>(
265 settings.get<TunerFrontendSettings::isdbt>().bandwidth),
266 .mode = static_cast<FrontendIsdbtMode>(
267 settings.get<TunerFrontendSettings::isdbt>().mode),
268 .coderate = static_cast<FrontendIsdbtCoderate>(
269 settings.get<TunerFrontendSettings::isdbt>().codeRate),
270 .guardInterval = static_cast<FrontendIsdbtGuardInterval>(
271 settings.get<TunerFrontendSettings::isdbt>().guardInterval),
272 .serviceAreaId = static_cast<uint32_t>(
273 settings.get<TunerFrontendSettings::isdbt>().serviceAreaId),
274 });
275 break;
276 default:
277 break;
278 }
279 Result status = mFrontend->scan(
280 frontendSettings, static_cast<FrontendScanType>(frontendScanType));
281 if (status == Result::SUCCESS) {
282 return Status::ok();
283 }
284
285 return Status::fromServiceSpecificError(static_cast<int32_t>(status));
286}
287
288Status TunerFrontend::stopScan() {
289 return Status::ok();
290}
291
292Status TunerFrontend::setLnb(int /*lnbHandle*/) {
293 return Status::ok();
294}
295
296Status TunerFrontend::setLna(bool /*bEnable*/) {
297 return Status::ok();
298}
299
300Status TunerFrontend::close() {
301 return Status::ok();
302}
303
Amy Zhanga046eee2021-01-12 14:44:58 -0800304Status TunerFrontend::getStatus(const vector<int32_t>& /*statusTypes*/,
305 vector<TunerFrontendStatus>* /*_aidl_return*/) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700306 return Status::ok();
307}
308
Amy Zhangd61491e2021-01-12 16:27:29 -0800309Status TunerFrontend::getFrontendId(int* _aidl_return) {
310 *_aidl_return = mId;
311 return Status::ok();
312}
Amy Zhanga046eee2021-01-12 14:44:58 -0800313
Amy Zhang0f04c452020-10-30 13:36:44 -0700314/////////////// FrontendCallback ///////////////////////
315
316Return<void> TunerFrontend::FrontendCallback::onEvent(FrontendEventType frontendEventType) {
317 ALOGD("FrontendCallback::onEvent, type=%d", frontendEventType);
318 mTunerFrontendCallback->onEvent((int)frontendEventType);
319 return Void();
320}
321
322Return<void> TunerFrontend::FrontendCallback::onScanMessage(
323 FrontendScanMessageType type, const FrontendScanMessage& message) {
324 ALOGD("FrontendCallback::onScanMessage, type=%d", type);
Amy Zhangd61491e2021-01-12 16:27:29 -0800325 TunerFrontendScanMessage scanMessage;
Amy Zhang0f04c452020-10-30 13:36:44 -0700326 switch(type) {
327 case FrontendScanMessageType::LOCKED: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800328 scanMessage.set<TunerFrontendScanMessage::isLocked>(message.isLocked());
Amy Zhang0f04c452020-10-30 13:36:44 -0700329 break;
330 }
331 case FrontendScanMessageType::END: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800332 scanMessage.set<TunerFrontendScanMessage::isEnd>(message.isEnd());
Amy Zhang0f04c452020-10-30 13:36:44 -0700333 break;
334 }
335 case FrontendScanMessageType::PROGRESS_PERCENT: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800336 scanMessage.set<TunerFrontendScanMessage::progressPercent>(message.progressPercent());
Amy Zhang0f04c452020-10-30 13:36:44 -0700337 break;
338 }
339 case FrontendScanMessageType::FREQUENCY: {
340 auto f = message.frequencies();
Amy Zhanga046eee2021-01-12 14:44:58 -0800341 vector<int> frequencies(begin(f), end(f));
Amy Zhangd61491e2021-01-12 16:27:29 -0800342 scanMessage.set<TunerFrontendScanMessage::frequencies>(frequencies);
Amy Zhang0f04c452020-10-30 13:36:44 -0700343 break;
344 }
345 case FrontendScanMessageType::SYMBOL_RATE: {
346 auto s = message.symbolRates();
Amy Zhanga046eee2021-01-12 14:44:58 -0800347 vector<int> symbolRates(begin(s), end(s));
Amy Zhangd61491e2021-01-12 16:27:29 -0800348 scanMessage.set<TunerFrontendScanMessage::symbolRates>(symbolRates);
Amy Zhang0f04c452020-10-30 13:36:44 -0700349 break;
350 }
351 case FrontendScanMessageType::HIERARCHY: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800352 scanMessage.set<TunerFrontendScanMessage::hierarchy>((int)message.hierarchy());
Amy Zhang0f04c452020-10-30 13:36:44 -0700353 break;
354 }
355 case FrontendScanMessageType::ANALOG_TYPE: {
Amy Zhangd61491e2021-01-12 16:27:29 -0800356 scanMessage.set<TunerFrontendScanMessage::analogType>((int)message.analogType());
Amy Zhang0f04c452020-10-30 13:36:44 -0700357 break;
358 }
359 case FrontendScanMessageType::PLP_IDS: {
360 auto p = message.plpIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800361 vector<uint8_t> plpIds(begin(p), end(p));
Amy Zhangd61491e2021-01-12 16:27:29 -0800362 scanMessage.set<TunerFrontendScanMessage::plpIds>(plpIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700363 break;
364 }
365 case FrontendScanMessageType::GROUP_IDS: {
366 auto g = message.groupIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800367 vector<uint8_t> groupIds(begin(g), end(g));
Amy Zhangd61491e2021-01-12 16:27:29 -0800368 scanMessage.set<TunerFrontendScanMessage::groupIds>(groupIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700369 break;
370 }
371 case FrontendScanMessageType::INPUT_STREAM_IDS: {
372 auto i = message.inputStreamIds();
Amy Zhanga046eee2021-01-12 14:44:58 -0800373 vector<char16_t> streamIds(begin(i), end(i));
Amy Zhangd61491e2021-01-12 16:27:29 -0800374 scanMessage.set<TunerFrontendScanMessage::inputStreamIds>(streamIds);
Amy Zhang0f04c452020-10-30 13:36:44 -0700375 break;
376 }
377 case FrontendScanMessageType::STANDARD: {
378 FrontendScanMessage::Standard std = message.std();
379 int standard;
380 if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
381 standard = (int) std.sStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700382 } else if (std.getDiscriminator() ==
383 FrontendScanMessage::Standard::hidl_discriminator::tStd) {
384 standard = (int) std.tStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700385 } else if (std.getDiscriminator() ==
386 FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
387 standard = (int) std.sifStd();
Amy Zhang0f04c452020-10-30 13:36:44 -0700388 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800389 scanMessage.set<TunerFrontendScanMessage::std>(standard);
Amy Zhang0f04c452020-10-30 13:36:44 -0700390 break;
391 }
392 case FrontendScanMessageType::ATSC3_PLP_INFO: {
Amy Zhanga046eee2021-01-12 14:44:58 -0800393 vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
394 vector<TunerFrontendScanAtsc3PlpInfo> tunerPlpInfos;
Amy Zhang0f04c452020-10-30 13:36:44 -0700395 for (int i = 0; i < plpInfos.size(); i++) {
396 auto info = plpInfos[i];
397 int plpId = (int) info.plpId;
398 bool lls = (bool) info.bLlsFlag;
Amy Zhangd61491e2021-01-12 16:27:29 -0800399 TunerFrontendScanAtsc3PlpInfo plpInfo{
Amy Zhang0f04c452020-10-30 13:36:44 -0700400 .plpId = plpId,
401 .llsFlag = lls,
402 };
403 tunerPlpInfos.push_back(plpInfo);
404 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800405 scanMessage.set<TunerFrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
Amy Zhang0f04c452020-10-30 13:36:44 -0700406 break;
407 }
408 default:
409 break;
410 }
Amy Zhangd61491e2021-01-12 16:27:29 -0800411 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
412 return Void();
413}
414
415Return<void> TunerFrontend::FrontendCallback::onScanMessageExt1_1(
416 FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& message) {
417 ALOGD("onScanMessageExt1_1::onScanMessage, type=%d", type);
418 TunerFrontendScanMessage scanMessage;
419 switch(type) {
420 case FrontendScanMessageTypeExt1_1::MODULATION: {
421 FrontendModulation m = message.modulation();
422 int modulation;
423 if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbc) {
424 modulation = (int) m.dvbc();
425 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbt) {
426 modulation = (int) m.dvbt();
427 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dvbs) {
428 modulation = (int) m.dvbs();
429 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs) {
430 modulation = (int) m.isdbs();
431 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbs3) {
432 modulation = (int) m.isdbs3();
433 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::isdbt) {
434 modulation = (int) m.isdbt();
435 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc) {
436 modulation = (int) m.atsc();
437 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::atsc3) {
438 modulation = (int) m.atsc3();
439 } else if (m.getDiscriminator() == FrontendModulation::hidl_discriminator::dtmb) {
440 modulation = (int) m.dtmb();
441 }
442 scanMessage.set<TunerFrontendScanMessage::modulation>(modulation);
443 break;
444 }
445 case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
446 scanMessage.set<TunerFrontendScanMessage::annex>((int)message.annex());
447 break;
448 }
449 case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
450 scanMessage.set<TunerFrontendScanMessage::isHighPriority>(message.isHighPriority());
451 break;
452 }
453 default:
454 break;
455 }
456 mTunerFrontendCallback->onScanMessage((int)type, scanMessage);
Amy Zhang0f04c452020-10-30 13:36:44 -0700457 return Void();
458}
459
Amy Zhanga046eee2021-01-12 14:44:58 -0800460/////////////// TunerFrontend Helper Methods ///////////////////////
Amy Zhang0f04c452020-10-30 13:36:44 -0700461
462hidl_vec<FrontendAtsc3PlpSettings> TunerFrontend::getAtsc3PlpSettings(
463 const TunerFrontendAtsc3Settings& settings) {
464 int len = settings.plpSettings.size();
465 hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
466 // parse PLP settings
467 for (int i = 0; i < len; i++) {
468 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
469 FrontendAtsc3Modulation modulation =
470 static_cast<FrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
471 FrontendAtsc3TimeInterleaveMode interleaveMode =
472 static_cast<FrontendAtsc3TimeInterleaveMode>(
473 settings.plpSettings[i].interleaveMode);
474 FrontendAtsc3CodeRate codeRate =
475 static_cast<FrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
476 FrontendAtsc3Fec fec =
477 static_cast<FrontendAtsc3Fec>(settings.plpSettings[i].fec);
478 FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
479 .plpId = plpId,
480 .modulation = modulation,
481 .interleaveMode = interleaveMode,
482 .codeRate = codeRate,
483 .fec = fec,
484 };
485 plps[i] = frontendAtsc3PlpSettings;
486 }
487 return plps;
488}
489
490FrontendDvbsCodeRate TunerFrontend::getDvbsCodeRate(const TunerFrontendDvbsCodeRate& codeRate) {
491 FrontendInnerFec innerFec = static_cast<FrontendInnerFec>(codeRate.fec);
492 bool isLinear = codeRate.isLinear;
493 bool isShortFrames = codeRate.isShortFrames;
494 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
495 FrontendDvbsCodeRate coderate {
496 .fec = innerFec,
497 .isLinear = isLinear,
498 .isShortFrames = isShortFrames,
499 .bitsPer1000Symbol = bitsPer1000Symbol,
500 };
501 return coderate;
502}
503} // namespace android