Support enable/disable Frontends.
Bug: 210199978
Test: atest android.media.tv.tuner.cts on AIDL and HIDL HALs
Change-Id: I66379e726c3279e519e81a1f4bcfd2265b1aeb0a
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index fc35905..9de0b31 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -6471,6 +6471,7 @@
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();
@@ -6483,6 +6484,7 @@
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 7c08913..300aa15 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -19,6 +19,7 @@
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 @@
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 @@
}
}
+ /**
+ * 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.
+ *
+ * <p>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.
+ *
+ * <p>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 64eede5..384ddf5 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1573,6 +1573,24 @@
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<FrontendType>(type), maxNumber);
+}
+
+int32_t JTuner::getMaxNumberOfFrontends(int32_t type) {
+ if (mTunerClient == nullptr) {
+ ALOGE("tuner is not initialized");
+ return -1;
+ }
+
+ return mTunerClient->getMaxNumberOfFrontends(static_cast<FrontendType>(type));
+}
+
jobject JTuner::openLnbByHandle(int handle) {
if (mTunerClient == nullptr) {
return nullptr;
@@ -4247,6 +4265,17 @@
return env->NewStringUTF(info.data());
}
+static jint android_media_tv_Tuner_set_maximum_frontends(JNIEnv *env, jobject thiz, jint type,
+ jint maxNumber) {
+ sp<JTuner> 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<JTuner> tuner = getTuner(env, thiz);
+ return tuner->getMaxNumberOfFrontends(type);
+}
+
static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->closeFrontend();
@@ -4558,6 +4587,10 @@
(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 4cad92b..f1b31e3 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -201,6 +201,8 @@
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 f917f01..3c8fdfe6 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -194,4 +194,23 @@
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 37b8ee1..a9f37e6 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -32,6 +32,7 @@
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 @@
*/
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