Loading media/java/android/media/tv/tuner/Lnb.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading media/jni/android_media_tv_Tuner.cpp +57 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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) { Loading media/jni/android_media_tv_Tuner.h +8 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
media/java/android/media/tv/tuner/Lnb.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
media/jni/android_media_tv_Tuner.cpp +57 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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) { Loading
media/jni/android_media_tv_Tuner.h +8 −0 Original line number Diff line number Diff line Loading @@ -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); Loading