Merge "Implement Tuner.openLnbByName()" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
735ed754b9
@@ -156,7 +156,7 @@ public class Lnb implements AutoCloseable {
|
|||||||
|
|
||||||
private long mNativeContext;
|
private long mNativeContext;
|
||||||
|
|
||||||
Lnb(int id) {
|
private Lnb(int id) {
|
||||||
mId = id;
|
mId = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,11 @@ import android.media.tv.tuner.frontend.FrontendStatus;
|
|||||||
import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType;
|
import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType;
|
||||||
import android.media.tv.tuner.frontend.OnTuneEventListener;
|
import android.media.tv.tuner.frontend.OnTuneEventListener;
|
||||||
import android.media.tv.tuner.frontend.ScanCallback;
|
import android.media.tv.tuner.frontend.ScanCallback;
|
||||||
|
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
|
||||||
|
import android.media.tv.tunerresourcemanager.TunerLnbRequest;
|
||||||
|
import android.media.tv.tunerresourcemanager.TunerResourceManager;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerExecutor;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
|
|
||||||
@@ -67,6 +71,7 @@ public class Tuner implements AutoCloseable {
|
|||||||
private static final String TAG = "MediaTvTuner";
|
private static final String TAG = "MediaTvTuner";
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private static final int MSG_RESOURCE_LOST = 1;
|
||||||
private static final int MSG_ON_FILTER_EVENT = 2;
|
private static final int MSG_ON_FILTER_EVENT = 2;
|
||||||
private static final int MSG_ON_FILTER_STATUS = 3;
|
private static final int MSG_ON_FILTER_STATUS = 3;
|
||||||
private static final int MSG_ON_LNB_EVENT = 4;
|
private static final int MSG_ON_LNB_EVENT = 4;
|
||||||
@@ -93,6 +98,8 @@ public class Tuner implements AutoCloseable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
private final TunerResourceManager mTunerResourceManager;
|
||||||
|
private final int mClientId;
|
||||||
|
|
||||||
private List<Integer> mFrontendIds;
|
private List<Integer> mFrontendIds;
|
||||||
private Frontend mFrontend;
|
private Frontend mFrontend;
|
||||||
@@ -102,6 +109,7 @@ public class Tuner implements AutoCloseable {
|
|||||||
|
|
||||||
private List<Integer> mLnbIds;
|
private List<Integer> mLnbIds;
|
||||||
private Lnb mLnb;
|
private Lnb mLnb;
|
||||||
|
private Integer mLnbId;
|
||||||
@Nullable
|
@Nullable
|
||||||
private OnTuneEventListener mOnTuneEventListener;
|
private OnTuneEventListener mOnTuneEventListener;
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -115,6 +123,15 @@ public class Tuner implements AutoCloseable {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Executor mOnResourceLostListenerExecutor;
|
private Executor mOnResourceLostListenerExecutor;
|
||||||
|
|
||||||
|
|
||||||
|
private final TunerResourceManager.ResourcesReclaimListener mResourceListener =
|
||||||
|
new TunerResourceManager.ResourcesReclaimListener() {
|
||||||
|
@Override
|
||||||
|
public void onReclaimResources() {
|
||||||
|
mHandler.sendMessage(mHandler.obtainMessage(MSG_RESOURCE_LOST));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a Tuner instance.
|
* Constructs a Tuner instance.
|
||||||
*
|
*
|
||||||
@@ -127,6 +144,14 @@ public class Tuner implements AutoCloseable {
|
|||||||
@TvInputService.PriorityHintUseCaseType int useCase) {
|
@TvInputService.PriorityHintUseCaseType int useCase) {
|
||||||
nativeSetup();
|
nativeSetup();
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mTunerResourceManager = (TunerResourceManager)
|
||||||
|
context.getSystemService(Context.TV_TUNER_RESOURCE_MGR_SERVICE);
|
||||||
|
|
||||||
|
int[] clientId = new int[1];
|
||||||
|
ResourceClientProfile profile = new ResourceClientProfile(tvInputSessionId, useCase);
|
||||||
|
mTunerResourceManager.registerClientProfile(
|
||||||
|
profile, new HandlerExecutor(mHandler), mResourceListener, clientId);
|
||||||
|
mClientId = clientId[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -226,6 +251,7 @@ public class Tuner implements AutoCloseable {
|
|||||||
|
|
||||||
private native List<Integer> nativeGetLnbIds();
|
private native List<Integer> nativeGetLnbIds();
|
||||||
private native Lnb nativeOpenLnbById(int id);
|
private native Lnb nativeOpenLnbById(int id);
|
||||||
|
private native Lnb nativeOpenLnbByName(String name);
|
||||||
|
|
||||||
private native Descrambler nativeOpenDescrambler();
|
private native Descrambler nativeOpenDescrambler();
|
||||||
|
|
||||||
@@ -275,6 +301,14 @@ public class Tuner implements AutoCloseable {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MSG_RESOURCE_LOST: {
|
||||||
|
if (mOnResourceLostListener != null
|
||||||
|
&& mOnResourceLostListenerExecutor != null) {
|
||||||
|
mOnResourceLostListenerExecutor.execute(
|
||||||
|
() -> mOnResourceLostListener.onResourceLost(Tuner.this));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
// fall through
|
// fall through
|
||||||
}
|
}
|
||||||
@@ -698,7 +732,10 @@ public class Tuner implements AutoCloseable {
|
|||||||
Objects.requireNonNull(executor, "executor must not be null");
|
Objects.requireNonNull(executor, "executor must not be null");
|
||||||
Objects.requireNonNull(cb, "LnbCallback must not be null");
|
Objects.requireNonNull(cb, "LnbCallback must not be null");
|
||||||
TunerUtils.checkTunerPermission(mContext);
|
TunerUtils.checkTunerPermission(mContext);
|
||||||
return openLnbByName(null, executor, cb);
|
if (mLnbId == null && !requestLnb()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return nativeOpenLnbById(mLnbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -714,11 +751,21 @@ public class Tuner implements AutoCloseable {
|
|||||||
@Nullable
|
@Nullable
|
||||||
public Lnb openLnbByName(@NonNull String name, @CallbackExecutor @NonNull Executor executor,
|
public Lnb openLnbByName(@NonNull String name, @CallbackExecutor @NonNull Executor executor,
|
||||||
@NonNull LnbCallback cb) {
|
@NonNull LnbCallback cb) {
|
||||||
|
Objects.requireNonNull(name, "LNB name must not be null");
|
||||||
Objects.requireNonNull(executor, "executor must not be null");
|
Objects.requireNonNull(executor, "executor must not be null");
|
||||||
Objects.requireNonNull(cb, "LnbCallback must not be null");
|
Objects.requireNonNull(cb, "LnbCallback must not be null");
|
||||||
TunerUtils.checkTunerPermission(mContext);
|
TunerUtils.checkTunerPermission(mContext);
|
||||||
// TODO: use resource manager to get LNB ID.
|
return nativeOpenLnbByName(name);
|
||||||
return new Lnb(0);
|
}
|
||||||
|
|
||||||
|
private boolean requestLnb() {
|
||||||
|
int[] lnbId = new int[1];
|
||||||
|
TunerLnbRequest request = new TunerLnbRequest(mClientId);
|
||||||
|
boolean granted = mTunerResourceManager.requestLnb(request, lnbId);
|
||||||
|
if (granted) {
|
||||||
|
mLnbId = lnbId[0];
|
||||||
|
}
|
||||||
|
return granted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1072,6 +1072,37 @@ jobject JTuner::openLnbById(int id) {
|
|||||||
return lnbObj;
|
return lnbObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jobject JTuner::openLnbByName(jstring name) {
|
||||||
|
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||||
|
std::string lnbName(env->GetStringUTFChars(name, nullptr));
|
||||||
|
sp<ILnb> iLnbSp;
|
||||||
|
Result res;
|
||||||
|
LnbId id;
|
||||||
|
mTuner->openLnbByName(lnbName, [&](Result r, LnbId lnbId, const sp<ILnb>& lnb) {
|
||||||
|
res = r;
|
||||||
|
iLnbSp = lnb;
|
||||||
|
id = lnbId;
|
||||||
|
});
|
||||||
|
if (res != Result::SUCCESS || iLnbSp == nullptr) {
|
||||||
|
ALOGE("Failed to open lnb");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mLnb = iLnbSp;
|
||||||
|
sp<LnbCallback> lnbCb = new LnbCallback(mObject, id);
|
||||||
|
mLnb->setCallback(lnbCb);
|
||||||
|
|
||||||
|
jobject lnbObj = env->NewObject(
|
||||||
|
env->FindClass("android/media/tv/tuner/Lnb"),
|
||||||
|
gFields.lnbInitID,
|
||||||
|
id);
|
||||||
|
|
||||||
|
sp<Lnb> lnbSp = new Lnb(iLnbSp, lnbObj);
|
||||||
|
lnbSp->incStrong(lnbObj);
|
||||||
|
env->SetLongField(lnbObj, gFields.lnbContext, (jlong) lnbSp.get());
|
||||||
|
|
||||||
|
return lnbObj;
|
||||||
|
}
|
||||||
|
|
||||||
int JTuner::tune(const FrontendSettings& settings) {
|
int JTuner::tune(const FrontendSettings& settings) {
|
||||||
if (mFe == NULL) {
|
if (mFe == NULL) {
|
||||||
ALOGE("frontend is not initialized");
|
ALOGE("frontend is not initialized");
|
||||||
@@ -1872,8 +1903,7 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
|
|||||||
|
|
||||||
jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb");
|
jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb");
|
||||||
gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J");
|
gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J");
|
||||||
gFields.lnbInitID =
|
gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V");
|
||||||
env->GetMethodID(lnbClazz, "<init>", "(I)V");
|
|
||||||
|
|
||||||
jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter");
|
jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter");
|
||||||
gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J");
|
gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J");
|
||||||
@@ -1996,6 +2026,12 @@ static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz,
|
|||||||
return tuner->openLnbById(id);
|
return tuner->openLnbById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jobject android_media_tv_Tuner_open_lnb_by_name(JNIEnv *env, jobject thiz, jstring name) {
|
||||||
|
sp<JTuner> tuner = getTuner(env, thiz);
|
||||||
|
return tuner->openLnbByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static jobject android_media_tv_Tuner_open_filter(
|
static jobject android_media_tv_Tuner_open_filter(
|
||||||
JNIEnv *env, jobject thiz, jint type, jint subType, jlong bufferSize) {
|
JNIEnv *env, jobject thiz, jint type, jint subType, jlong bufferSize) {
|
||||||
sp<JTuner> tuner = getTuner(env, thiz);
|
sp<JTuner> tuner = getTuner(env, thiz);
|
||||||
@@ -2888,6 +2924,8 @@ static const JNINativeMethod gTunerMethods[] = {
|
|||||||
(void *)android_media_tv_Tuner_get_lnb_ids },
|
(void *)android_media_tv_Tuner_get_lnb_ids },
|
||||||
{ "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;",
|
{ "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;",
|
||||||
(void *)android_media_tv_Tuner_open_lnb_by_id },
|
(void *)android_media_tv_Tuner_open_lnb_by_id },
|
||||||
|
{ "nativeOpenLnbByName", "(Ljava/lang/String;)Landroid/media/tv/tuner/Lnb;",
|
||||||
|
(void *)android_media_tv_Tuner_open_lnb_by_name },
|
||||||
{ "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Descrambler;",
|
{ "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Descrambler;",
|
||||||
(void *)android_media_tv_Tuner_open_descrambler },
|
(void *)android_media_tv_Tuner_open_descrambler },
|
||||||
{ "nativeOpenDvrRecorder", "(J)Landroid/media/tv/tuner/dvr/DvrRecorder;",
|
{ "nativeOpenDvrRecorder", "(J)Landroid/media/tv/tuner/dvr/DvrRecorder;",
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ struct JTuner : public RefBase {
|
|||||||
int setLna(bool enable);
|
int setLna(bool enable);
|
||||||
jobject getLnbIds();
|
jobject getLnbIds();
|
||||||
jobject openLnbById(int id);
|
jobject openLnbById(int id);
|
||||||
|
jobject openLnbByName(jstring name);
|
||||||
jobject openFilter(DemuxFilterType type, int bufferSize);
|
jobject openFilter(DemuxFilterType type, int bufferSize);
|
||||||
jobject openTimeFilter();
|
jobject openTimeFilter();
|
||||||
jobject openDescrambler();
|
jobject openDescrambler();
|
||||||
|
|||||||
Reference in New Issue
Block a user