Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -303,6 +303,7 @@ java_library { "android.hardware.thermal-V1.1-java", "android.hardware.thermal-V2.0-java", "android.hardware.tv.input-V1.0-java-constants", "android.hardware.tv.tuner-V1.0-java-constants", "android.hardware.usb-V1.0-java-constants", "android.hardware.usb-V1.1-java-constants", "android.hardware.usb-V1.2-java-constants", Loading media/java/android/media/tv/tuner/Tuner.java +81 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,13 @@ package android.media.tv.tuner; import android.annotation.IntDef; import android.hardware.tv.tuner.V1_0.Constants; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; /** * Tuner is used to interact with tuner devices. * Loading @@ -25,11 +32,41 @@ public final class Tuner implements AutoCloseable { private static final String TAG = "MediaTvTuner"; private static final boolean DEBUG = false; @Retention(RetentionPolicy.SOURCE) @IntDef({FRONTEND_TYPE_UNDEFINED, FRONTEND_TYPE_ANALOG, FRONTEND_TYPE_ATSC, FRONTEND_TYPE_ATSC3, FRONTEND_TYPE_DVBC, FRONTEND_TYPE_DVBS, FRONTEND_TYPE_DVBT, FRONTEND_TYPE_ISDBS, FRONTEND_TYPE_ISDBS3, FRONTEND_TYPE_ISDBT}) public @interface FrontendType {} public static final int FRONTEND_TYPE_UNDEFINED = Constants.FrontendType.UNDEFINED; public static final int FRONTEND_TYPE_ANALOG = Constants.FrontendType.ANALOG; public static final int FRONTEND_TYPE_ATSC = Constants.FrontendType.ATSC; public static final int FRONTEND_TYPE_ATSC3 = Constants.FrontendType.ATSC3; public static final int FRONTEND_TYPE_DVBC = Constants.FrontendType.DVBC; public static final int FRONTEND_TYPE_DVBS = Constants.FrontendType.DVBS; public static final int FRONTEND_TYPE_DVBT = Constants.FrontendType.DVBT; public static final int FRONTEND_TYPE_ISDBS = Constants.FrontendType.ISDBS; public static final int FRONTEND_TYPE_ISDBS3 = Constants.FrontendType.ISDBS3; public static final int FRONTEND_TYPE_ISDBT = Constants.FrontendType.ISDBT; @Retention(RetentionPolicy.SOURCE) @IntDef({FRONTEND_EVENT_TYPE_LOCKED, FRONTEND_EVENT_TYPE_NO_SIGNAL, FRONTEND_EVENT_TYPE_LOST_LOCK}) public @interface FrontendEventType {} public static final int FRONTEND_EVENT_TYPE_LOCKED = Constants.FrontendEventType.LOCKED; public static final int FRONTEND_EVENT_TYPE_NO_SIGNAL = Constants.FrontendEventType.NO_SIGNAL; public static final int FRONTEND_EVENT_TYPE_LOST_LOCK = Constants.FrontendEventType.LOST_LOCK; static { System.loadLibrary("media_tv_tuner"); nativeInit(); } private FrontendCallback mFrontendCallback; private List<Integer> mFrontendIds; public Tuner() { nativeSetup(); } Loading @@ -48,4 +85,48 @@ public final class Tuner implements AutoCloseable { * Native setup. */ private native void nativeSetup(); /** * Native method to get all frontend IDs. */ private native List<Integer> nativeGetFrontendIds(); /** * Native method to open frontend of the given ID. */ private native Frontend nativeOpenFrontendById(int id); /** * Frontend Callback. */ public interface FrontendCallback { /** * Invoked when there is a frontend event. */ void onEvent(int frontendEventType); } protected static class Frontend { int mId; private Frontend(int id) { mId = id; } } private List<Integer> getFrontendIds() { mFrontendIds = nativeGetFrontendIds(); return mFrontendIds; } private Frontend openFrontendById(int id) { if (mFrontendIds == null) { getFrontendIds(); } if (!mFrontendIds.contains(id)) { return null; } return nativeOpenFrontendById(id); } } media/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -132,6 +132,7 @@ cc_library_shared { shared_libs: [ "android.hardware.tv.tuner@1.0", "libandroid_runtime", "libhidlbase", "liblog", "libutils", ], Loading media/jni/android_media_tv_Tuner.cpp +64 −0 Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ #pragma GCC diagnostic ignored "-Wunused-function" using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jmethodID frontendInitID; }; static fields_t gFields; Loading Loading @@ -69,6 +72,50 @@ sp<ITuner> JTuner::getTunerService() { return mTuner; } jobject JTuner::getFrontendIds() { ALOGD("JTuner::getFrontendIds()"); hidl_vec<FrontendId> feIds; mTuner->getFrontendIds([&](Result, const hidl_vec<FrontendId>& frontendIds) { feIds = frontendIds; }); if (feIds.size() == 0) { ALOGW("Frontend 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 < feIds.size(); i++) { jobject idObj = env->NewObject(integerClazz, intInit, feIds[i]); env->CallBooleanMethod(obj, arrayListAdd, idObj); } return obj; } jobject JTuner::openFrontendById(int id) { mTuner->openFrontendById(id, [&](Result, const sp<IFrontend>& frontend) { mFe = frontend; }); if (mFe == nullptr) { ALOGE("Failed to open frontend"); return NULL; } jint jId = (jint) id; JNIEnv *env = AndroidRuntime::getJNIEnv(); // TODO: add more fields to frontend return env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Frontend"), gFields.frontendInitID, (jint) jId); } } // namespace android //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -99,6 +146,9 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend"); gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(I)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading @@ -106,9 +156,23 @@ static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { setTuner(env,thiz, tuner); } static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->getFrontendIds(); } static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openFrontendById(id); } static const JNINativeMethod gMethods[] = { { "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init }, { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, { "nativeGetFrontendIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_frontend_ids }, { "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", (void *)android_media_tv_Tuner_open_frontend_by_id }, }; static int register_android_media_tv_Tuner(JNIEnv *env) { Loading media/jni/android_media_tv_Tuner.h +5 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include "jni.h" using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::IFrontend; using ::android::hardware::tv::tuner::V1_0::ITuner; namespace android { Loading @@ -29,6 +31,8 @@ namespace android { struct JTuner : public RefBase { JTuner(JNIEnv *env, jobject thiz); sp<ITuner> getTunerService(); jobject getFrontendIds(); jobject openFrontendById(int id); protected: virtual ~JTuner(); Loading @@ -36,6 +40,7 @@ private: jclass mClass; jweak mObject; static sp<ITuner> mTuner; sp<IFrontend> mFe; }; } // namespace android Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -303,6 +303,7 @@ java_library { "android.hardware.thermal-V1.1-java", "android.hardware.thermal-V2.0-java", "android.hardware.tv.input-V1.0-java-constants", "android.hardware.tv.tuner-V1.0-java-constants", "android.hardware.usb-V1.0-java-constants", "android.hardware.usb-V1.1-java-constants", "android.hardware.usb-V1.2-java-constants", Loading
media/java/android/media/tv/tuner/Tuner.java +81 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,13 @@ package android.media.tv.tuner; import android.annotation.IntDef; import android.hardware.tv.tuner.V1_0.Constants; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; /** * Tuner is used to interact with tuner devices. * Loading @@ -25,11 +32,41 @@ public final class Tuner implements AutoCloseable { private static final String TAG = "MediaTvTuner"; private static final boolean DEBUG = false; @Retention(RetentionPolicy.SOURCE) @IntDef({FRONTEND_TYPE_UNDEFINED, FRONTEND_TYPE_ANALOG, FRONTEND_TYPE_ATSC, FRONTEND_TYPE_ATSC3, FRONTEND_TYPE_DVBC, FRONTEND_TYPE_DVBS, FRONTEND_TYPE_DVBT, FRONTEND_TYPE_ISDBS, FRONTEND_TYPE_ISDBS3, FRONTEND_TYPE_ISDBT}) public @interface FrontendType {} public static final int FRONTEND_TYPE_UNDEFINED = Constants.FrontendType.UNDEFINED; public static final int FRONTEND_TYPE_ANALOG = Constants.FrontendType.ANALOG; public static final int FRONTEND_TYPE_ATSC = Constants.FrontendType.ATSC; public static final int FRONTEND_TYPE_ATSC3 = Constants.FrontendType.ATSC3; public static final int FRONTEND_TYPE_DVBC = Constants.FrontendType.DVBC; public static final int FRONTEND_TYPE_DVBS = Constants.FrontendType.DVBS; public static final int FRONTEND_TYPE_DVBT = Constants.FrontendType.DVBT; public static final int FRONTEND_TYPE_ISDBS = Constants.FrontendType.ISDBS; public static final int FRONTEND_TYPE_ISDBS3 = Constants.FrontendType.ISDBS3; public static final int FRONTEND_TYPE_ISDBT = Constants.FrontendType.ISDBT; @Retention(RetentionPolicy.SOURCE) @IntDef({FRONTEND_EVENT_TYPE_LOCKED, FRONTEND_EVENT_TYPE_NO_SIGNAL, FRONTEND_EVENT_TYPE_LOST_LOCK}) public @interface FrontendEventType {} public static final int FRONTEND_EVENT_TYPE_LOCKED = Constants.FrontendEventType.LOCKED; public static final int FRONTEND_EVENT_TYPE_NO_SIGNAL = Constants.FrontendEventType.NO_SIGNAL; public static final int FRONTEND_EVENT_TYPE_LOST_LOCK = Constants.FrontendEventType.LOST_LOCK; static { System.loadLibrary("media_tv_tuner"); nativeInit(); } private FrontendCallback mFrontendCallback; private List<Integer> mFrontendIds; public Tuner() { nativeSetup(); } Loading @@ -48,4 +85,48 @@ public final class Tuner implements AutoCloseable { * Native setup. */ private native void nativeSetup(); /** * Native method to get all frontend IDs. */ private native List<Integer> nativeGetFrontendIds(); /** * Native method to open frontend of the given ID. */ private native Frontend nativeOpenFrontendById(int id); /** * Frontend Callback. */ public interface FrontendCallback { /** * Invoked when there is a frontend event. */ void onEvent(int frontendEventType); } protected static class Frontend { int mId; private Frontend(int id) { mId = id; } } private List<Integer> getFrontendIds() { mFrontendIds = nativeGetFrontendIds(); return mFrontendIds; } private Frontend openFrontendById(int id) { if (mFrontendIds == null) { getFrontendIds(); } if (!mFrontendIds.contains(id)) { return null; } return nativeOpenFrontendById(id); } }
media/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -132,6 +132,7 @@ cc_library_shared { shared_libs: [ "android.hardware.tv.tuner@1.0", "libandroid_runtime", "libhidlbase", "liblog", "libutils", ], Loading
media/jni/android_media_tv_Tuner.cpp +64 −0 Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ #pragma GCC diagnostic ignored "-Wunused-function" using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jmethodID frontendInitID; }; static fields_t gFields; Loading Loading @@ -69,6 +72,50 @@ sp<ITuner> JTuner::getTunerService() { return mTuner; } jobject JTuner::getFrontendIds() { ALOGD("JTuner::getFrontendIds()"); hidl_vec<FrontendId> feIds; mTuner->getFrontendIds([&](Result, const hidl_vec<FrontendId>& frontendIds) { feIds = frontendIds; }); if (feIds.size() == 0) { ALOGW("Frontend 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 < feIds.size(); i++) { jobject idObj = env->NewObject(integerClazz, intInit, feIds[i]); env->CallBooleanMethod(obj, arrayListAdd, idObj); } return obj; } jobject JTuner::openFrontendById(int id) { mTuner->openFrontendById(id, [&](Result, const sp<IFrontend>& frontend) { mFe = frontend; }); if (mFe == nullptr) { ALOGE("Failed to open frontend"); return NULL; } jint jId = (jint) id; JNIEnv *env = AndroidRuntime::getJNIEnv(); // TODO: add more fields to frontend return env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Frontend"), gFields.frontendInitID, (jint) jId); } } // namespace android //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -99,6 +146,9 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend"); gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(I)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading @@ -106,9 +156,23 @@ static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { setTuner(env,thiz, tuner); } static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->getFrontendIds(); } static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openFrontendById(id); } static const JNINativeMethod gMethods[] = { { "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init }, { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, { "nativeGetFrontendIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_frontend_ids }, { "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", (void *)android_media_tv_Tuner_open_frontend_by_id }, }; static int register_android_media_tv_Tuner(JNIEnv *env) { Loading
media/jni/android_media_tv_Tuner.h +5 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include "jni.h" using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::IFrontend; using ::android::hardware::tv::tuner::V1_0::ITuner; namespace android { Loading @@ -29,6 +31,8 @@ namespace android { struct JTuner : public RefBase { JTuner(JNIEnv *env, jobject thiz); sp<ITuner> getTunerService(); jobject getFrontendIds(); jobject openFrontendById(int id); protected: virtual ~JTuner(); Loading @@ -36,6 +40,7 @@ private: jclass mClass; jweak mObject; static sp<ITuner> mTuner; sp<IFrontend> mFe; }; } // namespace android Loading