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

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

Merge "Enable Tuner JNI to use Extended Frontend Settings"

parents c843f827 c3719e9c
Loading
Loading
Loading
Loading
+161 −8
Original line number Diff line number Diff line
@@ -134,6 +134,14 @@ using ::android::hardware::tv::tuner::V1_0::PlaybackSettings;
using ::android::hardware::tv::tuner::V1_0::RecordSettings;
using ::android::hardware::tv::tuner::V1_1::Constant;
using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
using ::android::hardware::tv::tuner::V1_1::FrontendAnalogSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbcSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbsSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbtSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;

struct fields_t {
    jfieldID tunerContext;
@@ -1377,12 +1385,21 @@ jobject JTuner::openLnbByName(jstring name) {
    return lnbObj;
}

int JTuner::tune(const FrontendSettings& settings) {
int JTuner::tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1) {
    if (mFe == NULL) {
        ALOGE("frontend is not initialized");
        return (int)Result::INVALID_STATE;
    }
    Result result = mFe->tune(settings);
    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->tune(settings);
        return (int)result;
    }

    result = fe_1_1->tune_1_1(settings, settingsExt1_1);
    return (int)result;
}

@@ -1395,12 +1412,22 @@ int JTuner::stopTune() {
    return (int)result;
}

int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType) {
int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType,
        const FrontendSettingsExt1_1& settingsExt1_1) {
    if (mFe == NULL) {
        ALOGE("frontend is not initialized");
        return (int)Result::INVALID_STATE;
    }
    Result result = mFe->scan(settings, scanType);
    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);
    return (int)result;
}

@@ -2105,6 +2132,22 @@ static uint32_t getFrontendSettingsFreq(JNIEnv *env, const jobject& settings) {
    return freq;
}

static uint32_t getFrontendSettingsEndFreq(JNIEnv *env, const jobject& settings) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings");
    jfieldID endFreqField = env->GetFieldID(clazz, "mEndFrequency", "I");
    uint32_t endFreq = static_cast<uint32_t>(env->GetIntField(settings, endFreqField));
    return endFreq;
}

static FrontendSpectralInversion getFrontendSettingsSpectralInversion(
        JNIEnv *env, const jobject& settings) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings");
    jfieldID inversionField = env->GetFieldID(clazz, "mSpectralInversion", "I");
    FrontendSpectralInversion inversion =
            static_cast<FrontendSpectralInversion>(env->GetIntField(settings, inversionField));
    return inversion;
}

static FrontendSettings getAnalogFrontendSettings(JNIEnv *env, const jobject& settings) {
    FrontendSettings frontendSettings;
    uint32_t freq = getFrontendSettingsFreq(env, settings);
@@ -2124,6 +2167,18 @@ static FrontendSettings getAnalogFrontendSettings(JNIEnv *env, const jobject& se
    return frontendSettings;
}

static void getAnalogFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
        FrontendSettingsExt1_1& settingsExt1_1) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings");
    FrontendAnalogAftFlag aftFlag =
            static_cast<FrontendAnalogAftFlag>(
                    env->GetIntField(settings, env->GetFieldID(clazz, "mAftFlag", "I")));
    FrontendAnalogSettingsExt1_1 analogExt1_1 {
        .aftFlag = aftFlag,
    };
    settingsExt1_1.settingExt.analog(analogExt1_1);
}

static hidl_vec<FrontendAtsc3PlpSettings> getAtsc3PlpSettings(
        JNIEnv *env, const jobject& settings) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings");
@@ -2243,6 +2298,19 @@ static FrontendSettings getDvbcFrontendSettings(JNIEnv *env, const jobject& sett
    return frontendSettings;
}

static void getDvbcFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
        FrontendSettingsExt1_1& settingsExt1_1) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendSettings");
    FrontendCableTimeInterleaveMode interleaveMode =
            static_cast<FrontendCableTimeInterleaveMode>(
                    env->GetIntField(settings, env->GetFieldID(clazz, "mInterleaveMode", "I")));

    FrontendDvbcSettingsExt1_1 dvbcExt1_1 {
        .interleaveMode = interleaveMode,
    };
    settingsExt1_1.settingExt.dvbc(dvbcExt1_1);
}

static FrontendDvbsCodeRate getDvbsCodeRate(JNIEnv *env, const jobject& settings) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
    jobject jcodeRate =
@@ -2284,7 +2352,6 @@ static FrontendSettings getDvbsFrontendSettings(JNIEnv *env, const jobject& sett
    uint32_t freq = getFrontendSettingsFreq(env, settings);
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");


    FrontendDvbsModulation modulation =
            static_cast<FrontendDvbsModulation>(
                    env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
@@ -2323,6 +2390,22 @@ static FrontendSettings getDvbsFrontendSettings(JNIEnv *env, const jobject& sett
    return frontendSettings;
}

static void getDvbsFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
        FrontendSettingsExt1_1& settingsExt1_1) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
    FrontendDvbsScanType scanType =
            static_cast<FrontendDvbsScanType>(
                    env->GetIntField(settings, env->GetFieldID(clazz, "mScanType", "I")));
    bool isDiseqcRxMessage = static_cast<bool>(env->GetBooleanField(
            settings, env->GetFieldID(clazz, "mIsDiseqcRxMessage", "B")));

    FrontendDvbsSettingsExt1_1 dvbsExt1_1 {
        .scanType = scanType,
        .isDiseqcRxMessage = isDiseqcRxMessage,
    };
    settingsExt1_1.settingExt.dvbs(dvbsExt1_1);
}

