public override IPlayerSlotController PrepareVideoPlayerSlotController(IPlayerManager playerManager, PlayerContextManager playerContextManager, PlayerContextConcurrencyMode concurrencyMode, out bool makePrimaryPlayer, out int audioPlayerSlotIndex, out int currentPlayerSlotIndex) { int numActive = playerContextManager.NumActivePlayerContexts; switch (concurrencyMode) { case PlayerContextConcurrencyMode.ConcurrentVideo: IList <IPlayerContext> playerContexts = playerContextManager.PlayerContexts; if (numActive >= 1 && playerContexts[PlayerContextIndex.PRIMARY].AVType == AVType.Video) { // The primary slot is a video player slot IPlayerSlotController result; if (numActive == 1) { result = playerManager.OpenSlot(); makePrimaryPlayer = true; } else // numActive > 1 { IPlayerContext pc = playerContexts[PlayerContextIndex.PRIMARY]; result = pc.Revoke(); // Necessary to revoke the player context to disable the auto close function (pc.CloseWhenFinished) makePrimaryPlayer = true; } audioPlayerSlotIndex = PlayerContextIndex.PRIMARY; currentPlayerSlotIndex = PlayerContextIndex.PRIMARY; return(result); } break; } // All other cases are handled the same as in the default player open strategy return(base.PrepareVideoPlayerSlotController(playerManager, playerContextManager, concurrencyMode, out makePrimaryPlayer, out audioPlayerSlotIndex, out currentPlayerSlotIndex)); }
public virtual IPlayerSlotController PrepareVideoPlayerSlotController(IPlayerManager playerManager, PlayerContextManager playerContextManager, PlayerContextConcurrencyMode concurrencyMode, out bool makePrimaryPlayer, out int audioPlayerSlotIndex, out int currentPlayerSlotIndex) { IList <IPlayerContext> playerContexts = playerContextManager.PlayerContexts; int numActive = playerContexts.Count; IPlayerSlotController result; switch (concurrencyMode) { case PlayerContextConcurrencyMode.ConcurrentAudio: if (numActive > 1 && playerContexts[PlayerContextIndex.SECONDARY].AVType == AVType.Audio) { // The secondary slot is an audio player slot IPlayerContext playerContext = playerContexts[PlayerContextIndex.PRIMARY]; result = playerContext.Revoke(); makePrimaryPlayer = true; audioPlayerSlotIndex = PlayerContextIndex.SECONDARY; } else if (numActive == 1 && playerContexts[PlayerContextIndex.PRIMARY].AVType == AVType.Audio) { // The primary slot is an audio player slot result = playerManager.OpenSlot(); makePrimaryPlayer = true; audioPlayerSlotIndex = PlayerContextIndex.SECONDARY; } else { // No audio slot available playerContextManager.CloseAllPlayerContexts(); result = playerManager.OpenSlot(); makePrimaryPlayer = true; audioPlayerSlotIndex = PlayerContextIndex.PRIMARY; } break; case PlayerContextConcurrencyMode.ConcurrentVideo: if (numActive >= 1 && playerContexts[PlayerContextIndex.PRIMARY].AVType == AVType.Video) { // The primary slot is a video player slot if (numActive > 1) { IPlayerContext pcSecondary = playerContextManager.GetPlayerContext(PlayerContextIndex.SECONDARY); pcSecondary.Close(); } result = playerManager.OpenSlot(); makePrimaryPlayer = false; audioPlayerSlotIndex = PlayerContextIndex.PRIMARY; } else { playerContextManager.CloseAllPlayerContexts(); result = playerManager.OpenSlot(); makePrimaryPlayer = true; audioPlayerSlotIndex = PlayerContextIndex.PRIMARY; } break; default: // Don't enable concurrent controllers: Close all except the primary slot controller playerContextManager.CloseAllPlayerContexts(); result = playerManager.OpenSlot(); makePrimaryPlayer = true; audioPlayerSlotIndex = PlayerContextIndex.PRIMARY; break; } currentPlayerSlotIndex = makePrimaryPlayer ? PlayerContextIndex.PRIMARY : PlayerContextIndex.SECONDARY; return(result); }