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
This commit is contained in:
Amy Zhang
2020-10-19 22:06:26 +00:00
committed by Android (Google) Code Review
7 changed files with 753 additions and 15 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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.
*
* <p>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.
*
* <p>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.
*
* <p>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.
*
* <p>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.
*
* <p>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.
*
* <p>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.
*
* <p>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}.
*
* <p>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.
*
* <p>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.
*
* <p>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}.
*
* <p>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.
*/

View File

@@ -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<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;
mFe->getStatus(v,
[&](Result r, const hidl_vec<FrontendStatus>& s) {
res = r;
status = s;
});
if (res != Result::SUCCESS) {
return NULL;
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.");
}
}
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<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) {

View File

@@ -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 {

View File

@@ -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 {