Loading media/java/android/media/tv/tuner/Tuner.java +37 −2 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ public final class Tuner implements AutoCloseable { private static final boolean DEBUG = false; 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; static { System.loadLibrary("media_tv_tuner"); Loading Loading @@ -86,6 +88,16 @@ public final class Tuner implements AutoCloseable { void onEvent(int frontendEventType); } /** * Frontend Callback. */ public interface FilterCallback { /** * Invoked when filter status changed. */ void onFilterStatus(int status); } @Nullable private EventHandler createEventHandler() { Looper looper; Loading @@ -110,6 +122,13 @@ public final class Tuner implements AutoCloseable { mFrontend.mCallback.onEvent(msg.arg1); } break; case MSG_ON_FILTER_STATUS: { Filter filter = (Filter) msg.obj; if (filter.mCallback != null) { filter.mCallback.onFilterStatus(msg.arg1); } break; } default: // fall through } Loading Loading @@ -171,13 +190,29 @@ public final class Tuner implements AutoCloseable { } protected class Filter { private long mNativeContext; private FilterCallback mCallback; int mId; private Filter(int id) { mId = id; } private void onFilterStatus(int status) { if (mHandler != null) { mHandler.sendMessage( mHandler.obtainMessage(MSG_ON_FILTER_STATUS, status, 0, this)); } } } private Filter openFilter(int type, int subType, int bufferSize) { return nativeOpenFilter(type, subType, bufferSize); private Filter openFilter(int type, int subType, int bufferSize, FilterCallback cb) { Filter filter = nativeOpenFilter(type, subType, bufferSize); if (filter != null) { filter.mCallback = cb; if (mHandler == null) { mHandler = createEventHandler(); } } return filter; } } media/jni/android_media_tv_Tuner.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -34,9 +34,11 @@ using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jfieldID filterContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; }; static fields_t gFields; Loading @@ -48,11 +50,23 @@ Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /* filterEven ALOGD("FilterCallback::onFilterEvent"); return Void(); } Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus /*status*/) { ALOGD("FilterCallback::onFilterStatu"); Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) { ALOGD("FilterCallback::onFilterStatus"); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( mFilter, gFields.onFilterStatusID, (jint)status); return Void(); } void FilterCallback::setFilter(const jobject filter) { ALOGD("FilterCallback::setFilter"); JNIEnv *env = AndroidRuntime::getJNIEnv(); mFilter = env->NewWeakGlobalRef(filter); } /////////////// FrontendCallback /////////////////////// FrontendCallback::FrontendCallback(jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {} Loading Loading @@ -186,27 +200,35 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { } } sp<IFilter> f; mDemux->openFilter(type, bufferSize, new FilterCallback, sp<IFilter> filterSp; sp<FilterCallback> callback = new FilterCallback(); mDemux->openFilter(type, bufferSize, callback, [&](Result, const sp<IFilter>& filter) { f = filter; filterSp = filter; }); if (f == NULL) { if (filterSp == NULL) { ALOGD("Failed to open filter, type = %d", type.mainType); return NULL; } int fId; f->getId([&](Result, uint32_t filterId) { filterSp->getId([&](Result, uint32_t filterId) { fId = filterId; }); mFilters[fId] = f; JNIEnv *env = AndroidRuntime::getJNIEnv(); return env->NewObject( jobject filterObj = env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Filter"), gFields.filterInitID, mObject, (jint) fId); filterSp->incStrong(filterObj); env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get()); callback->setFilter(filterObj); return filterObj; } } // namespace android Loading @@ -233,6 +255,10 @@ static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) { return (JTuner *)env->GetLongField(thiz, gFields.context); } static sp<IFilter> getFilter(JNIEnv *env, jobject filter) { return (IFilter *)env->GetLongField(filter, gFields.filterContext); } static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/tv/tuner/Tuner"); CHECK(clazz != NULL); Loading @@ -247,8 +273,11 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { env->GetMethodID(frontendClazz, "<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 = env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); gFields.onFilterStatusID = env->GetMethodID(filterClazz, "onFilterStatus", "(I)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading media/jni/android_media_tv_Tuner.h +4 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,10 @@ namespace android { struct FilterCallback : public IFilterCallback { virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(const DemuxFilterStatus status); void setFilter(const jobject filter); private: jweak mFilter; }; struct FrontendCallback : public IFrontendCallback { Loading Loading @@ -76,7 +80,6 @@ private: sp<IFrontend> mFe; sp<IDemux> mDemux; int mDemuxId; std::unordered_map<int, sp<IFilter>> mFilters; }; } // namespace android Loading Loading
media/java/android/media/tv/tuner/Tuner.java +37 −2 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ public final class Tuner implements AutoCloseable { private static final boolean DEBUG = false; 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; static { System.loadLibrary("media_tv_tuner"); Loading Loading @@ -86,6 +88,16 @@ public final class Tuner implements AutoCloseable { void onEvent(int frontendEventType); } /** * Frontend Callback. */ public interface FilterCallback { /** * Invoked when filter status changed. */ void onFilterStatus(int status); } @Nullable private EventHandler createEventHandler() { Looper looper; Loading @@ -110,6 +122,13 @@ public final class Tuner implements AutoCloseable { mFrontend.mCallback.onEvent(msg.arg1); } break; case MSG_ON_FILTER_STATUS: { Filter filter = (Filter) msg.obj; if (filter.mCallback != null) { filter.mCallback.onFilterStatus(msg.arg1); } break; } default: // fall through } Loading Loading @@ -171,13 +190,29 @@ public final class Tuner implements AutoCloseable { } protected class Filter { private long mNativeContext; private FilterCallback mCallback; int mId; private Filter(int id) { mId = id; } private void onFilterStatus(int status) { if (mHandler != null) { mHandler.sendMessage( mHandler.obtainMessage(MSG_ON_FILTER_STATUS, status, 0, this)); } } } private Filter openFilter(int type, int subType, int bufferSize) { return nativeOpenFilter(type, subType, bufferSize); private Filter openFilter(int type, int subType, int bufferSize, FilterCallback cb) { Filter filter = nativeOpenFilter(type, subType, bufferSize); if (filter != null) { filter.mCallback = cb; if (mHandler == null) { mHandler = createEventHandler(); } } return filter; } }
media/jni/android_media_tv_Tuner.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -34,9 +34,11 @@ using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jfieldID filterContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; }; static fields_t gFields; Loading @@ -48,11 +50,23 @@ Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /* filterEven ALOGD("FilterCallback::onFilterEvent"); return Void(); } Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus /*status*/) { ALOGD("FilterCallback::onFilterStatu"); Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) { ALOGD("FilterCallback::onFilterStatus"); JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod( mFilter, gFields.onFilterStatusID, (jint)status); return Void(); } void FilterCallback::setFilter(const jobject filter) { ALOGD("FilterCallback::setFilter"); JNIEnv *env = AndroidRuntime::getJNIEnv(); mFilter = env->NewWeakGlobalRef(filter); } /////////////// FrontendCallback /////////////////////// FrontendCallback::FrontendCallback(jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {} Loading Loading @@ -186,27 +200,35 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { } } sp<IFilter> f; mDemux->openFilter(type, bufferSize, new FilterCallback, sp<IFilter> filterSp; sp<FilterCallback> callback = new FilterCallback(); mDemux->openFilter(type, bufferSize, callback, [&](Result, const sp<IFilter>& filter) { f = filter; filterSp = filter; }); if (f == NULL) { if (filterSp == NULL) { ALOGD("Failed to open filter, type = %d", type.mainType); return NULL; } int fId; f->getId([&](Result, uint32_t filterId) { filterSp->getId([&](Result, uint32_t filterId) { fId = filterId; }); mFilters[fId] = f; JNIEnv *env = AndroidRuntime::getJNIEnv(); return env->NewObject( jobject filterObj = env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Filter"), gFields.filterInitID, mObject, (jint) fId); filterSp->incStrong(filterObj); env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get()); callback->setFilter(filterObj); return filterObj; } } // namespace android Loading @@ -233,6 +255,10 @@ static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) { return (JTuner *)env->GetLongField(thiz, gFields.context); } static sp<IFilter> getFilter(JNIEnv *env, jobject filter) { return (IFilter *)env->GetLongField(filter, gFields.filterContext); } static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/tv/tuner/Tuner"); CHECK(clazz != NULL); Loading @@ -247,8 +273,11 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { env->GetMethodID(frontendClazz, "<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 = env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); gFields.onFilterStatusID = env->GetMethodID(filterClazz, "onFilterStatus", "(I)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading
media/jni/android_media_tv_Tuner.h +4 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,10 @@ namespace android { struct FilterCallback : public IFilterCallback { virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(const DemuxFilterStatus status); void setFilter(const jobject filter); private: jweak mFilter; }; struct FrontendCallback : public IFrontendCallback { Loading Loading @@ -76,7 +80,6 @@ private: sp<IFrontend> mFe; sp<IDemux> mDemux; int mDemuxId; std::unordered_map<int, sp<IFilter>> mFilters; }; } // namespace android Loading