diff --git a/api/system-current.txt b/api/system-current.txt index 0acfb29ce7cac..d1ceed6b3f701 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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 { diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 56499e26bafe2..aedf5d5ae0bb5 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -775,7 +775,8 @@ public class Tuner implements AutoCloseable { * *

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 diff --git a/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java b/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java index 343dbb137dd6f..fadc004759304 100644 --- a/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java +++ b/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java @@ -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. + * + *

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); } } diff --git a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java index c265bb9e6050b..dd9347cd6e5de 100644 --- a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java +++ b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Lnb; +import android.media.tv.tuner.TunerVersionChecker; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -43,7 +44,13 @@ public class FrontendStatus { FRONTEND_STATUS_TYPE_EWBS, FRONTEND_STATUS_TYPE_AGC, FRONTEND_STATUS_TYPE_LNA, FRONTEND_STATUS_TYPE_LAYER_ERROR, FRONTEND_STATUS_TYPE_MER, FRONTEND_STATUS_TYPE_FREQ_OFFSET, FRONTEND_STATUS_TYPE_HIERARCHY, - FRONTEND_STATUS_TYPE_RF_LOCK, FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO}) + FRONTEND_STATUS_TYPE_RF_LOCK, FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO, + FRONTEND_STATUS_TYPE_BERS, FRONTEND_STATUS_TYPE_CODERATES, + FRONTEND_STATUS_TYPE_BANDWIDTH, FRONTEND_STATUS_TYPE_GUARD_INTERVAL, + FRONTEND_STATUS_TYPE_TRANSMISSION_MODE, FRONTEND_STATUS_TYPE_UEC, + FRONTEND_STATUS_TYPE_T2_SYSTEM_ID, FRONTEND_STATUS_TYPE_INTERLEAVINGS, + FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS, FRONTEND_STATUS_TYPE_TS_DATA_RATES, + FRONTEND_STATUS_TYPE_MODULATIONS_EXT}) @Retention(RetentionPolicy.SOURCE) public @interface FrontendStatusType {} @@ -145,10 +152,83 @@ public class FrontendStatus { */ public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = Constants.FrontendStatusType.ATSC3_PLP_INFO; - + /** + * BERS Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_BERS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.BERS; + /** + * Coderate Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_CODERATES = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.CODERATES; + /** + * Bandwidth Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.BANDWIDTH; + /** + * Guard Interval Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.GUARD_INTERVAL; + /** + * Transmission Mode Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.TRANSMISSION_MODE; + /** + * UEC Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_UEC = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.UEC; + /** + * T2 System Id Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.T2_SYSTEM_ID; + /** + * Interleavings Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.INTERLEAVINGS; + /** + * ISDBT Segments Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.ISDBT_SEGMENTS; + /** + * TS Data Rates Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.TS_DATA_RATES; + /** + * Extended Modulations Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.MODULATIONS; /** @hide */ @IntDef(value = { + AtscFrontendSettings.MODULATION_UNDEFINED, + AtscFrontendSettings.MODULATION_AUTO, + AtscFrontendSettings.MODULATION_MOD_8VSB, + AtscFrontendSettings.MODULATION_MOD_16VSB, + Atsc3FrontendSettings.MODULATION_UNDEFINED, + Atsc3FrontendSettings.MODULATION_AUTO, + Atsc3FrontendSettings.MODULATION_MOD_QPSK, + Atsc3FrontendSettings.MODULATION_MOD_16QAM, + Atsc3FrontendSettings.MODULATION_MOD_64QAM, + Atsc3FrontendSettings.MODULATION_MOD_256QAM, + Atsc3FrontendSettings.MODULATION_MOD_1024QAM, + Atsc3FrontendSettings.MODULATION_MOD_4096QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_UNDEFINED, + DtmbFrontendSettings.MODULATION_CONSTELLATION_AUTO, + DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM_NR, + DtmbFrontendSettings.MODULATION_CONSTELLATION_16QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_32QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_64QAM, DvbcFrontendSettings.MODULATION_UNDEFINED, DvbcFrontendSettings.MODULATION_AUTO, DvbcFrontendSettings.MODULATION_MOD_16QAM, @@ -171,6 +251,16 @@ public class FrontendStatus { DvbsFrontendSettings.MODULATION_MOD_128APSK, DvbsFrontendSettings.MODULATION_MOD_256APSK, DvbsFrontendSettings.MODULATION_MOD_RESERVED, + DvbtFrontendSettings.CONSTELLATION_UNDEFINED, + DvbtFrontendSettings.CONSTELLATION_AUTO, + DvbtFrontendSettings.CONSTELLATION_QPSK, + DvbtFrontendSettings.CONSTELLATION_16QAM, + DvbtFrontendSettings.CONSTELLATION_64QAM, + DvbtFrontendSettings.CONSTELLATION_256QAM, + DvbtFrontendSettings.CONSTELLATION_QPSK_R, + DvbtFrontendSettings.CONSTELLATION_16QAM_R, + DvbtFrontendSettings.CONSTELLATION_64QAM_R, + DvbtFrontendSettings.CONSTELLATION_256QAM_R, IsdbsFrontendSettings.MODULATION_UNDEFINED, IsdbsFrontendSettings.MODULATION_AUTO, IsdbsFrontendSettings.MODULATION_MOD_BPSK, @@ -192,6 +282,101 @@ public class FrontendStatus { @Retention(RetentionPolicy.SOURCE) public @interface FrontendModulation {} + /** @hide */ + @IntDef(value = { + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_CTI, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_HTI, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_240, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_720, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_1_0, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_1_1, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_64_2, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_32_4, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_16_8, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_8_16, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_2, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_3, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_4}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendInterleaveMode {} + + /** @hide */ + @IntDef(value = { + Atsc3FrontendSettings.BANDWIDTH_UNDEFINED, + Atsc3FrontendSettings.BANDWIDTH_AUTO, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_6MHZ, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_7MHZ, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_8MHZ, + DtmbFrontendSettings.BANDWIDTH_UNDEFINED, + DtmbFrontendSettings.BANDWIDTH_AUTO, + DtmbFrontendSettings.BANDWIDTH_6MHZ, + DtmbFrontendSettings.BANDWIDTH_8MHZ, + DvbtFrontendSettings.BANDWIDTH_UNDEFINED, + DvbtFrontendSettings.BANDWIDTH_AUTO, + DvbtFrontendSettings.BANDWIDTH_8MHZ, + DvbtFrontendSettings.BANDWIDTH_7MHZ, + DvbtFrontendSettings.BANDWIDTH_6MHZ, + DvbtFrontendSettings.BANDWIDTH_5MHZ, + DvbtFrontendSettings.BANDWIDTH_1_7MHZ, + DvbtFrontendSettings.BANDWIDTH_10MHZ, + IsdbtFrontendSettings.BANDWIDTH_UNDEFINED, + IsdbtFrontendSettings.BANDWIDTH_AUTO, + IsdbtFrontendSettings.BANDWIDTH_8MHZ, + IsdbtFrontendSettings.BANDWIDTH_7MHZ, + IsdbtFrontendSettings.BANDWIDTH_6MHZ}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendBandwidth {} + + /** @hide */ + @IntDef(value = { + DtmbFrontendSettings.TRANSMISSION_MODE_UNDEFINED, + DtmbFrontendSettings.TRANSMISSION_MODE_AUTO, + DtmbFrontendSettings.TRANSMISSION_MODE_C1, + DtmbFrontendSettings.TRANSMISSION_MODE_C3780, + DvbtFrontendSettings.TRANSMISSION_MODE_UNDEFINED, + DvbtFrontendSettings.TRANSMISSION_MODE_AUTO, + DvbtFrontendSettings.TRANSMISSION_MODE_2K, + DvbtFrontendSettings.TRANSMISSION_MODE_8K, + DvbtFrontendSettings.TRANSMISSION_MODE_4K, + DvbtFrontendSettings.TRANSMISSION_MODE_1K, + DvbtFrontendSettings.TRANSMISSION_MODE_16K, + DvbtFrontendSettings.TRANSMISSION_MODE_32K, + IsdbtFrontendSettings.MODE_UNDEFINED, + IsdbtFrontendSettings.MODE_AUTO, + IsdbtFrontendSettings.MODE_1, + IsdbtFrontendSettings.MODE_2, + IsdbtFrontendSettings.MODE_3}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendTransmissionMode {} + + /** @hide */ + @IntDef(value = { + DtmbFrontendSettings.GUARD_INTERVAL_UNDEFINED, + DtmbFrontendSettings.GUARD_INTERVAL_AUTO, + DtmbFrontendSettings.GUARD_INTERVAL_PN_420_VARIOUS, + DtmbFrontendSettings.GUARD_INTERVAL_PN_595_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_945_VARIOUS, + DtmbFrontendSettings.GUARD_INTERVAL_PN_420_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_945_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_RESERVED, + DvbtFrontendSettings.GUARD_INTERVAL_UNDEFINED, + DvbtFrontendSettings.GUARD_INTERVAL_AUTO, + DvbtFrontendSettings.GUARD_INTERVAL_1_32, + DvbtFrontendSettings.GUARD_INTERVAL_1_16, + DvbtFrontendSettings.GUARD_INTERVAL_1_8, + DvbtFrontendSettings.GUARD_INTERVAL_1_4, + DvbtFrontendSettings.GUARD_INTERVAL_1_128, + DvbtFrontendSettings.GUARD_INTERVAL_19_128, + DvbtFrontendSettings.GUARD_INTERVAL_19_256, + DvbtFrontendSettings.GUARD_INTERVAL_19_128}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendGuardInterval {} private Boolean mIsDemodLocked; private Integer mSnr; @@ -215,6 +400,18 @@ public class FrontendStatus { private Integer mHierarchy; private Boolean mIsRfLocked; private Atsc3PlpTuningInfo[] mPlpInfo; + private int[] mBers; + private int[] mCodeRates; + private Integer mBandwidth; + private Integer mGuardInterval; + private Integer mTransmissionMode; + private Integer mUec; + private Integer mSystemId; + private int[] mInterleaving; + private int[] mTsDataRate; + private int[] mIsdbtSegment; + private int[] mModulationsExt; + // Constructed and fields set by JNI code. private FrontendStatus() { @@ -323,7 +520,7 @@ public class FrontendStatus { /** * Gets Spectral Inversion for DVBC. */ - @DvbcFrontendSettings.SpectralInversion + @FrontendSettings.FrontendSpectralInversion public int getSpectralInversion() { if (mInversion == null) { throw new IllegalStateException(); @@ -436,6 +633,182 @@ public class FrontendStatus { return mPlpInfo; } + /** + * Gets an array of BERS status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getBers() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getBers status"); + if (mBers == null) { + throw new IllegalStateException(); + } + return mBers; + } + + /** + * Gets an array of code rates status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getCodeRates() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getCodeRates status"); + if (mCodeRates == null) { + throw new IllegalStateException(); + } + return mCodeRates; + } + + /** + * Gets bandwidth status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendBandwidth + public int getBandwidth() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getBandwidth status"); + if (mBandwidth == null) { + throw new IllegalStateException(); + } + return mBandwidth; + } + + /** + * Gets guard interval status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendGuardInterval + public int getGuardInterval() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getGuardInterval status"); + if (mGuardInterval == null) { + throw new IllegalStateException(); + } + return mGuardInterval; + } + + /** + * Gets tansmission mode status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendTransmissionMode + public int getTransmissionMode() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getTransmissionMode status"); + if (mTransmissionMode == null) { + throw new IllegalStateException(); + } + return mTransmissionMode; + } + + /** + * Gets UEC status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + public int getUec() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getUec status"); + if (mUec == null) { + throw new IllegalStateException(); + } + return mUec; + } + + /** + * Gets system id status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + public int getSystemId() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getSystemId status"); + if (mSystemId == null) { + throw new IllegalStateException(); + } + return mSystemId; + } + + /** + * Gets an array of interleaving status. Array value should be withink {@link + * FrontendInterleaveMode}. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getInterleaving() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getInterleaving status"); + if (mInterleaving == null) { + throw new IllegalStateException(); + } + return mInterleaving; + } + + /** + * Gets an array of isdbt segment status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getIsdbtSegment() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getIsdbtSegment status"); + if (mIsdbtSegment == null) { + throw new IllegalStateException(); + } + return mIsdbtSegment; + } + + /** + * Gets an array of TS data rate status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getTsDataRate() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getTsDataRate status"); + if (mTsDataRate == null) { + throw new IllegalStateException(); + } + return mTsDataRate; + } + + /** + * Gets an array of the extended modulations status. Array value should be withink {@link + * FrontendModulation}. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getModulationsExt() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getModulationsExt status"); + if (mModulationsExt == null) { + throw new IllegalStateException(); + } + return mModulationsExt; + } + /** * Status for each tuning Physical Layer Pipes. */ diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 6a1acede029f8..cd2fa636c0f69 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -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,18 +1869,49 @@ jobject JTuner::getFrontendStatus(jintArray types) { } JNIEnv *env = AndroidRuntime::getJNIEnv(); jsize size = env->GetArrayLength(types); - std::vector v(size); - env->GetIntArrayRegion(types, 0, size, reinterpret_cast(&v[0])); + jint intTypes[size]; + env->GetIntArrayRegion(types, 0, size, intTypes); + std::vector v; + std::vector v_1_1; + for (int i = 0; i < size; i++) { + if (isV1_1ExtendedStatusType(intTypes[i])) { + v_1_1.push_back(static_cast(intTypes[i])); + } else { + v.push_back(static_cast(intTypes[i])); + } + } Result res; hidl_vec status; - mFe->getStatus(v, - [&](Result r, const hidl_vec& s) { - res = r; - status = s; - }); - if (res != Result::SUCCESS) { - return NULL; + hidl_vec status_1_1; + + if (v.size() > 0) { + mFe->getStatus(v, + [&](Result r, const hidl_vec& 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& 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"); @@ -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 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(modulation.dvbc()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::dvbs: { + m[0] = static_cast(modulation.dvbs()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::dvbt: { + m[0] = static_cast(modulation.dvbt()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbs: { + m[0] = static_cast(modulation.isdbs()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbs3: { + m[0] = static_cast(modulation.isdbs3()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbt: { + m[0] = static_cast(modulation.isdbt()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::atsc: { + m[0] = static_cast(modulation.atsc()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::atsc3: { + m[0] = static_cast(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 v = s.bers(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&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(&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(bandwidth.atsc3()); + break; + } + case FrontendBandwidth::hidl_discriminator::dvbt: { + intBandwidth = static_cast(bandwidth.dvbt()); + break; + } + case FrontendBandwidth::hidl_discriminator::isdbt: { + intBandwidth = static_cast(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(interval.dvbt()); + break; + } + case FrontendGuardInterval::hidl_discriminator::isdbt: { + intInterval = static_cast(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(transmissionMode.dvbt()); + break; + } + case FrontendTransmissionMode::hidl_discriminator::isdbt: { + intTransmissionMode = static_cast(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(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(s.systemId())); + env->SetObjectField(statusObj, field, newIntegerObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::interleaving: { + jfieldID field = env->GetFieldID(clazz, "mInterleaving", "[I"); + + std::vector 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(interleaving.atsc3()); + env->SetIntArrayRegion(valObj, i, 1, in); + valid = true; + break; + } + case FrontendInterleaveMode::hidl_discriminator::dvbc: { + in[0] = static_cast(interleaving.dvbc()); + env->SetIntArrayRegion(valObj, i, 1, in); + valid = true; + break; + } + case FrontendInterleaveMode::hidl_discriminator::dtmb: { + in[0] = static_cast(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 v = s.isdbtSegment(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: { + jfieldID field = env->GetFieldID(clazz, "mTsDataRate", "[I"); + std::vector v = s.tsDataRate(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + default: { + break; + } + } + } return statusObj; } +bool JTuner::isV1_1ExtendedStatusType(int type) { + return (type > static_cast(FrontendStatusType::ATSC3_PLP_INFO) + && type <= static_cast(FrontendStatusTypeExt1_1::TS_DATA_RATES)); +} + jint JTuner::closeFrontend() { Result r = Result::SUCCESS; if (mFe != NULL) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 2b73f312be054..3f74d24b29c5c 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -268,6 +268,8 @@ private: static jobject getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getDtmbFrontendCaps(JNIEnv *env, int id); + + bool isV1_1ExtendedStatusType(jint type); }; class C2DataIdInfo : public C2Param { diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 126730f35a1c8..869c637be46be 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -5776,6 +5776,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 @@ -5819,6 +5820,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); @@ -6020,14 +6022,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(); @@ -6036,23 +6045,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 @@ -6062,6 +6082,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 {