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

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

Merge "Update Tuner Resources in Tuner Service"

parents 07f14e30 ce2cb401
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