summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/jni/android_media_tv_Tuner.cpp4
-rw-r--r--services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java14
-rw-r--r--services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java8
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);
}