diff options
5 files changed, 220 insertions, 0 deletions
diff --git a/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl b/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl index b21bc89e2f37..77cac6ef7e2e 100644 --- a/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl +++ b/media/java/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl @@ -20,6 +20,7 @@ import android.media.tv.tunerresourcemanager.CasSessionRequest; import android.media.tv.tunerresourcemanager.IResourcesReclaimListener; import android.media.tv.tunerresourcemanager.ResourceClientProfile; import android.media.tv.tunerresourcemanager.TunerDemuxRequest; +import android.media.tv.tunerresourcemanager.TunerDescramblerRequest; import android.media.tv.tunerresourcemanager.TunerFrontendInfo; import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; @@ -172,6 +173,30 @@ interface ITunerResourceManager { boolean requestDemux(in TunerDemuxRequest request, out int[] demuxHandle); /* + * This API is used by the Tuner framework to request an available descrambler from the + * TunerHAL. + * + * <p>There are three possible scenarios: + * <ul> + * <li>If there is descrambler available, the API would send the handle back. + * + * <li>If no Descrambler is available but the current request info can show higher priority than + * other uses of Descrambler, the API will send + * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would + * handle the resource reclaim on the holder of lower priority and notify the holder of its + * resource loss. + * + * <li>If no Descrambler can be granted, the API would return false. + * <ul> + * + * @param request {@link TunerDescramblerRequest} information of the current request. + * @param descramblerHandle a one-element array to return the granted descrambler handle. + * + * @return true if there is Descrambler granted. + */ + boolean requestDescrambler(in TunerDescramblerRequest request, out int[] descramblerHandle); + + /* * This API is used by the Tuner framework to request an available Cas session. This session * needs to be under the CAS system with the id indicated in the {@code request}. * @@ -243,6 +268,15 @@ interface ITunerResourceManager { void releaseDemux(in int demuxHandle); /* + * Notifies the TRM that the Descrambler with the given handle was released. + * + * <p>Client must call this whenever it releases a descrambler. + * + * @param demuxHandle the handle of the released Tuner Descrambler. + */ + void releaseDescrambler(in int descramblerHandle); + + /* * Notifies the TRM that the given Cas session has been released. * * <p>Client must call this whenever it releases a Cas session. diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.aidl b/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.aidl new file mode 100644 index 000000000000..fbafb3bc010e --- /dev/null +++ b/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.aidl @@ -0,0 +1,24 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.tv.tunerresourcemanager; + +/** + * Information required to request a Tuner Descrambler. + * + * @hide + */ +parcelable TunerDescramblerRequest;
\ No newline at end of file diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.java b/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.java new file mode 100644 index 000000000000..58162879f8cf --- /dev/null +++ b/media/java/android/media/tv/tunerresourcemanager/TunerDescramblerRequest.java @@ -0,0 +1,96 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.tv.tunerresourcemanager; + +import android.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +/** + * Information required to request a Tuner Descrambler. + * + * @hide + */ +public final class TunerDescramblerRequest implements Parcelable { + static final String TAG = "TunerDescramblerRequest"; + + public static final + @NonNull + Parcelable.Creator<TunerDescramblerRequest> CREATOR = + new Parcelable.Creator<TunerDescramblerRequest>() { + @Override + public TunerDescramblerRequest createFromParcel(Parcel source) { + try { + return new TunerDescramblerRequest(source); + } catch (Exception e) { + Log.e(TAG, "Exception creating TunerDescramblerRequest from parcel", e); + return null; + } + } + + @Override + public TunerDescramblerRequest[] newArray(int size) { + return new TunerDescramblerRequest[size]; + } + }; + + /** + * Client id of the client that sends the request. + */ + private final int mClientId; + + private TunerDescramblerRequest(@NonNull Parcel source) { + mClientId = source.readInt(); + } + + /** + * Constructs a new {@link TunerDescramblerRequest} with the given parameters. + * + * @param clientId id of the client. + */ + public TunerDescramblerRequest(int clientId) { + mClientId = clientId; + } + + /** + * Returns the id of the client. + */ + public int getClientId() { + return mClientId; + } + + // Parcelable + @Override + public int describeContents() { + return 0; + } + + @NonNull + @Override + public String toString() { + StringBuilder b = new StringBuilder(128); + b.append("TunerDescramblerRequest {clientId=").append(mClientId); + b.append("}"); + return b.toString(); + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(mClientId); + } +} diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java index 1c1d7fab3107..524b6c2e26e1 100644 --- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java @@ -292,6 +292,40 @@ public class TunerResourceManager { } /** + * Requests a Tuner Descrambler resource. + * + * <p>There are three possible scenarios: + * <ul> + * <li>If there is Descrambler available, the API would send the handle back. + * + * <li>If no Descrambler is available but the current request has a higher priority than other + * uses of descramblers, the API will send + * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would + * handle the resource reclaim on the holder of lower priority and notify the holder of its + * resource loss. + * + * <li>If no Descrambler system can be granted, the API would return false. + * <ul> + * + * @param request {@link TunerDescramblerRequest} information of the current request. + * @param descramblerHandle a one-element array to return the granted Descrambler handle. + * If no Descrambler granted, this will return + * {@link #INVALID_RESOURCE_HANDLE}. + * + * @return true if there is Descrambler granted. + */ + public boolean requestDescrambler(@NonNull TunerDescramblerRequest request, + @NonNull int[] descramblerHandle) { + boolean result = false; + try { + result = mService.requestDescrambler(request, descramblerHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + return result; + } + + /** * Requests a CAS session resource. * * <p>There are three possible scenarios: @@ -392,6 +426,21 @@ public class TunerResourceManager { } /** + * Notifies the TRM that the Descrambler with the given handle has been released. + * + * <p>Client must call this whenever it releases an Descrambler. + * + * @param descramblerHandle the handle of the released Tuner Descrambler. + */ + public void releaseDescrambler(int descramblerHandle) { + try { + mService.releaseDescrambler(descramblerHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Notifies the TRM that the given Cas session has been released. * * <p>Client must call this whenever it releases a Cas session. diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index 2d3fc748b7fd..b43d8b7daf4a 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -25,6 +25,7 @@ import android.media.tv.tunerresourcemanager.IResourcesReclaimListener; import android.media.tv.tunerresourcemanager.ITunerResourceManager; import android.media.tv.tunerresourcemanager.ResourceClientProfile; import android.media.tv.tunerresourcemanager.TunerDemuxRequest; +import android.media.tv.tunerresourcemanager.TunerDescramblerRequest; import android.media.tv.tunerresourcemanager.TunerFrontendInfo; import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; @@ -199,6 +200,15 @@ public class TunerResourceManagerService extends SystemService { } @Override + public boolean requestDescrambler(@NonNull TunerDescramblerRequest request, + @NonNull int[] descrambleHandle) { + if (DEBUG) { + Slog.d(TAG, "requestDescrambler(request=" + request + ")"); + } + return true; + } + + @Override public boolean requestCasSession( @NonNull CasSessionRequest request, @NonNull int[] sessionResourceId) { if (DEBUG) { @@ -231,6 +241,13 @@ public class TunerResourceManagerService extends SystemService { } @Override + public void releaseDescrambler(int descramblerHandle) { + if (DEBUG) { + Slog.d(TAG, "releaseDescrambler(descramblerHandle=" + descramblerHandle + ")"); + } + } + + @Override public void releaseCasSession(int sessionResourceId) { if (DEBUG) { Slog.d(TAG, "releaseCasSession(sessionResourceId=" + sessionResourceId + ")"); |