Loading media/java/android/media/tv/tuner/Tuner.java +62 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ public final class Tuner implements AutoCloseable { private static final int MSG_ON_FRONTEND_EVENT = 1; private static final int MSG_ON_FILTER_EVENT = 2; private static final int MSG_ON_FILTER_STATUS = 3; private static final int MSG_ON_LNB_EVENT = 4; static { System.loadLibrary("media_tv_tuner"); Loading @@ -45,6 +46,9 @@ public final class Tuner implements AutoCloseable { private Frontend mFrontend; private EventHandler mHandler; private List<Integer> mLnbIds; private Lnb mLnb; public Tuner() { nativeSetup(); } Loading Loading @@ -76,6 +80,8 @@ public final class Tuner implements AutoCloseable { private native Filter nativeOpenFilter(int type, int subType, int bufferSize); private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); /** * Frontend Callback. Loading @@ -88,6 +94,16 @@ public final class Tuner implements AutoCloseable { void onEvent(int frontendEventType); } /** * LNB Callback. */ public interface LnbCallback { /** * Invoked when there is a LNB event. */ void onEvent(int lnbEventType); } /** * Frontend Callback. */ Loading Loading @@ -129,6 +145,11 @@ public final class Tuner implements AutoCloseable { } break; } case MSG_ON_LNB_EVENT: { if (mLnb != null && mLnb.mCallback != null) { mLnb.mCallback.onEvent(msg.arg1); } } default: // fall through } Loading Loading @@ -232,4 +253,45 @@ public final class Tuner implements AutoCloseable { } return filter; } protected class Lnb { private int mId; private LnbCallback mCallback; private Lnb(int id) { mId = id; } public void setCallback(@Nullable LnbCallback callback) { mCallback = callback; if (mCallback == null) { return; } if (mHandler == null) { mHandler = createEventHandler(); } } } private List<Integer> getLnbIds() { mLnbIds = nativeGetLnbIds(); return mLnbIds; } private Lnb openLnbById(int id) { if (mLnbIds == null) { mLnbIds = getLnbIds(); } if (!mLnbIds.contains(id)) { return null; } mLnb = nativeOpenLnbById(id); return mLnb; } private void onLnbEvent(int eventType) { if (mHandler != null) { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); } } } media/jni/android_media_tv_Tuner.cpp +85 −0 Original line number Diff line number Diff line Loading @@ -39,11 +39,30 @@ struct fields_t { jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; jmethodID lnbInitID; jmethodID onLnbEventID; }; static fields_t gFields; namespace android { /////////////// LnbCallback /////////////////////// LnbCallback::LnbCallback(jweak tunerObj, LnbId id) : mObject(tunerObj), mId(id) {} Return<void> LnbCallback::onEvent(LnbEventType lnbEventType) { ALOGD("LnbCallback::onEvent, type=%d", lnbEventType); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( mObject, gFields.onLnbEventID, (jint)lnbEventType); return Void(); } Return<void> LnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& /*diseqcMessage*/) { ALOGD("LnbCallback::onDiseqcMessage"); return Void(); } /////////////// FilterCallback /////////////////////// //TODO: implement filter callback Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /*filterEvent*/) { Loading Loading @@ -175,6 +194,52 @@ jobject JTuner::openFrontendById(int id) { (jint) jId); } jobject JTuner::getLnbIds() { ALOGD("JTuner::getLnbIds()"); mTuner->getLnbIds([&](Result, const hidl_vec<FrontendId>& lnbIds) { mLnbIds = lnbIds; }); if (mLnbIds.size() == 0) { ALOGW("Lnb isn't available"); return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); jclass arrayListClazz = env->FindClass("java/util/ArrayList"); jmethodID arrayListAdd = env->GetMethodID(arrayListClazz, "add", "(Ljava/lang/Object;)Z"); jobject obj = env->NewObject(arrayListClazz, env->GetMethodID(arrayListClazz, "<init>", "()V")); jclass integerClazz = env->FindClass("java/lang/Integer"); jmethodID intInit = env->GetMethodID(integerClazz, "<init>", "(I)V"); for (int i=0; i < mLnbIds.size(); i++) { jobject idObj = env->NewObject(integerClazz, intInit, mLnbIds[i]); env->CallBooleanMethod(obj, arrayListAdd, idObj); } return obj; } jobject JTuner::openLnbById(int id) { sp<ILnb> lnbSp; mTuner->openLnbById(id, [&](Result, const sp<ILnb>& lnb) { lnbSp = lnb; }); if (lnbSp == nullptr) { ALOGE("Failed to open lnb"); return NULL; } mLnb = lnbSp; sp<LnbCallback> lnbCb = new LnbCallback(mObject, id); mLnb->setCallback(lnbCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); return env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Lnb"), gFields.lnbInitID, mObject, id); } bool JTuner::openDemux() { if (mTuner == nullptr) { return false; Loading Loading @@ -268,10 +333,16 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V"); gFields.onLnbEventID = env->GetMethodID(clazz, "onLnbEvent", "(I)V"); jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend"); gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); jclass lnbClazz = env->FindClass("android/media/tv/tuner/Tuner$Lnb"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/Tuner$Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); gFields.filterInitID = Loading @@ -295,6 +366,16 @@ static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject t return tuner->openFrontendById(id); } static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->getLnbIds(); } static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, jint id) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openLnbById(id); } static jobject android_media_tv_Tuner_open_filter( JNIEnv *env, jobject thiz, jint type, jint subType, jint bufferSize) { sp<JTuner> tuner = getTuner(env, thiz); Loading Loading @@ -344,6 +425,10 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_open_frontend_by_id }, { "nativeOpenFilter", "(III)Landroid/media/tv/tuner/Tuner$Filter;", (void *)android_media_tv_Tuner_open_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Tuner$Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_id }, }; static const JNINativeMethod gFilterMethods[] = { Loading media/jni/android_media_tv_Tuner.h +17 −0 Original line number Diff line number Diff line Loading @@ -37,10 +37,22 @@ using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; using ::android::hardware::tv::tuner::V1_0::IFrontend; using ::android::hardware::tv::tuner::V1_0::IFrontendCallback; using ::android::hardware::tv::tuner::V1_0::ILnb; using ::android::hardware::tv::tuner::V1_0::ILnbCallback; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::LnbEventType; using ::android::hardware::tv::tuner::V1_0::LnbId; namespace android { struct LnbCallback : public ILnbCallback { LnbCallback(jweak tunerObj, LnbId id); virtual Return<void> onEvent(LnbEventType lnbEventType); virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage); jweak mObject; LnbId mId; }; struct FilterCallback : public IFilterCallback { virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(const DemuxFilterStatus status); Loading @@ -67,7 +79,10 @@ struct JTuner : public RefBase { sp<ITuner> getTunerService(); jobject getFrontendIds(); jobject openFrontendById(int id); jobject getLnbIds(); jobject openLnbById(int id); jobject openFilter(DemuxFilterType type, int bufferSize); protected: bool openDemux(); virtual ~JTuner(); Loading @@ -78,6 +93,8 @@ private: static sp<ITuner> mTuner; hidl_vec<FrontendId> mFeIds; sp<IFrontend> mFe; hidl_vec<LnbId> mLnbIds; sp<ILnb> mLnb; sp<IDemux> mDemux; int mDemuxId; }; Loading Loading
media/java/android/media/tv/tuner/Tuner.java +62 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ public final class Tuner implements AutoCloseable { private static final int MSG_ON_FRONTEND_EVENT = 1; private static final int MSG_ON_FILTER_EVENT = 2; private static final int MSG_ON_FILTER_STATUS = 3; private static final int MSG_ON_LNB_EVENT = 4; static { System.loadLibrary("media_tv_tuner"); Loading @@ -45,6 +46,9 @@ public final class Tuner implements AutoCloseable { private Frontend mFrontend; private EventHandler mHandler; private List<Integer> mLnbIds; private Lnb mLnb; public Tuner() { nativeSetup(); } Loading Loading @@ -76,6 +80,8 @@ public final class Tuner implements AutoCloseable { private native Filter nativeOpenFilter(int type, int subType, int bufferSize); private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); /** * Frontend Callback. Loading @@ -88,6 +94,16 @@ public final class Tuner implements AutoCloseable { void onEvent(int frontendEventType); } /** * LNB Callback. */ public interface LnbCallback { /** * Invoked when there is a LNB event. */ void onEvent(int lnbEventType); } /** * Frontend Callback. */ Loading Loading @@ -129,6 +145,11 @@ public final class Tuner implements AutoCloseable { } break; } case MSG_ON_LNB_EVENT: { if (mLnb != null && mLnb.mCallback != null) { mLnb.mCallback.onEvent(msg.arg1); } } default: // fall through } Loading Loading @@ -232,4 +253,45 @@ public final class Tuner implements AutoCloseable { } return filter; } protected class Lnb { private int mId; private LnbCallback mCallback; private Lnb(int id) { mId = id; } public void setCallback(@Nullable LnbCallback callback) { mCallback = callback; if (mCallback == null) { return; } if (mHandler == null) { mHandler = createEventHandler(); } } } private List<Integer> getLnbIds() { mLnbIds = nativeGetLnbIds(); return mLnbIds; } private Lnb openLnbById(int id) { if (mLnbIds == null) { mLnbIds = getLnbIds(); } if (!mLnbIds.contains(id)) { return null; } mLnb = nativeOpenLnbById(id); return mLnb; } private void onLnbEvent(int eventType) { if (mHandler != null) { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); } } }
media/jni/android_media_tv_Tuner.cpp +85 −0 Original line number Diff line number Diff line Loading @@ -39,11 +39,30 @@ struct fields_t { jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; jmethodID lnbInitID; jmethodID onLnbEventID; }; static fields_t gFields; namespace android { /////////////// LnbCallback /////////////////////// LnbCallback::LnbCallback(jweak tunerObj, LnbId id) : mObject(tunerObj), mId(id) {} Return<void> LnbCallback::onEvent(LnbEventType lnbEventType) { ALOGD("LnbCallback::onEvent, type=%d", lnbEventType); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( mObject, gFields.onLnbEventID, (jint)lnbEventType); return Void(); } Return<void> LnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& /*diseqcMessage*/) { ALOGD("LnbCallback::onDiseqcMessage"); return Void(); } /////////////// FilterCallback /////////////////////// //TODO: implement filter callback Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /*filterEvent*/) { Loading Loading @@ -175,6 +194,52 @@ jobject JTuner::openFrontendById(int id) { (jint) jId); } jobject JTuner::getLnbIds() { ALOGD("JTuner::getLnbIds()"); mTuner->getLnbIds([&](Result, const hidl_vec<FrontendId>& lnbIds) { mLnbIds = lnbIds; }); if (mLnbIds.size() == 0) { ALOGW("Lnb isn't available"); return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); jclass arrayListClazz = env->FindClass("java/util/ArrayList"); jmethodID arrayListAdd = env->GetMethodID(arrayListClazz, "add", "(Ljava/lang/Object;)Z"); jobject obj = env->NewObject(arrayListClazz, env->GetMethodID(arrayListClazz, "<init>", "()V")); jclass integerClazz = env->FindClass("java/lang/Integer"); jmethodID intInit = env->GetMethodID(integerClazz, "<init>", "(I)V"); for (int i=0; i < mLnbIds.size(); i++) { jobject idObj = env->NewObject(integerClazz, intInit, mLnbIds[i]); env->CallBooleanMethod(obj, arrayListAdd, idObj); } return obj; } jobject JTuner::openLnbById(int id) { sp<ILnb> lnbSp; mTuner->openLnbById(id, [&](Result, const sp<ILnb>& lnb) { lnbSp = lnb; }); if (lnbSp == nullptr) { ALOGE("Failed to open lnb"); return NULL; } mLnb = lnbSp; sp<LnbCallback> lnbCb = new LnbCallback(mObject, id); mLnb->setCallback(lnbCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); return env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Lnb"), gFields.lnbInitID, mObject, id); } bool JTuner::openDemux() { if (mTuner == nullptr) { return false; Loading Loading @@ -268,10 +333,16 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V"); gFields.onLnbEventID = env->GetMethodID(clazz, "onLnbEvent", "(I)V"); jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend"); gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); jclass lnbClazz = env->FindClass("android/media/tv/tuner/Tuner$Lnb"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/Tuner$Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); gFields.filterInitID = Loading @@ -295,6 +366,16 @@ static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject t return tuner->openFrontendById(id); } static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->getLnbIds(); } static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, jint id) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openLnbById(id); } static jobject android_media_tv_Tuner_open_filter( JNIEnv *env, jobject thiz, jint type, jint subType, jint bufferSize) { sp<JTuner> tuner = getTuner(env, thiz); Loading Loading @@ -344,6 +425,10 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_open_frontend_by_id }, { "nativeOpenFilter", "(III)Landroid/media/tv/tuner/Tuner$Filter;", (void *)android_media_tv_Tuner_open_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Tuner$Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_id }, }; static const JNINativeMethod gFilterMethods[] = { Loading
media/jni/android_media_tv_Tuner.h +17 −0 Original line number Diff line number Diff line Loading @@ -37,10 +37,22 @@ using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; using ::android::hardware::tv::tuner::V1_0::IFrontend; using ::android::hardware::tv::tuner::V1_0::IFrontendCallback; using ::android::hardware::tv::tuner::V1_0::ILnb; using ::android::hardware::tv::tuner::V1_0::ILnbCallback; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::LnbEventType; using ::android::hardware::tv::tuner::V1_0::LnbId; namespace android { struct LnbCallback : public ILnbCallback { LnbCallback(jweak tunerObj, LnbId id); virtual Return<void> onEvent(LnbEventType lnbEventType); virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage); jweak mObject; LnbId mId; }; struct FilterCallback : public IFilterCallback { virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(const DemuxFilterStatus status); Loading @@ -67,7 +79,10 @@ struct JTuner : public RefBase { sp<ITuner> getTunerService(); jobject getFrontendIds(); jobject openFrontendById(int id); jobject getLnbIds(); jobject openLnbById(int id); jobject openFilter(DemuxFilterType type, int bufferSize); protected: bool openDemux(); virtual ~JTuner(); Loading @@ -78,6 +93,8 @@ private: static sp<ITuner> mTuner; hidl_vec<FrontendId> mFeIds; sp<IFrontend> mFe; hidl_vec<LnbId> mLnbIds; sp<ILnb> mLnb; sp<IDemux> mDemux; int mDemuxId; }; Loading