blob: bbfc90fb1945c907483338726e0334b682f75ec3 [file] [log] [blame]
Hongguang093c5f32021-08-09 19:46:34 -07001/**
2 * Copyright 2021, 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_NDEBUG 0
18#define LOG_TAG "TunerHidlFrontend"
19
20#include "TunerHidlFrontend.h"
21
22#include <aidl/android/hardware/tv/tuner/Result.h>
23
24#include "TunerHidlLnb.h"
25
26using ::aidl::android::hardware::tv::tuner::FrontendAnalogSettings;
27using ::aidl::android::hardware::tv::tuner::FrontendAnalogSifStandard;
28using ::aidl::android::hardware::tv::tuner::FrontendAnalogType;
29using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Bandwidth;
30using ::aidl::android::hardware::tv::tuner::FrontendAtsc3CodeRate;
31using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Fec;
32using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Modulation;
33using ::aidl::android::hardware::tv::tuner::FrontendAtsc3PlpSettings;
34using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Settings;
35using ::aidl::android::hardware::tv::tuner::FrontendAtsc3TimeInterleaveMode;
36using ::aidl::android::hardware::tv::tuner::FrontendAtscModulation;
37using ::aidl::android::hardware::tv::tuner::FrontendAtscSettings;
38using ::aidl::android::hardware::tv::tuner::FrontendBandwidth;
39using ::aidl::android::hardware::tv::tuner::FrontendCableTimeInterleaveMode;
40using ::aidl::android::hardware::tv::tuner::FrontendDtmbBandwidth;
41using ::aidl::android::hardware::tv::tuner::FrontendDtmbGuardInterval;
42using ::aidl::android::hardware::tv::tuner::FrontendDtmbModulation;
43using ::aidl::android::hardware::tv::tuner::FrontendDtmbSettings;
44using ::aidl::android::hardware::tv::tuner::FrontendDtmbTimeInterleaveMode;
45using ::aidl::android::hardware::tv::tuner::FrontendDtmbTransmissionMode;
46using ::aidl::android::hardware::tv::tuner::FrontendDvbcAnnex;
47using ::aidl::android::hardware::tv::tuner::FrontendDvbcBandwidth;
48using ::aidl::android::hardware::tv::tuner::FrontendDvbcModulation;
49using ::aidl::android::hardware::tv::tuner::FrontendDvbcSettings;
50using ::aidl::android::hardware::tv::tuner::FrontendDvbsModulation;
51using ::aidl::android::hardware::tv::tuner::FrontendDvbsRolloff;
52using ::aidl::android::hardware::tv::tuner::FrontendDvbsSettings;
53using ::aidl::android::hardware::tv::tuner::FrontendDvbsStandard;
54using ::aidl::android::hardware::tv::tuner::FrontendDvbtBandwidth;
55using ::aidl::android::hardware::tv::tuner::FrontendDvbtConstellation;
56using ::aidl::android::hardware::tv::tuner::FrontendDvbtGuardInterval;
57using ::aidl::android::hardware::tv::tuner::FrontendDvbtHierarchy;
58using ::aidl::android::hardware::tv::tuner::FrontendDvbtSettings;
59using ::aidl::android::hardware::tv::tuner::FrontendDvbtStandard;
60using ::aidl::android::hardware::tv::tuner::FrontendDvbtTransmissionMode;
61using ::aidl::android::hardware::tv::tuner::FrontendGuardInterval;
62using ::aidl::android::hardware::tv::tuner::FrontendInnerFec;
63using ::aidl::android::hardware::tv::tuner::FrontendInterleaveMode;
64using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Modulation;
65using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Rolloff;
66using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Settings;
67using ::aidl::android::hardware::tv::tuner::FrontendIsdbsModulation;
68using ::aidl::android::hardware::tv::tuner::FrontendIsdbsRolloff;
69using ::aidl::android::hardware::tv::tuner::FrontendIsdbsSettings;
70using ::aidl::android::hardware::tv::tuner::FrontendIsdbtBandwidth;
71using ::aidl::android::hardware::tv::tuner::FrontendIsdbtCoderate;
72using ::aidl::android::hardware::tv::tuner::FrontendIsdbtGuardInterval;
73using ::aidl::android::hardware::tv::tuner::FrontendIsdbtMode;
74using ::aidl::android::hardware::tv::tuner::FrontendIsdbtModulation;
75using ::aidl::android::hardware::tv::tuner::FrontendIsdbtSettings;
76using ::aidl::android::hardware::tv::tuner::FrontendModulation;
77using ::aidl::android::hardware::tv::tuner::FrontendModulationStatus;
78using ::aidl::android::hardware::tv::tuner::FrontendRollOff;
79using ::aidl::android::hardware::tv::tuner::FrontendScanAtsc3PlpInfo;
80using ::aidl::android::hardware::tv::tuner::FrontendScanMessageStandard;
81using ::aidl::android::hardware::tv::tuner::FrontendSpectralInversion;
82using ::aidl::android::hardware::tv::tuner::FrontendStatusAtsc3PlpInfo;
83using ::aidl::android::hardware::tv::tuner::FrontendTransmissionMode;
84using ::aidl::android::hardware::tv::tuner::Result;
85
86using HidlFrontendStatusAtsc3PlpInfo =
87 ::aidl::android::hardware::tv::tuner::FrontendStatusAtsc3PlpInfo;
88using HidlFrontendAnalogSifStandard =
89 ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
90using HidlFrontendAnalogType = ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
91using HidlFrontendAtscModulation = ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
92using HidlFrontendAtsc3Bandwidth = ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
93using HidlFrontendAtsc3CodeRate = ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
94using HidlFrontendAtsc3DemodOutputFormat =
95 ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
96using HidlFrontendAtsc3Fec = ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
97using HidlFrontendAtsc3Modulation = ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
98using HidlFrontendAtsc3TimeInterleaveMode =
99 ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
100using HidlFrontendDvbcAnnex = ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
101using HidlFrontendDvbcModulation = ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
102using HidlFrontendDvbcOuterFec = ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
103using HidlFrontendDvbcSpectralInversion =
104 ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
105using HidlFrontendDvbsModulation = ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
106using HidlFrontendDvbsPilot = ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
107using HidlFrontendDvbsRolloff = ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
108using HidlFrontendDvbsSettings = ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
109using HidlFrontendDvbsStandard = ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
110using HidlFrontendDvbsVcmMode = ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
111using HidlFrontendDvbtBandwidth = ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
112using HidlFrontendDvbtCoderate = ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
113using HidlFrontendDvbtConstellation =
114 ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
115using HidlFrontendDvbtGuardInterval =
116 ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
117using HidlFrontendDvbtHierarchy = ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
118using HidlFrontendDvbtPlpMode = ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
119using HidlFrontendDvbtSettings = ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
120using HidlFrontendDvbtStandard = ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
121using HidlFrontendDvbtTransmissionMode =
122 ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
123using HidlFrontendInnerFec = ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
124using HidlFrontendIsdbs3Coderate = ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
125using HidlFrontendIsdbs3Modulation = ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
126using HidlFrontendIsdbs3Rolloff = ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
127using HidlFrontendIsdbs3Settings = ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
128using HidlFrontendIsdbsCoderate = ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
129using HidlFrontendIsdbsModulation = ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
130using HidlFrontendIsdbsRolloff = ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
131using HidlFrontendIsdbsSettings = ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
132using HidlFrontendIsdbsStreamIdType =
133 ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
134using HidlFrontendIsdbtBandwidth = ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
135using HidlFrontendIsdbtCoderate = ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
136using HidlFrontendIsdbtGuardInterval =
137 ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
138using HidlFrontendIsdbtMode = ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
139using HidlFrontendIsdbtModulation = ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
140using HidlFrontendIsdbtSettings = ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
141using HidlFrontendModulationStatus = ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
142using HidlFrontendScanAtsc3PlpInfo = ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
143using HidlFrontendScanType = ::android::hardware::tv::tuner::V1_0::FrontendScanType;
144using HidlFrontendStatusType = ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
145using HidlResult = ::android::hardware::tv::tuner::V1_0::Result;
146using HidlFrontendAnalogAftFlag = ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
147using HidlFrontendBandwidth = ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
148using HidlFrontendCableTimeInterleaveMode =
149 ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
150using HidlFrontendDvbcBandwidth = ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
151using HidlFrontendDtmbBandwidth = ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
152using HidlFrontendDtmbCodeRate = ::android::hardware::tv::tuner::V1_1::FrontendDtmbCodeRate;
153using HidlFrontendDtmbGuardInterval =
154 ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
155using HidlFrontendDtmbModulation = ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
156using HidlFrontendDtmbTimeInterleaveMode =
157 ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
158using HidlFrontendDtmbTransmissionMode =
159 ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
160using HidlFrontendDvbsScanType = ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
161using HidlFrontendGuardInterval = ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
162using HidlFrontendInterleaveMode = ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
163using HidlFrontendModulation = ::android::hardware::tv::tuner::V1_1::FrontendModulation;
164using HidlFrontendRollOff = ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
165using HidlFrontendTransmissionMode = ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
166using HidlFrontendSpectralInversion =
167 ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
168using HidlFrontendStatusTypeExt1_1 = ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
169
170using namespace std;
171
172namespace aidl {
173namespace android {
174namespace media {
175namespace tv {
176namespace tuner {
177
178TunerHidlFrontend::TunerHidlFrontend(sp<HidlIFrontend> frontend, int id) {
179 mFrontend = frontend;
180 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
181 mId = id;
182}
183
184TunerHidlFrontend::~TunerHidlFrontend() {
185 mFrontend = nullptr;
186 mFrontend_1_1 = nullptr;
187 mId = -1;
188}
189
190::ndk::ScopedAStatus TunerHidlFrontend::setCallback(
191 const shared_ptr<ITunerFrontendCallback>& tunerFrontendCallback) {
192 if (mFrontend == nullptr) {
193 ALOGE("IFrontend is not initialized");
194 return ::ndk::ScopedAStatus::fromServiceSpecificError(
195 static_cast<int32_t>(Result::UNAVAILABLE));
196 }
197
198 if (tunerFrontendCallback == nullptr) {
199 return ::ndk::ScopedAStatus::fromServiceSpecificError(
200 static_cast<int32_t>(Result::INVALID_ARGUMENT));
201 }
202
203 sp<HidlIFrontendCallback> frontendCallback = new FrontendCallback(tunerFrontendCallback);
204 HidlResult status = mFrontend->setCallback(frontendCallback);
205 if (status == HidlResult::SUCCESS) {
206 return ::ndk::ScopedAStatus::ok();
207 }
208
209 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
210}
211
212::ndk::ScopedAStatus TunerHidlFrontend::tune(const FrontendSettings& settings) {
213 if (mFrontend == nullptr) {
214 ALOGE("IFrontend is not initialized");
215 return ::ndk::ScopedAStatus::fromServiceSpecificError(
216 static_cast<int32_t>(Result::UNAVAILABLE));
217 }
218
219 HidlResult status;
220 HidlFrontendSettings frontendSettings;
221 HidlFrontendSettingsExt1_1 frontendSettingsExt;
222 getHidlFrontendSettings(settings, frontendSettings, frontendSettingsExt);
223 if (mFrontend_1_1 != nullptr) {
224 status = mFrontend_1_1->tune_1_1(frontendSettings, frontendSettingsExt);
225 } else {
226 status = mFrontend->tune(frontendSettings);
227 }
228 if (status == HidlResult::SUCCESS) {
229 return ::ndk::ScopedAStatus::ok();
230 }
231
232 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
233}
234
235::ndk::ScopedAStatus TunerHidlFrontend::stopTune() {
236 if (mFrontend == nullptr) {
237 ALOGD("IFrontend is not initialized");
238 return ::ndk::ScopedAStatus::fromServiceSpecificError(
239 static_cast<int32_t>(Result::UNAVAILABLE));
240 }
241
242 HidlResult status = mFrontend->stopTune();
243 if (status == HidlResult::SUCCESS) {
244 return ::ndk::ScopedAStatus::ok();
245 }
246
247 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
248}
249
250::ndk::ScopedAStatus TunerHidlFrontend::scan(const FrontendSettings& settings,
251 FrontendScanType frontendScanType) {
252 if (mFrontend == nullptr) {
253 ALOGD("IFrontend is not initialized");
254 return ::ndk::ScopedAStatus::fromServiceSpecificError(
255 static_cast<int32_t>(Result::UNAVAILABLE));
256 }
257
258 HidlResult status;
259 HidlFrontendSettings frontendSettings;
260 HidlFrontendSettingsExt1_1 frontendSettingsExt;
261 getHidlFrontendSettings(settings, frontendSettings, frontendSettingsExt);
262 if (mFrontend_1_1 != nullptr) {
263 status = mFrontend_1_1->scan_1_1(frontendSettings,
264 static_cast<HidlFrontendScanType>(frontendScanType),
265 frontendSettingsExt);
266 } else {
267 status = mFrontend->scan(frontendSettings,
268 static_cast<HidlFrontendScanType>(frontendScanType));
269 }
270 if (status == HidlResult::SUCCESS) {
271 return ::ndk::ScopedAStatus::ok();
272 }
273
274 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
275}
276
277::ndk::ScopedAStatus TunerHidlFrontend::stopScan() {
278 if (mFrontend == nullptr) {
279 ALOGD("IFrontend is not initialized");
280 return ::ndk::ScopedAStatus::fromServiceSpecificError(
281 static_cast<int32_t>(Result::UNAVAILABLE));
282 }
283
284 HidlResult status = mFrontend->stopScan();
285 if (status == HidlResult::SUCCESS) {
286 return ::ndk::ScopedAStatus::ok();
287 }
288
289 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
290}
291
292::ndk::ScopedAStatus TunerHidlFrontend::setLnb(const shared_ptr<ITunerLnb>& lnb) {
293 if (mFrontend == nullptr) {
294 ALOGD("IFrontend is not initialized");
295 return ::ndk::ScopedAStatus::fromServiceSpecificError(
296 static_cast<int32_t>(Result::UNAVAILABLE));
297 }
298
299 if (lnb == nullptr) {
300 return ::ndk::ScopedAStatus::fromServiceSpecificError(
301 static_cast<int32_t>(Result::INVALID_ARGUMENT));
302 }
303
304 HidlResult status = mFrontend->setLnb(static_cast<TunerHidlLnb*>(lnb.get())->getId());
305 if (status == HidlResult::SUCCESS) {
306 return ::ndk::ScopedAStatus::ok();
307 }
308
309 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
310}
311
312::ndk::ScopedAStatus TunerHidlFrontend::setLna(bool bEnable) {
313 if (mFrontend == nullptr) {
314 ALOGD("IFrontend is not initialized");
315 return ::ndk::ScopedAStatus::fromServiceSpecificError(
316 static_cast<int32_t>(Result::UNAVAILABLE));
317 }
318
319 HidlResult status = mFrontend->setLna(bEnable);
320 if (status == HidlResult::SUCCESS) {
321 return ::ndk::ScopedAStatus::ok();
322 }
323
324 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
325}
326
327::ndk::ScopedAStatus TunerHidlFrontend::linkCiCamToFrontend(int32_t ciCamId,
328 int32_t* _aidl_return) {
329 if (mFrontend_1_1 == nullptr) {
330 ALOGD("IFrontend_1_1 is not initialized");
331 return ::ndk::ScopedAStatus::fromServiceSpecificError(
332 static_cast<int32_t>(Result::UNAVAILABLE));
333 }
334
335 int ltsId;
336 HidlResult status;
337 mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId), [&](HidlResult r, uint32_t id) {
338 status = r;
339 ltsId = id;
340 });
341
342 if (status == HidlResult::SUCCESS) {
343 *_aidl_return = ltsId;
344 return ::ndk::ScopedAStatus::ok();
345 }
346
347 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
348}
349
350::ndk::ScopedAStatus TunerHidlFrontend::unlinkCiCamToFrontend(int32_t ciCamId) {
351 if (mFrontend_1_1 == nullptr) {
352 ALOGD("IFrontend_1_1 is not initialized");
353 return ::ndk::ScopedAStatus::fromServiceSpecificError(
354 static_cast<int32_t>(Result::UNAVAILABLE));
355 }
356
357 HidlResult status = mFrontend_1_1->unlinkCiCam(ciCamId);
358 if (status == HidlResult::SUCCESS) {
359 return ::ndk::ScopedAStatus::ok();
360 }
361
362 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
363}
364
365::ndk::ScopedAStatus TunerHidlFrontend::close() {
366 if (mFrontend == nullptr) {
367 ALOGD("IFrontend is not initialized");
368 return ::ndk::ScopedAStatus::fromServiceSpecificError(
369 static_cast<int32_t>(Result::UNAVAILABLE));
370 }
371
372 HidlResult status = mFrontend->close();
373 mFrontend = nullptr;
374 mFrontend_1_1 = nullptr;
375
376 if (status != HidlResult::SUCCESS) {
377 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(status));
378 }
379
380 return ::ndk::ScopedAStatus::ok();
381}
382
383::ndk::ScopedAStatus TunerHidlFrontend::getStatus(const vector<FrontendStatusType>& in_statusTypes,
384 vector<FrontendStatus>* _aidl_return) {
385 if (mFrontend == nullptr) {
386 ALOGD("IFrontend is not initialized");
387 return ::ndk::ScopedAStatus::fromServiceSpecificError(
388 static_cast<int32_t>(Result::UNAVAILABLE));
389 }
390
391 HidlResult res;
392 vector<HidlFrontendStatus> status;
393 vector<HidlFrontendStatusExt1_1> statusExt;
394 vector<HidlFrontendStatusType> types;
395 vector<HidlFrontendStatusTypeExt1_1> typesExt;
396 for (auto s : in_statusTypes) {
397 if (static_cast<int32_t>(s) <=
398 static_cast<int32_t>(HidlFrontendStatusType::ATSC3_PLP_INFO)) {
399 types.push_back(static_cast<HidlFrontendStatusType>(s));
400 } else {
401 typesExt.push_back(static_cast<HidlFrontendStatusTypeExt1_1>(s));
402 }
403 }
404
405 mFrontend->getStatus(types, [&](HidlResult r, const hidl_vec<HidlFrontendStatus>& ss) {
406 res = r;
407 for (auto s : ss) {
408 status.push_back(s);
409 }
410 });
411 if (res != HidlResult::SUCCESS) {
412 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
413 }
414
415 if (mFrontend_1_1 != nullptr) {
416 mFrontend_1_1->getStatusExt1_1(
417 typesExt, [&](HidlResult r, const hidl_vec<HidlFrontendStatusExt1_1>& ss) {
418 res = r;
419 for (auto s : ss) {
420 statusExt.push_back(s);
421 }
422 });
423 if (res != HidlResult::SUCCESS) {
424 return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
425 }
426 }
427
428 getAidlFrontendStatus(status, statusExt, *_aidl_return);
429 return ::ndk::ScopedAStatus::ok();
430}
431
432::ndk::ScopedAStatus TunerHidlFrontend::getFrontendId(int32_t* _aidl_return) {
433 *_aidl_return = mId;
434 return ::ndk::ScopedAStatus::ok();
435}
436
437/////////////// FrontendCallback ///////////////////////
438Return<void> TunerHidlFrontend::FrontendCallback::onEvent(HidlFrontendEventType frontendEventType) {
439 ALOGV("FrontendCallback::onEvent, type=%d", frontendEventType);
440 mTunerFrontendCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
441 return Void();
442}
443
444Return<void> TunerHidlFrontend::FrontendCallback::onScanMessage(
445 HidlFrontendScanMessageType type, const HidlFrontendScanMessage& message) {
446 ALOGV("FrontendCallback::onScanMessage, type=%d", type);
447 FrontendScanMessage scanMessage;
448 switch (type) {
449 case HidlFrontendScanMessageType::LOCKED: {
450 scanMessage.set<FrontendScanMessage::isLocked>(message.isLocked());
451 break;
452 }
453 case HidlFrontendScanMessageType::END: {
454 scanMessage.set<FrontendScanMessage::isEnd>(message.isEnd());
455 break;
456 }
457 case HidlFrontendScanMessageType::PROGRESS_PERCENT: {
458 scanMessage.set<FrontendScanMessage::progressPercent>(message.progressPercent());
459 break;
460 }
461 case HidlFrontendScanMessageType::FREQUENCY: {
462 const vector<uint32_t>& f = message.frequencies();
463 vector<int64_t> lf(begin(f), end(f));
464 scanMessage.set<FrontendScanMessage::frequencies>(lf);
465 break;
466 }
467 case HidlFrontendScanMessageType::SYMBOL_RATE: {
468 const vector<uint32_t>& s = message.symbolRates();
469 vector<int32_t> symbolRates(begin(s), end(s));
470 scanMessage.set<FrontendScanMessage::symbolRates>(symbolRates);
471 break;
472 }
473 case HidlFrontendScanMessageType::HIERARCHY: {
474 scanMessage.set<FrontendScanMessage::hierarchy>(
475 static_cast<FrontendDvbtHierarchy>(message.hierarchy()));
476 break;
477 }
478 case HidlFrontendScanMessageType::ANALOG_TYPE: {
479 scanMessage.set<FrontendScanMessage::analogType>(
480 static_cast<FrontendAnalogType>(message.analogType()));
481 break;
482 }
483 case HidlFrontendScanMessageType::PLP_IDS: {
484 const vector<uint8_t>& p = message.plpIds();
485 vector<int32_t> plpIds(begin(p), end(p));
486 scanMessage.set<FrontendScanMessage::plpIds>(plpIds);
487 break;
488 }
489 case HidlFrontendScanMessageType::GROUP_IDS: {
490 const vector<uint8_t>& g = message.groupIds();
491 vector<int32_t> groupIds(begin(g), end(g));
492 scanMessage.set<FrontendScanMessage::groupIds>(groupIds);
493 break;
494 }
495 case HidlFrontendScanMessageType::INPUT_STREAM_IDS: {
496 const vector<uint16_t>& i = message.inputStreamIds();
497 vector<int32_t> streamIds(begin(i), end(i));
498 scanMessage.set<FrontendScanMessage::inputStreamIds>(streamIds);
499 break;
500 }
501 case HidlFrontendScanMessageType::STANDARD: {
502 const HidlFrontendScanMessage::Standard& std = message.std();
503 FrontendScanMessageStandard standard;
504 if (std.getDiscriminator() == HidlFrontendScanMessage::Standard::hidl_discriminator::sStd) {
505 standard.set<FrontendScanMessageStandard::sStd>(
506 static_cast<FrontendDvbsStandard>(std.sStd()));
507 } else if (std.getDiscriminator() ==
508 HidlFrontendScanMessage::Standard::hidl_discriminator::tStd) {
509 standard.set<FrontendScanMessageStandard::tStd>(
510 static_cast<FrontendDvbtStandard>(std.tStd()));
511 } else if (std.getDiscriminator() ==
512 HidlFrontendScanMessage::Standard::hidl_discriminator::sifStd) {
513 standard.set<FrontendScanMessageStandard::sifStd>(
514 static_cast<FrontendAnalogSifStandard>(std.sifStd()));
515 }
516 scanMessage.set<FrontendScanMessage::std>(standard);
517 break;
518 }
519 case HidlFrontendScanMessageType::ATSC3_PLP_INFO: {
520 const vector<HidlFrontendScanAtsc3PlpInfo>& plpInfos = message.atsc3PlpInfos();
521 vector<FrontendScanAtsc3PlpInfo> tunerPlpInfos;
522 for (int i = 0; i < plpInfos.size(); i++) {
523 FrontendScanAtsc3PlpInfo plpInfo{
524 .plpId = static_cast<int32_t>(plpInfos[i].plpId),
525 .bLlsFlag = plpInfos[i].bLlsFlag,
526 };
527 tunerPlpInfos.push_back(plpInfo);
528 }
529 scanMessage.set<FrontendScanMessage::atsc3PlpInfos>(tunerPlpInfos);
530 break;
531 }
532 default:
533 break;
534 }
535 mTunerFrontendCallback->onScanMessage(static_cast<FrontendScanMessageType>(type), scanMessage);
536 return Void();
537}
538
539Return<void> TunerHidlFrontend::FrontendCallback::onScanMessageExt1_1(
540 HidlFrontendScanMessageTypeExt1_1 type, const HidlFrontendScanMessageExt1_1& message) {
541 ALOGV("onScanMessageExt1_1::onScanMessage, type=%d", type);
542 FrontendScanMessage scanMessage;
543 switch (type) {
544 case HidlFrontendScanMessageTypeExt1_1::MODULATION: {
545 HidlFrontendModulation m = message.modulation();
546 FrontendModulation modulation;
547 switch (m.getDiscriminator()) {
548 case HidlFrontendModulation::hidl_discriminator::dvbc: {
549 modulation.set<FrontendModulation::dvbc>(static_cast<FrontendDvbcModulation>(m.dvbc()));
550 break;
551 }
552 case HidlFrontendModulation::hidl_discriminator::dvbt: {
553 modulation.set<FrontendModulation::dvbt>(
554 static_cast<FrontendDvbtConstellation>(m.dvbt()));
555 break;
556 }
557 case HidlFrontendModulation::hidl_discriminator::dvbs: {
558 modulation.set<FrontendModulation::dvbs>(static_cast<FrontendDvbsModulation>(m.dvbs()));
559 break;
560 }
561 case HidlFrontendModulation::hidl_discriminator::isdbs: {
562 modulation.set<FrontendModulation::isdbs>(
563 static_cast<FrontendIsdbsModulation>(m.isdbs()));
564 break;
565 }
566 case HidlFrontendModulation::hidl_discriminator::isdbs3: {
567 modulation.set<FrontendModulation::isdbs3>(
568 static_cast<FrontendIsdbs3Modulation>(m.isdbs3()));
569 break;
570 }
571 case HidlFrontendModulation::hidl_discriminator::isdbt: {
572 modulation.set<FrontendModulation::isdbt>(
573 static_cast<FrontendIsdbtModulation>(m.isdbt()));
574 break;
575 }
576 case HidlFrontendModulation::hidl_discriminator::atsc: {
577 modulation.set<FrontendModulation::atsc>(static_cast<FrontendAtscModulation>(m.atsc()));
578 break;
579 }
580 case HidlFrontendModulation::hidl_discriminator::atsc3: {
581 modulation.set<FrontendModulation::atsc3>(
582 static_cast<FrontendAtsc3Modulation>(m.atsc3()));
583 break;
584 }
585 case HidlFrontendModulation::hidl_discriminator::dtmb: {
586 modulation.set<FrontendModulation::dtmb>(static_cast<FrontendDtmbModulation>(m.dtmb()));
587 break;
588 }
589 }
590 scanMessage.set<FrontendScanMessage::modulation>(modulation);
591 break;
592 }
593 case HidlFrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
594 scanMessage.set<FrontendScanMessage::annex>(
595 static_cast<FrontendDvbcAnnex>(message.annex()));
596 break;
597 }
598 case HidlFrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
599 scanMessage.set<FrontendScanMessage::isHighPriority>(message.isHighPriority());
600 break;
601 }
602 default: {
603 break;
604 }
605 }
606 mTunerFrontendCallback->onScanMessage(static_cast<FrontendScanMessageType>(type), scanMessage);
607 return Void();
608}
609
610/////////////// TunerHidlFrontend Helper Methods ///////////////////////
611void TunerHidlFrontend::getAidlFrontendStatus(const vector<HidlFrontendStatus>& hidlStatus,
612 const vector<HidlFrontendStatusExt1_1>& hidlStatusExt,
613 vector<FrontendStatus>& aidlStatus) {
614 for (HidlFrontendStatus s : hidlStatus) {
615 FrontendStatus status;
616 switch (s.getDiscriminator()) {
617 case HidlFrontendStatus::hidl_discriminator::isDemodLocked: {
618 status.set<FrontendStatus::isDemodLocked>(s.isDemodLocked());
619 aidlStatus.push_back(status);
620 break;
621 }
622 case HidlFrontendStatus::hidl_discriminator::snr: {
623 status.set<FrontendStatus::snr>((int)s.snr());
624 aidlStatus.push_back(status);
625 break;
626 }
627 case HidlFrontendStatus::hidl_discriminator::ber: {
628 status.set<FrontendStatus::ber>((int)s.ber());
629 aidlStatus.push_back(status);
630 break;
631 }
632 case HidlFrontendStatus::hidl_discriminator::per: {
633 status.set<FrontendStatus::per>((int)s.per());
634 aidlStatus.push_back(status);
635 break;
636 }
637 case HidlFrontendStatus::hidl_discriminator::preBer: {
638 status.set<FrontendStatus::preBer>((int)s.preBer());
639 aidlStatus.push_back(status);
640 break;
641 }
642 case HidlFrontendStatus::hidl_discriminator::signalQuality: {
643 status.set<FrontendStatus::signalQuality>((int)s.signalQuality());
644 aidlStatus.push_back(status);
645 break;
646 }
647 case HidlFrontendStatus::hidl_discriminator::signalStrength: {
648 status.set<FrontendStatus::signalStrength>((int)s.signalStrength());
649 aidlStatus.push_back(status);
650 break;
651 }
652 case HidlFrontendStatus::hidl_discriminator::symbolRate: {
653 status.set<FrontendStatus::symbolRate>((int)s.symbolRate());
654 aidlStatus.push_back(status);
655 break;
656 }
657 case HidlFrontendStatus::hidl_discriminator::innerFec: {
658 status.set<FrontendStatus::innerFec>(static_cast<FrontendInnerFec>(s.innerFec()));
659 aidlStatus.push_back(status);
660 break;
661 }
662 case HidlFrontendStatus::hidl_discriminator::modulation: {
663 FrontendModulationStatus modulationStatus;
664 switch (s.modulation().getDiscriminator()) {
665 case HidlFrontendModulationStatus::hidl_discriminator::dvbc:
666 modulationStatus.set<FrontendModulationStatus::dvbc>(
667 static_cast<FrontendDvbcModulation>(s.modulation().dvbc()));
668 break;
669 case HidlFrontendModulationStatus::hidl_discriminator::dvbs:
670 modulationStatus.set<FrontendModulationStatus::dvbs>(
671 static_cast<FrontendDvbsModulation>(s.modulation().dvbs()));
672 break;
673 case HidlFrontendModulationStatus::hidl_discriminator::isdbs:
674 modulationStatus.set<FrontendModulationStatus::isdbs>(
675 static_cast<FrontendIsdbsModulation>(s.modulation().isdbs()));
676 break;
677 case HidlFrontendModulationStatus::hidl_discriminator::isdbs3:
678 modulationStatus.set<FrontendModulationStatus::isdbs3>(
679 static_cast<FrontendIsdbs3Modulation>(s.modulation().isdbs3()));
680 break;
681 case HidlFrontendModulationStatus::hidl_discriminator::isdbt:
682 modulationStatus.set<FrontendModulationStatus::isdbt>(
683 static_cast<FrontendIsdbtModulation>(s.modulation().isdbt()));
684 break;
685 }
686 status.set<FrontendStatus::modulationStatus>(modulationStatus);
687 aidlStatus.push_back(status);
688 break;
689 }
690 case HidlFrontendStatus::hidl_discriminator::inversion: {
691 status.set<FrontendStatus::inversion>(
692 static_cast<FrontendSpectralInversion>(s.inversion()));
693 aidlStatus.push_back(status);
694 break;
695 }
696 case HidlFrontendStatus::hidl_discriminator::lnbVoltage: {
697 status.set<FrontendStatus::lnbVoltage>(static_cast<LnbVoltage>(s.lnbVoltage()));
698 aidlStatus.push_back(status);
699 break;
700 }
701 case HidlFrontendStatus::hidl_discriminator::plpId: {
702 status.set<FrontendStatus::plpId>((int32_t)s.plpId());
703 aidlStatus.push_back(status);
704 break;
705 }
706 case HidlFrontendStatus::hidl_discriminator::isEWBS: {
707 status.set<FrontendStatus::isEWBS>(s.isEWBS());
708 aidlStatus.push_back(status);
709 break;
710 }
711 case HidlFrontendStatus::hidl_discriminator::agc: {
712 status.set<FrontendStatus::agc>((int32_t)s.agc());
713 aidlStatus.push_back(status);
714 break;
715 }
716 case HidlFrontendStatus::hidl_discriminator::isLnaOn: {
717 status.set<FrontendStatus::isLnaOn>(s.isLnaOn());
718 aidlStatus.push_back(status);
719 break;
720 }
721 case HidlFrontendStatus::hidl_discriminator::isLayerError: {
722 vector<bool> e(s.isLayerError().begin(), s.isLayerError().end());
723 status.set<FrontendStatus::isLayerError>(e);
724 aidlStatus.push_back(status);
725 break;
726 }
727 case HidlFrontendStatus::hidl_discriminator::mer: {
728 status.set<FrontendStatus::mer>(static_cast<int32_t>(s.mer()));
729 aidlStatus.push_back(status);
730 break;
731 }
732 case HidlFrontendStatus::hidl_discriminator::freqOffset: {
733 status.set<FrontendStatus::freqOffset>(static_cast<int64_t>(s.freqOffset()));
734 aidlStatus.push_back(status);
735 break;
736 }
737 case HidlFrontendStatus::hidl_discriminator::hierarchy: {
738 status.set<FrontendStatus::hierarchy>(
739 static_cast<FrontendDvbtHierarchy>(s.hierarchy()));
740 aidlStatus.push_back(status);
741 break;
742 }
743 case HidlFrontendStatus::hidl_discriminator::isRfLocked: {
744 status.set<FrontendStatus::isRfLocked>(s.isRfLocked());
745 aidlStatus.push_back(status);
746 break;
747 }
748 case HidlFrontendStatus::hidl_discriminator::plpInfo: {
749 vector<FrontendStatusAtsc3PlpInfo> info;
750 for (auto i : s.plpInfo()) {
751 info.push_back({
752 .plpId = static_cast<int32_t>(i.plpId),
753 .isLocked = i.isLocked,
754 .uec = static_cast<int32_t>(i.uec),
755 });
756 }
757 status.set<FrontendStatus::plpInfo>(info);
758 aidlStatus.push_back(status);
759 break;
760 }
761 }
762 }
763
764 for (HidlFrontendStatusExt1_1 s : hidlStatusExt) {
765 FrontendStatus status;
766 switch (s.getDiscriminator()) {
767 case HidlFrontendStatusExt1_1::hidl_discriminator::modulations: {
768 vector<FrontendModulation> aidlMod;
769 for (auto m : s.modulations()) {
770 switch (m.getDiscriminator()) {
771 case HidlFrontendModulation::hidl_discriminator::dvbc:
772 aidlMod.push_back(static_cast<FrontendDvbcModulation>(m.dvbc()));
773 break;
774 case HidlFrontendModulation::hidl_discriminator::dvbs:
775 aidlMod.push_back(static_cast<FrontendDvbsModulation>(m.dvbs()));
776 break;
777 case HidlFrontendModulation::hidl_discriminator::dvbt:
778 aidlMod.push_back(static_cast<FrontendDvbtConstellation>(m.dvbt()));
779 break;
780 case HidlFrontendModulation::hidl_discriminator::isdbs:
781 aidlMod.push_back(static_cast<FrontendIsdbsModulation>(m.isdbs()));
782 break;
783 case HidlFrontendModulation::hidl_discriminator::isdbs3:
784 aidlMod.push_back(static_cast<FrontendIsdbs3Modulation>(m.isdbs3()));
785 break;
786 case HidlFrontendModulation::hidl_discriminator::isdbt:
787 aidlMod.push_back(static_cast<FrontendIsdbtModulation>(m.isdbt()));
788 break;
789 case HidlFrontendModulation::hidl_discriminator::atsc:
790 aidlMod.push_back(static_cast<FrontendAtscModulation>(m.atsc()));
791 break;
792 case HidlFrontendModulation::hidl_discriminator::atsc3:
793 aidlMod.push_back(static_cast<FrontendAtsc3Modulation>(m.atsc3()));
794 break;
795 case HidlFrontendModulation::hidl_discriminator::dtmb:
796 aidlMod.push_back(static_cast<FrontendDtmbModulation>(m.dtmb()));
797 break;
798 }
799 }
800 status.set<FrontendStatus::modulations>(aidlMod);
801 aidlStatus.push_back(status);
802 break;
803 }
804 case HidlFrontendStatusExt1_1::hidl_discriminator::bers: {
805 vector<int> b(s.bers().begin(), s.bers().end());
806 status.set<FrontendStatus::bers>(b);
807 aidlStatus.push_back(status);
808 break;
809 }
810 case HidlFrontendStatusExt1_1::hidl_discriminator::codeRates: {
811 vector<FrontendInnerFec> codeRates;
812 for (auto c : s.codeRates()) {
813 codeRates.push_back(static_cast<FrontendInnerFec>(c));
814 }
815 status.set<FrontendStatus::codeRates>(codeRates);
816 aidlStatus.push_back(status);
817 break;
818 }
819 case HidlFrontendStatusExt1_1::hidl_discriminator::bandwidth: {
820 FrontendBandwidth bandwidth;
821 switch (s.bandwidth().getDiscriminator()) {
822 case HidlFrontendBandwidth::hidl_discriminator::atsc3:
823 bandwidth.set<FrontendBandwidth::atsc3>(
824 static_cast<FrontendAtsc3Bandwidth>(s.bandwidth().atsc3()));
825 break;
826 case HidlFrontendBandwidth::hidl_discriminator::dvbc:
827 bandwidth.set<FrontendBandwidth::dvbc>(
828 static_cast<FrontendDvbcBandwidth>(s.bandwidth().dvbc()));
829 break;
830 case HidlFrontendBandwidth::hidl_discriminator::dvbt:
831 bandwidth.set<FrontendBandwidth::dvbt>(
832 static_cast<FrontendDvbtBandwidth>(s.bandwidth().dvbt()));
833 break;
834 case HidlFrontendBandwidth::hidl_discriminator::isdbt:
835 bandwidth.set<FrontendBandwidth::isdbt>(
836 static_cast<FrontendIsdbtBandwidth>(s.bandwidth().isdbt()));
837 break;
838 case HidlFrontendBandwidth::hidl_discriminator::dtmb:
839 bandwidth.set<FrontendBandwidth::dtmb>(
840 static_cast<FrontendDtmbBandwidth>(s.bandwidth().dtmb()));
841 break;
842 }
843 status.set<FrontendStatus::bandwidth>(bandwidth);
844 aidlStatus.push_back(status);
845 break;
846 }
847 case HidlFrontendStatusExt1_1::hidl_discriminator::interval: {
848 FrontendGuardInterval interval;
849 switch (s.interval().getDiscriminator()) {
850 case HidlFrontendGuardInterval::hidl_discriminator::dvbt:
851 interval.set<FrontendGuardInterval::dvbt>(
852 static_cast<FrontendDvbtGuardInterval>(s.interval().dvbt()));
853 break;
854 case HidlFrontendGuardInterval::hidl_discriminator::isdbt:
855 interval.set<FrontendGuardInterval::isdbt>(
856 static_cast<FrontendIsdbtGuardInterval>(s.interval().isdbt()));
857 break;
858 case HidlFrontendGuardInterval::hidl_discriminator::dtmb:
859 interval.set<FrontendGuardInterval::dtmb>(
860 static_cast<FrontendDtmbGuardInterval>(s.interval().dtmb()));
861 break;
862 }
863 status.set<FrontendStatus::interval>(interval);
864 aidlStatus.push_back(status);
865 break;
866 }
867 case HidlFrontendStatusExt1_1::hidl_discriminator::transmissionMode: {
868 FrontendTransmissionMode transmissionMode;
869 switch (s.transmissionMode().getDiscriminator()) {
870 case HidlFrontendTransmissionMode::hidl_discriminator::dvbt:
871 transmissionMode.set<FrontendTransmissionMode::dvbt>(
872 static_cast<FrontendDvbtTransmissionMode>(s.transmissionMode().dvbt()));
873 break;
874 case HidlFrontendTransmissionMode::hidl_discriminator::isdbt:
875 transmissionMode.set<FrontendTransmissionMode::isdbt>(
876 static_cast<FrontendIsdbtMode>(s.transmissionMode().isdbt()));
877 break;
878 case HidlFrontendTransmissionMode::hidl_discriminator::dtmb:
879 transmissionMode.set<FrontendTransmissionMode::dtmb>(
880 static_cast<FrontendDtmbTransmissionMode>(s.transmissionMode().dtmb()));
881 break;
882 }
883 status.set<FrontendStatus::transmissionMode>(transmissionMode);
884 aidlStatus.push_back(status);
885 break;
886 }
887 case HidlFrontendStatusExt1_1::hidl_discriminator::uec: {
888 status.set<FrontendStatus::uec>(static_cast<int32_t>(s.uec()));
889 aidlStatus.push_back(status);
890 break;
891 }
892 case HidlFrontendStatusExt1_1::hidl_discriminator::systemId: {
893 status.set<FrontendStatus::systemId>(static_cast<int32_t>(s.systemId()));
894 aidlStatus.push_back(status);
895 break;
896 }
897 case HidlFrontendStatusExt1_1::hidl_discriminator::interleaving: {
898 vector<FrontendInterleaveMode> aidlInter;
899 for (auto i : s.interleaving()) {
900 FrontendInterleaveMode leaveMode;
901 switch (i.getDiscriminator()) {
902 case HidlFrontendInterleaveMode::hidl_discriminator::atsc3:
903 leaveMode.set<FrontendInterleaveMode::atsc3>(
904 static_cast<FrontendAtsc3TimeInterleaveMode>(i.atsc3()));
905 break;
906 case HidlFrontendInterleaveMode::hidl_discriminator::dvbc:
907 leaveMode.set<FrontendInterleaveMode::dvbc>(
908 static_cast<FrontendCableTimeInterleaveMode>(i.dvbc()));
909 break;
910 case HidlFrontendInterleaveMode::hidl_discriminator::dtmb:
911 leaveMode.set<FrontendInterleaveMode::dtmb>(
912 static_cast<FrontendDtmbTimeInterleaveMode>(i.dtmb()));
913 break;
914 }
915 aidlInter.push_back(leaveMode);
916 }
917 status.set<FrontendStatus::interleaving>(aidlInter);
918 aidlStatus.push_back(status);
919 break;
920 }
921 case HidlFrontendStatusExt1_1::hidl_discriminator::isdbtSegment: {
922 const vector<uint8_t>& seg = s.isdbtSegment();
923 vector<int32_t> i(seg.begin(), seg.end());
924 status.set<FrontendStatus::isdbtSegment>(i);
925 aidlStatus.push_back(status);
926 break;
927 }
928 case HidlFrontendStatusExt1_1::hidl_discriminator::tsDataRate: {
929 vector<int32_t> ts(s.tsDataRate().begin(), s.tsDataRate().end());
930 status.set<FrontendStatus::tsDataRate>(ts);
931 aidlStatus.push_back(status);
932 break;
933 }
934 case HidlFrontendStatusExt1_1::hidl_discriminator::rollOff: {
935 FrontendRollOff rollOff;
936 switch (s.rollOff().getDiscriminator()) {
937 case HidlFrontendRollOff::hidl_discriminator::dvbs:
938 rollOff.set<FrontendRollOff::dvbs>(
939 static_cast<FrontendDvbsRolloff>(s.rollOff().dvbs()));
940 break;
941 case HidlFrontendRollOff::hidl_discriminator::isdbs:
942 rollOff.set<FrontendRollOff::isdbs>(
943 static_cast<FrontendIsdbsRolloff>(s.rollOff().isdbs()));
944 break;
945 case HidlFrontendRollOff::hidl_discriminator::isdbs3:
946 rollOff.set<FrontendRollOff::isdbs3>(
947 static_cast<FrontendIsdbs3Rolloff>(s.rollOff().isdbs3()));
948 break;
949 }
950 status.set<FrontendStatus::rollOff>(rollOff);
951 aidlStatus.push_back(status);
952 break;
953 }
954 case HidlFrontendStatusExt1_1::hidl_discriminator::isMiso: {
955 status.set<FrontendStatus::isMiso>(s.isMiso());
956 aidlStatus.push_back(status);
957 break;
958 }
959 case HidlFrontendStatusExt1_1::hidl_discriminator::isLinear: {
960 status.set<FrontendStatus::isLinear>(s.isLinear());
961 aidlStatus.push_back(status);
962 break;
963 }
964 case HidlFrontendStatusExt1_1::hidl_discriminator::isShortFrames: {
965 status.set<FrontendStatus::isShortFrames>(s.isShortFrames());
966 aidlStatus.push_back(status);
967 break;
968 }
969 }
970 }
971}
972
973hidl_vec<HidlFrontendAtsc3PlpSettings> TunerHidlFrontend::getAtsc3PlpSettings(
974 const FrontendAtsc3Settings& settings) {
975 int len = settings.plpSettings.size();
976 hidl_vec<HidlFrontendAtsc3PlpSettings> plps = hidl_vec<HidlFrontendAtsc3PlpSettings>(len);
977 // parse PLP settings
978 for (int i = 0; i < len; i++) {
979 uint8_t plpId = static_cast<uint8_t>(settings.plpSettings[i].plpId);
980 HidlFrontendAtsc3Modulation modulation =
981 static_cast<HidlFrontendAtsc3Modulation>(settings.plpSettings[i].modulation);
982 HidlFrontendAtsc3TimeInterleaveMode interleaveMode =
983 static_cast<HidlFrontendAtsc3TimeInterleaveMode>(
984 settings.plpSettings[i].interleaveMode);
985 HidlFrontendAtsc3CodeRate codeRate =
986 static_cast<HidlFrontendAtsc3CodeRate>(settings.plpSettings[i].codeRate);
987 HidlFrontendAtsc3Fec fec = static_cast<HidlFrontendAtsc3Fec>(settings.plpSettings[i].fec);
988 HidlFrontendAtsc3PlpSettings frontendAtsc3PlpSettings{
989 .plpId = plpId,
990 .modulation = modulation,
991 .interleaveMode = interleaveMode,
992 .codeRate = codeRate,
993 .fec = fec,
994 };
995 plps[i] = frontendAtsc3PlpSettings;
996 }
997 return plps;
998}
999
1000HidlFrontendDvbsCodeRate TunerHidlFrontend::getDvbsCodeRate(const FrontendDvbsCodeRate& codeRate) {
1001 HidlFrontendInnerFec innerFec = static_cast<HidlFrontendInnerFec>(codeRate.fec);
1002 bool isLinear = codeRate.isLinear;
1003 bool isShortFrames = codeRate.isShortFrames;
1004 uint32_t bitsPer1000Symbol = static_cast<uint32_t>(codeRate.bitsPer1000Symbol);
1005 HidlFrontendDvbsCodeRate coderate{
1006 .fec = innerFec,
1007 .isLinear = isLinear,
1008 .isShortFrames = isShortFrames,
1009 .bitsPer1000Symbol = bitsPer1000Symbol,
1010 };
1011 return coderate;
1012}
1013
1014void TunerHidlFrontend::getHidlFrontendSettings(const FrontendSettings& aidlSettings,
1015 HidlFrontendSettings& settings,
1016 HidlFrontendSettingsExt1_1& settingsExt) {
1017 switch (aidlSettings.getTag()) {
1018 case FrontendSettings::analog: {
1019 const FrontendAnalogSettings& analog = aidlSettings.get<FrontendSettings::analog>();
1020 settings.analog({
1021 .frequency = static_cast<uint32_t>(analog.frequency),
1022 .type = static_cast<HidlFrontendAnalogType>(analog.type),
1023 .sifStandard = static_cast<HidlFrontendAnalogSifStandard>(analog.sifStandard),
1024 });
1025 settingsExt.settingExt.analog({
1026 .aftFlag = static_cast<HidlFrontendAnalogAftFlag>(analog.aftFlag),
1027 });
1028 settingsExt.endFrequency = static_cast<uint32_t>(analog.endFrequency);
1029 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(analog.inversion);
1030 break;
1031 }
1032 case FrontendSettings::atsc: {
1033 const FrontendAtscSettings& atsc = aidlSettings.get<FrontendSettings::atsc>();
1034 settings.atsc({
1035 .frequency = static_cast<uint32_t>(atsc.frequency),
1036 .modulation = static_cast<HidlFrontendAtscModulation>(atsc.modulation),
1037 });
1038 settingsExt.endFrequency = static_cast<uint32_t>(atsc.endFrequency);
1039 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(atsc.inversion);
1040 settingsExt.settingExt.noinit();
1041 break;
1042 }
1043 case FrontendSettings::atsc3: {
1044 const FrontendAtsc3Settings& atsc3 = aidlSettings.get<FrontendSettings::atsc3>();
1045 settings.atsc3({
1046 .frequency = static_cast<uint32_t>(atsc3.frequency),
1047 .bandwidth = static_cast<HidlFrontendAtsc3Bandwidth>(atsc3.bandwidth),
1048 .demodOutputFormat =
1049 static_cast<HidlFrontendAtsc3DemodOutputFormat>(atsc3.demodOutputFormat),
1050 .plpSettings = getAtsc3PlpSettings(atsc3),
1051 });
1052 settingsExt.endFrequency = static_cast<uint32_t>(atsc3.endFrequency);
1053 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(atsc3.inversion);
1054 settingsExt.settingExt.noinit();
1055 break;
1056 }
1057 case FrontendSettings::dvbc: {
1058 const FrontendDvbcSettings& dvbc = aidlSettings.get<FrontendSettings::dvbc>();
1059 settings.dvbc({
1060 .frequency = static_cast<uint32_t>(dvbc.frequency),
1061 .modulation = static_cast<HidlFrontendDvbcModulation>(dvbc.modulation),
1062 .fec = static_cast<HidlFrontendInnerFec>(dvbc.fec),
1063 .symbolRate = static_cast<uint32_t>(dvbc.symbolRate),
1064 .outerFec = static_cast<HidlFrontendDvbcOuterFec>(dvbc.outerFec),
1065 .annex = static_cast<HidlFrontendDvbcAnnex>(dvbc.annex),
1066 .spectralInversion = static_cast<HidlFrontendDvbcSpectralInversion>(dvbc.inversion),
1067 });
1068 settingsExt.settingExt.dvbc({
1069 .interleaveMode =
1070 static_cast<HidlFrontendCableTimeInterleaveMode>(dvbc.interleaveMode),
1071 .bandwidth = static_cast<HidlFrontendDvbcBandwidth>(dvbc.bandwidth),
1072 });
1073 settingsExt.endFrequency = static_cast<uint32_t>(dvbc.endFrequency);
1074 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(dvbc.inversion);
1075 break;
1076 }
1077 case FrontendSettings::dvbs: {
1078 const FrontendDvbsSettings& dvbs = aidlSettings.get<FrontendSettings::dvbs>();
1079 settings.dvbs({
1080 .frequency = static_cast<uint32_t>(dvbs.frequency),
1081 .modulation = static_cast<HidlFrontendDvbsModulation>(dvbs.modulation),
1082 .coderate = getDvbsCodeRate(dvbs.coderate),
1083 .symbolRate = static_cast<uint32_t>(dvbs.symbolRate),
1084 .rolloff = static_cast<HidlFrontendDvbsRolloff>(dvbs.rolloff),
1085 .pilot = static_cast<HidlFrontendDvbsPilot>(dvbs.pilot),
1086 .inputStreamId = static_cast<uint32_t>(dvbs.inputStreamId),
1087 .standard = static_cast<HidlFrontendDvbsStandard>(dvbs.standard),
1088 .vcmMode = static_cast<HidlFrontendDvbsVcmMode>(dvbs.vcmMode),
1089 });
1090 settingsExt.settingExt.dvbs({
1091 .scanType = static_cast<HidlFrontendDvbsScanType>(dvbs.scanType),
1092 .isDiseqcRxMessage = dvbs.isDiseqcRxMessage,
1093 });
1094 settingsExt.endFrequency = static_cast<uint32_t>(dvbs.endFrequency);
1095 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(dvbs.inversion);
1096 break;
1097 }
1098 case FrontendSettings::dvbt: {
1099 const FrontendDvbtSettings& dvbt = aidlSettings.get<FrontendSettings::dvbt>();
1100 settings.dvbt({
1101 .frequency = static_cast<uint32_t>(dvbt.frequency),
1102 .transmissionMode =
1103 static_cast<HidlFrontendDvbtTransmissionMode>(dvbt.transmissionMode),
1104 .bandwidth = static_cast<HidlFrontendDvbtBandwidth>(dvbt.bandwidth),
1105 .constellation = static_cast<HidlFrontendDvbtConstellation>(dvbt.constellation),
1106 .hierarchy = static_cast<HidlFrontendDvbtHierarchy>(dvbt.hierarchy),
1107 .hpCoderate = static_cast<HidlFrontendDvbtCoderate>(dvbt.hpCoderate),
1108 .lpCoderate = static_cast<HidlFrontendDvbtCoderate>(dvbt.lpCoderate),
1109 .guardInterval = static_cast<HidlFrontendDvbtGuardInterval>(dvbt.guardInterval),
1110 .isHighPriority = dvbt.isHighPriority,
1111 .standard = static_cast<HidlFrontendDvbtStandard>(dvbt.standard),
1112 .isMiso = dvbt.isMiso,
1113 .plpMode = static_cast<HidlFrontendDvbtPlpMode>(dvbt.plpMode),
1114 .plpId = static_cast<uint8_t>(dvbt.plpId),
1115 .plpGroupId = static_cast<uint8_t>(dvbt.plpGroupId),
1116 });
1117 settingsExt.settingExt.dvbt({
1118 .constellation = static_cast<
1119 ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(
1120 dvbt.constellation),
1121 .transmissionMode = static_cast<
1122 ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
1123 dvbt.transmissionMode),
1124 });
1125 settingsExt.endFrequency = static_cast<uint32_t>(dvbt.endFrequency);
1126 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(dvbt.inversion);
1127 break;
1128 }
1129 case FrontendSettings::isdbs: {
1130 const FrontendIsdbsSettings& isdbs = aidlSettings.get<FrontendSettings::isdbs>();
1131 settings.isdbs({
1132 .frequency = static_cast<uint32_t>(isdbs.frequency),
1133 .streamId = static_cast<uint16_t>(isdbs.streamId),
1134 .streamIdType = static_cast<HidlFrontendIsdbsStreamIdType>(isdbs.streamIdType),
1135 .modulation = static_cast<HidlFrontendIsdbsModulation>(isdbs.modulation),
1136 .coderate = static_cast<HidlFrontendIsdbsCoderate>(isdbs.coderate),
1137 .symbolRate = static_cast<uint32_t>(isdbs.symbolRate),
1138 .rolloff = static_cast<HidlFrontendIsdbsRolloff>(isdbs.rolloff),
1139 });
1140 settingsExt.endFrequency = static_cast<uint32_t>(isdbs.endFrequency);
1141 settingsExt.settingExt.noinit();
1142 break;
1143 }
1144 case FrontendSettings::isdbs3: {
1145 const FrontendIsdbs3Settings& isdbs3 = aidlSettings.get<FrontendSettings::isdbs3>();
1146 settings.isdbs3({
1147 .frequency = static_cast<uint32_t>(isdbs3.frequency),
1148 .streamId = static_cast<uint16_t>(isdbs3.streamId),
1149 .streamIdType = static_cast<HidlFrontendIsdbsStreamIdType>(isdbs3.streamIdType),
1150 .modulation = static_cast<HidlFrontendIsdbs3Modulation>(isdbs3.modulation),
1151 .coderate = static_cast<HidlFrontendIsdbs3Coderate>(isdbs3.coderate),
1152 .symbolRate = static_cast<uint32_t>(isdbs3.symbolRate),
1153 .rolloff = static_cast<HidlFrontendIsdbs3Rolloff>(isdbs3.rolloff),
1154 });
1155 settingsExt.endFrequency = static_cast<uint32_t>(isdbs3.endFrequency);
1156 settingsExt.settingExt.noinit();
1157 break;
1158 }
1159 case FrontendSettings::isdbt: {
1160 const FrontendIsdbtSettings& isdbt = aidlSettings.get<FrontendSettings::isdbt>();
1161 settings.isdbt({
1162 .frequency = static_cast<uint32_t>(isdbt.frequency),
1163 .modulation = static_cast<HidlFrontendIsdbtModulation>(isdbt.modulation),
1164 .bandwidth = static_cast<HidlFrontendIsdbtBandwidth>(isdbt.bandwidth),
1165 .mode = static_cast<HidlFrontendIsdbtMode>(isdbt.mode),
1166 .coderate = static_cast<HidlFrontendIsdbtCoderate>(isdbt.coderate),
1167 .guardInterval = static_cast<HidlFrontendIsdbtGuardInterval>(isdbt.guardInterval),
1168 .serviceAreaId = static_cast<uint32_t>(isdbt.serviceAreaId),
1169 });
1170 settingsExt.endFrequency = static_cast<uint32_t>(isdbt.endFrequency);
1171 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(isdbt.inversion);
1172 settingsExt.settingExt.noinit();
1173 break;
1174 }
1175 case FrontendSettings::dtmb: {
1176 const FrontendDtmbSettings& dtmb = aidlSettings.get<FrontendSettings::dtmb>();
1177 settingsExt.settingExt.dtmb({
1178 .frequency = static_cast<uint32_t>(dtmb.frequency),
1179 .transmissionMode =
1180 static_cast<HidlFrontendDtmbTransmissionMode>(dtmb.transmissionMode),
1181 .bandwidth = static_cast<HidlFrontendDtmbBandwidth>(dtmb.bandwidth),
1182 .modulation = static_cast<HidlFrontendDtmbModulation>(dtmb.modulation),
1183 .codeRate = static_cast<HidlFrontendDtmbCodeRate>(dtmb.codeRate),
1184 .guardInterval = static_cast<HidlFrontendDtmbGuardInterval>(dtmb.guardInterval),
1185 .interleaveMode =
1186 static_cast<HidlFrontendDtmbTimeInterleaveMode>(dtmb.interleaveMode),
1187 });
1188 settingsExt.endFrequency = static_cast<uint32_t>(dtmb.endFrequency);
1189 settingsExt.inversion = static_cast<HidlFrontendSpectralInversion>(dtmb.inversion);
1190 break;
1191 }
1192 default:
1193 break;
1194 }
1195}
1196
1197} // namespace tuner
1198} // namespace tv
1199} // namespace media
1200} // namespace android
1201} // namespace aidl