Add a cpp DVR wrapper
So we can store the FMQ, states, etc. for each Dvr instance.
Test: make; acloud create;
Change-Id: Ia51bbfea017c1eb3831016545b75eeb06a1dc169
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 5fa6a1f..9304450 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -97,6 +97,14 @@
mDvr = env->NewWeakGlobalRef(dvr);
}
+/////////////// Dvr ///////////////////////
+
+Dvr::Dvr(sp<IDvr> sp, jweak obj) : mDvrSp(sp), mDvrObj(obj) {}
+
+sp<IDvr> Dvr::getIDvr() {
+ return mDvrSp;
+}
+
/////////////// FilterCallback ///////////////////////
//TODO: implement filter callback
Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /*filterEvent*/) {
@@ -395,14 +403,14 @@
return NULL;
}
}
- sp<IDvr> dvrSp;
+ sp<IDvr> iDvrSp;
sp<DvrCallback> callback = new DvrCallback();
mDemux->openDvr(type, bufferSize, callback,
[&](Result, const sp<IDvr>& dvr) {
- dvrSp = dvr;
+ iDvrSp = dvr;
});
- if (dvrSp == NULL) {
+ if (iDvrSp == NULL) {
return NULL;
}
@@ -412,7 +420,7 @@
env->FindClass("android/media/tv/tuner/Tuner$Dvr"),
gFields.dvrInitID,
mObject);
-
+ sp<Dvr> dvrSp = new Dvr(iDvrSp, dvrObj);
dvrSp->incStrong(dvrObj);
env->SetLongField(dvrObj, gFields.dvrContext, (jlong)dvrSp.get());
@@ -532,8 +540,8 @@
return dvrSettings;
}
-static sp<IDvr> getDvr(JNIEnv *env, jobject dvr) {
- return (IDvr *)env->GetLongField(dvr, gFields.dvrContext);
+static sp<Dvr> getDvr(JNIEnv *env, jobject dvr) {
+ return (Dvr *)env->GetLongField(dvr, gFields.dvrContext);
}
static void android_media_tv_Tuner_native_init(JNIEnv *env) {
@@ -777,7 +785,7 @@
}
static bool android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
if (dvrSp == NULL || filterSp == NULL) {
return false;
@@ -787,7 +795,7 @@
}
static bool android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
if (dvrSp == NULL || filterSp == NULL) {
return false;
@@ -797,7 +805,7 @@
}
static int android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobject settings) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
if (dvrSp == NULL) {
ALOGD("Failed to configure dvr: dvr not found");
return (int)Result::INVALID_STATE;
@@ -807,7 +815,7 @@
}
static bool android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
if (dvrSp == NULL) {
ALOGD("Failed to start dvr: dvr not found");
return false;
@@ -816,7 +824,7 @@
}
static bool android_media_tv_Tuner_stop_dvr(JNIEnv *env, jobject dvr) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
if (dvrSp == NULL) {
ALOGD("Failed to stop dvr: dvr not found");
return false;
@@ -825,7 +833,7 @@
}
static bool android_media_tv_Tuner_flush_dvr(JNIEnv *env, jobject dvr) {
- sp<IDvr> dvrSp = getDvr(env, dvr);
+ sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
if (dvrSp == NULL) {
ALOGD("Failed to flush dvr: dvr not found");
return false;
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index 467acb8..9f9fb27 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -77,6 +77,13 @@
jweak mDvr;
};
+struct Dvr : public RefBase {
+ Dvr(sp<IDvr> sp, jweak obj);
+ sp<IDvr> getIDvr();
+ sp<IDvr> mDvrSp;
+ jweak mDvrObj;
+};
+
struct FilterCallback : public IFilterCallback {
virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
virtual Return<void> onFilterStatus(const DemuxFilterStatus status);