diff options
| author | 2020-01-27 13:21:55 -0800 | |
|---|---|---|
| committer | 2020-01-29 12:32:13 -0800 | |
| commit | deb067c2732bca8830318b85f496c4179381e9a3 (patch) | |
| tree | 971adac5471c46453dd0b44e3fd1a360d652326e | |
| parent | 7b1117247b791307c968b9575f57325dd5090524 (diff) | |
Implement tune() in JNI
Test: make; acloud create;
Change-Id: I6b0f044c5b11da40085e5d0a363048f63ebba397
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 513 |
1 files changed, 483 insertions, 30 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 007d367a533a..1fbe7f42fff3 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -41,6 +41,54 @@ using ::android::hardware::tv::tuner::V1_0::DvrSettings; using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSettings; using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard; using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3PlpSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Settings; +using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode; +using ::android::hardware::tv::tuner::V1_0::FrontendAtscSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsCodeRate; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard; +using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode; +using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation; +using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings; +using ::android::hardware::tv::tuner::V1_0::FrontendType; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::PlaybackSettings; using ::android::hardware::tv::tuner::V1_0::RecordSettings; @@ -493,32 +541,437 @@ static DemuxPid getDemuxPid(int pidType, int pid) { return demuxPid; } -static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) { - FrontendSettings frontendSettings; +static uint32_t getFrontendSettingsFreq(JNIEnv *env, const jobject& settings) { jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings"); jfieldID freqField = env->GetFieldID(clazz, "mFrequency", "I"); - uint32_t freq = static_cast<uint32_t>(env->GetIntField(clazz, freqField)); - - // TODO: handle the other 8 types of settings - if (type == 1) { - // analog - clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings"); - FrontendAnalogType analogType = - static_cast<FrontendAnalogType>( - env->GetIntField(settings, env->GetFieldID(clazz, "mAnalogType", "I"))); - FrontendAnalogSifStandard sifStandard = - static_cast<FrontendAnalogSifStandard>( - env->GetIntField(settings, env->GetFieldID(clazz, "mSifStandard", "I"))); - FrontendAnalogSettings frontendAnalogSettings { - .frequency = freq, - .type = analogType, - .sifStandard = sifStandard, + uint32_t freq = static_cast<uint32_t>(env->GetIntField(settings, freqField)); + return freq; +} + +static FrontendSettings getAnalogFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings"); + FrontendAnalogType analogType = + static_cast<FrontendAnalogType>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSignalType", "I"))); + FrontendAnalogSifStandard sifStandard = + static_cast<FrontendAnalogSifStandard>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSifStandard", "I"))); + FrontendAnalogSettings frontendAnalogSettings { + .frequency = freq, + .type = analogType, + .sifStandard = sifStandard, + }; + frontendSettings.analog(frontendAnalogSettings); + return frontendSettings; +} + +static hidl_vec<FrontendAtsc3PlpSettings> getAtsc3PlpSettings( + JNIEnv *env, const jobject& settings) { + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings"); + jobjectArray plpSettings = + reinterpret_cast<jobjectArray>( + env->GetObjectField(settings, + env->GetFieldID( + clazz, + "mPlpSettings", + "[Landroid/media/tv/tuner/frontend/Atsc3PlpSettings;"))); + int len = env->GetArrayLength(plpSettings); + + jclass plpClazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3PlpSettings"); + hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len); + // parse PLP settings + for (int i = 0; i < len; i++) { + jobject plp = env->GetObjectArrayElement(plpSettings, i); + uint8_t plpId = + static_cast<uint8_t>( + env->GetIntField(plp, env->GetFieldID(plpClazz, "mPlpId", "I"))); + FrontendAtsc3Modulation modulation = + static_cast<FrontendAtsc3Modulation>( + env->GetIntField(plp, env->GetFieldID(plpClazz, "mModulation", "I"))); + FrontendAtsc3TimeInterleaveMode interleaveMode = + static_cast<FrontendAtsc3TimeInterleaveMode>( + env->GetIntField( + plp, env->GetFieldID(plpClazz, "mInterleaveMode", "I"))); + FrontendAtsc3CodeRate codeRate = + static_cast<FrontendAtsc3CodeRate>( + env->GetIntField(plp, env->GetFieldID(plpClazz, "mCodeRate", "I"))); + FrontendAtsc3Fec fec = + static_cast<FrontendAtsc3Fec>( + env->GetIntField(plp, env->GetFieldID(plpClazz, "mFec", "I"))); + FrontendAtsc3PlpSettings frontendAtsc3PlpSettings { + .plpId = plpId, + .modulation = modulation, + .interleaveMode = interleaveMode, + .codeRate = codeRate, + .fec = fec, }; - frontendSettings.analog(frontendAnalogSettings); + plps[i] = frontendAtsc3PlpSettings; } + return plps; +} + +static FrontendSettings getAtsc3FrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings"); + + FrontendAtsc3Bandwidth bandwidth = + static_cast<FrontendAtsc3Bandwidth>( + env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I"))); + FrontendAtsc3DemodOutputFormat demod = + static_cast<FrontendAtsc3DemodOutputFormat>( + env->GetIntField( + settings, env->GetFieldID(clazz, "mDemodOutputFormat", "I"))); + hidl_vec<FrontendAtsc3PlpSettings> plps = getAtsc3PlpSettings(env, settings); + FrontendAtsc3Settings frontendAtsc3Settings { + .frequency = freq, + .bandwidth = bandwidth, + .demodOutputFormat = demod, + .plpSettings = plps, + }; + frontendSettings.atsc3(frontendAtsc3Settings); + return frontendSettings; +} + +static FrontendSettings getAtscFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AtscFrontendSettings"); + FrontendAtscModulation modulation = + static_cast<FrontendAtscModulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + FrontendAtscSettings frontendAtscSettings { + .frequency = freq, + .modulation = modulation, + }; + frontendSettings.atsc(frontendAtscSettings); + return frontendSettings; +} + +static FrontendSettings getDvbcFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendSettings"); + FrontendDvbcModulation modulation = + static_cast<FrontendDvbcModulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + FrontendInnerFec innerFec = + static_cast<FrontendInnerFec>( + env->GetLongField(settings, env->GetFieldID(clazz, "mFec", "J"))); + uint32_t symbolRate = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I"))); + FrontendDvbcOuterFec outerFec = + static_cast<FrontendDvbcOuterFec>( + env->GetIntField(settings, env->GetFieldID(clazz, "mOuterFec", "I"))); + FrontendDvbcAnnex annex = + static_cast<FrontendDvbcAnnex>( + env->GetByteField(settings, env->GetFieldID(clazz, "mAnnex", "B"))); + FrontendDvbcSpectralInversion spectralInversion = + static_cast<FrontendDvbcSpectralInversion>( + env->GetIntField( + settings, env->GetFieldID(clazz, "mSpectralInversion", "I"))); + FrontendDvbcSettings frontendDvbcSettings { + .frequency = freq, + .modulation = modulation, + .fec = innerFec, + .symbolRate = symbolRate, + .outerFec = outerFec, + .annex = annex, + .spectralInversion = spectralInversion, + }; + frontendSettings.dvbc(frontendDvbcSettings); + return frontendSettings; +} + +static FrontendDvbsCodeRate getDvbsCodeRate(JNIEnv *env, const jobject& settings) { + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings"); + jobject jcodeRate = + env->GetObjectField(settings, + env->GetFieldID( + clazz, + "mCodeRate", + "Landroid/media/tv/tuner/frontend/DvbsCodeRate;")); + + jclass codeRateClazz = env->FindClass("android/media/tv/tuner/frontend/DvbsCodeRate"); + FrontendInnerFec innerFec = + static_cast<FrontendInnerFec>( + env->GetLongField( + jcodeRate, env->GetFieldID(codeRateClazz, "mInnerFec", "J"))); + bool isLinear = + static_cast<bool>( + env->GetBooleanField( + jcodeRate, env->GetFieldID(codeRateClazz, "mIsLinear", "Z"))); + bool isShortFrames = + static_cast<bool>( + env->GetBooleanField( + jcodeRate, env->GetFieldID(codeRateClazz, "mIsShortFrames", "Z"))); + uint32_t bitsPer1000Symbol = + static_cast<uint32_t>( + env->GetIntField( + jcodeRate, env->GetFieldID( + codeRateClazz, "mBitsPer1000Symbol", "I"))); + FrontendDvbsCodeRate coderate { + .fec = innerFec, + .isLinear = isLinear, + .isShortFrames = isShortFrames, + .bitsPer1000Symbol = bitsPer1000Symbol, + }; + return coderate; +} + +static FrontendSettings getDvbsFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings"); + + + FrontendDvbsModulation modulation = + static_cast<FrontendDvbsModulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + uint32_t symbolRate = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I"))); + FrontendDvbsRolloff rolloff = + static_cast<FrontendDvbsRolloff>( + env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I"))); + FrontendDvbsPilot pilot = + static_cast<FrontendDvbsPilot>( + env->GetIntField(settings, env->GetFieldID(clazz, "mPilot", "I"))); + uint32_t inputStreamId = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mInputStreamId", "I"))); + FrontendDvbsStandard standard = + static_cast<FrontendDvbsStandard>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStandard", "I"))); + FrontendDvbsVcmMode vcmMode = + static_cast<FrontendDvbsVcmMode>( + env->GetIntField(settings, env->GetFieldID(clazz, "mVcmMode", "I"))); + FrontendDvbsCodeRate coderate = getDvbsCodeRate(env, settings); + + FrontendDvbsSettings frontendDvbsSettings { + .frequency = freq, + .modulation = modulation, + .coderate = coderate, + .symbolRate = symbolRate, + .rolloff = rolloff, + .pilot = pilot, + .inputStreamId = inputStreamId, + .standard = standard, + .vcmMode = vcmMode, + }; + frontendSettings.dvbs(frontendDvbsSettings); + return frontendSettings; +} + +static FrontendSettings getDvbtFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendSettings"); + FrontendDvbtTransmissionMode transmissionMode = + static_cast<FrontendDvbtTransmissionMode>( + env->GetIntField( + settings, env->GetFieldID(clazz, "mTransmissionMode", "I"))); + FrontendDvbtBandwidth bandwidth = + static_cast<FrontendDvbtBandwidth>( + env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I"))); + FrontendDvbtConstellation constellation = + static_cast<FrontendDvbtConstellation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mConstellation", "I"))); + FrontendDvbtHierarchy hierarchy = + static_cast<FrontendDvbtHierarchy>( + env->GetIntField(settings, env->GetFieldID(clazz, "mHierarchy", "I"))); + FrontendDvbtCoderate hpCoderate = + static_cast<FrontendDvbtCoderate>( + env->GetIntField(settings, env->GetFieldID(clazz, "mHpCodeRate", "I"))); + FrontendDvbtCoderate lpCoderate = + static_cast<FrontendDvbtCoderate>( + env->GetIntField(settings, env->GetFieldID(clazz, "mLpCodeRate", "I"))); + FrontendDvbtGuardInterval guardInterval = + static_cast<FrontendDvbtGuardInterval>( + env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I"))); + bool isHighPriority = + static_cast<bool>( + env->GetBooleanField( + settings, env->GetFieldID(clazz, "mIsHighPriority", "Z"))); + FrontendDvbtStandard standard = + static_cast<FrontendDvbtStandard>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStandard", "I"))); + bool isMiso = + static_cast<bool>( + env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsMiso", "Z"))); + FrontendDvbtPlpMode plpMode = + static_cast<FrontendDvbtPlpMode>( + env->GetIntField(settings, env->GetFieldID(clazz, "mPlpMode", "I"))); + uint8_t plpId = + static_cast<uint8_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mPlpId", "I"))); + uint8_t plpGroupId = + static_cast<uint8_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mPlpGroupId", "I"))); + + FrontendDvbtSettings frontendDvbtSettings { + .frequency = freq, + .transmissionMode = transmissionMode, + .bandwidth = bandwidth, + .constellation = constellation, + .hierarchy = hierarchy, + .hpCoderate = hpCoderate, + .lpCoderate = lpCoderate, + .guardInterval = guardInterval, + .isHighPriority = isHighPriority, + .standard = standard, + .isMiso = isMiso, + .plpMode = plpMode, + .plpId = plpId, + .plpGroupId = plpGroupId, + }; + frontendSettings.dvbt(frontendDvbtSettings); + return frontendSettings; +} + +static FrontendSettings getIsdbsFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbsFrontendSettings"); + uint16_t streamId = + static_cast<uint16_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStreamId", "I"))); + FrontendIsdbsStreamIdType streamIdType = + static_cast<FrontendIsdbsStreamIdType>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStreamIdType", "I"))); + FrontendIsdbsModulation modulation = + static_cast<FrontendIsdbsModulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + FrontendIsdbsCoderate coderate = + static_cast<FrontendIsdbsCoderate>( + env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I"))); + uint32_t symbolRate = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I"))); + FrontendIsdbsRolloff rolloff = + static_cast<FrontendIsdbsRolloff>( + env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I"))); + + FrontendIsdbsSettings frontendIsdbsSettings { + .frequency = freq, + .streamId = streamId, + .streamIdType = streamIdType, + .modulation = modulation, + .coderate = coderate, + .symbolRate = symbolRate, + .rolloff = rolloff, + }; + frontendSettings.isdbs(frontendIsdbsSettings); return frontendSettings; } +static FrontendSettings getIsdbs3FrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Isdbs3FrontendSettings"); + uint16_t streamId = + static_cast<uint16_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStreamId", "I"))); + FrontendIsdbsStreamIdType streamIdType = + static_cast<FrontendIsdbsStreamIdType>( + env->GetIntField(settings, env->GetFieldID(clazz, "mStreamIdType", "I"))); + FrontendIsdbs3Modulation modulation = + static_cast<FrontendIsdbs3Modulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + FrontendIsdbs3Coderate coderate = + static_cast<FrontendIsdbs3Coderate>( + env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I"))); + uint32_t symbolRate = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I"))); + FrontendIsdbs3Rolloff rolloff = + static_cast<FrontendIsdbs3Rolloff>( + env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I"))); + + FrontendIsdbs3Settings frontendIsdbs3Settings { + .frequency = freq, + .streamId = streamId, + .streamIdType = streamIdType, + .modulation = modulation, + .coderate = coderate, + .symbolRate = symbolRate, + .rolloff = rolloff, + }; + frontendSettings.isdbs3(frontendIsdbs3Settings); + return frontendSettings; +} + +static FrontendSettings getIsdbtFrontendSettings(JNIEnv *env, const jobject& settings) { + FrontendSettings frontendSettings; + uint32_t freq = getFrontendSettingsFreq(env, settings); + jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbtFrontendSettings"); + FrontendIsdbtModulation modulation = + static_cast<FrontendIsdbtModulation>( + env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I"))); + FrontendIsdbtBandwidth bandwidth = + static_cast<FrontendIsdbtBandwidth>( + env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I"))); + FrontendIsdbtMode mode = + static_cast<FrontendIsdbtMode>( + env->GetIntField(settings, env->GetFieldID(clazz, "mMode", "I"))); + FrontendIsdbtCoderate coderate = + static_cast<FrontendIsdbtCoderate>( + env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I"))); + FrontendIsdbtGuardInterval guardInterval = + static_cast<FrontendIsdbtGuardInterval>( + env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I"))); + uint32_t serviceAreaId = + static_cast<uint32_t>( + env->GetIntField(settings, env->GetFieldID(clazz, "mServiceAreaId", "I"))); + + FrontendIsdbtSettings frontendIsdbtSettings { + .frequency = freq, + .modulation = modulation, + .bandwidth = bandwidth, + .mode = mode, + .coderate = coderate, + .guardInterval = guardInterval, + .serviceAreaId = serviceAreaId, + }; + frontendSettings.isdbt(frontendIsdbtSettings); + return frontendSettings; +} + +static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) { + ALOGD("getFrontendSettings %d", type); + + FrontendType feType = static_cast<FrontendType>(type); + switch(feType) { + case FrontendType::ANALOG: + return getAnalogFrontendSettings(env, settings); + case FrontendType::ATSC3: + return getAtsc3FrontendSettings(env, settings); + case FrontendType::ATSC: + return getAtscFrontendSettings(env, settings); + case FrontendType::DVBC: + return getDvbcFrontendSettings(env, settings); + case FrontendType::DVBS: + return getDvbsFrontendSettings(env, settings); + case FrontendType::DVBT: + return getDvbtFrontendSettings(env, settings); + case FrontendType::ISDBS: + return getIsdbsFrontendSettings(env, settings); + case FrontendType::ISDBS3: + return getIsdbs3FrontendSettings(env, settings); + case FrontendType::ISDBT: + return getIsdbtFrontendSettings(env, settings); + default: + // should never happen because a type is associated with a subclass of + // FrontendSettings and not set by users + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Unsupported frontend type %d", type); + return FrontendSettings(); + } +} + static sp<Filter> getFilter(JNIEnv *env, jobject filter) { return (Filter *)env->GetLongField(filter, gFields.filterContext); } @@ -587,23 +1040,23 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb"); gFields.lnbInitID = - env->GetMethodID(lnbClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); + env->GetMethodID(lnbClazz, "<init>", "(I)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); gFields.filterInitID = - env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); + env->GetMethodID(filterClazz, "<init>", "(I)V"); gFields.onFilterStatusID = env->GetMethodID(filterClazz, "onFilterStatus", "(I)V"); jclass descramblerClazz = env->FindClass("android/media/tv/tuner/Descrambler"); gFields.descramblerContext = env->GetFieldID(descramblerClazz, "mNativeContext", "J"); gFields.descramblerInitID = - env->GetMethodID(descramblerClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V"); + env->GetMethodID(descramblerClazz, "<init>", "()V"); jclass dvrClazz = env->FindClass("android/media/tv/tuner/dvr/Dvr"); gFields.dvrContext = env->GetFieldID(dvrClazz, "mNativeContext", "J"); - gFields.dvrInitID = env->GetMethodID(dvrClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V"); + gFields.dvrInitID = env->GetMethodID(dvrClazz, "<init>", "()V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { @@ -1141,16 +1594,16 @@ static const JNINativeMethod gTunerMethods[] = { { "nativeSetLna", "(Z)I", (void *)android_media_tv_Tuner_set_lna }, { "nativeGetFrontendStatus", "([I)Landroid/media/tv/tuner/frontend/FrontendStatus;", (void *)android_media_tv_Tuner_get_frontend_status }, - { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/Tuner/filter/Filter;)I", + { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/filter/Filter;)I", (void *)android_media_tv_Tuner_gat_av_sync_hw_id }, { "nativeGetAvSyncTime", "(I)J", (void *)android_media_tv_Tuner_gat_av_sync_time }, { "nativeConnectCiCam", "(I)I", (void *)android_media_tv_Tuner_connect_cicam }, { "nativeDisconnectCiCam", "()I", (void *)android_media_tv_Tuner_disconnect_cicam }, - { "nativeGetFrontendInfo", "(I)Landroid/media/tv/tuner/FrontendInfo;", + { "nativeGetFrontendInfo", "(I)Landroid/media/tv/tuner/frontend/FrontendInfo;", (void *)android_media_tv_Tuner_get_frontend_info }, - { "nativeOpenFilter", "(IIJ)Landroid/media/tv/tuner/Tuner/filter/Filter;", + { "nativeOpenFilter", "(IIJ)Landroid/media/tv/tuner/filter/Filter;", (void *)android_media_tv_Tuner_open_filter }, - { "nativeOpenTimeFilter", "()Landroid/media/tv/tuner/Tuner/filter/TimeFilter;", + { "nativeOpenTimeFilter", "()Landroid/media/tv/tuner/filter/TimeFilter;", (void *)android_media_tv_Tuner_open_time_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_lnb_ids }, @@ -1180,9 +1633,9 @@ static const JNINativeMethod gFilterMethods[] = { }; static const JNINativeMethod gTimeFilterMethods[] = { - { "nativeSetTimeStamp", "(J)I", (void *)android_media_tv_Tuner_time_filter_set_timestamp }, - { "nativeClearTimeStamp", "()I", (void *)android_media_tv_Tuner_time_filter_clear_timestamp }, - { "nativeGetTimeStamp", "()Ljava/lang/Long;", + { "nativeSetTimestamp", "(J)I", (void *)android_media_tv_Tuner_time_filter_set_timestamp }, + { "nativeClearTimestamp", "()I", (void *)android_media_tv_Tuner_time_filter_clear_timestamp }, + { "nativeGetTimestamp", "()Ljava/lang/Long;", (void *)android_media_tv_Tuner_time_filter_get_timestamp }, { "nativeGetSourceTime", "()Ljava/lang/Long;", (void *)android_media_tv_Tuner_time_filter_get_source_time }, |