Loading media/java/android/media/tv/tuner/Tuner.java +64 −23 Original line number Diff line number Diff line Loading @@ -353,13 +353,16 @@ public class Tuner implements AutoCloseable { @Override public void close() { if (mFrontendHandle != null) { nativeCloseFrontendByHandle(mFrontendHandle); int res = nativeCloseFrontend(mFrontendHandle); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "failed to close frontend"); } mTunerResourceManager.releaseFrontend(mFrontendHandle, mClientId); mFrontendHandle = null; mFrontend = null; } if (mLnb != null) { releaseLnb(); mLnb.close(); } if (!mDescramblers.isEmpty()) { for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) { Loading @@ -374,6 +377,14 @@ public class Tuner implements AutoCloseable { } mFilters.clear(); } if (mDemuxHandle != null) { int res = nativeCloseDemux(mDemuxHandle); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "failed to close demux"); } mTunerResourceManager.releaseDemux(mDemuxHandle, mClientId); mFrontendHandle = null; } TunerUtils.throwExceptionForResult(nativeClose(), "failed to close tuner"); } Loading Loading @@ -425,6 +436,8 @@ public class Tuner implements AutoCloseable { private static native DemuxCapabilities nativeGetDemuxCapabilities(); private native int nativeCloseDemux(int handle); private native int nativeCloseFrontend(int handle); private native int nativeClose(); Loading Loading @@ -545,11 +558,12 @@ public class Tuner implements AutoCloseable { @Result public int tune(@NonNull FrontendSettings settings) { mFrontendType = settings.getType(); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { mFrontendInfo = null; return nativeTune(settings.getType(), settings); } return RESULT_UNAVAILABLE; } /** * Stops a previous tuning. Loading Loading @@ -584,12 +598,14 @@ public class Tuner implements AutoCloseable { + "started."); } mFrontendType = settings.getType(); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { mScanCallback = scanCallback; mScanCallbackExecutor = executor; mFrontendInfo = null; return nativeScan(settings.getType(), settings, scanType); } return RESULT_UNAVAILABLE; } /** * Stops a previous scanning. Loading Loading @@ -671,7 +687,9 @@ public class Tuner implements AutoCloseable { * @return the id of hardware A/V sync. */ public int getAvSyncHwId(@NonNull Filter filter) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return INVALID_AV_SYNC_ID; } Integer id = nativeGetAvSyncHwId(filter); return id == null ? INVALID_AV_SYNC_ID : id; } Loading @@ -686,7 +704,9 @@ public class Tuner implements AutoCloseable { * @return the current timestamp of hardware A/V sync. */ public long getAvSyncTime(int avSyncHwId) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return INVALID_TIMESTAMP; } Long time = nativeGetAvSyncTime(avSyncHwId); return time == null ? INVALID_TIMESTAMP : time; } Loading @@ -702,9 +722,11 @@ public class Tuner implements AutoCloseable { */ @Result public int connectCiCam(int ciCamId) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return nativeConnectCiCam(ciCamId); } return RESULT_UNAVAILABLE; } /** * Disconnects Conditional Access Modules (CAM) Loading @@ -715,9 +737,11 @@ public class Tuner implements AutoCloseable { */ @Result public int disconnectCiCam() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return nativeDisconnectCiCam(); } return RESULT_UNAVAILABLE; } /** * Gets the frontend information. Loading @@ -726,7 +750,9 @@ public class Tuner implements AutoCloseable { */ @Nullable public FrontendInfo getFrontendInfo() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { return null; } if (mFrontend == null) { throw new IllegalStateException("frontend is not initialized"); } Loading Loading @@ -861,7 +887,9 @@ public class Tuner implements AutoCloseable { public Filter openFilter(@Type int mainType, @Subtype int subType, @BytesLong long bufferSize, @CallbackExecutor @Nullable Executor executor, @Nullable FilterCallback cb) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } Filter filter = nativeOpenFilter( mainType, TunerUtils.getFilterSubtype(mainType, subType), bufferSize); if (filter != null) { Loading Loading @@ -891,13 +919,16 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); if (mLnb != null) { mLnb.setCallback(executor, cb, this); return mLnb; } if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB) && mLnb != null) { mLnb.setCallback(executor, cb, this); } setLnb(mLnb); return mLnb; } return null; } /** * Opens an LNB (low-noise block downconverter) object specified by the give name. Loading @@ -922,6 +953,7 @@ public class Tuner implements AutoCloseable { } mLnb = newLnb; mLnb.setCallback(executor, cb, this); setLnb(mLnb); } return mLnb; } Loading @@ -944,7 +976,9 @@ public class Tuner implements AutoCloseable { */ @Nullable public TimeFilter openTimeFilter() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } return nativeOpenTimeFilter(); } Loading @@ -956,6 +990,9 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) @Nullable public Descrambler openDescrambler() { if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } return requestDescrambler(); } Loading @@ -976,7 +1013,9 @@ public class Tuner implements AutoCloseable { @NonNull OnRecordStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnRecordStatusChangedListener must not be null"); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } DvrRecorder dvr = nativeOpenDvrRecorder(bufferSize); dvr.setListener(executor, l); return dvr; Loading @@ -999,7 +1038,9 @@ public class Tuner implements AutoCloseable { @NonNull OnPlaybackStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnPlaybackStatusChangedListener must not be null"); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize); dvr.setListener(executor, l); return dvr; Loading media/jni/android_media_tv_Tuner.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -1130,7 +1130,7 @@ jintArray JTuner::getLnbIds() { lnbIds = ids; res = r; }); if (res != Result::SUCCESS || mLnbIds.size() == 0) { if (res != Result::SUCCESS || lnbIds.size() == 0) { ALOGW("Lnb isn't available"); return NULL; } Loading Loading @@ -1797,6 +1797,22 @@ jobject JTuner::getFrontendStatus(jintArray types) { return statusObj; } jint JTuner::closeFrontend() { Result r = Result::SUCCESS; if (mFe != NULL) { r = mFe->close(); } return (jint) r; } jint JTuner::closeDemux() { Result r = Result::SUCCESS; if (mDemux != NULL) { r = mDemux->close(); } return (jint) r; } } // namespace android //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -3199,6 +3215,16 @@ static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) { return (jint) tuner->close(); } static jint android_media_tv_Tuner_close_demux(JNIEnv* env, jobject thiz, jint /* handle */) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->closeDemux(); } static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->closeFrontend(); } static jint android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<Dvr> dvrSp = getDvr(env, dvr); if (dvrSp == NULL) { Loading Loading @@ -3527,6 +3553,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_demux_caps }, { "nativeOpenDemuxByhandle", "(I)I", (void *)android_media_tv_Tuner_open_demux }, { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_tuner }, { "nativeCloseFrontend", "(I)I", (void *)android_media_tv_Tuner_close_frontend }, { "nativeCloseDemux", "(I)I", (void *)android_media_tv_Tuner_close_demux }, }; static const JNINativeMethod gFilterMethods[] = { Loading media/jni/android_media_tv_Tuner.h +2 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,8 @@ struct JTuner : public RefBase { jobject getFrontendStatus(jintArray types); Result openDemux(); jint close(); jint closeFrontend(); jint closeDemux(); protected: virtual ~JTuner(); Loading Loading
media/java/android/media/tv/tuner/Tuner.java +64 −23 Original line number Diff line number Diff line Loading @@ -353,13 +353,16 @@ public class Tuner implements AutoCloseable { @Override public void close() { if (mFrontendHandle != null) { nativeCloseFrontendByHandle(mFrontendHandle); int res = nativeCloseFrontend(mFrontendHandle); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "failed to close frontend"); } mTunerResourceManager.releaseFrontend(mFrontendHandle, mClientId); mFrontendHandle = null; mFrontend = null; } if (mLnb != null) { releaseLnb(); mLnb.close(); } if (!mDescramblers.isEmpty()) { for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) { Loading @@ -374,6 +377,14 @@ public class Tuner implements AutoCloseable { } mFilters.clear(); } if (mDemuxHandle != null) { int res = nativeCloseDemux(mDemuxHandle); if (res != Tuner.RESULT_SUCCESS) { TunerUtils.throwExceptionForResult(res, "failed to close demux"); } mTunerResourceManager.releaseDemux(mDemuxHandle, mClientId); mFrontendHandle = null; } TunerUtils.throwExceptionForResult(nativeClose(), "failed to close tuner"); } Loading Loading @@ -425,6 +436,8 @@ public class Tuner implements AutoCloseable { private static native DemuxCapabilities nativeGetDemuxCapabilities(); private native int nativeCloseDemux(int handle); private native int nativeCloseFrontend(int handle); private native int nativeClose(); Loading Loading @@ -545,11 +558,12 @@ public class Tuner implements AutoCloseable { @Result public int tune(@NonNull FrontendSettings settings) { mFrontendType = settings.getType(); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { mFrontendInfo = null; return nativeTune(settings.getType(), settings); } return RESULT_UNAVAILABLE; } /** * Stops a previous tuning. Loading Loading @@ -584,12 +598,14 @@ public class Tuner implements AutoCloseable { + "started."); } mFrontendType = settings.getType(); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { mScanCallback = scanCallback; mScanCallbackExecutor = executor; mFrontendInfo = null; return nativeScan(settings.getType(), settings, scanType); } return RESULT_UNAVAILABLE; } /** * Stops a previous scanning. Loading Loading @@ -671,7 +687,9 @@ public class Tuner implements AutoCloseable { * @return the id of hardware A/V sync. */ public int getAvSyncHwId(@NonNull Filter filter) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return INVALID_AV_SYNC_ID; } Integer id = nativeGetAvSyncHwId(filter); return id == null ? INVALID_AV_SYNC_ID : id; } Loading @@ -686,7 +704,9 @@ public class Tuner implements AutoCloseable { * @return the current timestamp of hardware A/V sync. */ public long getAvSyncTime(int avSyncHwId) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return INVALID_TIMESTAMP; } Long time = nativeGetAvSyncTime(avSyncHwId); return time == null ? INVALID_TIMESTAMP : time; } Loading @@ -702,9 +722,11 @@ public class Tuner implements AutoCloseable { */ @Result public int connectCiCam(int ciCamId) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return nativeConnectCiCam(ciCamId); } return RESULT_UNAVAILABLE; } /** * Disconnects Conditional Access Modules (CAM) Loading @@ -715,9 +737,11 @@ public class Tuner implements AutoCloseable { */ @Result public int disconnectCiCam() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return nativeDisconnectCiCam(); } return RESULT_UNAVAILABLE; } /** * Gets the frontend information. Loading @@ -726,7 +750,9 @@ public class Tuner implements AutoCloseable { */ @Nullable public FrontendInfo getFrontendInfo() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { return null; } if (mFrontend == null) { throw new IllegalStateException("frontend is not initialized"); } Loading Loading @@ -861,7 +887,9 @@ public class Tuner implements AutoCloseable { public Filter openFilter(@Type int mainType, @Subtype int subType, @BytesLong long bufferSize, @CallbackExecutor @Nullable Executor executor, @Nullable FilterCallback cb) { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } Filter filter = nativeOpenFilter( mainType, TunerUtils.getFilterSubtype(mainType, subType), bufferSize); if (filter != null) { Loading Loading @@ -891,13 +919,16 @@ public class Tuner implements AutoCloseable { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); if (mLnb != null) { mLnb.setCallback(executor, cb, this); return mLnb; } if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB) && mLnb != null) { mLnb.setCallback(executor, cb, this); } setLnb(mLnb); return mLnb; } return null; } /** * Opens an LNB (low-noise block downconverter) object specified by the give name. Loading @@ -922,6 +953,7 @@ public class Tuner implements AutoCloseable { } mLnb = newLnb; mLnb.setCallback(executor, cb, this); setLnb(mLnb); } return mLnb; } Loading @@ -944,7 +976,9 @@ public class Tuner implements AutoCloseable { */ @Nullable public TimeFilter openTimeFilter() { checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } return nativeOpenTimeFilter(); } Loading @@ -956,6 +990,9 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) @Nullable public Descrambler openDescrambler() { if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } return requestDescrambler(); } Loading @@ -976,7 +1013,9 @@ public class Tuner implements AutoCloseable { @NonNull OnRecordStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnRecordStatusChangedListener must not be null"); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } DvrRecorder dvr = nativeOpenDvrRecorder(bufferSize); dvr.setListener(executor, l); return dvr; Loading @@ -999,7 +1038,9 @@ public class Tuner implements AutoCloseable { @NonNull OnPlaybackStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnPlaybackStatusChangedListener must not be null"); checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); if (!checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX)) { return null; } DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize); dvr.setListener(executor, l); return dvr; Loading
media/jni/android_media_tv_Tuner.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -1130,7 +1130,7 @@ jintArray JTuner::getLnbIds() { lnbIds = ids; res = r; }); if (res != Result::SUCCESS || mLnbIds.size() == 0) { if (res != Result::SUCCESS || lnbIds.size() == 0) { ALOGW("Lnb isn't available"); return NULL; } Loading Loading @@ -1797,6 +1797,22 @@ jobject JTuner::getFrontendStatus(jintArray types) { return statusObj; } jint JTuner::closeFrontend() { Result r = Result::SUCCESS; if (mFe != NULL) { r = mFe->close(); } return (jint) r; } jint JTuner::closeDemux() { Result r = Result::SUCCESS; if (mDemux != NULL) { r = mDemux->close(); } return (jint) r; } } // namespace android //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -3199,6 +3215,16 @@ static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) { return (jint) tuner->close(); } static jint android_media_tv_Tuner_close_demux(JNIEnv* env, jobject thiz, jint /* handle */) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->closeDemux(); } static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->closeFrontend(); } static jint android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) { sp<Dvr> dvrSp = getDvr(env, dvr); if (dvrSp == NULL) { Loading Loading @@ -3527,6 +3553,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_demux_caps }, { "nativeOpenDemuxByhandle", "(I)I", (void *)android_media_tv_Tuner_open_demux }, { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_tuner }, { "nativeCloseFrontend", "(I)I", (void *)android_media_tv_Tuner_close_frontend }, { "nativeCloseDemux", "(I)I", (void *)android_media_tv_Tuner_close_demux }, }; static const JNINativeMethod gFilterMethods[] = { Loading
media/jni/android_media_tv_Tuner.h +2 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,8 @@ struct JTuner : public RefBase { jobject getFrontendStatus(jintArray types); Result openDemux(); jint close(); jint closeFrontend(); jint closeDemux(); protected: virtual ~JTuner(); Loading