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