using fis.media.Library.Media.EventArgs; using fis.media.Library.Media.Members; using fis.media.Library.Media.Players; using fis.media.Library.Media.Publisher; using fis.media.ThirdPartLibrary.Tencent; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace fis.media.Library.Media.Rooms { internal class TRTCRoom : Room, IRtcRoom { private static IRoom _instance; private TRTCChatRoom _trtcChatRoom; private int _rtcRoomId; private TRTCRoom():base(RoomTypeEnum.TRTCRoom) { _trtcChatRoom = TRTCChatRoom.Instance; } public static IRoom Instance => _instance ?? (_instance = new TRTCRoom()); public int RTCRoomId => _rtcRoomId; public override int EnterRoom(AbstractMember member) { if (member is ActiveMember activeMember) { if (activeMember.IsOnline) { activeMember.ApplyPlayer(GenerateRtcPlayer(activeMember)); } } return base.EnterRoom(member); } public static AbstractPlayer GenerateRtcPlayer(ActiveMember activeMember) { var player = new RtcPlayer(activeMember.Id); var regionInfo = activeMember.LayerConfig.RegionInfo; var channels = player.PlayerChannels; channels.Add(new PlayerChannel() { ChannelName = ChannelNameEnum.Main, ChannelMemberId = activeMember.Id, ChannelMemberRoleType = activeMember.RoleType, }); switch (regionInfo.GetChannelTypeEnum()) { case ChannelTypeEnum.OnlyMainRegion: break; case ChannelTypeEnum.MainRegionWithSideOne: channels.Add(new PlayerChannel() { ChannelName = ChannelNameEnum.SideOne, ChannelMemberId = activeMember.Id, ChannelMemberRoleType = activeMember.RoleType, }); break; case ChannelTypeEnum.MainRegionWithSideTwo: channels.Add(new PlayerChannel() { ChannelName = ChannelNameEnum.SideTwo, ChannelMemberId = activeMember.Id, ChannelMemberRoleType = activeMember.RoleType, }); break; default:break; } return player; } protected override bool DoDispose() { _trtcChatRoom.Exit(); return base.DoDispose(); } } }