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

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

Merge changes from topic "frstatus"

* changes:
  Tuner JNI to use the extended frontend status types and build up extended status struct
  Add Frontend Status Extended types and getter APIs
parents 8366252c 07a2704a
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -5836,6 +5836,7 @@ package android.media.tv.tuner.frontend {
    method public int getSymbolRate();
    method public int getType();
    method public int getVcmMode();
    method public boolean isDiseqcRxMessage();
    field public static final int MODULATION_AUTO = 1; // 0x1
    field public static final int MODULATION_MOD_128APSK = 2048; // 0x800
    field public static final int MODULATION_MOD_16APSK = 256; // 0x100
@@ -5879,6 +5880,7 @@ package android.media.tv.tuner.frontend {
  public static class DvbsFrontendSettings.Builder {
    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings build();
    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setCodeRate(@Nullable android.media.tv.tuner.frontend.DvbsCodeRate);
    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setDiseqcRxMessage(boolean);
    method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setFrequency(int);
    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setInputStreamId(int);
    method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setModulation(int);
@@ -6080,14 +6082,21 @@ package android.media.tv.tuner.frontend {
  public class FrontendStatus {
    method public int getAgc();
    method @NonNull public android.media.tv.tuner.frontend.FrontendStatus.Atsc3PlpTuningInfo[] getAtsc3PlpTuningInfo();
    method public int getBandwidth();
    method public int getBer();
    method @NonNull public int[] getBers();
    method @NonNull public int[] getCodeRates();
    method public int getFreqOffset();
    method public int getGuardInterval();
    method public int getHierarchy();
    method public long getInnerFec();
    method @NonNull public int[] getInterleaving();
    method @NonNull public int[] getIsdbtSegment();
    method @NonNull public boolean[] getLayerErrors();
    method public int getLnbVoltage();
    method public int getMer();
    method public int getModulation();
    method @NonNull public int[] getModulationsExt();
    method public int getPer();
    method public int getPerBer();
    method public int getPlpId();
@@ -6096,23 +6105,34 @@ package android.media.tv.tuner.frontend {
    method public int getSnr();
    method public int getSpectralInversion();
    method public int getSymbolRate();
    method public int getSystemId();
    method public int getTransmissionMode();
    method @NonNull public int[] getTsDataRate();
    method public int getUec();
    method public boolean isDemodLocked();
    method public boolean isEwbs();
    method public boolean isLnaOn();
    method public boolean isRfLocked();
    field public static final int FRONTEND_STATUS_TYPE_AGC = 14; // 0xe
    field public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = 21; // 0x15
    field public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = 25; // 0x19
    field public static final int FRONTEND_STATUS_TYPE_BER = 2; // 0x2
    field public static final int FRONTEND_STATUS_TYPE_BERS = 23; // 0x17
    field public static final int FRONTEND_STATUS_TYPE_CODERATES = 24; // 0x18
    field public static final int FRONTEND_STATUS_TYPE_DEMOD_LOCK = 0; // 0x0
    field public static final int FRONTEND_STATUS_TYPE_EWBS = 13; // 0xd
    field public static final int FRONTEND_STATUS_TYPE_FEC = 8; // 0x8
    field public static final int FRONTEND_STATUS_TYPE_FREQ_OFFSET = 18; // 0x12
    field public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = 26; // 0x1a
    field public static final int FRONTEND_STATUS_TYPE_HIERARCHY = 19; // 0x13
    field public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = 30; // 0x1e
    field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f
    field public static final int FRONTEND_STATUS_TYPE_LAYER_ERROR = 16; // 0x10
    field public static final int FRONTEND_STATUS_TYPE_LNA = 15; // 0xf
    field public static final int FRONTEND_STATUS_TYPE_LNB_VOLTAGE = 11; // 0xb
    field public static final int FRONTEND_STATUS_TYPE_MER = 17; // 0x11
    field public static final int FRONTEND_STATUS_TYPE_MODULATION = 9; // 0x9
    field public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = 22; // 0x16
    field public static final int FRONTEND_STATUS_TYPE_PER = 3; // 0x3
    field public static final int FRONTEND_STATUS_TYPE_PLP_ID = 12; // 0xc
    field public static final int FRONTEND_STATUS_TYPE_PRE_BER = 4; // 0x4
@@ -6122,6 +6142,10 @@ package android.media.tv.tuner.frontend {
    field public static final int FRONTEND_STATUS_TYPE_SNR = 1; // 0x1
    field public static final int FRONTEND_STATUS_TYPE_SPECTRAL = 10; // 0xa
    field public static final int FRONTEND_STATUS_TYPE_SYMBOL_RATE = 7; // 0x7
    field public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = 29; // 0x1d
    field public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = 27; // 0x1b
    field public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = 32; // 0x20
    field public static final int FRONTEND_STATUS_TYPE_UEC = 28; // 0x1c
  }
  public static class FrontendStatus.Atsc3PlpTuningInfo {
+2 −1
Original line number Diff line number Diff line
@@ -775,7 +775,8 @@ public class Tuner implements AutoCloseable {
     *
     * <p>This retrieve the statuses of the frontend for given status types.
     *
     * @param statusTypes an array of status types which the caller requests.
     * @param statusTypes an array of status types which the caller requests. Any types that are not
     *        in {@link FrontendInfo.getStatusCapabilities()} would be ignored.
     * @return statuses which response the caller's requests. {@code null} if the operation failed.
     */
    @Nullable
+31 −2
Original line number Diff line number Diff line
@@ -260,10 +260,12 @@ public class DvbsFrontendSettings extends FrontendSettings {
    private final int mVcmMode;
    // Dvbs scan type is only supported in Tuner 1.1 or higher.
    private final int mScanType;
    // isDiseqcRxMessage is only supported in Tuner 1.1 or higher.
    private final boolean mIsDiseqcRxMessage;

    private DvbsFrontendSettings(int frequency, int modulation, DvbsCodeRate codeRate,
            int symbolRate, int rolloff, int pilot, int inputStreamId, int standard, int vcm,
            int scanType) {
            int scanType, boolean isDiseqcRxMessage) {
        super(frequency);
        mModulation = modulation;
        mCodeRate = codeRate;
@@ -274,6 +276,7 @@ public class DvbsFrontendSettings extends FrontendSettings {
        mStandard = standard;
        mVcmMode = vcm;
        mScanType = scanType;
        mIsDiseqcRxMessage = isDiseqcRxMessage;
    }

    /**
@@ -337,6 +340,15 @@ public class DvbsFrontendSettings extends FrontendSettings {
    public int getScanType() {
        return mScanType;
    }
    /**
     * To receive Diseqc Message or not. Default value is false.
     *
     * The setter {@link Builder#setDiseqcRxMessage(boolean)} is only supported with Tuner HAL 1.1
     * or higher.
     */
    public boolean isDiseqcRxMessage() {
        return mIsDiseqcRxMessage;
    }

    /**
     * Creates a builder for {@link DvbsFrontendSettings}.
@@ -360,6 +372,7 @@ public class DvbsFrontendSettings extends FrontendSettings {
        private int mStandard = STANDARD_AUTO;
        private int mVcmMode = VCM_MODE_UNDEFINED;
        private int mScanType = SCAN_TYPE_UNDEFINED;
        private boolean mIsDiseqcRxMessage = false;

        private Builder() {
        }
@@ -394,6 +407,21 @@ public class DvbsFrontendSettings extends FrontendSettings {
            return this;
        }

        /**
         * Set true to receive Diseqc Message.
         *
         * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause
         * no-op. Use {@link TunerVersionChecker.getTunerVersion()} to check the version.
         */
        @NonNull
        public Builder setDiseqcRxMessage(boolean isDiseqcRxMessage) {
            if (TunerVersionChecker.checkHigherOrEqualVersionTo(
                        TunerVersionChecker.TUNER_VERSION_1_1, "setDiseqcRxMessage")) {
                mIsDiseqcRxMessage = isDiseqcRxMessage;
            }
            return this;
        }

        /**
         * Sets Modulation.
         *
@@ -481,7 +509,8 @@ public class DvbsFrontendSettings extends FrontendSettings {
        @NonNull
        public DvbsFrontendSettings build() {
            return new DvbsFrontendSettings(mFrequency, mModulation, mCodeRate, mSymbolRate,
                    mRolloff, mPilot, mInputStreamId, mStandard, mVcmMode, mScanType);
                    mRolloff, mPilot, mInputStreamId, mStandard, mVcmMode, mScanType,
                    mIsDiseqcRxMessage);
        }
    }

+376 −3

File changed.

Preview size limit exceeded, changes collapsed.

+294 −9
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ 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::FrontendBandwidth;
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;
@@ -149,7 +150,13 @@ using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbSettings;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
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::FrontendTransmissionMode;

struct fields_t {
    jfieldID tunerContext;
@@ -1862,11 +1869,23 @@ jobject JTuner::getFrontendStatus(jintArray types) {
    }
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jsize size = env->GetArrayLength(types);
    std::vector<FrontendStatusType> v(size);
    env->GetIntArrayRegion(types, 0, size, reinterpret_cast<jint*>(&v[0]));
    jint intTypes[size];
    env->GetIntArrayRegion(types, 0, size, intTypes);
    std::vector<FrontendStatusType> v;
    std::vector<FrontendStatusTypeExt1_1> v_1_1;
    for (int i = 0; i < size; i++) {
        if (isV1_1ExtendedStatusType(intTypes[i])) {
            v_1_1.push_back(static_cast<FrontendStatusTypeExt1_1>(intTypes[i]));
        } else {
            v.push_back(static_cast<FrontendStatusType>(intTypes[i]));
        }
    }

    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;
@@ -1875,6 +1894,25 @@ jobject JTuner::getFrontendStatus(jintArray types) {
        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.");
        }
    }

    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus");
    jmethodID init = env->GetMethodID(clazz, "<init>", "()V");
@@ -2101,9 +2139,256 @@ jobject JTuner::getFrontendStatus(jintArray types) {
        }
    }

    for (auto s : status_1_1) {
        switch(s.getDiscriminator()) {
            case FrontendStatusExt1_1::hidl_discriminator::modulations: {
                jfieldID field = env->GetFieldID(clazz, "mModulationsExt", "[I");
                std::vector<FrontendModulation> v = s.modulations();

                jintArray valObj = env->NewIntArray(v.size());
                bool valid = false;
                jint m[1];
                for (int i = 0; i < v.size(); i++) {
                    auto modulation = v[i];
                    switch(modulation.getDiscriminator()) {
                        case FrontendModulation::hidl_discriminator::dvbc: {
                            m[0] = static_cast<jint>(modulation.dvbc());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::dvbs: {
                            m[0] = static_cast<jint>(modulation.dvbs());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                           break;
                        }
                        case FrontendModulation::hidl_discriminator::dvbt: {
                            m[0] = static_cast<jint>(modulation.dvbt());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::isdbs: {
                            m[0] = static_cast<jint>(modulation.isdbs());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::isdbs3: {
                            m[0] = static_cast<jint>(modulation.isdbs3());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::isdbt: {
                            m[0] = static_cast<jint>(modulation.isdbt());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::atsc: {
                            m[0] = static_cast<jint>(modulation.atsc());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        case FrontendModulation::hidl_discriminator::atsc3: {
                            m[0] = static_cast<jint>(modulation.atsc3());
                            env->SetIntArrayRegion(valObj, i, 1, m);
                            valid = true;
                            break;
                        }
                        default:
                            break;
                    }
                }
                if (valid) {
                    env->SetObjectField(statusObj, field, valObj);
                }
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::bers: {
                jfieldID field = env->GetFieldID(clazz, "mBers", "[I");
                std::vector<uint32_t> v = s.bers();

                jintArray valObj = env->NewIntArray(v.size());
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::codeRates: {
                jfieldID field = env->GetFieldID(clazz, "mCodeRates", "[I");
                std::vector<::android::hardware::tv::tuner::V1_1::FrontendInnerFec> v
                        = s.codeRates();

                jintArray valObj = env->NewIntArray(v.size());
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::bandwidth: {
                jfieldID field = env->GetFieldID(clazz, "mBandwidth", "Ljava/lang/Integer;");
                auto bandwidth = s.bandwidth();
                jint intBandwidth;
                bool valid = true;
                switch(bandwidth.getDiscriminator()) {
                    case FrontendBandwidth::hidl_discriminator::atsc3: {
                        intBandwidth = static_cast<jint>(bandwidth.atsc3());
                        break;
                    }
                    case FrontendBandwidth::hidl_discriminator::dvbt: {
                        intBandwidth = static_cast<jint>(bandwidth.dvbt());
                        break;
                    }
                    case FrontendBandwidth::hidl_discriminator::isdbt: {
                        intBandwidth = static_cast<jint>(bandwidth.isdbt());
                        break;
                    }
                    default:
                        valid = false;
                        break;
                }
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intBandwidth);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                }
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::interval: {
                jfieldID field = env->GetFieldID(clazz, "mGuardInterval", "Ljava/lang/Integer;");
                auto interval = s.interval();
                jint intInterval;
                bool valid = true;
                switch(interval.getDiscriminator()) {
                    case FrontendGuardInterval::hidl_discriminator::dvbt: {
                        intInterval = static_cast<jint>(interval.dvbt());
                        break;
                    }
                    case FrontendGuardInterval::hidl_discriminator::isdbt: {
                        intInterval = static_cast<jint>(interval.isdbt());
                        break;
                    }
                    default:
                        valid = false;
                        break;
                }
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intInterval);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                }
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::transmissionMode: {
                jfieldID field = env->GetFieldID(clazz, "mTransmissionMode", "Ljava/lang/Integer;");
                auto transmissionMode = s.transmissionMode();
                jint intTransmissionMode;
                bool valid = true;
                switch(transmissionMode.getDiscriminator()) {
                    case FrontendTransmissionMode::hidl_discriminator::dvbt: {
                        intTransmissionMode = static_cast<jint>(transmissionMode.dvbt());
                        break;
                    }
                    case FrontendTransmissionMode::hidl_discriminator::isdbt: {
                        intTransmissionMode = static_cast<jint>(transmissionMode.isdbt());
                        break;
                    }
                    default:
                        valid = false;
                        break;
                }
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intTransmissionMode);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                }
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::uec: {
                jfieldID field = env->GetFieldID(clazz, "mUec", "Ljava/lang/Integer;");
                jobject newIntegerObj = env->NewObject(
                        intClazz, initInt, static_cast<jint>(s.uec()));
                env->SetObjectField(statusObj, field, newIntegerObj);
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::systemId: {
                jfieldID field = env->GetFieldID(clazz, "mSystemId", "Ljava/lang/Integer;");
                jobject newIntegerObj = env->NewObject(
                        intClazz, initInt, static_cast<jint>(s.systemId()));
                env->SetObjectField(statusObj, field, newIntegerObj);
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::interleaving: {
                jfieldID field = env->GetFieldID(clazz, "mInterleaving", "[I");

                std::vector<FrontendInterleaveMode> v = s.interleaving();
                jintArray valObj = env->NewIntArray(v.size());
                bool valid = false;
                jint in[1];
                for (int i = 0; i < v.size(); i++) {
                    auto interleaving = v[i];
                    switch(interleaving.getDiscriminator()) {
                        case FrontendInterleaveMode::hidl_discriminator::atsc3: {
                            in[0] = static_cast<jint>(interleaving.atsc3());
                            env->SetIntArrayRegion(valObj, i, 1, in);
                            valid = true;
                            break;
                        }
                        case FrontendInterleaveMode::hidl_discriminator::dvbc: {
                            in[0] = static_cast<jint>(interleaving.dvbc());
                            env->SetIntArrayRegion(valObj, i, 1, in);
                            valid = true;
                           break;
                        }
                        case FrontendInterleaveMode::hidl_discriminator::dtmb: {
                            in[0] = static_cast<jint>(interleaving.dtmb());
                            env->SetIntArrayRegion(valObj, i, 1, in);
                            valid = true;
                           break;
                        }
                        default:
                            break;
                    }
                }
                if (valid) {
                    env->SetObjectField(statusObj, field, valObj);
                }
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::isdbtSegment: {
                jfieldID field = env->GetFieldID(clazz, "mIsdbtSegment", "[I");
                std::vector<uint8_t> v = s.isdbtSegment();

                jintArray valObj = env->NewIntArray(v.size());
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                break;
            }
            case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: {
                jfieldID field = env->GetFieldID(clazz, "mTsDataRate", "[I");
                std::vector<uint32_t> v = s.tsDataRate();

                jintArray valObj = env->NewIntArray(v.size());
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                break;
            }
            default: {
                break;
            }
        }
    }
    return statusObj;
}

bool JTuner::isV1_1ExtendedStatusType(int type) {
    return (type > static_cast<int>(FrontendStatusType::ATSC3_PLP_INFO)
                && type <= static_cast<int>(FrontendStatusTypeExt1_1::TS_DATA_RATES));
}

jint JTuner::closeFrontend() {
    Result r = Result::SUCCESS;
    if (mFe != NULL) {
Loading