Loading media/java/android/media/tv/tuner/Lnb.java +1 −1 Original line number Diff line number Diff line Loading @@ -156,7 +156,7 @@ public class Lnb implements AutoCloseable { private long mNativeContext; Lnb(int id) { private Lnb(int id) { mId = id; } Loading media/java/android/media/tv/tuner/Tuner.java +50 −3 Original line number Diff line number Diff line Loading @@ -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.OnTuneEventListener; 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.HandlerExecutor; import android.os.Looper; import android.os.Message; Loading @@ -67,6 +71,7 @@ public class Tuner implements AutoCloseable { private static final String TAG = "MediaTvTuner"; 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_STATUS = 3; private static final int MSG_ON_LNB_EVENT = 4; Loading @@ -93,6 +98,8 @@ public class Tuner implements AutoCloseable { } private final Context mContext; private final TunerResourceManager mTunerResourceManager; private final int mClientId; private List<Integer> mFrontendIds; private Frontend mFrontend; Loading @@ -102,6 +109,7 @@ public class Tuner implements AutoCloseable { private List<Integer> mLnbIds; private Lnb mLnb; private Integer mLnbId; @Nullable private OnTuneEventListener mOnTuneEventListener; @Nullable Loading @@ -115,6 +123,15 @@ public class Tuner implements AutoCloseable { @Nullable 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. * Loading @@ -127,6 +144,14 @@ public class Tuner implements AutoCloseable { @TvInputService.PriorityHintUseCaseType int useCase) { nativeSetup(); 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]; } /** Loading Loading @@ -226,6 +251,7 @@ public class Tuner implements AutoCloseable { private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); private native Lnb nativeOpenLnbByName(String name); private native Descrambler nativeOpenDescrambler(); Loading Loading @@ -275,6 +301,14 @@ public class Tuner implements AutoCloseable { } break; } case MSG_RESOURCE_LOST: { if (mOnResourceLostListener != null && mOnResourceLostListenerExecutor != null) { mOnResourceLostListenerExecutor.execute( () -> mOnResourceLostListener.onResourceLost(Tuner.this)); } break; } default: // fall through } Loading Loading @@ -698,7 +732,10 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); TunerUtils.checkTunerPermission(mContext); return openLnbByName(null, executor, cb); if (mLnbId == null && !requestLnb()) { return null; } return nativeOpenLnbById(mLnbId); } /** Loading @@ -714,11 +751,21 @@ public class Tuner implements AutoCloseable { @Nullable public Lnb openLnbByName(@NonNull String name, @CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(name, "LNB name must not be null"); Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); TunerUtils.checkTunerPermission(mContext); // TODO: use resource manager to get LNB ID. return new Lnb(0); return nativeOpenLnbByName(name); } 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; } /** Loading media/jni/android_media_tv_Tuner.cpp +40 −2 Original line number Diff line number Diff line Loading @@ -1072,6 +1072,37 @@ jobject JTuner::openLnbById(int id) { 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) { if (mFe == NULL) { ALOGE("frontend is not initialized"); Loading Loading @@ -1872,8 +1903,7 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb"); gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); Loading Loading @@ -1996,6 +2026,12 @@ static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, 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( JNIEnv *env, jobject thiz, jint type, jint subType, jlong bufferSize) { sp<JTuner> tuner = getTuner(env, thiz); Loading Loading @@ -2888,6 +2924,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;", (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;", (void *)android_media_tv_Tuner_open_descrambler }, { "nativeOpenDvrRecorder", "(J)Landroid/media/tv/tuner/dvr/DvrRecorder;", Loading media/jni/android_media_tv_Tuner.h +1 −0 Original line number Diff line number Diff line Loading @@ -180,6 +180,7 @@ struct JTuner : public RefBase { int setLna(bool enable); jobject getLnbIds(); jobject openLnbById(int id); jobject openLnbByName(jstring name); jobject openFilter(DemuxFilterType type, int bufferSize); jobject openTimeFilter(); jobject openDescrambler(); Loading Loading
media/java/android/media/tv/tuner/Lnb.java +1 −1 Original line number Diff line number Diff line Loading @@ -156,7 +156,7 @@ public class Lnb implements AutoCloseable { private long mNativeContext; Lnb(int id) { private Lnb(int id) { mId = id; } Loading
media/java/android/media/tv/tuner/Tuner.java +50 −3 Original line number Diff line number Diff line Loading @@ -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.OnTuneEventListener; 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.HandlerExecutor; import android.os.Looper; import android.os.Message; Loading @@ -67,6 +71,7 @@ public class Tuner implements AutoCloseable { private static final String TAG = "MediaTvTuner"; 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_STATUS = 3; private static final int MSG_ON_LNB_EVENT = 4; Loading @@ -93,6 +98,8 @@ public class Tuner implements AutoCloseable { } private final Context mContext; private final TunerResourceManager mTunerResourceManager; private final int mClientId; private List<Integer> mFrontendIds; private Frontend mFrontend; Loading @@ -102,6 +109,7 @@ public class Tuner implements AutoCloseable { private List<Integer> mLnbIds; private Lnb mLnb; private Integer mLnbId; @Nullable private OnTuneEventListener mOnTuneEventListener; @Nullable Loading @@ -115,6 +123,15 @@ public class Tuner implements AutoCloseable { @Nullable 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. * Loading @@ -127,6 +144,14 @@ public class Tuner implements AutoCloseable { @TvInputService.PriorityHintUseCaseType int useCase) { nativeSetup(); 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]; } /** Loading Loading @@ -226,6 +251,7 @@ public class Tuner implements AutoCloseable { private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); private native Lnb nativeOpenLnbByName(String name); private native Descrambler nativeOpenDescrambler(); Loading Loading @@ -275,6 +301,14 @@ public class Tuner implements AutoCloseable { } break; } case MSG_RESOURCE_LOST: { if (mOnResourceLostListener != null && mOnResourceLostListenerExecutor != null) { mOnResourceLostListenerExecutor.execute( () -> mOnResourceLostListener.onResourceLost(Tuner.this)); } break; } default: // fall through } Loading Loading @@ -698,7 +732,10 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); TunerUtils.checkTunerPermission(mContext); return openLnbByName(null, executor, cb); if (mLnbId == null && !requestLnb()) { return null; } return nativeOpenLnbById(mLnbId); } /** Loading @@ -714,11 +751,21 @@ public class Tuner implements AutoCloseable { @Nullable public Lnb openLnbByName(@NonNull String name, @CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(name, "LNB name must not be null"); Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); TunerUtils.checkTunerPermission(mContext); // TODO: use resource manager to get LNB ID. return new Lnb(0); return nativeOpenLnbByName(name); } 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; } /** Loading
media/jni/android_media_tv_Tuner.cpp +40 −2 Original line number Diff line number Diff line Loading @@ -1072,6 +1072,37 @@ jobject JTuner::openLnbById(int id) { 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) { if (mFe == NULL) { ALOGE("frontend is not initialized"); Loading Loading @@ -1872,8 +1903,7 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb"); gFields.lnbContext = env->GetFieldID(lnbClazz, "mNativeContext", "J"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); gFields.lnbInitID = env->GetMethodID(lnbClazz, "<init>", "(I)V"); jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter"); gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J"); Loading Loading @@ -1996,6 +2026,12 @@ static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, 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( JNIEnv *env, jobject thiz, jint type, jint subType, jlong bufferSize) { sp<JTuner> tuner = getTuner(env, thiz); Loading Loading @@ -2888,6 +2924,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;", (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;", (void *)android_media_tv_Tuner_open_descrambler }, { "nativeOpenDvrRecorder", "(J)Landroid/media/tv/tuner/dvr/DvrRecorder;", Loading
media/jni/android_media_tv_Tuner.h +1 −0 Original line number Diff line number Diff line Loading @@ -180,6 +180,7 @@ struct JTuner : public RefBase { int setLna(bool enable); jobject getLnbIds(); jobject openLnbById(int id); jobject openLnbByName(jstring name); jobject openFilter(DemuxFilterType type, int bufferSize); jobject openTimeFilter(); jobject openDescrambler(); Loading