diff options
3 files changed, 26 insertions, 0 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 397c70485d5b..6c79dcc63fd0 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1342,6 +1342,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 fb9a4d41ee90..8736c30e9d1d 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -80,6 +80,11 @@ public final class ClientProfile { private Set<Integer> mShareFeClientIds = 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. */ private Set<Integer> mUsingLnbHandles = new HashSet<>(); @@ -223,12 +228,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 6162d716b85e..23d727e97aae 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -996,9 +996,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); } @@ -1008,6 +1014,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); } |