| /* |
| * Copyright 2020 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #define LOG_TAG "FrontendClient" |
| |
| #include <android-base/logging.h> |
| #include <utils/Log.h> |
| |
| #include "FrontendClient.h" |
| |
| using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo; |
| using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings; |
| |
| using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard; |
| using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType; |
| using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth; |
| using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy; |
| using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard; |
| using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode; |
| using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation; |
| using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus; |
| using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo; |
| using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo; |
| using ::android::hardware::tv::tuner::V1_0::LnbVoltage; |
| using ::android::hardware::tv::tuner::V1_1::Constant; |
| using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth; |
| using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation; |
| using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval; |
| using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendModulation; |
| using ::android::hardware::tv::tuner::V1_1::FrontendRollOff; |
| using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion; |
| using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode; |
| using ::android::hardware::tv::tuner::V1_1::FrontendType; |
| |
| namespace android { |
| |
| /////////////// FrontendClient /////////////////////// |
| |
| FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type) { |
| mTunerFrontend = tunerFrontend; |
| mType = type; |
| } |
| |
| FrontendClient::~FrontendClient() { |
| mTunerFrontend = NULL; |
| mFrontend = NULL; |
| mFrontend_1_1 = NULL; |
| mId = -1; |
| mType = -1; |
| } |
| |
| Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) { |
| if (mTunerFrontend != NULL) { |
| shared_ptr<TunerFrontendCallback> aidlCallback = |
| ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback); |
| aidlCallback->setFrontendType(mType); |
| Status s = mTunerFrontend->setCallback(aidlCallback); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| sp<HidlFrontendCallback> hidlCallback = new HidlFrontendCallback(frontendClientCallback); |
| return mFrontend->setCallback(hidlCallback); |
| } |
| |
| void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) { |
| mFrontend = frontend; |
| mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend); |
| } |
| |
| // TODO: move after migration is done |
| void FrontendClient::setId(int id) { |
| mId = id; |
| } |
| |
| Result FrontendClient::tune(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| if (mTunerFrontend != NULL) { |
| TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1); |
| Status s = mTunerFrontend->tune(tunerFeSettings); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| Result result; |
| if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) { |
| result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1); |
| return result; |
| } |
| |
| if (mFrontend != NULL) { |
| result = mFrontend->tune(settings); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| Result FrontendClient::stopTune() { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->stopTune(); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend != NULL) { |
| Result result = mFrontend->stopTune(); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| if (mTunerFrontend != NULL) { |
| TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1); |
| Status s = mTunerFrontend->scan(tunerFeSettings, (int)type); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| Result result; |
| if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) { |
| result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1); |
| return result; |
| } |
| |
| if (mFrontend != NULL) { |
| result = mFrontend->scan(settings, type); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| Result FrontendClient::stopScan() { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->stopScan(); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend != NULL) { |
| Result result = mFrontend->stopScan(); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) { |
| vector<FrontendStatus> status; |
| |
| if (mTunerFrontend != NULL) { |
| vector<TunerFrontendStatus> aidlStatus; |
| vector<int> types; |
| for (auto t : statusTypes) { |
| types.push_back((int)t); |
| } |
| Status s = mTunerFrontend->getStatus(types, &aidlStatus); |
| if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) { |
| return status; |
| } |
| return getHidlStatus(aidlStatus); |
| } |
| |
| if (mFrontend != NULL && statusTypes.size() > 0) { |
| Result res; |
| mFrontend->getStatus(statusTypes, |
| [&](Result r, const hidl_vec<FrontendStatus>& s) { |
| res = r; |
| status = s; |
| }); |
| if (res != Result::SUCCESS) { |
| status.clear(); |
| return status; |
| } |
| } |
| |
| return status; |
| } |
| |
| vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1( |
| vector<FrontendStatusTypeExt1_1> statusTypes) { |
| vector<FrontendStatusExt1_1> status; |
| |
| if (mTunerFrontend != NULL) { |
| vector<TunerFrontendStatus> aidlStatus; |
| vector<int> types; |
| for (auto t : statusTypes) { |
| types.push_back((int)t); |
| } |
| Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus); |
| if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) { |
| return status; |
| } |
| return getHidlStatusExt(aidlStatus); |
| } |
| |
| if (mFrontend_1_1 != NULL && statusTypes.size() > 0) { |
| Result res; |
| mFrontend_1_1->getStatusExt1_1(statusTypes, |
| [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) { |
| res = r; |
| status = s; |
| }); |
| if (res != Result::SUCCESS) { |
| status.clear(); |
| return status; |
| } |
| } |
| |
| return status; |
| } |
| |
| Result FrontendClient::setLnb(sp<LnbClient> lnbClient) { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb()); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend != NULL) { |
| Result result = mFrontend->setLnb(lnbClient->getId()); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| Result FrontendClient::setLna(bool bEnable) { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->setLna(bEnable); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend != NULL) { |
| Result result = mFrontend->setLna(bEnable); |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| int FrontendClient::linkCiCamToFrontend(int ciCamId) { |
| int ltsId = (int)Constant::INVALID_LTS_ID; |
| |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, <sId); |
| if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) { |
| return ltsId; |
| } |
| return (int)Constant::INVALID_LTS_ID; |
| } |
| |
| if (mFrontend_1_1 != NULL) { |
| Result res; |
| mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId), |
| [&](Result r, uint32_t id) { |
| res = r; |
| ltsId = id; |
| }); |
| if (res != Result::SUCCESS) { |
| return (int)Constant::INVALID_LTS_ID; |
| } |
| } |
| |
| return ltsId; |
| } |
| |
| Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId); |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend_1_1 != NULL) { |
| return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId)); |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| Result FrontendClient::close() { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->close(); |
| mTunerFrontend = NULL; |
| return ClientHelper::getServiceSpecificErrorCode(s); |
| } |
| |
| if (mFrontend != NULL) { |
| Result result = mFrontend->close(); |
| mFrontend = NULL; |
| mFrontend_1_1 = NULL; |
| return result; |
| } |
| |
| return Result::INVALID_STATE; |
| } |
| |
| /////////////// TunerFrontend Helper Methods /////////////////////// |
| |
| shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() { |
| return mTunerFrontend; |
| } |
| |
| int FrontendClient::getId() { |
| if (mTunerFrontend != NULL) { |
| Status s = mTunerFrontend->getFrontendId(&mId); |
| if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) { |
| return mId; |
| } |
| ALOGE("Failed to getFrontendId from Tuner Frontend"); |
| return -1; |
| } |
| |
| if (mFrontend != NULL) { |
| return mId; |
| } |
| |
| return -1; |
| } |
| |
| vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) { |
| vector<FrontendStatus> hidlStatus; |
| for (TunerFrontendStatus s : aidlStatus) { |
| FrontendStatus status = FrontendStatus(); |
| switch (s.getTag()) { |
| case TunerFrontendStatus::isDemodLocked: { |
| status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::snr: { |
| status.snr(s.get<TunerFrontendStatus::snr>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::ber: { |
| status.ber((uint32_t)s.get<TunerFrontendStatus::ber>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::per: { |
| status.per((uint32_t)s.get<TunerFrontendStatus::per>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::preBer: { |
| status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::signalQuality: { |
| status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::signalStrength: { |
| status.signalStrength(s.get<TunerFrontendStatus::signalStrength>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::symbolRate: { |
| status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::innerFec: { |
| status.innerFec(static_cast<FrontendInnerFec>( |
| s.get<TunerFrontendStatus::innerFec>())); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::modulation: { |
| auto aidlMod = s.get<TunerFrontendStatus::modulation>(); |
| FrontendModulationStatus modulation; |
| switch (mType) { |
| case (int)FrontendType::DVBC: |
| modulation.dvbc(static_cast<FrontendDvbcModulation>(aidlMod)); |
| status.modulation(modulation); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DVBS: |
| modulation.dvbs(static_cast<FrontendDvbsModulation>(aidlMod)); |
| status.modulation(modulation); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBS: |
| modulation.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod)); |
| status.modulation(modulation); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBS3: |
| modulation.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod)); |
| status.modulation(modulation); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBT: |
| modulation.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod)); |
| status.modulation(modulation); |
| hidlStatus.push_back(status); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case TunerFrontendStatus::inversion: { |
| status.inversion(static_cast<FrontendDvbcSpectralInversion>( |
| s.get<TunerFrontendStatus::inversion>())); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::lnbVoltage: { |
| status.lnbVoltage(static_cast<LnbVoltage>( |
| s.get<TunerFrontendStatus::lnbVoltage>())); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::plpId: { |
| status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isEWBS: { |
| status.isEWBS(s.get<TunerFrontendStatus::isEWBS>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::agc: { |
| status.agc((uint8_t)s.get<TunerFrontendStatus::agc>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isLnaOn: { |
| status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isLayerError: { |
| auto aidlE = s.get<TunerFrontendStatus::isLayerError>(); |
| hidl_vec<bool> e(aidlE.begin(), aidlE.end()); |
| status.isLayerError(e); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::mer: { |
| status.mer(s.get<TunerFrontendStatus::mer>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::freqOffset: { |
| status.freqOffset(s.get<TunerFrontendStatus::freqOffset>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::hierarchy: { |
| status.hierarchy(static_cast<FrontendDvbtHierarchy>( |
| s.get<TunerFrontendStatus::hierarchy>())); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isRfLocked: { |
| status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::plpInfo: { |
| int size = s.get<TunerFrontendStatus::plpInfo>().size(); |
| hidl_vec<FrontendStatusAtsc3PlpInfo> info(size); |
| for (int i = 0; i < size; i++) { |
| auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i]; |
| info[i] = { |
| .plpId = (uint8_t)aidlInfo.plpId, |
| .isLocked = aidlInfo.isLocked, |
| .uec = (uint32_t)aidlInfo.uec, |
| }; |
| } |
| status.plpInfo(info); |
| hidlStatus.push_back(status); |
| break; |
| } |
| default: |
| break; |
| } |
| } |
| return hidlStatus; |
| } |
| |
| vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt( |
| vector<TunerFrontendStatus>& aidlStatus) { |
| vector<FrontendStatusExt1_1> hidlStatus; |
| for (TunerFrontendStatus s : aidlStatus) { |
| FrontendStatusExt1_1 status; |
| switch (s.getTag()) { |
| case TunerFrontendStatus::modulations: { |
| vector<FrontendModulation> ms; |
| for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) { |
| FrontendModulation m; |
| switch (mType) { |
| case (int)FrontendType::DVBC: |
| m.dvbc(static_cast<FrontendDvbcModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::DVBS: |
| m.dvbs(static_cast<FrontendDvbsModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::DVBT: |
| m.dvbt(static_cast<FrontendDvbtConstellation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::ISDBS: |
| m.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::ISDBS3: |
| m.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::ISDBT: |
| m.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::ATSC: |
| m.atsc(static_cast<FrontendAtscModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::ATSC3: |
| m.atsc3(static_cast<FrontendAtsc3Modulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| case (int)FrontendType::DTMB: |
| m.dtmb(static_cast<FrontendDtmbModulation>(aidlMod)); |
| ms.push_back(m); |
| break; |
| default: |
| break; |
| } |
| } |
| if (ms.size() > 0) { |
| status.modulations(ms); |
| hidlStatus.push_back(status); |
| } |
| break; |
| } |
| case TunerFrontendStatus::bers: { |
| auto aidlB = s.get<TunerFrontendStatus::bers>(); |
| hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end()); |
| status.bers(b); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::codeRates: { |
| vector<hardware::tv::tuner::V1_1::FrontendInnerFec> codeRates; |
| for (auto aidlCodeRate : s.get<TunerFrontendStatus::codeRates>()) { |
| codeRates.push_back( |
| static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate)); |
| } |
| if (codeRates.size() > 0) { |
| status.codeRates(codeRates); |
| hidlStatus.push_back(status); |
| } |
| break; |
| } |
| case TunerFrontendStatus::bandwidth: { |
| auto aidlBand = s.get<TunerFrontendStatus::bandwidth>(); |
| FrontendBandwidth band; |
| switch (mType) { |
| case (int)FrontendType::ATSC3: |
| band.atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand)); |
| status.bandwidth(band); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DVBC: |
| band.dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand)); |
| status.bandwidth(band); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DVBT: |
| band.dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand)); |
| status.bandwidth(band); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBT: |
| band.isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand)); |
| status.bandwidth(band); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DTMB: |
| band.dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand)); |
| status.bandwidth(band); |
| hidlStatus.push_back(status); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case TunerFrontendStatus::interval: { |
| auto aidlInter = s.get<TunerFrontendStatus::interval>(); |
| FrontendGuardInterval inter; |
| switch (mType) { |
| case (int)FrontendType::DVBT: |
| inter.dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter)); |
| status.interval(inter); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBT: |
| inter.isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter)); |
| status.interval(inter); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DTMB: |
| inter.dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter)); |
| status.interval(inter); |
| hidlStatus.push_back(status); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case TunerFrontendStatus::transmissionMode: { |
| auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>(); |
| FrontendTransmissionMode trans; |
| switch (mType) { |
| case (int)FrontendType::DVBT: |
| trans.dvbt(static_cast<FrontendDvbtTransmissionMode>(aidlTran)); |
| status.transmissionMode(trans); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBT: |
| trans.isdbt(static_cast<FrontendIsdbtMode>(aidlTran)); |
| status.transmissionMode(trans); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::DTMB: |
| trans.dtmb(static_cast<FrontendDtmbTransmissionMode>(aidlTran)); |
| status.transmissionMode(trans); |
| hidlStatus.push_back(status); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case TunerFrontendStatus::uec: { |
| status.uec((uint32_t)s.get<TunerFrontendStatus::uec>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::systemId: { |
| status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::interleaving: { |
| vector<FrontendInterleaveMode> modes; |
| for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) { |
| FrontendInterleaveMode mode; |
| switch (mType) { |
| case (int)FrontendType::DVBC: |
| mode.dvbc(static_cast<FrontendCableTimeInterleaveMode>(aidlInter)); |
| modes.push_back(mode); |
| break; |
| case (int)FrontendType::ATSC3: |
| mode.atsc3(static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter)); |
| modes.push_back(mode); |
| break; |
| case (int)FrontendType::DTMB: |
| mode.dtmb(static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter)); |
| modes.push_back(mode); |
| break; |
| default: |
| break; |
| } |
| } |
| if (modes.size() > 0) { |
| status.interleaving(modes); |
| hidlStatus.push_back(status); |
| } |
| break; |
| } |
| case TunerFrontendStatus::isdbtSegment: { |
| auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>(); |
| hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end()); |
| status.isdbtSegment(s); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::tsDataRate: { |
| auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>(); |
| hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end()); |
| status.tsDataRate(ts); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::rollOff: { |
| auto aidlRoll = s.get<TunerFrontendStatus::rollOff>(); |
| FrontendRollOff roll; |
| switch (mType) { |
| case (int)FrontendType::DVBS: |
| roll.dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll)); |
| status.rollOff(roll); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBS: |
| roll.isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll)); |
| status.rollOff(roll); |
| hidlStatus.push_back(status); |
| break; |
| case (int)FrontendType::ISDBS3: |
| roll.isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll)); |
| status.rollOff(roll); |
| hidlStatus.push_back(status); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case TunerFrontendStatus::isMiso: { |
| status.isMiso(s.get<TunerFrontendStatus::isMiso>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isLinear: { |
| status.isLinear(s.get<TunerFrontendStatus::isLinear>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| case TunerFrontendStatus::isShortFrames: { |
| status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>()); |
| hidlStatus.push_back(status); |
| break; |
| } |
| default: |
| break; |
| } |
| } |
| return hidlStatus; |
| } |
| |
| TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| bool isExtended = validateExtendedSettings(settingsExt1_1); |
| TunerFrontendSettings s{ |
| .isExtended = isExtended, |
| .endFrequency = (int) settingsExt1_1.endFrequency, |
| .inversion = (int) settingsExt1_1.inversion, |
| }; |
| |
| if (settingsExt1_1.settingExt.getDiscriminator() |
| == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) { |
| s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1)); |
| return s; |
| } |
| |
| switch (settings.getDiscriminator()) { |
| case FrontendSettings::hidl_discriminator::analog: { |
| s.settings.set<TunerFrontendUnionSettings::analog>( |
| getAidlAnalogSettings(settings, settingsExt1_1)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::atsc: { |
| s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::atsc3: { |
| s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::dvbs: { |
| s.settings.set<TunerFrontendUnionSettings::dvbs>( |
| getAidlDvbsSettings(settings, settingsExt1_1)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::dvbc: { |
| s.settings.set<TunerFrontendUnionSettings::cable>( |
| getAidlCableSettings(settings, settingsExt1_1)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::dvbt: { |
| s.settings.set<TunerFrontendUnionSettings::dvbt>( |
| getAidlDvbtSettings(settings, settingsExt1_1)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::isdbs: { |
| s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::isdbs3: { |
| s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings)); |
| break; |
| } |
| case FrontendSettings::hidl_discriminator::isdbt: { |
| s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings)); |
| break; |
| } |
| default: |
| break; |
| } |
| return s; |
| } |
| |
| TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| TunerFrontendAnalogSettings analogSettings{ |
| .frequency = (int)settings.analog().frequency, |
| .signalType = (int)settings.analog().type, |
| .sifStandard = (int)settings.analog().sifStandard, |
| }; |
| if (settingsExt1_1.settingExt.getDiscriminator() |
| == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) { |
| analogSettings.isExtended = true; |
| analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag; |
| } else { |
| analogSettings.isExtended = false; |
| } |
| return analogSettings; |
| } |
| |
| TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| TunerFrontendDvbsSettings dvbsSettings{ |
| .frequency = (int)settings.dvbs().frequency, |
| .modulation = (int)settings.dvbs().modulation, |
| .codeRate = { |
| .fec = (long)settings.dvbs().coderate.fec, |
| .isLinear = settings.dvbs().coderate.isLinear, |
| .isShortFrames = settings.dvbs().coderate.isShortFrames, |
| .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol, |
| }, |
| .symbolRate = (int)settings.dvbs().symbolRate, |
| .rolloff = (int)settings.dvbs().rolloff, |
| .pilot = (int)settings.dvbs().pilot, |
| .inputStreamId = (int)settings.dvbs().inputStreamId, |
| .standard = (int)settings.dvbs().standard, |
| .vcm = (int)settings.dvbs().vcmMode, |
| }; |
| if (settingsExt1_1.settingExt.getDiscriminator() |
| == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) { |
| dvbsSettings.isExtended = true; |
| dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType; |
| dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage; |
| } else { |
| dvbsSettings.isExtended = false; |
| } |
| return dvbsSettings; |
| } |
| |
| TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| TunerFrontendCableSettings cableSettings{ |
| .frequency = (int)settings.dvbc().frequency, |
| .modulation = (int)settings.dvbc().modulation, |
| .innerFec = (long)settings.dvbc().fec, |
| .symbolRate = (int)settings.dvbc().symbolRate, |
| .outerFec = (int)settings.dvbc().outerFec, |
| .annex = (int)settings.dvbc().annex, |
| .spectralInversion = (int)settings.dvbc().spectralInversion, |
| }; |
| if (settingsExt1_1.settingExt.getDiscriminator() |
| == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) { |
| cableSettings.isExtended = true; |
| cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode; |
| cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth; |
| } else { |
| cableSettings.isExtended = false; |
| } |
| return cableSettings; |
| } |
| |
| TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings, |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| TunerFrontendDvbtSettings dvbtSettings{ |
| .frequency = (int)settings.dvbt().frequency, |
| .transmissionMode = (int)settings.dvbt().transmissionMode, |
| .bandwidth = (int)settings.dvbt().bandwidth, |
| .constellation = (int)settings.dvbt().constellation, |
| .hierarchy = (int)settings.dvbt().hierarchy, |
| .hpCodeRate = (int)settings.dvbt().hpCoderate, |
| .lpCodeRate = (int)settings.dvbt().lpCoderate, |
| .guardInterval = (int)settings.dvbt().guardInterval, |
| .isHighPriority = settings.dvbt().isHighPriority, |
| .standard = (int)settings.dvbt().standard, |
| .isMiso = settings.dvbt().isMiso, |
| .plpMode = (int)settings.dvbt().plpMode, |
| .plpId = (int)settings.dvbt().plpId, |
| .plpGroupId = (int)settings.dvbt().plpGroupId, |
| }; |
| if (settingsExt1_1.settingExt.getDiscriminator() |
| == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) { |
| dvbtSettings.isExtended = true; |
| dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation; |
| dvbtSettings.transmissionMode = |
| (int)settingsExt1_1.settingExt.dvbt().transmissionMode; |
| } else { |
| dvbtSettings.isExtended = false; |
| } |
| return dvbtSettings; |
| } |
| |
| TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings( |
| const FrontendSettingsExt1_1& settingsExt1_1) { |
| TunerFrontendDtmbSettings dtmbSettings{ |
| .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency, |
| .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode, |
| .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth, |
| .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation, |
| .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate, |
| .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval, |
| .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode, |
| }; |
| return dtmbSettings; |
| } |
| |
| TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) { |
| TunerFrontendAtscSettings atscSettings{ |
| .frequency = (int)settings.atsc().frequency, |
| .modulation = (int)settings.atsc().modulation, |
| }; |
| return atscSettings; |
| } |
| |
| TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) { |
| TunerFrontendAtsc3Settings atsc3Settings{ |
| .frequency = (int)settings.atsc3().frequency, |
| .bandwidth = (int)settings.atsc3().bandwidth, |
| .demodOutputFormat = (int)settings.atsc3().demodOutputFormat, |
| }; |
| atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size()); |
| for (auto plpSetting : settings.atsc3().plpSettings) { |
| atsc3Settings.plpSettings.push_back({ |
| .plpId = (int)plpSetting.plpId, |
| .modulation = (int)plpSetting.modulation, |
| .interleaveMode = (int)plpSetting.interleaveMode, |
| .codeRate = (int)plpSetting.codeRate, |
| .fec = (int)plpSetting.fec, |
| }); |
| } |
| return atsc3Settings; |
| } |
| |
| TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) { |
| TunerFrontendIsdbsSettings isdbsSettings{ |
| .frequency = (int)settings.isdbs().frequency, |
| .streamId = (char16_t)settings.isdbs().streamId, |
| .streamIdType = (int)settings.isdbs().streamIdType, |
| .modulation = (int)settings.isdbs().modulation, |
| .codeRate = (int)settings.isdbs().coderate, |
| .symbolRate = (int)settings.isdbs().symbolRate, |
| .rolloff = (int)settings.isdbs().rolloff, |
| }; |
| return isdbsSettings; |
| } |
| |
| TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings( |
| const FrontendSettings& settings) { |
| TunerFrontendIsdbs3Settings isdbs3Settings{ |
| .frequency = (int)settings.isdbs3().frequency, |
| .streamId = (char16_t)settings.isdbs3().streamId, |
| .streamIdType = (int)settings.isdbs3().streamIdType, |
| .modulation = (int)settings.isdbs3().modulation, |
| .codeRate = (int)settings.isdbs3().coderate, |
| .symbolRate = (int)settings.isdbs3().symbolRate, |
| .rolloff = (int)settings.isdbs3().rolloff, |
| }; |
| return isdbs3Settings; |
| } |
| |
| TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) { |
| TunerFrontendIsdbtSettings isdbtSettings{ |
| .frequency = (int)settings.isdbt().frequency, |
| .modulation = (int)settings.isdbt().modulation, |
| .bandwidth = (int)settings.isdbt().bandwidth, |
| .mode = (int)settings.isdbt().mode, |
| .codeRate = (int)settings.isdbt().coderate, |
| .guardInterval = (int)settings.isdbt().guardInterval, |
| .serviceAreaId = (int)settings.isdbt().serviceAreaId, |
| }; |
| return isdbtSettings; |
| } |
| |
| bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) { |
| return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY |
| || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED |
| || settingsExt1_1.settingExt.getDiscriminator() |
| != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit; |
| } |
| |
| /////////////// TunerFrontendCallback /////////////////////// |
| |
| TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback) |
| : mFrontendClientCallback(frontendClientCallback) {} |
| |
| Status TunerFrontendCallback::onEvent(int frontendEventType) { |
| if (mFrontendClientCallback != NULL) { |
| mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType)); |
| return Status::ok(); |
| } |
| return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE)); |
| } |
| |
| Status TunerFrontendCallback::onScanMessage(int messageType, |
| const TunerFrontendScanMessage& message) { |
| if (mFrontendClientCallback != NULL) { |
| if (!is1_1ExtendedScanMessage(messageType)) { |
| mFrontendClientCallback->onScanMessage( |
| static_cast<FrontendScanMessageType>(messageType), |
| getHalScanMessage(messageType, message)); |
| } else { |
| mFrontendClientCallback->onScanMessageExt1_1( |
| static_cast<FrontendScanMessageTypeExt1_1>(messageType), |
| getHalScanMessageExt1_1(messageType, message)); |
| } |
| return Status::ok(); |
| } |
| return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE)); |
| } |
| |
| /////////////// IFrontendCallback /////////////////////// |
| |
| HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback) |
| : mFrontendClientCallback(frontendClientCallback) {} |
| |
| Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) { |
| if (mFrontendClientCallback != NULL) { |
| mFrontendClientCallback->onEvent(frontendEventType); |
| } |
| return Void(); |
| } |
| |
| Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type, |
| const FrontendScanMessage& message) { |
| if (mFrontendClientCallback != NULL) { |
| mFrontendClientCallback->onScanMessage(type, message); |
| } |
| return Void(); |
| } |
| |
| Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type, |
| const FrontendScanMessageExt1_1& message) { |
| if (mFrontendClientCallback != NULL) { |
| mFrontendClientCallback->onScanMessageExt1_1(type, message); |
| } |
| return Void(); |
| } |
| |
| /////////////// FrontendClientCallback Helper Methods /////////////////////// |
| |
| FrontendScanMessage TunerFrontendCallback::getHalScanMessage( |
| int messageType, const TunerFrontendScanMessage& message) { |
| FrontendScanMessage scanMessage; |
| switch (messageType) { |
| case (int) FrontendScanMessageType::LOCKED: |
| scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>()); |
| break; |
| case (int) FrontendScanMessageType::END: |
| scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>()); |
| break; |
| case (int) FrontendScanMessageType::PROGRESS_PERCENT: |
| scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>()); |
| break; |
| case (int) FrontendScanMessageType::FREQUENCY: { |
| vector<int> f = message.get<TunerFrontendScanMessage::frequencies>(); |
| hidl_vec<uint32_t> frequencies(begin(f), end(f)); |
| scanMessage.frequencies(frequencies); |
| break; |
| } |
| case (int) FrontendScanMessageType::SYMBOL_RATE: { |
| vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>(); |
| hidl_vec<uint32_t> symbolRates(begin(s), end(s)); |
| scanMessage.symbolRates(symbolRates); |
| break; |
| } |
| case (int) FrontendScanMessageType::HIERARCHY: |
| scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>( |
| message.get<TunerFrontendScanMessage::hierarchy>())); |
| break; |
| case (int) FrontendScanMessageType::ANALOG_TYPE: |
| scanMessage.analogType(static_cast<FrontendAnalogType>( |
| message.get<TunerFrontendScanMessage::analogType>())); |
| break; |
| case (int) FrontendScanMessageType::PLP_IDS: { |
| vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>(); |
| hidl_vec<uint8_t> plpIds(begin(p), end(p)); |
| scanMessage.plpIds(plpIds); |
| break; |
| } |
| case (int) FrontendScanMessageType::GROUP_IDS: { |
| vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>(); |
| hidl_vec<uint8_t> groupIds(begin(g), end(g)); |
| scanMessage.groupIds(groupIds); |
| break; |
| } |
| case (int) FrontendScanMessageType::INPUT_STREAM_IDS: { |
| vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>(); |
| hidl_vec<uint16_t> inputStreamIds(begin(i), end(i)); |
| scanMessage.inputStreamIds(inputStreamIds); |
| break; |
| } |
| case (int) FrontendScanMessageType::STANDARD: { |
| FrontendScanMessage::Standard std; |
| int standard = message.get<TunerFrontendScanMessage::std>(); |
| switch (mType) { |
| case (int) FrontendType::DVBS: |
| std.sStd(static_cast<FrontendDvbsStandard>(standard)); |
| scanMessage.std(std); |
| break; |
| case (int) FrontendType::DVBT: |
| std.tStd(static_cast<FrontendDvbtStandard>(standard)); |
| scanMessage.std(std); |
| break; |
| case (int) FrontendType::ANALOG: |
| std.sifStd(static_cast<FrontendAnalogSifStandard>(standard)); |
| scanMessage.std(std); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| case (int) FrontendScanMessageType::ATSC3_PLP_INFO: { |
| vector<TunerFrontendScanAtsc3PlpInfo> plp = |
| message.get<TunerFrontendScanMessage::atsc3PlpInfos>(); |
| hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo; |
| int size = plp.size(); |
| plpInfo.resize(size); |
| for (int i = 0; i < size; i++) { |
| auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i]; |
| FrontendScanAtsc3PlpInfo p{ |
| .plpId = static_cast<uint8_t>(info.plpId), |
| .bLlsFlag = info.llsFlag, |
| }; |
| plpInfo[i] = p; |
| } |
| scanMessage.atsc3PlpInfos(plpInfo); |
| break; |
| } |
| default: |
| break; |
| } |
| return scanMessage; |
| } |
| |
| FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1( |
| int messageType, const TunerFrontendScanMessage& message) { |
| FrontendScanMessageExt1_1 scanMessage; |
| switch (messageType) { |
| case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: |
| scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>()); |
| break; |
| case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX: |
| scanMessage.annex(static_cast<FrontendDvbcAnnex>( |
| message.get<TunerFrontendScanMessage::annex>())); |
| break; |
| case (int) FrontendScanMessageTypeExt1_1::MODULATION: { |
| FrontendModulation m; |
| int modulation = message.get<TunerFrontendScanMessage::modulation>(); |
| switch (mType) { |
| case (int) FrontendType::DVBC: |
| m.dvbc(static_cast<FrontendDvbcModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::DVBS: |
| m.dvbs(static_cast<FrontendDvbsModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::DVBT: |
| m.dvbt(static_cast<FrontendDvbtConstellation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::ISDBS: |
| m.isdbs(static_cast<FrontendIsdbsModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::ISDBS3: |
| m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::ISDBT: |
| m.isdbt(static_cast<FrontendIsdbtModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::ATSC: |
| m.atsc(static_cast<FrontendAtscModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) FrontendType::ATSC3: |
| m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB: |
| m.dtmb(static_cast<FrontendDtmbModulation>(modulation)); |
| scanMessage.modulation(m); |
| break; |
| default: |
| break; |
| } |
| break; |
| } |
| default: |
| break; |
| } |
| return scanMessage; |
| } |
| |
| bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) { |
| return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION |
| && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY; |
| } |
| } // namespace android |