Support enable/disable Frontends.

Bug: 210199978
Test: atest android.media.tv.tuner.cts on AIDL and HIDL HALs
Change-Id: I66379e726c3279e519e81a1f4bcfd2265b1aeb0a
This commit is contained in:
Hongguang
2021-12-22 15:58:37 -08:00
parent dd4769c8d4
commit 4d9772d803
6 changed files with 124 additions and 0 deletions

View File

@@ -6471,6 +6471,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();
@@ -6483,6 +6484,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);

View File

@@ -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.
*
* <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();

View File

@@ -1573,6 +1573,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<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 @@ 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<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 @@ 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[] = {

View File

@@ -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();

View File

@@ -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

View File

@@ -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