From 0d5b81ba3d43480c1657fc69c66d695fc22c84f5 Mon Sep 17 00:00:00 2001 From: Pierre Couillaud Date: Fri, 5 May 2023 11:28:31 +0100 Subject: [PATCH] When sharing to new frontend, stop sharing with old Cherry picked Idd465a97749328138852fee19eeba87310ccc0bc to master due to b/286408867. Code was merged via `-s ours` and is missing even though the sha exists on the target branch. Cherry pick is required to bring in the code. Manually remove the "Merged in" directive to allow for downstream propagation. Bug: 280826683 Test: android.media.tv.tuner.cts.TunerTest Signed-off-by: Pierre Couillaud (cherry picked from https://android-review.googlesource.com/q/commit:6b126f0ef71da3f0d4afcc2d31dc8ff6f9a0efa9) Change-Id: I0750ba6552fd6239f22b2e65d95cf32c12fe3e82 --- media/jni/android_media_tv_Tuner.cpp | 4 ++++ .../tv/tunerresourcemanager/ClientProfile.java | 14 ++++++++++++++ .../TunerResourceManagerService.java | 8 ++++++++ 3 files changed, 26 insertions(+) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 1b04f18e38c7c..feb914fe31616 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1468,6 +1468,10 @@ int JTuner::shareFrontend(int feId) { return (int)Result::INVALID_STATE; } + if (mDemuxClient != NULL) { + mDemuxClient->setFrontendDataSourceById(feId); + } + mSharedFeId = feId; return (int)Result::SUCCESS; } diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java index 301e612e46992..8e375275d0804 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -81,6 +81,11 @@ public final class ClientProfile { private Set mUsingDemuxHandles = new HashSet<>(); + /** + * Client id sharee that has shared frontend with the current client. + */ + private Integer mShareeFeClientId = INVALID_RESOURCE_ID; + /** * List of the Lnb handles that are used by the current client. */ @@ -225,12 +230,21 @@ public final class ClientProfile { return mShareFeClientIds; } + public Integer getShareeFeClientId() { + return mShareeFeClientId; + } + + public void setShareeFeClientId(Integer shareeFeClientId) { + mShareeFeClientId = shareeFeClientId; + } + /** * Called when the client released a frontend. */ public void releaseFrontend() { mUsingFrontendHandles.clear(); mShareFeClientIds.clear(); + mShareeFeClientId = INVALID_RESOURCE_ID; mPrimaryUsingFrontendHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; } 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 8f416082374ee..c526016544a6b 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -1087,9 +1087,15 @@ public class TunerResourceManagerService extends SystemService implements IBinde if (DEBUG) { Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId); } + Integer shareeFeClientId = getClientProfile(selfClientId).getShareeFeClientId(); + if (shareeFeClientId != ClientProfile.INVALID_RESOURCE_ID) { + getClientProfile(shareeFeClientId).stopSharingFrontend(selfClientId); + getClientProfile(selfClientId).releaseFrontend(); + } for (int feId : getClientProfile(targetClientId).getInUseFrontendHandles()) { getClientProfile(selfClientId).useFrontend(feId); } + getClientProfile(selfClientId).setShareeFeClientId(targetClientId); getClientProfile(targetClientId).shareFrontend(selfClientId); } @@ -1099,6 +1105,8 @@ public class TunerResourceManagerService extends SystemService implements IBinde // change the owner of all the inUse frontend newOwnerProfile.shareFrontend(currentOwnerId); currentOwnerProfile.stopSharingFrontend(newOwnerId); + newOwnerProfile.setShareeFeClientId(ClientProfile.INVALID_RESOURCE_ID); + currentOwnerProfile.setShareeFeClientId(newOwnerId); for (int inUseHandle : newOwnerProfile.getInUseFrontendHandles()) { getFrontendResource(inUseHandle).setOwner(newOwnerId); }