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