diff options
| -rw-r--r-- | Android.bp | 1 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/Tuner.java | 81 | ||||
| -rw-r--r-- | media/jni/Android.bp | 1 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 64 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 5 |
5 files changed, 152 insertions, 0 deletions
diff --git a/Android.bp b/Android.bp index a667c1064486..9497085a82ca 100644 --- a/Android.bp +++ b/Android.bp @@ -307,6 +307,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", diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 0228dc94fb25..2257747c2c8b 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -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. * @@ -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(); } @@ -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); + } } diff --git a/media/jni/Android.bp b/media/jni/Android.bp index a596d89bdcce..3742f970e8fd 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -132,6 +132,7 @@ cc_library_shared { shared_libs: [ "android.hardware.tv.tuner@1.0", "libandroid_runtime", + "libhidlbase", "liblog", "libutils", ], diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index d499eee5a9da..ba133fc44fb7 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -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; @@ -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 //////////////////////////////////////////////////////////////////////////////// @@ -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) { @@ -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) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index e7d5924a7dbe..1425542aa648 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -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 { @@ -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(); @@ -36,6 +40,7 @@ private: jclass mClass; jweak mObject; static sp<ITuner> mTuner; + sp<IFrontend> mFe; }; } // namespace android |