Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5af84149 authored by Amy Zhang's avatar Amy Zhang
Browse files

Complete TunerFrontend aidl interface and implementation

Test: make
Bug: 159067322
Change-Id: I97bc2431be1ba7b0a807b6dd06b609ad2c885dde
parent b2989b53
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ cc_binary {

    shared_libs: [
        "android.hardware.tv.tuner@1.0",
        "android.hardware.tv.tuner@1.1",
        "libbase",
        "libbinder",
        "libfmq",
+61 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define LOG_TAG "TunerFrontend"

#include "TunerFrontend.h"
#include "TunerLnb.h"

using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3PlpSettings;
using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
@@ -206,14 +207,70 @@ Status TunerFrontend::stopScan() {
    return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}

Status TunerFrontend::setLnb(int /*lnbHandle*/) {
Status TunerFrontend::setLnb(const shared_ptr<ITunerLnb>& lnb) {
    if (mFrontend == NULL) {
        ALOGD("IFrontend is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result status = mFrontend->setLnb(static_cast<TunerLnb*>(lnb.get())->getId());
    if (status == Result::SUCCESS) {
        return Status::ok();
    }

Status TunerFrontend::setLna(bool /*bEnable*/) {
    return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}

Status TunerFrontend::setLna(bool bEnable) {
    if (mFrontend == NULL) {
        ALOGD("IFrontend is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result status = mFrontend->setLna(bEnable);
    if (status == Result::SUCCESS) {
        return Status::ok();
    }

    return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}

Status TunerFrontend::linkCiCamToFrontend(int ciCamId, int32_t* _aidl_return) {
    if (mFrontend_1_1 == NULL) {
        ALOGD("IFrontend_1_1 is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    int ltsId;
    Result status;
    mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
            [&](Result r, uint32_t id) {
                status = r;
                ltsId = id;
            });

    if (status == Result::SUCCESS) {
        *_aidl_return = ltsId;
        return Status::ok();
    }

    return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}

Status TunerFrontend::unlinkCiCamToFrontend(int ciCamId) {
    if (mFrontend_1_1 == NULL) {
        ALOGD("IFrontend_1_1 is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result status = mFrontend_1_1->unlinkCiCam(ciCamId);
    if (status == Result::SUCCESS) {
        return Status::ok();
    }

    return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}

Status TunerFrontend::close() {
    if (mFrontend == NULL) {
        ALOGD("IFrontend is not initialized");
+4 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
using Status = ::ndk::ScopedAStatus;
using ::aidl::android::media::tv::tuner::BnTunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerFrontendCallback;
using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Settings;
using ::aidl::android::media::tv::tuner::TunerFrontendDvbsCodeRate;
using ::aidl::android::media::tv::tuner::TunerFrontendScanMessage;
@@ -65,8 +66,10 @@ public:
    Status stopTune() override;
    Status scan(const TunerFrontendSettings& settings, int frontendScanType) override;
    Status stopScan() override;
    Status setLnb(int lnbHandle) override;
    Status setLnb(const shared_ptr<ITunerLnb>& lnb) override;
    Status setLna(bool bEnable) override;
    Status linkCiCamToFrontend(int ciCamId, int32_t* _aidl_return) override;
    Status unlinkCiCamToFrontend(int ciCamId) override;
    Status close() override;
    Status getStatus(const vector<int32_t>& statusTypes,
            vector<TunerFrontendStatus>* _aidl_return) override;
+2 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ public:
    Status sendDiseqcMessage(const vector<uint8_t>& diseqcMessage) override;
    Status close() override;

    int getId() { return mId; }

    struct LnbCallback : public ILnbCallback {
        LnbCallback(const shared_ptr<ITunerLnbCallback> tunerLnbCallback)
                : mTunerLnbCallback(tunerLnbCallback) {};
+63 −74
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
#define LOG_TAG "TunerService"

#include <android/binder_manager.h>
#include <fmq/ConvertMQDescriptors.h>
#include <utils/Log.h>
#include "TunerService.h"
#include "TunerFrontend.h"
@@ -46,6 +45,7 @@ using ::android::hardware::tv::tuner::V1_0::IFrontend;
using ::android::hardware::tv::tuner::V1_0::ILnb;
using ::android::hardware::tv::tuner::V1_0::LnbId;
using ::android::hardware::tv::tuner::V1_0::Result;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;

namespace android {

@@ -58,8 +58,8 @@ void TunerService::instantiate() {
    AServiceManager_addService(service->asBinder().get(), getServiceName());
}

bool TunerService::getITuner() {
    ALOGD("getITuner");
bool TunerService::hasITuner() {
    ALOGD("hasITuner");
    if (mTuner != nullptr) {
        return true;
    }
@@ -71,10 +71,26 @@ bool TunerService::getITuner() {
    return true;
}

bool TunerService::hasITuner_1_1() {
    ALOGD("hasITuner_1_1");
    if (mTuner_1_1 != nullptr) {
        return true;
    }
    if (!hasITuner()) {
        return false;
    }
    mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::castFrom(mTuner);
    if (mTuner_1_1 == nullptr) {
        ALOGE("Failed to get ITuner_1_1 service");
        return false;
    }
    return true;
}

Status TunerService::openDemux(
        int /* demuxHandle */, std::shared_ptr<ITunerDemux>* _aidl_return) {
    ALOGD("openDemux");
    if (!getITuner()) {
    if (!hasITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
    Result res;
@@ -99,7 +115,7 @@ Status TunerService::openDemux(

Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
    ALOGD("getDemuxCaps");
    if (!getITuner()) {
    if (!hasITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
    Result res;
@@ -117,48 +133,8 @@ Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
    return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}

Result TunerService::configFilter() {
    ALOGD("configFilter");
    if (mFilter == NULL) {
        ALOGD("Failed to configure filter: filter not found");
        return Result::NOT_INITIALIZED;
    }
    DemuxFilterSettings filterSettings;
    DemuxTsFilterSettings tsFilterSettings {
        .tpid = 256,
    };
    DemuxFilterAvSettings filterAvSettings {
        .isPassthrough = false,
    };
    tsFilterSettings.filterSettings.av(filterAvSettings);
    filterSettings.ts(tsFilterSettings);
    Result res = mFilter->configure(filterSettings);

    if (res != Result::SUCCESS) {
        ALOGD("config filter failed, res = %d", res);
        return res;
    }

    Result getQueueDescResult = Result::UNKNOWN_ERROR;
    mFilter->getQueueDesc(
            [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
                mFilterMQDesc = desc;
                getQueueDescResult = r;
                ALOGD("getFilterQueueDesc");
            });
    if (getQueueDescResult == Result::SUCCESS) {
        unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
                mFilterMQDesc,  &mAidlMQDesc);
        mAidlMq = new (nothrow) AidlMessageQueue(mAidlMQDesc);
        EventFlag::createEventFlag(mAidlMq->getEventFlagWord(), &mEventFlag);
    } else {
        ALOGD("get MQDesc failed, res = %d", getQueueDescResult);
    }
    return getQueueDescResult;
}

Status TunerService::getFrontendIds(vector<int32_t>* ids) {
    if (!getITuner()) {
    if (!hasITuner()) {
        return Status::fromServiceSpecificError(
                static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
@@ -173,17 +149,15 @@ Status TunerService::getFrontendIds(vector<int32_t>* ids) {
    return Status::ok();
}

Status TunerService::getFrontendInfo(
        int32_t frontendHandle, TunerFrontendInfo* _aidl_return) {
    if (mTuner == nullptr) {
Status TunerService::getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) {
    if (!hasITuner()) {
        ALOGE("ITuner service is not init.");
        return ::ndk::ScopedAStatus::fromServiceSpecificError(
                static_cast<int32_t>(Result::UNAVAILABLE));
    }

    FrontendInfo info;
    int feId = getResourceIdFromHandle(frontendHandle, FRONTEND);
    Result res = getHidlFrontendInfo(feId, info);
    Result res = getHidlFrontendInfo(id, info);
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
@@ -193,9 +167,41 @@ Status TunerService::getFrontendInfo(
    return Status::ok();
}

Status TunerService::getFrontendDtmbCapabilities(
        int32_t id, TunerFrontendDtmbCapabilities* _aidl_return) {
    if (!hasITuner_1_1()) {
        ALOGE("ITuner_1_1 service is not init.");
        return ::ndk::ScopedAStatus::fromServiceSpecificError(
                static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res;
    FrontendDtmbCapabilities dtmbCaps;
    mTuner_1_1->getFrontendDtmbCapabilities(id,
            [&](Result r, const FrontendDtmbCapabilities& caps) {
        dtmbCaps = caps;
        res = r;
    });
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }

    TunerFrontendDtmbCapabilities aidlDtmbCaps{
        .transmissionModeCap = (int)dtmbCaps.transmissionModeCap,
        .bandwidthCap = (int)dtmbCaps.bandwidthCap,
        .modulationCap = (int)dtmbCaps.modulationCap,
        .codeRateCap = (int)dtmbCaps.codeRateCap,
        .guardIntervalCap = (int)dtmbCaps.guardIntervalCap,
        .interleaveModeCap = (int)dtmbCaps.interleaveModeCap,
    };

    *_aidl_return = aidlDtmbCaps;
    return Status::ok();
}

Status TunerService::openFrontend(
        int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) {
    if (mTuner == nullptr) {
    if (!hasITuner()) {
        ALOGE("ITuner service is not init.");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
@@ -214,25 +220,8 @@ Status TunerService::openFrontend(
    return Status::ok();
}

Status TunerService::getFmqSyncReadWrite(
        MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) {
    ALOGD("getFmqSyncReadWrite");
    // TODO: put the following methods AIDL, and should be called from clients.
    configFilter();
    mFilter->start();
    if (mqDesc == nullptr) {
        ALOGD("getFmqSyncReadWrite null MQDescriptor.");
        *_aidl_return = false;
    } else {
        ALOGD("getFmqSyncReadWrite true");
        *_aidl_return = true;
        *mqDesc = move(mAidlMQDesc);
    }
    return ndk::ScopedAStatus::ok();
}

Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
    if (!getITuner()) {
    if (!hasITuner()) {
        ALOGD("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
@@ -253,7 +242,7 @@ Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return)
}

Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
    if (!getITuner()) {
    if (!hasITuner()) {
        ALOGE("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
@@ -276,7 +265,7 @@ Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>*

Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
            std::shared_ptr<ITunerDescrambler>* _aidl_return) {
    if (!getITuner()) {
    if (!hasITuner()) {
        ALOGD("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
@@ -297,7 +286,7 @@ Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
}

Status TunerService::updateTunerResources() {
    if (!getITuner()) {
    if (!hasITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

@@ -453,7 +442,7 @@ TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo)
        case FrontendType::DVBC: {
            TunerFrontendCableCapabilities cableCaps{
                .modulationCap = (int)halInfo.frontendCaps.dvbcCaps().modulationCap,
                .codeRateCap = (int)halInfo.frontendCaps.dvbcCaps().fecCap,
                .codeRateCap = (int64_t)halInfo.frontendCaps.dvbcCaps().fecCap,
                .annexCap = (int)halInfo.frontendCaps.dvbcCaps().annexCap,
            };
            caps.set<TunerFrontendCapabilities::cableCaps>(cableCaps);
Loading