Merge "Tuner API: get resources from TRM" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
49797b6b30
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;",
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user