import { default as LayoutManager } from './index'; import { XYMultiViewLayout, ILayout, IRoster, PollingState, TemplateMode } from '../../type/index'; import { default as Client } from '../client'; export default class Polling { pollingMessage: XYMultiViewLayout | null; private pollingIntervalTimer; private pollingInterval; private client; private pollingState; private logger; private skipMuteVideo; private skipUnjoined; private speakerPriority; private isSetPollingSpeaker; private isSymmetricLayout; private specifiedMap; private speakerItem; private autoPollingMap; private autoFileUnjoined; private autoFillEmptyScreen; private pollingLayout; private autoSpecified; private customizedList; private pollingMode; private layoutManager; private cacheUnmuteSpeakerRoster; private cachePollingPause; private isPollingConfigChange; private isForceUpdateMode; private cacheIsPolling; private ftRoster; private cacheCustomizedLayout; constructor(client: Client, layout: LayoutManager); /** * 获取排序后的成员列表 * * @returns { IRoster[] } - 排序后的成员列表 */ getSortedRosterList(): IRoster[]; /** * 获取轮询状态 * * @returns { PollingState } - 轮询状态 */ getPollingState(): PollingState; /** * 获取轮询多画面布局 * * @returns { ILayout[] } - 轮询多画面布局 */ getPollingLayout(): ILayout[]; /** * 处理轮询多画面消息 * * @param { string } customizedLayout - 会控上报的多画面消息字符串,包含统一多画面/轮询多画面、AVC、SVC等布局模式 */ handleCustomizedLayout(customizedLayout: string): void; /** * 停止多画面布局 */ stopMultiViewLayout(): void; /** * 处理会控多画面-AVC布局消息 * * @param { XYMultiViewLayout } params - 多画面数据 */ private handleAVCLayoutMessage; /** * 处理会控轮询多画面-SVC布局消息 * * @param { XYMultiViewLayout } params - 多画面数据 */ private handlePollingLayoutMessage; /** * 开始轮询多画面 * * @param { XYMultiViewLayout } params - 轮询多画面数据 */ startPollingLayout(params: XYMultiViewLayout): void; /** * 转换多画面列表类型为自动模式 * * @param { CustomizedItem[] } detail - 多画面列表 * @param { boolean } auto - 是否是自动分配模式 * @returns { CustomizedItem[] } - 转换后的多画面列表 */ private convertDetailListToAutoType; /** * 获取当前轮询布局模式 * * @returns { TemplateMode } - 布局模式 */ getTemplateMode(): TemplateMode; /** * 多画面布局-执行多画面操作:启动/暂停 */ operateMultiViewLayout(): void; /** * 处理多画面AVC/轮询AVC模式启动轮询多画面操作 * * 1、生成基础的请流LayoutMap数据 * 2、请流布局 */ private handleStartAVCLayout; /** * 创建多画面AVC布局 */ private createAVCLayout; /** * 启动轮询多画面 */ private handleStartPollingLayout; /** * 暂停轮询多画面 */ private handlePausePollingLayout; /** * 重置轮询多画面配置数据 */ private resetPollingConfig; /** * 判断轮询多画面配置是否变动 * * @param { XYMultiViewLayout } params - 轮询多画面配置参数 * @returns { boolean } - 是否变动 */ private checkPollingConfigChange; /** * 更新对比轮询多画面布局模型,重新计算模版信息 * * @param { PollingModeItem } currentMode - 当前布局模型 * @param { PollingModeItem } previewMode - 上一次的布局模型 * @param { boolean } isForceUpdate - 是否强制更新模版 */ private updateMode; /** * 创建轮询多画面基础数据 */ private createPolling; /** * 创建轮询多画面分页数据 */ private createPollingLayout; /** * 更新轮询多画面布局 * * 2025/07/25需求实现梳理的规则: * 1、如果开启了优先显示语音激励开关,并且没有设置语音激励窗口 * - 1.1 如果是对称布局 * - 1.1.1 如果存在AS,且AS不存在画面中,则将AS显示到左上角第一个窗口 * - 1.1.2 如果存在AS,且AS在当前画面其他窗口,无需移动,原AS窗口需要标记篮框 * - 1.1.3 如果没有可用AS,则按照原窗口规则显示,无需处理 * - 1.2 如果是非对称布局 * - 1.2.1 如果当前列表存在AS,且不是大画面,则将AS和大画面互换(注意大画面和原AS位置是否存在可用值) * - 1.2.2 如果当前列表不存在AS,且存在可用AS,则使用AS替换大画面位置(需要判断大画面位置是否存在可用值) * - 1.2.3 如果没有可用AS,则显示原指定窗口画面,无需处理 * 2、如果开启了优先显示语音激励开关,设置了语音激励窗口 * - 无需处理 * 3、如果没有开启优先显示语音激励开关,则不做处理 * - 无需处理 * * @param { ILayout[] } pollingLayout - 轮询多画面布局 * @returns { ILayout[] } - 轮询多画面布局 */ private updatePollingLayout; /** * 重置上一轮中轮询多画面布局中AS的状态,避免AS状态错乱 */ private resetPollingLayoutActiveSpeakerState; /** * 设置语音激励布局项到指定位置 * * @param { ILayout[] } pollingLayout - 轮询多画面布局 * @param { BasePollingItem } speakerItem - 语音激励项数据 * @param { number } targetIndex - 目标位置索引 */ private setSpeakerLayoutItem; /** * 更新对称布局 * - 1.1 对称布局 * - 1.1.1 如果存在AS,且AS不存在画面中,则将AS显示到左上角第一个窗口 * - 1.1.2 如果存在AS,且AS在当前画面其他窗口,无需移动,原AS窗口需要标记篮框 * - 1.1.3 如果没有可用AS,则按照原窗口规则显示,无需处理 * * @param { ILayout[] } pollingLayout - 轮询多画面布局 * @returns { ILayout[] } - 轮询多画面布局 */ private updateSymmetricLayout; /** * 设置布局项为语音激励状态 * * @param { ILayout } layoutItem - 布局项 */ private setLayoutItemActiveSpeaker; /** * 更新非对称布局 * - 1.2 如果是非对称布局 * - 1.2.1 如果当前列表存在AS,且不是大画面,则将AS和大画面互换(注意大画面和原AS位置是否存在可用值) * - 1.2.2 如果当前列表不存在AS,且存在可用AS,则使用AS替换大画面位置(需要判断大画面位置是否存在可用值) * - 1.2.3 如果没有可用AS,则显示原指定窗口画面,无需处理 * * @param { ILayout[] } pollingLayout - 轮询多画面布局 * @returns { ILayout[] } - 轮询多画面布局 */ private updateAsymmetricLayout; /** * 交换两个布局项的位置 * * @param { ILayout[] } pollingLayout - 轮询多画面布局 * @param { number } indexA - 位置A * @param { number } indexB - 位置B */ private swapLayoutItems; /** * 创建轮询多画面基础布局 * * @param { ITemplateObj[] } tempList - 模版List数据 * @param { number } index - 索引位 * @returns { ILayout } - 基础布局数据 */ private createBaseTemplateLayout; /** * 创建轮询多画面布局项 * * @param { CustomizedItem } item - 布局项数据 * @param { number } index - 索引位 * @param { number } autoPollingIndex - 自动轮询索引位 * @returns { XYPollingLayoutItemData } - 布局项数据 */ private createLayoutItemByType; /** * 创建语音激励布局项 * * @param { number } index - 索引位 * @returns { XYPollingLayoutItemData } - 布局项数据 */ private createSpeakerLayoutItem; /** * 创建手动指定轮询布局项 * * @param { number } index - 索引位 * @param { CustomizedItem } item - 布局项数据 * @returns { XYPollingLayoutItemData } - 布局项数据 */ private createSpecifiedLayoutItem; /** * 创建自动轮询布局项 * * @param { number } index - 索引位 * @param { number } autoPollingIndex - 自动轮询索引位 * @returns { XYPollingLayoutItemData } - 布局项数据 */ private createAutoLayoutItem; /** * 生成自定义Layout Polling ID * 目的是画面重复渲染时,支持生成唯一的ID字段 */ private generateCustomId; /** * 获取当前全量roster信息Map * * @returns { Map } 结果 */ private getBulkRosterMap; /** * 设置轮询多画面项Roster和ID数据 * * @param { BasePollingItem | null } item - 基础数据 * @param { PollingLayout } layout - LayoutMap数据结构 * @param { string } customId - 自定义Id */ private setPollingLayoutItem; /** * 创建多画面AVC请流列表 */ private createAVCRequestNewLayout; /** * 根据pollingLayout创建请流列表 */ private createRequestNewLayout; /** * 获取当前页的自动轮询列表数据 * * @returns { BasePollingItem[] } - 分页列表数据 */ private getCurrentPagePollingList; /** * 缓存所有指定成员列表,用户后续对比,避免自动循环列表中包含这些数据 */ private calculateSpecifiedMap; /** * 获取过滤后的自动轮询列表数据 * * @param { BaseSpecifiedInfo[] } list - 基础的轮询列表数据 * @returns { BasePollingItem[] } - 过滤后的轮询数据 */ private getPollingListAndFilter; /** * 基于过滤条件向轮询列表填充数据 * * @param { BasePollingItem[] } pollingList - 轮询列表 * @param { BasePollingItem } data - 需要追加的数据 * @param { boolean } isLocal - 是否是Local */ private appendDataToPollingList; /** * 预创建自动轮询列表 */ private calculateAutoPollingMap; /** * 计算自动轮询分页信息 * * @param { BasePollingItem[] } pollingList - 自动轮询列表 */ private calculateAutoPollingPageInfo; /** * 计算Active Speaker数据(窗口指定语音激励模式) * 窗口指定语音激励时:AS获取: 媒体一路AS > roster排序(排除Local,content) > null */ private calculateCommonActiveSpeaker; /** * 获取Active Speaker数据(启用AS优先开关模式) * 开启优先显示语音激励开关时:获取可用AS的规则: 媒体一路AS + audio unmute > Local audio unmute > null(原窗口设定规则) */ private calculateUnmuteActiveSpeaker; /** * 计算指定的DI是否包含在指定循环列表中 * * @param { string } di - 需要查询的DI数据 * @param { boolean } currentPage - 是否指定当前页查询 * @returns { boolean } - 返回是否包含 */ private isIncludeSpecifiedMap; /** * 查找可用的替换AS数据的人员 */ private findNextSpeaker; /** * 启动轮询多画面定时器 */ private startPollingInterval; /** * 启动轮询多画面 */ startPolling(): void; /** * 暂停轮询多画面 */ pausePolling(state: PollingState): void; /** * 推送轮询的启用状态 */ emitPollingState(): void; /** * 清理轮询定时器 */ clearPollingTimer(): void; /** * 语音激励变化 */ handleSpeakersInfo(): void; /** * 20路排好序的Roster消息变更 */ setOrderRoster(): void; /** * 订阅Roster变更消息 * */ handleRosterWithPolling(): void; /** * 接收到LayoutResult后,更新模版 */ handleLayoutResult(): void; /** * 翻页 */ nextPage(): void; /** * 销毁资源 */ destroy(): void; }