Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdf30dec authored by shubang's avatar shubang
Browse files

Handle filter status callback

Test: make; acloud
Change-Id: Ibff3e6e7fd834b2cbb1ceb75028151af575c27eb
parent 5d01ae69
Loading
Loading
Loading
Loading
+37 −2
Original line number Diff line number Diff line
@@ -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");
@@ -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;
@@ -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
            }
@@ -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;
    }
}
+43 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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) {}
@@ -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
@@ -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);
@@ -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) {
+4 −1
Original line number Diff line number Diff line
@@ -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 {
@@ -76,7 +80,6 @@ private:
    sp<IFrontend> mFe;
    sp<IDemux> mDemux;
    int mDemuxId;
    std::unordered_map<int, sp<IFilter>> mFilters;
};

}  // namespace android