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

Commit ce2cb401 authored by Amy Zhang's avatar Amy Zhang
Browse files

Update Tuner Resources in Tuner Service

Test: atest android.media.tv.tuner.cts
Bug: 159067322
Change-Id: Ieff22f0fe50c0515ca2545485d62defaaa47b88d
parent 44ab821b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -79,6 +79,8 @@ cc_library {
        "libmedia",
        "libutils",
        "tv_tuner_aidl_interface-ndk_platform",
        "tv_tuner_resource_manager_aidl_interface-ndk_platform",
        "tv_tuner_resource_manager_aidl_interface-cpp",
    ],

    static_libs: [
@@ -113,6 +115,8 @@ cc_binary {
        "liblog",
        "libtunerservice",
        "libutils",
        "tv_tuner_resource_manager_aidl_interface-ndk_platform",
        "tv_tuner_resource_manager_aidl_interface-cpp",
    ],

    static_libs: [
+100 −23
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ using ::aidl::android::media::tv::tuner::TunerFrontendDvbtCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Capabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtCapabilities;
using ::android::hardware::hidl_vec;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
@@ -77,13 +76,10 @@ Status TunerService::openDemux(
    if (!getITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
    if (mDemux != nullptr) {
        *_aidl_return = mDemux->ref<ITunerDemux>();
        return Status::ok();
    }
    Result res;
    uint32_t id;
    sp<IDemux> demuxSp = nullptr;
    shared_ptr<ITunerDemux> tunerDemux = nullptr;
    mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& demux) {
        demuxSp = demux;
        id = demuxId;
@@ -91,13 +87,12 @@ Status TunerService::openDemux(
        ALOGD("open demux, id = %d", demuxId);
    });
    if (res == Result::SUCCESS) {
        mDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
        *_aidl_return = mDemux->ref<ITunerDemux>();
        tunerDemux = ::ndk::SharedRefBase::make<TunerDemux>(demuxSp, id);
        *_aidl_return = tunerDemux->ref<ITunerDemux>();
        return Status::ok();
    }

    ALOGD("open demux failed, res = %d", res);
    mDemux = nullptr;
    return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}

@@ -141,17 +136,13 @@ Result TunerService::configFilter() {
    return getQueueDescResult;
}

Status TunerService::getFrontendIds(vector<int32_t>* ids, int32_t* /* _aidl_return */) {
Status TunerService::getFrontendIds(vector<int32_t>* ids) {
    if (!getITuner()) {
        return Status::fromServiceSpecificError(
                static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
    hidl_vec<FrontendId> feIds;
    Result res;
    mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
        feIds = frontendIds;
        res = r;
    });
    Result res = getHidlFrontendIds(feIds);
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
@@ -169,13 +160,9 @@ Status TunerService::getFrontendInfo(
                static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res;
    FrontendInfo info;
    int feId = getResourceIdFromHandle(frontendHandle, FRONTEND);
    mTuner->getFrontendInfo(feId, [&](Result r, const FrontendInfo& feInfo) {
        info = feInfo;
        res = r;
    });
    Result res = getHidlFrontendInfo(feId, info);
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
@@ -224,8 +211,8 @@ Status TunerService::getFmqSyncReadWrite(
}

Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
    if (mTuner == nullptr) {
        ALOGE("ITuner service is not init.");
    if (!getITuner()) {
        ALOGD("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

@@ -245,8 +232,8 @@ Status TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return)
}

Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) {
    if (mTuner == nullptr) {
        ALOGE("ITuner service is not init.");
    if (!getITuner()) {
        ALOGE("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

@@ -266,6 +253,96 @@ Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>*
    return Status::ok();
}

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

    // Connect with Tuner Resource Manager.
    ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
    mTunerResourceManager = ITunerResourceManager::fromBinder(binder);

    updateFrontendResources();
    updateLnbResources();
    // TODO: update Demux, Descrambler.
    return Status::ok();
}

void TunerService::updateFrontendResources() {
    hidl_vec<FrontendId> ids;
    Result res = getHidlFrontendIds(ids);
    if (res != Result::SUCCESS) {
        return;
    }
    vector<TunerFrontendInfo> infos;
    for (int i = 0; i < ids.size(); i++) {
        FrontendInfo frontendInfo;
        Result res = getHidlFrontendInfo((int)ids[i], frontendInfo);
        if (res != Result::SUCCESS) {
            continue;
        }
        TunerFrontendInfo tunerFrontendInfo{
            .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
            .type = static_cast<int>(frontendInfo.type),
            .exclusiveGroupId = static_cast<int>(frontendInfo.exclusiveGroupId),
        };
        infos.push_back(tunerFrontendInfo);
    }
    mTunerResourceManager->setFrontendInfoList(infos);
}

void TunerService::updateLnbResources() {
    vector<int> handles = getLnbHandles();
    if (handles.size() == 0) {
        return;
    }
    mTunerResourceManager->setLnbInfoList(handles);
}

vector<int> TunerService::getLnbHandles() {
    vector<int> lnbHandles;
    if (mTuner != NULL) {
        Result res;
        vector<LnbId> lnbIds;
        mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
            lnbIds = ids;
            res = r;
        });
        if (res != Result::SUCCESS || lnbIds.size() == 0) {
        } else {
            for (int i = 0; i < lnbIds.size(); i++) {
                lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
            }
        }
    }

    return lnbHandles;
}

Result TunerService::getHidlFrontendIds(hidl_vec<FrontendId>& ids) {
    if (mTuner == NULL) {
        return Result::NOT_INITIALIZED;
    }
    Result res;
    mTuner->getFrontendIds([&](Result r, const hidl_vec<FrontendId>& frontendIds) {
        ids = frontendIds;
        res = r;
    });
    return res;
}

Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
    if (mTuner == NULL) {
        return Result::NOT_INITIALIZED;
    }
    Result res;
    mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& feInfo) {
        info = feInfo;
        res = r;
    });
    return res;
}

TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
    TunerFrontendInfo info{
        .type = (int)halInfo.type,
+25 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#ifndef ANDROID_MEDIA_TUNERSERVICE_H
#define ANDROID_MEDIA_TUNERSERVICE_H

#include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h>
#include <aidl/android/media/tv/tuner/BnTunerService.h>
#include <android/hardware/tv/tuner/1.0/ITuner.h>
#include <fmq/AidlMessageQueue.h>
@@ -31,10 +32,12 @@ using ::aidl::android::media::tv::tuner::ITunerDemux;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;

using ::android::hardware::details::logError;
using ::android::hardware::EventFlag;
using ::android::hardware::hidl_vec;
using ::android::hardware::kSynchronizedReadWrite;
using ::android::hardware::EventFlag;
using ::android::hardware::MessageQueue;
using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
@@ -94,7 +97,14 @@ public:
        return (resourceHandle & 0x00ff0000) >> 16;
    }

    Status getFrontendIds(vector<int32_t>* ids, int32_t* _aidl_return) override;
    int getResourceHandleFromId(int id, int resourceType) {
        // TODO: build up randomly generated id to handle mapping
        return (resourceType & 0x000000ff) << 24
                | (id << 16)
                | (mResourceRequestCount++ & 0xffff);
    }

    Status getFrontendIds(vector<int32_t>* ids) override;
    Status getFrontendInfo(int32_t frontendHandle, TunerFrontendInfo* _aidl_return) override;
    Status openFrontend(
            int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override;
@@ -103,19 +113,30 @@ public:
    Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override;
    Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override;
    Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override;
    Status updateTunerResources() override;

private:
    bool getITuner();
    Result configFilter();

    void updateFrontendResources();
    void updateLnbResources();
    Result getHidlFrontendIds(hidl_vec<FrontendId>& ids);
    Result getHidlFrontendInfo(int id, FrontendInfo& info);
    vector<int> getLnbHandles();

    TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo);

    sp<ITuner> mTuner;
    std::shared_ptr<ITunerDemux> mDemux;
    sp<IFilter> mFilter;

    shared_ptr<ITunerResourceManager> mTunerResourceManager;
    int mResourceRequestCount = 0;

    AidlMessageQueue* mAidlMq;
    MQDescriptorSync<uint8_t> mFilterMQDesc;
    AidlMQDesc mAidlMQDesc;
    EventFlag* mEventFlag;
    TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo);
};

} // namespace android
+7 −3
Original line number Diff line number Diff line
@@ -34,10 +34,8 @@ interface ITunerService {

    /**
     * Gets frontend IDs.
     *
     * @return the result code of the operation.
     */
    int getFrontendIds(out int[] ids);
    void getFrontendIds(out int[] ids);

    /**
     * Retrieve the frontend's information.
@@ -82,4 +80,10 @@ interface ITunerService {
     * Create a new instance of Demux.
     */
    ITunerDemux openDemux(in int demuxHandle);

    /**
     * Update Tuner Resources in TunerResourceManager.
     */
    // TODO: b/178124017 update TRM in TunerService independently.
    void updateTunerResources();
}
+1 −2
Original line number Diff line number Diff line
service media.tuner /system/bin/mediatuner
    class main
    user media
    group media
    ioprio rt 4
    task_profiles ProcessCapacityHigh HighPerformance