1 /* 2 * Copyright 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.media.tv.tuner.frontend; 18 19 import android.annotation.IntDef; 20 import android.annotation.IntRange; 21 import android.annotation.NonNull; 22 import android.annotation.SystemApi; 23 import android.hardware.tv.tuner.V1_0.Constants; 24 import android.media.tv.tuner.TunerVersionChecker; 25 import android.media.tv.tuner.frontend.FrontendSettings.FrontendSpectralInversion; 26 27 import java.lang.annotation.Retention; 28 import java.lang.annotation.RetentionPolicy; 29 30 /** 31 * Frontend settings for DVBC. 32 * 33 * @hide 34 */ 35 @SystemApi 36 public class DvbcFrontendSettings extends FrontendSettings { 37 38 /** @hide */ 39 @IntDef(flag = true, 40 prefix = "MODULATION_", 41 value = {MODULATION_UNDEFINED, MODULATION_AUTO, MODULATION_MOD_16QAM, 42 MODULATION_MOD_32QAM, MODULATION_MOD_64QAM, MODULATION_MOD_128QAM, 43 MODULATION_MOD_256QAM}) 44 @Retention(RetentionPolicy.SOURCE) 45 public @interface Modulation {} 46 47 /** 48 * Modulation undefined. 49 */ 50 public static final int MODULATION_UNDEFINED = Constants.FrontendDvbcModulation.UNDEFINED; 51 /** 52 * Hardware is able to detect and set modulation automatically 53 */ 54 public static final int MODULATION_AUTO = Constants.FrontendDvbcModulation.AUTO; 55 /** 56 * 16QAM Modulation. 57 */ 58 public static final int MODULATION_MOD_16QAM = Constants.FrontendDvbcModulation.MOD_16QAM; 59 /** 60 * 32QAM Modulation. 61 */ 62 public static final int MODULATION_MOD_32QAM = Constants.FrontendDvbcModulation.MOD_32QAM; 63 /** 64 * 64QAM Modulation. 65 */ 66 public static final int MODULATION_MOD_64QAM = Constants.FrontendDvbcModulation.MOD_64QAM; 67 /** 68 * 128QAM Modulation. 69 */ 70 public static final int MODULATION_MOD_128QAM = Constants.FrontendDvbcModulation.MOD_128QAM; 71 /** 72 * 256QAM Modulation. 73 */ 74 public static final int MODULATION_MOD_256QAM = Constants.FrontendDvbcModulation.MOD_256QAM; 75 76 /** @hide */ 77 @Retention(RetentionPolicy.SOURCE) 78 @IntDef(prefix = "OUTER_FEC_", 79 value = {OUTER_FEC_UNDEFINED, OUTER_FEC_OUTER_FEC_NONE, OUTER_FEC_OUTER_FEC_RS}) 80 public @interface OuterFec {} 81 82 /** 83 * Outer Forward Error Correction (FEC) Type undefined. 84 */ 85 public static final int OUTER_FEC_UNDEFINED = Constants.FrontendDvbcOuterFec.UNDEFINED; 86 /** 87 * None Outer Forward Error Correction (FEC) Type. 88 */ 89 public static final int OUTER_FEC_OUTER_FEC_NONE = 90 Constants.FrontendDvbcOuterFec.OUTER_FEC_NONE; 91 /** 92 * RS Outer Forward Error Correction (FEC) Type. 93 */ 94 public static final int OUTER_FEC_OUTER_FEC_RS = Constants.FrontendDvbcOuterFec.OUTER_FEC_RS; 95 96 97 /** @hide */ 98 @IntDef(flag = true, 99 prefix = "ANNEX_", 100 value = {ANNEX_UNDEFINED, ANNEX_A, ANNEX_B, ANNEX_C}) 101 @Retention(RetentionPolicy.SOURCE) 102 public @interface Annex {} 103 104 /** 105 * Annex Type undefined. 106 */ 107 public static final int ANNEX_UNDEFINED = Constants.FrontendDvbcAnnex.UNDEFINED; 108 /** 109 * Annex Type A. 110 */ 111 public static final int ANNEX_A = Constants.FrontendDvbcAnnex.A; 112 /** 113 * Annex Type B. 114 */ 115 public static final int ANNEX_B = Constants.FrontendDvbcAnnex.B; 116 /** 117 * Annex Type C. 118 */ 119 public static final int ANNEX_C = Constants.FrontendDvbcAnnex.C; 120 121 122 /** 123 * @deprecated Use the {@code FrontendSpectralInversion} instead. 124 * @hide 125 */ 126 @Deprecated 127 @IntDef(prefix = "SPECTRAL_INVERSION_", 128 value = {SPECTRAL_INVERSION_UNDEFINED, SPECTRAL_INVERSION_NORMAL, 129 SPECTRAL_INVERSION_INVERTED}) 130 @Retention(RetentionPolicy.SOURCE) 131 public @interface SpectralInversion {} 132 133 /** 134 * Spectral Inversion Type undefined. 135 * 136 * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED} instead. 137 */ 138 @Deprecated 139 public static final int SPECTRAL_INVERSION_UNDEFINED = 140 Constants.FrontendDvbcSpectralInversion.UNDEFINED; 141 /** 142 * Normal Spectral Inversion. 143 * 144 * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_NORMAL} instead. 145 */ 146 @Deprecated 147 public static final int SPECTRAL_INVERSION_NORMAL = 148 Constants.FrontendDvbcSpectralInversion.NORMAL; 149 /** 150 * Inverted Spectral Inversion. 151 * 152 * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_INVERTED} instead. 153 */ 154 @Deprecated 155 public static final int SPECTRAL_INVERSION_INVERTED = 156 Constants.FrontendDvbcSpectralInversion.INVERTED; 157 158 /** @hide */ 159 @IntDef(flag = true, 160 prefix = "TIME_INTERLEAVE_MODE_", 161 value = {TIME_INTERLEAVE_MODE_UNDEFINED, TIME_INTERLEAVE_MODE_AUTO, 162 TIME_INTERLEAVE_MODE_128_1_0, TIME_INTERLEAVE_MODE_128_1_1, 163 TIME_INTERLEAVE_MODE_64_2, TIME_INTERLEAVE_MODE_32_4, 164 TIME_INTERLEAVE_MODE_16_8, TIME_INTERLEAVE_MODE_8_16, 165 TIME_INTERLEAVE_MODE_128_2, TIME_INTERLEAVE_MODE_128_3, 166 TIME_INTERLEAVE_MODE_128_4}) 167 @Retention(RetentionPolicy.SOURCE) 168 public @interface TimeInterleaveMode {} 169 170 /** 171 * Time interleave mode undefined. 172 */ 173 public static final int TIME_INTERLEAVE_MODE_UNDEFINED = 174 android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.UNDEFINED; 175 /** 176 * Hardware is able to detect and set Time Interleave Mode automatically. 177 */ 178 public static final int TIME_INTERLEAVE_MODE_AUTO = 179 android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.AUTO; 180 /** 181 * 128/1/0 Time Interleave Mode. 182 */ 183 public static final int TIME_INTERLEAVE_MODE_128_1_0 = android.hardware.tv.tuner.V1_1.Constants 184 .FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_0; 185 /** 186 * 128/1/1 Time Interleave Mode. 187 */ 188 public static final int TIME_INTERLEAVE_MODE_128_1_1 = android.hardware.tv.tuner.V1_1.Constants 189 .FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_1; 190 /** 191 * 64/2 Time Interleave Mode. 192 */ 193 public static final int TIME_INTERLEAVE_MODE_64_2 = android.hardware.tv.tuner.V1_1.Constants 194 .FrontendCableTimeInterleaveMode.INTERLEAVING_64_2; 195 /** 196 * 32/4 Time Interleave Mode. 197 */ 198 public static final int TIME_INTERLEAVE_MODE_32_4 = android.hardware.tv.tuner.V1_1.Constants 199 .FrontendCableTimeInterleaveMode.INTERLEAVING_32_4; 200 /** 201 * 16/8 Time Interleave Mode. 202 */ 203 public static final int TIME_INTERLEAVE_MODE_16_8 = android.hardware.tv.tuner.V1_1.Constants 204 .FrontendCableTimeInterleaveMode.INTERLEAVING_16_8; 205 /** 206 * 8/16 Time Interleave Mode. 207 */ 208 public static final int TIME_INTERLEAVE_MODE_8_16 = android.hardware.tv.tuner.V1_1.Constants 209 .FrontendCableTimeInterleaveMode.INTERLEAVING_8_16; 210 /** 211 * 128/2 Time Interleave Mode. 212 */ 213 public static final int TIME_INTERLEAVE_MODE_128_2 = android.hardware.tv.tuner.V1_1.Constants 214 .FrontendCableTimeInterleaveMode.INTERLEAVING_128_2; 215 /** 216 * 128/3 Time Interleave Mode. 217 */ 218 public static final int TIME_INTERLEAVE_MODE_128_3 = android.hardware.tv.tuner.V1_1.Constants 219 .FrontendCableTimeInterleaveMode.INTERLEAVING_128_3; 220 /** 221 * 128/4 Time Interleave Mode. 222 */ 223 public static final int TIME_INTERLEAVE_MODE_128_4 = android.hardware.tv.tuner.V1_1.Constants 224 .FrontendCableTimeInterleaveMode.INTERLEAVING_128_4; 225 226 /** @hide */ 227 @IntDef(flag = true, 228 prefix = "BANDWIDTH_", 229 value = {BANDWIDTH_UNDEFINED, BANDWIDTH_5MHZ, BANDWIDTH_6MHZ, BANDWIDTH_7MHZ, 230 BANDWIDTH_8MHZ}) 231 @Retention(RetentionPolicy.SOURCE) 232 public @interface Bandwidth {} 233 234 /** 235 * Bandwidth undefined. 236 */ 237 public static final int BANDWIDTH_UNDEFINED = 238 android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.UNDEFINED; 239 /** 240 * 5 MHz bandwidth. 241 */ 242 public static final int BANDWIDTH_5MHZ = 243 android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_5MHZ; 244 /** 245 * 6 MHz bandwidth. 246 */ 247 public static final int BANDWIDTH_6MHZ = 248 android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_6MHZ; 249 /** 250 * 7 MHz bandwidth. 251 */ 252 public static final int BANDWIDTH_7MHZ = 253 android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_7MHZ; 254 /** 255 * 8 MHz bandwidth. 256 */ 257 public static final int BANDWIDTH_8MHZ = 258 android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_8MHZ; 259 260 261 private final int mModulation; 262 private final long mInnerFec; 263 private final int mSymbolRate; 264 private final int mOuterFec; 265 private final int mAnnex; 266 private final int mSpectralInversion; 267 // Dvbc time interleave mode is only supported in Tuner 1.1 or higher. 268 private final int mInterleaveMode; 269 // Dvbc bandwidth is only supported in Tuner 1.1 or higher. 270 private final int mBandwidth; 271 DvbcFrontendSettings(int frequency, int modulation, long innerFec, int symbolRate, int outerFec, int annex, int spectralInversion, int interleaveMode, int bandwidth)272 private DvbcFrontendSettings(int frequency, int modulation, long innerFec, int symbolRate, 273 int outerFec, int annex, int spectralInversion, int interleaveMode, int bandwidth) { 274 super(frequency); 275 mModulation = modulation; 276 mInnerFec = innerFec; 277 mSymbolRate = symbolRate; 278 mOuterFec = outerFec; 279 mAnnex = annex; 280 mSpectralInversion = spectralInversion; 281 mInterleaveMode = interleaveMode; 282 mBandwidth = bandwidth; 283 } 284 285 /** 286 * Gets Modulation. 287 */ 288 @Modulation getModulation()289 public int getModulation() { 290 return mModulation; 291 } 292 /** 293 * Gets Inner Forward Error Correction. 294 */ 295 @InnerFec getInnerFec()296 public long getInnerFec() { 297 return mInnerFec; 298 } 299 /** 300 * Gets Symbol Rate in symbols per second. 301 */ getSymbolRate()302 public int getSymbolRate() { 303 return mSymbolRate; 304 } 305 /** 306 * Gets Outer Forward Error Correction. 307 */ 308 @OuterFec getOuterFec()309 public int getOuterFec() { 310 return mOuterFec; 311 } 312 /** 313 * Gets Annex. 314 */ 315 @Annex getAnnex()316 public int getAnnex() { 317 return mAnnex; 318 } 319 /** 320 * Gets Spectral Inversion. 321 */ 322 @FrontendSpectralInversion getSpectralInversion()323 public int getSpectralInversion() { 324 return mSpectralInversion; 325 } 326 /** 327 * Gets Time Interleave Mode. 328 */ 329 @TimeInterleaveMode getTimeInterleaveMode()330 public int getTimeInterleaveMode() { 331 return mInterleaveMode; 332 } 333 /** 334 * Gets Bandwidth. 335 */ 336 @Bandwidth getBandwidth()337 public int getBandwidth() { 338 return mBandwidth; 339 } 340 341 /** 342 * Creates a builder for {@link DvbcFrontendSettings}. 343 */ 344 @NonNull builder()345 public static Builder builder() { 346 return new Builder(); 347 } 348 349 /** 350 * Builder for {@link DvbcFrontendSettings}. 351 */ 352 public static class Builder { 353 private int mFrequency = 0; 354 private int mModulation = MODULATION_UNDEFINED; 355 private long mInnerFec = FEC_UNDEFINED; 356 private int mSymbolRate = 0; 357 private int mOuterFec = OUTER_FEC_UNDEFINED; 358 private int mAnnex = ANNEX_UNDEFINED; 359 private int mSpectralInversion = FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED; 360 private int mInterleaveMode = TIME_INTERLEAVE_MODE_UNDEFINED; 361 private int mBandwidth = BANDWIDTH_UNDEFINED; 362 Builder()363 private Builder() { 364 } 365 366 /** 367 * Sets frequency in Hz. 368 * 369 * <p>Default value is 0. 370 */ 371 @NonNull 372 @IntRange(from = 1) setFrequency(int frequency)373 public Builder setFrequency(int frequency) { 374 mFrequency = frequency; 375 return this; 376 } 377 378 /** 379 * Sets Modulation. 380 * 381 * <p>Default value is {@link #MODULATION_UNDEFINED}. 382 */ 383 @NonNull setModulation(@odulation int modulation)384 public Builder setModulation(@Modulation int modulation) { 385 mModulation = modulation; 386 return this; 387 } 388 /** 389 * Sets Inner Forward Error Correction. 390 * 391 * <p>Default value is {@link #FEC_UNDEFINED}. 392 */ 393 @NonNull setInnerFec(@nnerFec long fec)394 public Builder setInnerFec(@InnerFec long fec) { 395 mInnerFec = fec; 396 return this; 397 } 398 /** 399 * Sets Symbol Rate in symbols per second. 400 * 401 * <p>Default value is 0. 402 */ 403 @NonNull setSymbolRate(int symbolRate)404 public Builder setSymbolRate(int symbolRate) { 405 mSymbolRate = symbolRate; 406 return this; 407 } 408 /** 409 * Sets Outer Forward Error Correction. 410 * 411 * <p>Default value is {@link #OUTER_FEC_UNDEFINED}. 412 */ 413 @NonNull setOuterFec(@uterFec int outerFec)414 public Builder setOuterFec(@OuterFec int outerFec) { 415 mOuterFec = outerFec; 416 return this; 417 } 418 /** 419 * Sets Annex. 420 * 421 * <p>Default value is {@link #ANNEX_UNDEFINED}. 422 */ 423 @NonNull setAnnex(@nnex int annex)424 public Builder setAnnex(@Annex int annex) { 425 mAnnex = annex; 426 return this; 427 } 428 /** 429 * Sets Spectral Inversion. 430 * 431 * <p>Default value is {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED}. 432 */ 433 @NonNull setSpectralInversion(@rontendSpectralInversion int spectralInversion)434 public Builder setSpectralInversion(@FrontendSpectralInversion int spectralInversion) { 435 mSpectralInversion = spectralInversion; 436 return this; 437 } 438 /** 439 * Set the time interleave mode. 440 * 441 * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause 442 * no-op. Use {@link TunerVersionChecker#getTunerVersion()} to check the version. 443 * 444 * @param interleaveMode the value to set as the time interleave mode. Default value is 445 * {@link #TIME_INTERLEAVE_MODE_UNDEFINED}. 446 */ 447 @NonNull setTimeInterleaveMode(@imeInterleaveMode int interleaveMode)448 public Builder setTimeInterleaveMode(@TimeInterleaveMode int interleaveMode) { 449 if (TunerVersionChecker.checkHigherOrEqualVersionTo( 450 TunerVersionChecker.TUNER_VERSION_1_1, "setTimeInterleaveMode")) { 451 mInterleaveMode = interleaveMode; 452 } 453 return this; 454 } 455 /** 456 * Set the Bandwidth. 457 * 458 * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause 459 * no-op. Use {@link TunerVersionChecker#getTunerVersion()} to check the version. 460 * 461 * @param bandwidth the value to set as the bandwidth. Default value is 462 * {@link #BANDWIDTH_UNDEFINED}. 463 */ 464 @NonNull setBandwidth(@andwidth int bandwidth)465 public Builder setBandwidth(@Bandwidth int bandwidth) { 466 if (TunerVersionChecker.checkHigherOrEqualVersionTo( 467 TunerVersionChecker.TUNER_VERSION_1_1, "setBandwidth")) { 468 mBandwidth = bandwidth; 469 } 470 return this; 471 } 472 473 /** 474 * Builds a {@link DvbcFrontendSettings} object. 475 */ 476 @NonNull build()477 public DvbcFrontendSettings build() { 478 return new DvbcFrontendSettings(mFrequency, mModulation, mInnerFec, mSymbolRate, 479 mOuterFec, mAnnex, mSpectralInversion, mInterleaveMode, mBandwidth); 480 } 481 } 482 483 @Override getType()484 public int getType() { 485 return FrontendSettings.TYPE_DVBC; 486 } 487 } 488