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

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

Fully remove Frontend HAL from Tuner JNI and use Frontend Client instead

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: Ia011e776035827ca4dcf2ae9f4728513e5cf5a0a
parent 921fd433
Loading
Loading
Loading
Loading
+23 −121
Original line number Diff line number Diff line
@@ -859,8 +859,7 @@ sp<ITimeFilter> TimeFilter::getITimeFilter() {

/////////////// FrontendClientCallbackImpl ///////////////////////

FrontendClientCallbackImpl::FrontendClientCallbackImpl(
        jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {}
FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {}

void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) {
    ALOGD("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType);
@@ -1123,8 +1122,8 @@ JTuner::JTuner(JNIEnv *env, jobject thiz)
}

JTuner::~JTuner() {
    if (mFe != NULL) {
        mFe->close();
    if (mFeClient != NULL) {
        mFeClient->close();
    }
    if (mDemux != NULL) {
        mDemux->close();
@@ -1134,7 +1133,6 @@ JTuner::~JTuner() {
    env->DeleteWeakGlobalRef(mObject);
    env->DeleteGlobalRef(mClass);
    mTuner = NULL;
    mFe = NULL;
    mDemux = NULL;
    mTunerClient = NULL;
    mFeClient = NULL;
@@ -1189,27 +1187,6 @@ jobject JTuner::getFrontendIds() {
}

jobject JTuner::openFrontendByHandle(int feHandle) {
    sp<IFrontend> fe;
    Result res;
    uint32_t id = getResourceIdFromHandle(feHandle);

    mTuner->openFrontendById(id, [&](Result r, const sp<IFrontend>& frontend) {
        fe = frontend;
        res = r;
    });
    if (res != Result::SUCCESS || fe == nullptr) {
        ALOGE("Failed to open frontend");
        return NULL;
    }
    mFe = fe;
    mFe_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
    mFeId = id;
    if (mDemux != NULL) {
        mDemux->setFrontendDataSource(mFeId);
    }

    jint jId = (jint) id;

    // TODO: Handle reopening frontend with different handle
    sp<FrontendClient> feClient = mTunerClient->openFrontend(feHandle);
    if (feClient == NULL) {
@@ -1219,11 +1196,10 @@ jobject JTuner::openFrontendByHandle(int feHandle) {
    mFeClient = feClient;

    mFeId = mFeClient->getId();
    jId = (jint) id;
    if (mDemuxClient != NULL) {
        mDemuxClient->setFrontendDataSource(mFeClient);
    }
    sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject, id);
    sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject);
    mFeClient->setCallback(feClientCb);

    JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1232,7 +1208,7 @@ jobject JTuner::openFrontendByHandle(int feHandle) {
            env->FindClass("android/media/tv/tuner/Tuner$Frontend"),
            gFields.frontendInitID,
            mObject,
            (jint) jId);
            (jint) mFeId);
}

jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
@@ -1536,29 +1512,20 @@ int JTuner::stopTune() {

int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType,
        const FrontendSettingsExt1_1& settingsExt1_1) {
    if (mFe == NULL) {
        ALOGE("frontend is not initialized");
    if (mFeClient == NULL) {
        ALOGE("frontend client is not initialized");
        return (int)Result::INVALID_STATE;
    }
    Result result;
    sp<::android::hardware::tv::tuner::V1_1::IFrontend> fe_1_1 =
            ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
    if (fe_1_1 == NULL) {
        ALOGD("1.1 frontend is not found. Using 1.0 instead.");
        result = mFe->scan(settings, scanType);
        return (int)result;
    }

    result = fe_1_1->scan_1_1(settings, scanType, settingsExt1_1);
    Result result = mFeClient->scan(settings, scanType, settingsExt1_1);
    return (int)result;
}

int JTuner::stopScan() {
    if (mFe == NULL) {
        ALOGE("frontend is not initialized");
    if (mFeClient == NULL) {
        ALOGE("frontend client is not initialized");
        return (int)Result::INVALID_STATE;
    }
    Result result = mFe->stopScan();
    Result result = mFeClient->stopScan();
    return (int)result;
}

@@ -1576,11 +1543,11 @@ int JTuner::setLnb(sp<LnbClient> lnbClient) {
}

int JTuner::setLna(bool enable) {
    if (mFe == NULL) {
        ALOGE("frontend is not initialized");
    if (mFeClient == NULL) {
        ALOGE("frontend client is not initialized");
        return (int)Result::INVALID_STATE;
    }
    Result result = mFe->setLna(enable);
    Result result = mFeClient->setLna(enable);
    return (int)result;
}

@@ -1603,9 +1570,6 @@ Result JTuner::openDemux() {
        if (res == Result::SUCCESS) {
            mDemux = demuxSp;
            mDemuxId = id;
            if (mFe != NULL) {
                mDemux->setFrontendDataSource(mFeId);
            }
        } else {
            return res;
        }
@@ -1631,12 +1595,6 @@ Result JTuner::openDemux() {

jint JTuner::close() {
    Result res = Result::SUCCESS;
    if (mFe != NULL) {
        res = mFe->close();
        if (res != Result::SUCCESS) {
            return (jint) res;
        }
    }
    if (mDemux != NULL) {
        res = mDemux->close();
        if (res != Result::SUCCESS) {
@@ -1702,24 +1660,11 @@ int JTuner::connectCiCam(jint id) {
}

int JTuner::linkCiCam(int id) {
    if (mFe_1_1 == NULL) {
        ALOGE("frontend 1.1 is not initialized");
        return (int)Constant::INVALID_LTS_ID;
    }

    Result res;
    uint32_t ltsId;
    mFe_1_1->linkCiCam(static_cast<uint32_t>(id),
            [&](Result r, uint32_t id) {
                res = r;
                ltsId = id;
            });

    if (res != Result::SUCCESS) {
    if (mFeClient == NULL) {
        ALOGE("frontend client is not initialized");
        return (int)Constant::INVALID_LTS_ID;
    }

    return (int) ltsId;
    return mFeClient->linkCiCamToFrontend(id);
}

int JTuner::disconnectCiCam() {
@@ -1735,12 +1680,12 @@ int JTuner::disconnectCiCam() {


int JTuner::unlinkCiCam(int id) {
    if (mFe_1_1 == NULL) {
        ALOGE("frontend 1.1 is not initialized");
    if (mFeClient == NULL) {
        ALOGE("frontend client is not initialized");
        return (int)Result::INVALID_STATE;
    }

    Result r = mFe_1_1->unlinkCiCam(static_cast<uint32_t>(id));
    Result r = mFeClient->unlinkCiCamToFrontend(id);

    return (int) r;
}
@@ -1910,7 +1855,7 @@ jobject JTuner::getDemuxCaps() {
}

jobject JTuner::getFrontendStatus(jintArray types) {
    if (mFe == NULL) {
    if (mFeClient == NULL) {
        return NULL;
    }
    JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1927,38 +1872,8 @@ jobject JTuner::getFrontendStatus(jintArray types) {
        }
    }

    Result res;
    hidl_vec<FrontendStatus> status;
    hidl_vec<FrontendStatusExt1_1> status_1_1;

    if (v.size() > 0) {
        mFe->getStatus(v,
                [&](Result r, const hidl_vec<FrontendStatus>& s) {
                    res = r;
                    status = s;
                });
        if (res != Result::SUCCESS) {
            return NULL;
        }
    }

    if (v_1_1.size() > 0) {
        sp<::android::hardware::tv::tuner::V1_1::IFrontend> iFeSp_1_1;
        iFeSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);

        if (iFeSp_1_1 != NULL) {
            iFeSp_1_1->getStatusExt1_1(v_1_1,
                [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
                    res = r;
                    status_1_1 = s;
                });
            if (res != Result::SUCCESS) {
                return NULL;
            }
        } else {
            ALOGW("getStatusExt1_1 is not supported with the current HAL implementation.");
        }
    }
    hidl_vec<FrontendStatus> status = mFeClient->getStatus(v);
    hidl_vec<FrontendStatusExt1_1> status_1_1 = mFeClient->getStatusExtended_1_1(v_1_1);

    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus");
    jmethodID init = env->GetMethodID(clazz, "<init>", "()V");
@@ -2504,15 +2419,6 @@ bool JTuner::isV1_1ExtendedStatusType(int type) {

jint JTuner::closeFrontend() {
    Result r = Result::SUCCESS;
    if (mFe != NULL) {
        r = mFe->close();
    }
    if (r == Result::SUCCESS) {
        mFe = NULL;
        mFe_1_1 = NULL;
    } else {
        return (jint) r;
    }

    if (mFeClient != NULL) {
        r = mFeClient->close();
@@ -2570,10 +2476,6 @@ static sp<DescramblerClient> getDescramblerClient(JNIEnv *env, jobject descrambl
    return (DescramblerClient *)env->GetLongField(descrambler, gFields.descramblerContext);
}

static uint32_t getResourceIdFromHandle(jint handle) {
    return (handle & 0x00ff0000) >> 16;
}

static DemuxPid getDemuxPid(int pidType, int pid) {
    DemuxPid demuxPid;
    if ((int)pidType == 1) {
+1 −9
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ private:
};

struct FrontendClientCallbackImpl : public FrontendClientCallback {
    FrontendClientCallbackImpl(jweak tunerObj, FrontendId id);
    FrontendClientCallbackImpl(jweak tunerObj);

    virtual void onEvent(FrontendEventType frontendEventType);
    virtual void onScanMessage(
@@ -187,7 +187,6 @@ struct FrontendClientCallbackImpl : public FrontendClientCallback {
            FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt);

    jweak mObject;
    FrontendId mId;
};

struct TimeFilter : public RefBase {
@@ -244,10 +243,6 @@ private:
    static sp<ITuner> mTuner;
    static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
    static sp<TunerClient> mTunerClient;
    // TODO: remove after migrate to client lib
    sp<IFrontend> mFe;
    // TODO: remove after migrate to client lib
    sp<::android::hardware::tv::tuner::V1_1::IFrontend> mFe_1_1;
    sp<FrontendClient> mFeClient;
    int mFeId;
    sp<LnbClient> mLnbClient;
@@ -267,9 +262,6 @@ private:
    static jobject getDtmbFrontendCaps(JNIEnv *env, int id);

    bool isV1_1ExtendedStatusType(jint type);
    static uint32_t getResourceIdFromHandle(jint handle) {
        return (handle & 0x00ff0000) >> 16;
    }
};

class C2DataIdInfo : public C2Param {
+144 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "FrontendClient.h"

using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
using ::android::hardware::tv::tuner::V1_1::Constant;

namespace android {

@@ -99,6 +100,96 @@ Result FrontendClient::stopTune() {
    return Result::INVALID_STATE;
}

Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
        const FrontendSettingsExt1_1& settingsExt1_1) {
    if (mTunerFrontend != NULL) {
        // TODO: parse hidl settings to aidl settings
        // TODO: aidl frontend settings to include Tuner HAL 1.1 settings
        TunerFrontendSettings settings;
        // TODO: handle error message.
        mTunerFrontend->scan(settings, (int)type);
        return Result::SUCCESS;
    }

    Result result;
    if (mFrontend_1_1 != NULL) {
        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) {
        // TODO: handle error message.
        mTunerFrontend->stopScan();
        return Result::SUCCESS;
    }

    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) {
        // TODO: handle error message.
        /*status = mTunerFrontend->getStatus(statusTypes);
        return status;*/
    }

    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) {
        // TODO: handle error message.
        /*status = mTunerFrontend->getStatusExtended_1_1(statusTypes);
        return status;*/
    }

    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) {
        // TODO: handle error message.
@@ -114,6 +205,59 @@ Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
    return Result::INVALID_STATE;
}

Result FrontendClient::setLna(bool bEnable) {
    if (mTunerFrontend != NULL) {
        // TODO: handle error message.
        /*mTunerFrontend->setLna(bEnable);
        return Result::SUCCESS;*/
    }

    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) {
        // TODO: handle error message.
        /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId);
        return ltsId;*/
    }

    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) {
        // TODO: handle error message.
        /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
        return Result::SUCCESS;*/
    }

    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) {
        // TODO: handle error message.
+44 −0
Original line number Diff line number Diff line
@@ -38,13 +38,18 @@ using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
using ::android::hardware::tv::tuner::V1_0::FrontendSettings;
using ::android::hardware::tv::tuner::V1_0::FrontendStatus;
using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
using ::android::hardware::tv::tuner::V1_0::IFrontend;
using ::android::hardware::tv::tuner::V1_0::Result;

using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
using ::android::hardware::tv::tuner::V1_1::IFrontendCallback;

using namespace std;
@@ -127,11 +132,50 @@ public:
     */
    Result stopTune();

    /**
     * Scan the frontend to use the settings given.
     */
    Result scan(const FrontendSettings& settings, FrontendScanType frontendScanType,
            const FrontendSettingsExt1_1& settingsExt1_1);

    /**
     * Stop the previous scanning.
     */
    Result stopScan();

    /**
     * Gets the statuses of the frontend.
     */
    vector<FrontendStatus> getStatus(vector<FrontendStatusType> statusTypes);

    /**
     * Gets the 1.1 extended statuses of the frontend.
     */
    vector<FrontendStatusExt1_1> getStatusExtended_1_1(
            vector<FrontendStatusTypeExt1_1> statusTypes);

    /**
     * Sets Low-Noise Block downconverter (LNB) for satellite frontend.
     */
    Result setLnb(sp<LnbClient> lnbClient);

    /**
     * Enable or Disable Low Noise Amplifier (LNA).
     */
    Result setLna(bool bEnable);

    /**
     * Link Frontend to the cicam with given id.
     *
     * @return lts id
     */
    int linkCiCamToFrontend(int ciCamId);

    /**
     * Unink Frontend to the cicam with given id.
     */
    Result unlinkCiCamToFrontend(int ciCamId);

    /**
     * Close Frontend.
     */