static FrontendSettings getDvbtFrontendSettings(JNIEnv *env, const jobject& settings) {
    FrontendSettings frontendSettings;
    uint32_t freq = getFrontendSettingsFreq(env, settings);
@@ -2389,6 +2472,25 @@ static FrontendSettings getDvbtFrontendSettings(JNIEnv *env, const jobject& sett
    return frontendSettings;
}

static void getDvbtFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
        FrontendSettingsExt1_1& settingsExt1_1) {
    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendSettings");

    FrontendDvbtSettingsExt1_1 dvbtExt1_1;
    int transmissionMode =
            env->GetIntField(settings, env->GetFieldID(clazz, "mTransmissionMode", "I"));
    dvbtExt1_1.transmissionMode = static_cast<
            ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
                    transmissionMode);

    int constellation =
            env->GetIntField(settings, env->GetFieldID(clazz, "mConstellation", "I"));
    dvbtExt1_1.constellation = static_cast<
            ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(constellation);

    settingsExt1_1.settingExt.dvbt(dvbtExt1_1);
}

static FrontendSettings getIsdbsFrontendSettings(JNIEnv *env, const jobject& settings) {
    FrontendSettings frontendSettings;
    uint32_t freq = getFrontendSettingsFreq(env, settings);
@@ -2529,6 +2631,54 @@ static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject setti
    }
}

static FrontendSettingsExt1_1 getFrontendSettingsExt1_1(JNIEnv *env, int type, jobject settings) {
    ALOGD("getFrontendSettingsExt1_1 %d", type);

    FrontendSettingsExt1_1 settingsExt1_1 {
        .endFrequency = static_cast<uint32_t>(Constant::INVALID_FRONTEND_SETTING_FREQUENCY),
        .inversion = FrontendSpectralInversion::UNDEFINED,
    };
    settingsExt1_1.settingExt.noinit();
    FrontendType feType = static_cast<FrontendType>(type);
    switch(feType) {
        case FrontendType::DVBS:
            getDvbsFrontendSettingsExt1_1(env, settings, settingsExt1_1);
            break;
        case FrontendType::DVBT:
            getDvbtFrontendSettingsExt1_1(env, settings, settingsExt1_1);
            break;
        case FrontendType::ANALOG:
            getAnalogFrontendSettingsExt1_1(env, settings, settingsExt1_1);
            break;
        case FrontendType::ATSC3:
            break;
        case FrontendType::ATSC:
            break;
        case FrontendType::DVBC:
            getDvbcFrontendSettingsExt1_1(env, settings, settingsExt1_1);
            break;
        case FrontendType::ISDBS:
            break;
        case FrontendType::ISDBS3:
            break;
        case FrontendType::ISDBT:
            break;
        default:
            // should never happen because a type is associated with a subclass of
            // FrontendSettings and not set by users
            jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
                "Unsupported frontend type %d", type);
            return FrontendSettingsExt1_1();
    }

    uint32_t endFreq = getFrontendSettingsEndFreq(env, settings);
    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
    settingsExt1_1.endFrequency = endFreq;
    settingsExt1_1.inversion = inversion;

    return settingsExt1_1;
}

static sp<Filter> getFilter(JNIEnv *env, jobject filter) {
    return (Filter *)env->GetLongField(filter, gFields.filterContext);
}
@@ -2670,7 +2820,9 @@ static jint android_media_tv_Tuner_close_frontend_by_handle(

static int android_media_tv_Tuner_tune(JNIEnv *env, jobject thiz, jint type, jobject settings) {
    sp<JTuner> tuner = getTuner(env, thiz);
    return tuner->tune(getFrontendSettings(env, type, settings));
    FrontendSettings setting = getFrontendSettings(env, type, settings);
    FrontendSettingsExt1_1 settingExt = getFrontendSettingsExt1_1(env, type, settings);
    return tuner->tune(setting, settingExt);
}

static int android_media_tv_Tuner_stop_tune(JNIEnv *env, jobject thiz) {
@@ -2681,8 +2833,9 @@ static int android_media_tv_Tuner_stop_tune(JNIEnv *env, jobject thiz) {
static int android_media_tv_Tuner_scan(
        JNIEnv *env, jobject thiz, jint settingsType, jobject settings, jint scanType) {
    sp<JTuner> tuner = getTuner(env, thiz);
    return tuner->scan(getFrontendSettings(
            env, settingsType, settings), static_cast<FrontendScanType>(scanType));
    FrontendSettings setting = getFrontendSettings(env, settingsType, settings);
    FrontendSettingsExt1_1 settingExt = getFrontendSettingsExt1_1(env, settingsType, settings);
    return tuner->scan(setting, static_cast<FrontendScanType>(scanType), settingExt);
}

static int android_media_tv_Tuner_stop_scan(JNIEnv *env, jobject thiz) {
+4 −2
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ 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_1::FrontendSettingsExt1_1;
using ::android::hardware::tv::tuner::V1_0::IDemux;
using ::android::hardware::tv::tuner::V1_0::IDescrambler;
using ::android::hardware::tv::tuner::V1_0::IDvr;
@@ -217,9 +218,10 @@ struct JTuner : public RefBase {
    jobject openFrontendById(int id);
    jint closeFrontendById(int id);
    jobject getFrontendInfo(int id);
    int tune(const FrontendSettings& settings);
    int tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
    int stopTune();
    int scan(const FrontendSettings& settings, FrontendScanType scanType);
    int scan(const FrontendSettings& settings, FrontendScanType scanType,
            const FrontendSettingsExt1_1& settingsExt1_1);
    int stopScan();
    int setLnb(int id);
    int setLna(bool enable);