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

Commit 57079259 authored by Amy Zhang's avatar Amy Zhang Committed by Android (Google) Code Review
Browse files

Merge "Complete TunerFrontend aidl interface and implementation" into sc-dev

parents 144f9e20 5af84149
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