diff options
| -rw-r--r-- | media/java/android/media/tv/tuner/Lnb.java | 2 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 72 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 8 |
3 files changed, 67 insertions, 15 deletions
diff --git a/media/java/android/media/tv/tuner/Lnb.java b/media/java/android/media/tv/tuner/Lnb.java index a8d2cba46440..7932dcb06d88 100644 --- a/media/java/android/media/tv/tuner/Lnb.java +++ b/media/java/android/media/tv/tuner/Lnb.java @@ -154,6 +154,8 @@ public class Lnb implements AutoCloseable { private native int nativeSendDiseqcMessage(byte[] message); private native int nativeClose(); + private long mNativeContext; + Lnb(int id) { mId = id; } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index e68ccfaa0812..273c77684635 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -117,11 +117,15 @@ using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings; using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo; using ::android::hardware::tv::tuner::V1_0::FrontendType; using ::android::hardware::tv::tuner::V1_0::ITuner; +using ::android::hardware::tv::tuner::V1_0::LnbPosition; +using ::android::hardware::tv::tuner::V1_0::LnbTone; +using ::android::hardware::tv::tuner::V1_0::LnbVoltage; using ::android::hardware::tv::tuner::V1_0::PlaybackSettings; using ::android::hardware::tv::tuner::V1_0::RecordSettings; struct fields_t { jfieldID tunerContext; + jfieldID lnbContext; jfieldID filterContext; jfieldID timeFilterContext; jfieldID descramblerContext; @@ -163,6 +167,23 @@ Return<void> LnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& /*diseqcMessa return Void(); } +/////////////// Lnb /////////////////////// + +Lnb::Lnb(sp<ILnb> sp, jobject obj) : mLnbSp(sp) { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + mLnbObj = env->NewWeakGlobalRef(obj); +} + +Lnb::~Lnb() { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(mLnbObj); + mLnbObj = NULL; +} + +sp<ILnb> Lnb::getILnb() { + return mLnbSp; +} + /////////////// DvrCallback /////////////////////// Return<void> DvrCallback::onRecordStatus(RecordStatus /*status*/) { ALOGD("DvrCallback::onRecordStatus"); @@ -770,24 +791,29 @@ jobject JTuner::getLnbIds() { } jobject JTuner::openLnbById(int id) { - sp<ILnb> lnbSp; + sp<ILnb> iLnbSp; mTuner->openLnbById(id, [&](Result, const sp<ILnb>& lnb) { - lnbSp = lnb; + iLnbSp = lnb; }); - if (lnbSp == nullptr) { + if (iLnbSp == nullptr) { ALOGE("Failed to open lnb"); return NULL; } - mLnb = lnbSp; + mLnb = iLnbSp; sp<LnbCallback> lnbCb = new LnbCallback(mObject, id); mLnb->setCallback(lnbCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); - return env->NewObject( + jobject lnbObj = env->NewObject( env->FindClass("android/media/tv/tuner/Lnb"), gFields.lnbInitID, - mObject, - id); + (jint) id); + + sp<Lnb> lnbSp = new Lnb(iLnbSp, lnbObj); + lnbSp->incStrong(lnbObj); + env->SetLongField(lnbObj, gFields.lnbContext, (jlong) lnbSp.get()); + + return lnbObj; } int JTuner::tune(const FrontendSettings& settings) { @@ -1589,6 +1615,7 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { env->GetMethodID(frontendClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb"); + gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); @@ -2425,20 +2452,35 @@ static int android_media_tv_Tuner_close_dvr(JNIEnv*, jobject) { return 0; } -static int android_media_tv_Tuner_lnb_set_voltage(JNIEnv*, jobject, jint) { - return 0; +static sp<Lnb> getLnb(JNIEnv *env, jobject lnb) { + return (Lnb *)env->GetLongField(lnb, gFields.lnbContext); } -static int android_media_tv_Tuner_lnb_set_tone(JNIEnv*, jobject, jint) { - return 0; +static jint android_media_tv_Tuner_lnb_set_voltage(JNIEnv* env, jobject lnb, jint voltage) { + sp<ILnb> iLnbSp = getLnb(env, lnb)->getILnb(); + Result r = iLnbSp->setVoltage(static_cast<LnbVoltage>(voltage)); + return (jint) r; } -static int android_media_tv_Tuner_lnb_set_position(JNIEnv*, jobject, jint) { - return 0; +static int android_media_tv_Tuner_lnb_set_tone(JNIEnv* env, jobject lnb, jint tone) { + sp<ILnb> iLnbSp = getLnb(env, lnb)->getILnb(); + Result r = iLnbSp->setTone(static_cast<LnbTone>(tone)); + return (jint) r; } -static int android_media_tv_Tuner_lnb_send_diseqc_msg(JNIEnv*, jobject, jbyteArray) { - return 0; +static int android_media_tv_Tuner_lnb_set_position(JNIEnv* env, jobject lnb, jint position) { + sp<ILnb> iLnbSp = getLnb(env, lnb)->getILnb(); + Result r = iLnbSp->setSatellitePosition(static_cast<LnbPosition>(position)); + return (jint) r; +} + +static int android_media_tv_Tuner_lnb_send_diseqc_msg(JNIEnv* env, jobject lnb, jbyteArray msg) { + sp<ILnb> iLnbSp = getLnb(env, lnb)->getILnb(); + int size = env->GetArrayLength(msg); + std::vector<uint8_t> v(size); + env->GetByteArrayRegion(msg, 0, size, reinterpret_cast<jbyte*>(&v[0])); + Result r = iLnbSp->sendDiseqcMessage(v); + return (jint) r; } static int android_media_tv_Tuner_close_lnb(JNIEnv*, jobject) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index b786fc4e76b7..fec4cd8d5002 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -75,6 +75,14 @@ struct LnbCallback : public ILnbCallback { LnbId mId; }; +struct Lnb : public RefBase { + Lnb(sp<ILnb> sp, jobject obj); + ~Lnb(); + sp<ILnb> getILnb(); + sp<ILnb> mLnbSp; + jweak mLnbObj; +}; + struct DvrCallback : public IDvrCallback { virtual Return<void> onRecordStatus(RecordStatus status); virtual Return<void> onPlaybackStatus(PlaybackStatus status); |