diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 75c9be966f816..3a48d7cc674cd 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6473,6 +6473,7 @@ package android.media.tv.tuner { method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(); method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]); + method @IntRange(from=0xffffffff) public int getMaxNumberOfFrontends(int); method @RequiresPermission("android.permission.TUNER_RESOURCE_ACCESS") public boolean hasUnusedFrontend(int); method public boolean isLowestPriority(int); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler(); @@ -6485,6 +6486,7 @@ package android.media.tv.tuner { method @Nullable public android.media.tv.tuner.filter.TimeFilter openTimeFilter(); method public int scan(@NonNull android.media.tv.tuner.frontend.FrontendSettings, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.ScanCallback); method public int setLnaEnabled(boolean); + method public int setMaxNumberOfFrontends(int, @IntRange(from=0) int); method public void setOnTuneEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.OnTuneEventListener); method public void setResourceLostListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.Tuner.OnResourceLostListener); method public void shareFrontendFromTuner(@NonNull android.media.tv.tuner.Tuner); diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 7c08913c82cdd..300aa15a3afda 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -19,6 +19,7 @@ package android.media.tv.tuner; import android.annotation.BytesLong; import android.annotation.CallbackExecutor; import android.annotation.IntDef; +import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -688,6 +689,8 @@ public class Tuner implements AutoCloseable { private native Filter nativeOpenFilter(int type, int subType, long bufferSize); private native TimeFilter nativeOpenTimeFilter(); private native String nativeGetFrontendHardwareInfo(); + private native int nativeSetMaxNumberOfFrontends(int frontendType, int maxNumber); + private native int nativeGetMaxNumberOfFrontends(int frontendType); private native Lnb nativeOpenLnbByHandle(int handle); private native Lnb nativeOpenLnbByName(String name); @@ -1307,6 +1310,55 @@ public class Tuner implements AutoCloseable { } } + /** + * Sets the maximum usable frontends number of a given frontend type. It is used to enable or + * disable frontends when cable connection status is changed by user. + * + *

This API is only supported by Tuner HAL 2.0 or higher. Unsupported version would return + * {@link RESULT_UNAVAILABLE}. Use {@link TunerVersionChecker#getTunerVersion()} to check the + * version. + * + * @param frontendType the {@link android.media.tv.tuner.frontend.FrontendSettings.Type} which + * the maximum usable number will be set. + * @param maxNumber the new maximum usable number. + * @return result status of the operation. + */ + @Result + public int setMaxNumberOfFrontends( + @FrontendSettings.Type int frontendType, @IntRange(from = 0) int maxNumber) { + if (!TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_2_0, "Set maximum Frontends")) { + return RESULT_UNAVAILABLE; + } + if (maxNumber < 0) { + return RESULT_INVALID_ARGUMENT; + } + int res = nativeSetMaxNumberOfFrontends(frontendType, maxNumber); + if (res == RESULT_SUCCESS) { + // TODO: b/211778848 Update Tuner Resource Manager. + } + return res; + } + + /** + * Get the maximum usable frontends number of a given frontend type. + * + *

This API is only supported by Tuner HAL 2.0 or higher. Unsupported version would return + * {@code -1}. Use {@link TunerVersionChecker#getTunerVersion()} to check the version. + * + * @param frontendType the {@link android.media.tv.tuner.frontend.FrontendSettings.Type} which + * the maximum usable number will be queried. + * @return the maximum usable number of the queried frontend type. + */ + @IntRange(from = -1) + public int getMaxNumberOfFrontends(@FrontendSettings.Type int frontendType) { + if (!TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_2_0, "Set maximum Frontends")) { + return -1; + } + return nativeGetMaxNumberOfFrontends(frontendType); + } + /** @hide */ public FrontendInfo getFrontendInfoById(int id) { mFrontendLock.lock(); diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index f5606bc3539f2..8ccc4fb3cd021 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1577,6 +1577,24 @@ Result JTuner::getFrontendHardwareInfo(string &info) { return mFeClient->getHardwareInfo(info); } +jint JTuner::setMaxNumberOfFrontends(int32_t type, int32_t maxNumber) { + if (mTunerClient == nullptr) { + ALOGE("tuner is not initialized"); + return (jint)Result::INVALID_STATE; + } + + return (jint)mTunerClient->setMaxNumberOfFrontends(static_cast(type), maxNumber); +} + +int32_t JTuner::getMaxNumberOfFrontends(int32_t type) { + if (mTunerClient == nullptr) { + ALOGE("tuner is not initialized"); + return -1; + } + + return mTunerClient->getMaxNumberOfFrontends(static_cast(type)); +} + jobject JTuner::openLnbByHandle(int handle) { if (mTunerClient == nullptr) { return nullptr; @@ -4281,6 +4299,17 @@ static jstring android_media_tv_Tuner_get_frontend_hardware_info(JNIEnv *env, jo return env->NewStringUTF(info.data()); } +static jint android_media_tv_Tuner_set_maximum_frontends(JNIEnv *env, jobject thiz, jint type, + jint maxNumber) { + sp tuner = getTuner(env, thiz); + return tuner->setMaxNumberOfFrontends(type, maxNumber); +} + +static jint android_media_tv_Tuner_get_maximum_frontends(JNIEnv *env, jobject thiz, jint type) { + sp tuner = getTuner(env, thiz); + return tuner->getMaxNumberOfFrontends(type); +} + static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) { sp tuner = getTuner(env, thiz); return tuner->closeFrontend(); @@ -4592,6 +4621,10 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_open_shared_filter}, { "nativeGetFrontendHardwareInfo","()Ljava/lang/String;", (void *)android_media_tv_Tuner_get_frontend_hardware_info }, + { "nativeSetMaxNumberOfFrontends", "(II)I", + (void *)android_media_tv_Tuner_set_maximum_frontends }, + { "nativeGetMaxNumberOfFrontends", "(I)I", + (void *)android_media_tv_Tuner_get_maximum_frontends }, }; static const JNINativeMethod gFilterMethods[] = { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 4cad92b7d0f8a..f1b31e3520b14 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -201,6 +201,8 @@ struct JTuner : public RefBase { jint closeFrontend(); jint closeDemux(); Result getFrontendHardwareInfo(string& info); + jint setMaxNumberOfFrontends(int32_t frontendType, int32_t maxNumber); + int32_t getMaxNumberOfFrontends(int32_t frontendType); jweak getObject(); diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp index f917f016939ae..3c8fdfe682afb 100644 --- a/media/jni/tuner/TunerClient.cpp +++ b/media/jni/tuner/TunerClient.cpp @@ -194,4 +194,23 @@ Result TunerClient::setLna(bool bEnable) { return Result::INVALID_STATE; } +Result TunerClient::setMaxNumberOfFrontends(FrontendType frontendType, int32_t maxNumber) { + if (mTunerService != nullptr) { + Status s = mTunerService->setMaxNumberOfFrontends(frontendType, maxNumber); + return ClientHelper::getServiceSpecificErrorCode(s); + } + + return Result::INVALID_STATE; +} + +int TunerClient::getMaxNumberOfFrontends(FrontendType frontendType) { + if (mTunerService != nullptr) { + int32_t maxNumber; + mTunerService->getMaxNumberOfFrontends(frontendType, &maxNumber); + return maxNumber; + } + + return -1; +} + } // namespace android diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h index 37b8ee1526a59..a9f37e6df3aac 100644 --- a/media/jni/tuner/TunerClient.h +++ b/media/jni/tuner/TunerClient.h @@ -32,6 +32,7 @@ using Status = ::ndk::ScopedAStatus; using ::aidl::android::hardware::tv::tuner::DemuxCapabilities; using ::aidl::android::hardware::tv::tuner::FrontendInfo; +using ::aidl::android::hardware::tv::tuner::FrontendType; using ::aidl::android::hardware::tv::tuner::Result; using ::aidl::android::media::tv::tuner::ITunerService; @@ -132,6 +133,21 @@ public: */ Result setLna(bool bEnable); + /** + * Set the maximum frontend number of a given frontend type. + * + * @param frontendType the frontend type which maximum number will be set. + * @param maxNumber the new maximum number. + */ + Result setMaxNumberOfFrontends(FrontendType frontendType, int32_t maxNumber); + + /** + * Get the maximum frontend number of a given frontend type. + * + * @param frontendType the frontend type which maximum number will be queried. + */ + int getMaxNumberOfFrontends(FrontendType frontendType); + private: /** * An AIDL Tuner Service Singleton assigned at the first time the Tuner Client