Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b80f31d8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Tuner API: get resources from TRM" into rvc-dev am: 49797b6b am: 3c343063

Change-Id: Ic833cbc14f65453a4544b462bac5f4556c63444e
parents 27a983b2 3c343063
Loading
Loading
Loading
Loading
+43 −45
Original line number Diff line number Diff line
@@ -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;
    }
}
+21 −0
Original line number Diff line number Diff line
@@ -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;
+13 −6
Original line number Diff line number Diff line
@@ -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;",
+7 −27
Original line number Diff line number Diff line
@@ -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);