Merge "Tuner API: get resources from TRM" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-03-18 01:55:52 +00:00
committed by Android (Google) Code Review
4 changed files with 84 additions and 78 deletions

View File

@@ -43,6 +43,7 @@ import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType;
import android.media.tv.tuner.frontend.OnTuneEventListener;
import android.media.tv.tuner.frontend.ScanCallback;
import android.media.tv.tunerresourcemanager.ResourceClientProfile;
import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
import android.media.tv.tunerresourcemanager.TunerLnbRequest;
import android.media.tv.tunerresourcemanager.TunerResourceManager;
import android.os.Handler;
@@ -195,15 +196,15 @@ public class Tuner implements AutoCloseable {
private final TunerResourceManager mTunerResourceManager;
private final int mClientId;
private List<Integer> mFrontendIds;
private Frontend mFrontend;
private EventHandler mHandler;
@Nullable
private FrontendInfo mFrontendInfo;
private Integer mFrontendHandle;
private int mFrontendType = FrontendSettings.TYPE_UNDEFINED;
private List<Integer> mLnbIds;
private Lnb mLnb;
private Integer mLnbId;
private Integer mLnbHandle;
@Nullable
private OnTuneEventListener mOnTuneEventListener;
@Nullable
@@ -327,7 +328,7 @@ public class Tuner implements AutoCloseable {
/**
* Native method to open frontend of the given ID.
*/
private native Frontend nativeOpenFrontendById(int id);
private native Frontend nativeOpenFrontendByHandle(int handle);
private native int nativeTune(int type, FrontendSettings settings);
private native int nativeStopTune();
private native int nativeScan(int settingsType, FrontendSettings settings, int scanType);
@@ -344,7 +345,7 @@ public class Tuner implements AutoCloseable {
private native TimeFilter nativeOpenTimeFilter();
private native List<Integer> nativeGetLnbIds();
private native Lnb nativeOpenLnbById(int id);
private native Lnb nativeOpenLnbByHandle(int handle);
private native Lnb nativeOpenLnbByName(String name);
private native Descrambler nativeOpenDescrambler();
@@ -476,7 +477,8 @@ public class Tuner implements AutoCloseable {
@RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER)
@Result
public int tune(@NonNull FrontendSettings settings) {
TunerUtils.checkTunerPermission(mContext);
mFrontendType = settings.getType();
checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND);
mFrontendInfo = null;
return nativeTune(settings.getType(), settings);
}
@@ -511,12 +513,13 @@ public class Tuner implements AutoCloseable {
@Result
public int scan(@NonNull FrontendSettings settings, @ScanType int scanType,
@NonNull @CallbackExecutor Executor executor, @NonNull ScanCallback scanCallback) {
TunerUtils.checkTunerPermission(mContext);
if (mScanCallback != null || mScanCallbackExecutor != null) {
throw new IllegalStateException(
"Scan already in progress. stopScan must be called before a new scan can be "
+ "started.");
}
mFrontendType = settings.getType();
checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND);
mScanCallback = scanCallback;
mScanCallbackExecutor = executor;
mFrontendInfo = null;
@@ -544,6 +547,16 @@ public class Tuner implements AutoCloseable {
return retVal;
}
private boolean requestFrontend() {
int[] feId = new int[1];
TunerFrontendRequest request = new TunerFrontendRequest(mClientId, mFrontendType);
boolean granted = mTunerResourceManager.requestFrontend(request, feId);
if (granted) {
mFrontendHandle = feId[0];
}
return granted;
}
/**
* Sets Low-Noise Block downconverter (LNB) for satellite frontend.
*
@@ -677,22 +690,6 @@ public class Tuner implements AutoCloseable {
return nativeGetDemuxCapabilities();
}
private List<Integer> getFrontendIds() {
mFrontendIds = nativeGetFrontendIds();
return mFrontendIds;
}
private Frontend openFrontendById(int id) {
if (mFrontendIds == null) {
mFrontendIds = getFrontendIds();
}
if (!mFrontendIds.contains(id)) {
return null;
}
mFrontend = nativeOpenFrontendById(id);
return mFrontend;
}
private void onFrontendEvent(int eventType) {
if (mOnTunerEventExecutor != null && mOnTuneEventListener != null) {
mOnTunerEventExecutor.execute(() -> mOnTuneEventListener.onTuneEvent(eventType));
@@ -829,11 +826,9 @@ public class Tuner implements AutoCloseable {
public Lnb openLnb(@CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) {
Objects.requireNonNull(executor, "executor must not be null");
Objects.requireNonNull(cb, "LnbCallback must not be null");
TunerUtils.checkTunerPermission(mContext);
if (mLnbId == null && !requestLnb()) {
return null;
}
return nativeOpenLnbById(mLnbId);
checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB);
// TODO: update JNI code for LNB handle,
return nativeOpenLnbByHandle(mLnbHandle);
}
/**
@@ -861,7 +856,7 @@ public class Tuner implements AutoCloseable {
TunerLnbRequest request = new TunerLnbRequest(mClientId);
boolean granted = mTunerResourceManager.requestLnb(request, lnbId);
if (granted) {
mLnbId = lnbId[0];
mLnbHandle = lnbId[0];
}
return granted;
}
@@ -876,22 +871,6 @@ public class Tuner implements AutoCloseable {
return nativeOpenTimeFilter();
}
private List<Integer> getLnbIds() {
mLnbIds = nativeGetLnbIds();
return mLnbIds;
}
private Lnb openLnbById(int id) {
if (mLnbIds == null) {
mLnbIds = getLnbIds();
}
if (!mLnbIds.contains(id)) {
return null;
}
mLnb = nativeOpenLnbById(id);
return mLnb;
}
private void onLnbEvent(int eventType) {
if (mHandler != null) {
mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0));
@@ -955,4 +934,23 @@ public class Tuner implements AutoCloseable {
DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize);
return dvr;
}
private boolean checkResource(int resourceType) {
// TODO: demux and descrambler
switch (resourceType) {
case TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND: {
if (mFrontendHandle == null && !requestFrontend()) {
return false;
}
break;
}
case TunerResourceManager.TUNER_RESOURCE_TYPE_LNB: {
if (mLnbHandle == null && !requestLnb()) {
return false;
}
break;
}
}
return true;
}
}

View File

@@ -17,6 +17,7 @@
package android.media.tv.tunerresourcemanager;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
@@ -27,6 +28,8 @@ import android.os.Binder;
import android.os.RemoteException;
import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;
/**
@@ -61,6 +64,24 @@ public class TunerResourceManager {
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
public static final int INVALID_RESOURCE_HANDLE = -1;
/**
* Tuner resource type to help generate resource handle
*/
@IntDef({
TUNER_RESOURCE_TYPE_FRONTEND,
TUNER_RESOURCE_TYPE_DEMUX,
TUNER_RESOURCE_TYPE_DESCRAMBLER,
TUNER_RESOURCE_TYPE_LNB,
TUNER_RESOURCE_TYPE_CAS_SESSION,
})
@Retention(RetentionPolicy.SOURCE)
public @interface TunerResourceType {}
public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0;
public static final int TUNER_RESOURCE_TYPE_DEMUX = 1;
public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2;
public static final int TUNER_RESOURCE_TYPE_LNB = 3;
public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4;
private final ITunerResourceManager mService;
private final int mUserId;

View File

@@ -1410,6 +1410,10 @@ static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) {
return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext);
}
static uint32_t getResourceIdFromHandle(jint handle) {
return (handle & 0x00ff0000) >> 16;
}
static DemuxPid getDemuxPid(int pidType, int pid) {
DemuxPid demuxPid;
if ((int)pidType == 1) {
@@ -1968,8 +1972,10 @@ static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz
return tuner->getFrontendIds();
}
static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) {
static jobject android_media_tv_Tuner_open_frontend_by_handle(
JNIEnv *env, jobject thiz, jint handle) {
sp<JTuner> tuner = getTuner(env, thiz);
uint32_t id = getResourceIdFromHandle(handle);
return tuner->openFrontendById(id);
}
@@ -2045,8 +2051,9 @@ static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) {
return tuner->getLnbIds();
}
static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, jint id) {
static jobject android_media_tv_Tuner_open_lnb_by_handle(JNIEnv *env, jobject thiz, jint handle) {
sp<JTuner> tuner = getTuner(env, thiz);
uint32_t id = getResourceIdFromHandle(handle);
return tuner->openLnbById(id);
}
@@ -2924,8 +2931,8 @@ static const JNINativeMethod gTunerMethods[] = {
{ "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup },
{ "nativeGetFrontendIds", "()Ljava/util/List;",
(void *)android_media_tv_Tuner_get_frontend_ids },
{ "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;",
(void *)android_media_tv_Tuner_open_frontend_by_id },
{ "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;",
(void *)android_media_tv_Tuner_open_frontend_by_handle },
{ "nativeTune", "(ILandroid/media/tv/tuner/frontend/FrontendSettings;)I",
(void *)android_media_tv_Tuner_tune },
{ "nativeStopTune", "()I", (void *)android_media_tv_Tuner_stop_tune },
@@ -2950,8 +2957,8 @@ static const JNINativeMethod gTunerMethods[] = {
(void *)android_media_tv_Tuner_open_time_filter },
{ "nativeGetLnbIds", "()Ljava/util/List;",
(void *)android_media_tv_Tuner_get_lnb_ids },
{ "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;",
(void *)android_media_tv_Tuner_open_lnb_by_id },
{ "nativeOpenLnbByHandle", "(I)Landroid/media/tv/tuner/Lnb;",
(void *)android_media_tv_Tuner_open_lnb_by_handle },
{ "nativeOpenLnbByName", "(Ljava/lang/String;)Landroid/media/tv/tuner/Lnb;",
(void *)android_media_tv_Tuner_open_lnb_by_name },
{ "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Descrambler;",

View File

@@ -16,7 +16,6 @@
package com.android.server.tv.tunerresourcemanager;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -41,8 +40,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemService;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -79,25 +76,6 @@ public class TunerResourceManagerService extends SystemService {
// Used to synchronize the access to the service.
private final Object mLock = new Object();
/**
* Tuner resource type to help generate resource handle
*/
@IntDef({
TUNER_RESOURCE_TYPE_FRONTEND,
TUNER_RESOURCE_TYPE_DEMUX,
TUNER_RESOURCE_TYPE_DESCRAMBLER,
TUNER_RESOURCE_TYPE_LNB,
TUNER_RESOURCE_TYPE_CAS_SESSION,
})
@Retention(RetentionPolicy.SOURCE)
public @interface TunerResourceType {}
public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0;
public static final int TUNER_RESOURCE_TYPE_DEMUX = 1;
public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2;
public static final int TUNER_RESOURCE_TYPE_LNB = 3;
public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4;
public TunerResourceManagerService(@Nullable Context context) {
super(context);
}
@@ -465,7 +443,7 @@ public class TunerResourceManagerService extends SystemService {
// Grant frontend when there is unused resource.
if (grantingFrontendId > -1) {
frontendHandle[0] = generateResourceHandle(
TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId);
TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId);
updateFrontendClientMappingOnNewGrant(grantingFrontendId, request.getClientId());
return true;
}
@@ -474,7 +452,7 @@ public class TunerResourceManagerService extends SystemService {
// request client has higher priority.
if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) {
frontendHandle[0] = generateResourceHandle(
TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId);
TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId);
reclaimFrontendResource(getFrontendResource(
inUseLowestPriorityFrId).getOwnerClientId());
updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId());
@@ -489,7 +467,7 @@ public class TunerResourceManagerService extends SystemService {
if (DEBUG) {
Slog.d(TAG, "requestDemux(request=" + request + ")");
}
demuxHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DEMUX, 0);
demuxHandle[0] = generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX, 0);
return true;
}
@@ -498,7 +476,8 @@ public class TunerResourceManagerService extends SystemService {
if (DEBUG) {
Slog.d(TAG, "requestDescrambler(request=" + request + ")");
}
descramblerHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DESCRAMBLER, 0);
descramblerHandle[0] =
generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER, 0);
return true;
}
@@ -664,7 +643,8 @@ public class TunerResourceManagerService extends SystemService {
return mClientProfiles.keySet().contains(clientId);
}
private int generateResourceHandle(@TunerResourceType int resourceType, int resourceId) {
private int generateResourceHandle(
@TunerResourceManager.TunerResourceType int resourceType, int resourceId) {
return (resourceType & 0x000000ff) << 24
| (resourceId << 16)
| (mResourceRequestCount++ & 0xffff);