blob: db28631fe06c826fe1c8c3ba6c9bf0e7cb427270 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media.tv.tuner.frontend;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.hardware.tv.tuner.V1_0.Constants;
import android.media.tv.tuner.TunerVersionChecker;
import android.media.tv.tuner.frontend.FrontendSettings.FrontendSpectralInversion;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Frontend settings for DVBC.
*
* @hide
*/
@SystemApi
public class DvbcFrontendSettings extends FrontendSettings {
/** @hide */
@IntDef(flag = true,
prefix = "MODULATION_",
value = {MODULATION_UNDEFINED, MODULATION_AUTO, MODULATION_MOD_16QAM,
MODULATION_MOD_32QAM, MODULATION_MOD_64QAM, MODULATION_MOD_128QAM,
MODULATION_MOD_256QAM})
@Retention(RetentionPolicy.SOURCE)
public @interface Modulation {}
/**
* Modulation undefined.
*/
public static final int MODULATION_UNDEFINED = Constants.FrontendDvbcModulation.UNDEFINED;
/**
* Hardware is able to detect and set modulation automatically
*/
public static final int MODULATION_AUTO = Constants.FrontendDvbcModulation.AUTO;
/**
* 16QAM Modulation.
*/
public static final int MODULATION_MOD_16QAM = Constants.FrontendDvbcModulation.MOD_16QAM;
/**
* 32QAM Modulation.
*/
public static final int MODULATION_MOD_32QAM = Constants.FrontendDvbcModulation.MOD_32QAM;
/**
* 64QAM Modulation.
*/
public static final int MODULATION_MOD_64QAM = Constants.FrontendDvbcModulation.MOD_64QAM;
/**
* 128QAM Modulation.
*/
public static final int MODULATION_MOD_128QAM = Constants.FrontendDvbcModulation.MOD_128QAM;
/**
* 256QAM Modulation.
*/
public static final int MODULATION_MOD_256QAM = Constants.FrontendDvbcModulation.MOD_256QAM;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = "OUTER_FEC_",
value = {OUTER_FEC_UNDEFINED, OUTER_FEC_OUTER_FEC_NONE, OUTER_FEC_OUTER_FEC_RS})
public @interface OuterFec {}
/**
* Outer Forward Error Correction (FEC) Type undefined.
*/
public static final int OUTER_FEC_UNDEFINED = Constants.FrontendDvbcOuterFec.UNDEFINED;
/**
* None Outer Forward Error Correction (FEC) Type.
*/
public static final int OUTER_FEC_OUTER_FEC_NONE =
Constants.FrontendDvbcOuterFec.OUTER_FEC_NONE;
/**
* RS Outer Forward Error Correction (FEC) Type.
*/
public static final int OUTER_FEC_OUTER_FEC_RS = Constants.FrontendDvbcOuterFec.OUTER_FEC_RS;
/** @hide */
@IntDef(flag = true,
prefix = "ANNEX_",
value = {ANNEX_UNDEFINED, ANNEX_A, ANNEX_B, ANNEX_C})
@Retention(RetentionPolicy.SOURCE)
public @interface Annex {}
/**
* Annex Type undefined.
*/
public static final int ANNEX_UNDEFINED = Constants.FrontendDvbcAnnex.UNDEFINED;
/**
* Annex Type A.
*/
public static final int ANNEX_A = Constants.FrontendDvbcAnnex.A;
/**
* Annex Type B.
*/
public static final int ANNEX_B = Constants.FrontendDvbcAnnex.B;
/**
* Annex Type C.
*/
public static final int ANNEX_C = Constants.FrontendDvbcAnnex.C;
/**
* @deprecated Use the {@code FrontendSpectralInversion} instead.
* @hide
*/
@Deprecated
@IntDef(prefix = "SPECTRAL_INVERSION_",
value = {SPECTRAL_INVERSION_UNDEFINED, SPECTRAL_INVERSION_NORMAL,
SPECTRAL_INVERSION_INVERTED})
@Retention(RetentionPolicy.SOURCE)
public @interface SpectralInversion {}
/**
* Spectral Inversion Type undefined.
*
* @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED} instead.
*/
@Deprecated
public static final int SPECTRAL_INVERSION_UNDEFINED =
Constants.FrontendDvbcSpectralInversion.UNDEFINED;
/**
* Normal Spectral Inversion.
*
* @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_NORMAL} instead.
*/
@Deprecated
public static final int SPECTRAL_INVERSION_NORMAL =
Constants.FrontendDvbcSpectralInversion.NORMAL;
/**
* Inverted Spectral Inversion.
*
* @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_INVERTED} instead.
*/
@Deprecated
public static final int SPECTRAL_INVERSION_INVERTED =
Constants.FrontendDvbcSpectralInversion.INVERTED;
/** @hide */
@IntDef(flag = true,
prefix = "TIME_INTERLEAVE_MODE_",
value = {TIME_INTERLEAVE_MODE_UNDEFINED, TIME_INTERLEAVE_MODE_AUTO,
TIME_INTERLEAVE_MODE_128_1_0, TIME_INTERLEAVE_MODE_128_1_1,
TIME_INTERLEAVE_MODE_64_2, TIME_INTERLEAVE_MODE_32_4,
TIME_INTERLEAVE_MODE_16_8, TIME_INTERLEAVE_MODE_8_16,
TIME_INTERLEAVE_MODE_128_2, TIME_INTERLEAVE_MODE_128_3,
TIME_INTERLEAVE_MODE_128_4})
@Retention(RetentionPolicy.SOURCE)
public @interface TimeInterleaveMode {}
/**
* Time interleave mode undefined.
*/
public static final int TIME_INTERLEAVE_MODE_UNDEFINED =
android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.UNDEFINED;
/**
* Hardware is able to detect and set Time Interleave Mode automatically.
*/
public static final int TIME_INTERLEAVE_MODE_AUTO =
android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.AUTO;
/**
* 128/1/0 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_128_1_0 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_0;
/**
* 128/1/1 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_128_1_1 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_1;
/**
* 64/2 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_64_2 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_64_2;
/**
* 32/4 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_32_4 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_32_4;
/**
* 16/8 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_16_8 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_16_8;
/**
* 8/16 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_8_16 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_8_16;
/**
* 128/2 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_128_2 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_128_2;
/**
* 128/3 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_128_3 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_128_3;
/**
* 128/4 Time Interleave Mode.
*/
public static final int TIME_INTERLEAVE_MODE_128_4 = android.hardware.tv.tuner.V1_1.Constants
.FrontendCableTimeInterleaveMode.INTERLEAVING_128_4;
/** @hide */
@IntDef(flag = true,
prefix = "BANDWIDTH_",
value = {BANDWIDTH_UNDEFINED, BANDWIDTH_5MHZ, BANDWIDTH_6MHZ, BANDWIDTH_7MHZ,
BANDWIDTH_8MHZ})
@Retention(RetentionPolicy.SOURCE)
public @interface Bandwidth {}
/**
* Bandwidth undefined.
*/
public static final int BANDWIDTH_UNDEFINED =
android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.UNDEFINED;
/**
* 5 MHz bandwidth.
*/
public static final int BANDWIDTH_5MHZ =
android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_5MHZ;
/**
* 6 MHz bandwidth.
*/
public static final int BANDWIDTH_6MHZ =
android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_6MHZ;
/**
* 7 MHz bandwidth.
*/
public static final int BANDWIDTH_7MHZ =
android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_7MHZ;
/**
* 8 MHz bandwidth.
*/
public static final int BANDWIDTH_8MHZ =
android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_8MHZ;
private final int mModulation;
private final long mInnerFec;
private final int mSymbolRate;
private final int mOuterFec;
private final int mAnnex;
private final int mSpectralInversion;
// Dvbc time interleave mode is only supported in Tuner 1.1 or higher.
private final int mInterleaveMode;
// Dvbc bandwidth is only supported in Tuner 1.1 or higher.
private final int mBandwidth;
private DvbcFrontendSettings(int frequency, int modulation, long innerFec, int symbolRate,
int outerFec, int annex, int spectralInversion, int interleaveMode, int bandwidth) {
super(frequency);
mModulation = modulation;
mInnerFec = innerFec;
mSymbolRate = symbolRate;
mOuterFec = outerFec;
mAnnex = annex;
mSpectralInversion = spectralInversion;
mInterleaveMode = interleaveMode;
mBandwidth = bandwidth;
}
/**
* Gets Modulation.
*/
@Modulation
public int getModulation() {
return mModulation;
}
/**
* Gets Inner Forward Error Correction.
*/
@InnerFec
public long getInnerFec() {
return mInnerFec;
}
/**
* Gets Symbol Rate in symbols per second.
*/
public int getSymbolRate() {
return mSymbolRate;
}
/**
* Gets Outer Forward Error Correction.
*/
@OuterFec
public int getOuterFec() {
return mOuterFec;
}
/**
* Gets Annex.
*/
@Annex
public int getAnnex() {
return mAnnex;
}
/**
* Gets Spectral Inversion.
*/
@FrontendSpectralInversion
public int getSpectralInversion() {
return mSpectralInversion;
}
/**
* Gets Time Interleave Mode.
*/
@TimeInterleaveMode
public int getTimeInterleaveMode() {
return mInterleaveMode;
}
/**
* Gets Bandwidth.
*/
@Bandwidth
public int getBandwidth() {
return mBandwidth;
}
/**
* Creates a builder for {@link DvbcFrontendSettings}.
*/
@NonNull
public static Builder builder() {
return new Builder();
}
/**
* Builder for {@link DvbcFrontendSettings}.
*/
public static class Builder {
private int mFrequency = 0;
private int mModulation = MODULATION_UNDEFINED;
private long mInnerFec = FEC_UNDEFINED;
private int mSymbolRate = 0;
private int mOuterFec = OUTER_FEC_UNDEFINED;
private int mAnnex = ANNEX_UNDEFINED;
private int mSpectralInversion = FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED;
private int mInterleaveMode = TIME_INTERLEAVE_MODE_UNDEFINED;
private int mBandwidth = BANDWIDTH_UNDEFINED;
private Builder() {
}
/**
* Sets frequency in Hz.
*
* <p>Default value is 0.
*/
@NonNull
@IntRange(from = 1)
public Builder setFrequency(int frequency) {
mFrequency = frequency;
return this;
}
/**
* Sets Modulation.
*
* <p>Default value is {@link #MODULATION_UNDEFINED}.
*/
@NonNull
public Builder setModulation(@Modulation int modulation) {
mModulation = modulation;
return this;
}
/**
* Sets Inner Forward Error Correction.
*
* <p>Default value is {@link #FEC_UNDEFINED}.
*/
@NonNull
public Builder setInnerFec(@InnerFec long fec) {
mInnerFec = fec;
return this;
}
/**
* Sets Symbol Rate in symbols per second.
*
* <p>Default value is 0.
*/
@NonNull
public Builder setSymbolRate(int symbolRate) {
mSymbolRate = symbolRate;
return this;
}
/**
* Sets Outer Forward Error Correction.
*
* <p>Default value is {@link #OUTER_FEC_UNDEFINED}.
*/
@NonNull
public Builder setOuterFec(@OuterFec int outerFec) {
mOuterFec = outerFec;
return this;
}
/**
* Sets Annex.
*
* <p>Default value is {@link #ANNEX_UNDEFINED}.
*/
@NonNull
public Builder setAnnex(@Annex int annex) {
mAnnex = annex;
return this;
}
/**
* Sets Spectral Inversion.
*
* <p>Default value is {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED}.
*/
@NonNull
public Builder setSpectralInversion(@FrontendSpectralInversion int spectralInversion) {
mSpectralInversion = spectralInversion;
return this;
}
/**
* Set the time interleave mode.
*
* <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.
*
* @param interleaveMode the value to set as the time interleave mode. Default value is
* {@link #TIME_INTERLEAVE_MODE_UNDEFINED}.
*/
@NonNull
public Builder setTimeInterleaveMode(@TimeInterleaveMode int interleaveMode) {
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_1_1, "setTimeInterleaveMode")) {
mInterleaveMode = interleaveMode;
}
return this;
}
/**
* Set the Bandwidth.
*
* <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.
*
* @param bandwidth the value to set as the bandwidth. Default value is
* {@link #BANDWIDTH_UNDEFINED}.
*/
@NonNull
public Builder setBandwidth(@Bandwidth int bandwidth) {
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_1_1, "setBandwidth")) {
mBandwidth = bandwidth;
}
return this;
}
/**
* Builds a {@link DvbcFrontendSettings} object.
*/
@NonNull
public DvbcFrontendSettings build() {
return new DvbcFrontendSettings(mFrequency, mModulation, mInnerFec, mSymbolRate,
mOuterFec, mAnnex, mSpectralInversion, mInterleaveMode, mBandwidth);
}
}
@Override
public int getType() {
return FrontendSettings.TYPE_DVBC;
}
}