Esempio n. 1
0
 public static int FindLastIndex(this IPlaylist playlist, Func <IPlaylistItem, bool> predicate)
 {
     return(playlist.FindLastIndex(playlist.Count - 1, predicate));
 }
Esempio n. 2
0
        private void AddTiming2(DateTime startTime, IPlaySource playSource)
        {
            // 验证操作的合法性。
            ValidatePlayDuration(playSource.PlayRange.Duration);
            ValidateStartTime(startTime, false);
            EnsureNoTimingConflict(startTime, playSource.PlayRange.Duration);

            // 触发事件前置事件。



            List <PlaybillItem> tempList = new List <PlaybillItem>();

            // 重新计算调度信息。
            DateTime beginTime;


            var prevIndex = _playlist.FindLastIndex(i => !i.IsSkipped() && i.ScheduleInfo.StopTime <= startTime);

            if (prevIndex == -1)
            {
                if (_playlist.Count == 0)
                {
                    if (_playlist.HasMinStartTime() && _playlist.MinStartTime.Value < startTime)
                    {
                        beginTime = _playlist.MinStartTime.Value;
                    }
                    else
                    {
                        beginTime = startTime;
                    }
                }
                else
                {
                    beginTime = _playlist[0].ScheduleInfo.StartTime; // startTime;
                    beginTime = beginTime > startTime ? startTime : beginTime;
                }

                // [prevIndex+1, index-1], 注:index-prevIndex+1
                // 替换范围:[prevIndex+1, index-1] (删除的起始索引0==prevIndex+1,数量index==index-prevIndex-1)
            }
            else
            {
                beginTime = _playlist[prevIndex].ScheduleInfo.StopTime;
                // 注:prevIndex可能等于index-1。
                // 当prevIndex小于index-1时。
                // 替换范围:[prevIndex + 1, index-1] (删除的起始索引prevIndex + 1,数量index-prevIndex-1 )

                // 当prevIndex等于index-1时。(删除的起始索引prevIndex + 1==index,数量index-prevIndex-1==0 )
                // 在index处插入0个或1个。
            }

            DateTime endTime;
            var      nextIndex = _playlist.FindFirstIndex(prevIndex + 1, i => !i.IsSkipped() && i.ScheduleInfo.ScheduleMode == ScheduleMode.Timing && i.ScheduleInfo.StartTime > startTime);

            //beginTime = playItem.ScheduleInfo.StopTime;
            if (nextIndex == -1)
            {
                endTime   = DateTime.MaxValue;
                nextIndex = _playlist.Count;

                // [index + 1, _playlist.Count - 1], 注:index + 1可能等于_playlist.Count - 1
                // 替换范围:[index + 1, _playlist.Count - 1] (删除的起始索引index + 1, 数量nextIndex-index-1==_playlist.Count-index-1)
            }
            else
            {
                endTime = _playlist[nextIndex].ScheduleInfo.StartTime;

                // 注:nextIndex可能等于index+1。
                // 当nextIndex大于index+1时。
                // 替换范围:[index+1, nextIndex-1] (删除的起始索引index+1,数量nextIndex-index-1 )

                // 当nextIndex等于index+1时。(删除的起始索引index+1, 数量nextIndex-index-1==0 )
                // 在index+1处插入0个或1个。
            }

            PlaybillItem playItem = PlaybillItem.CreateTiming(startTime, new NormalPlaySource(playSource), false);

            Debug.Assert(beginTime <= endTime);
            Debug.Assert(beginTime <= startTime && endTime > playItem.ScheduleInfo.StopTime);

            for (int i = prevIndex + 1; i < nextIndex; i++)
            {
                tempList.Add(_playlist[i].PlaybillItem);
                //builder.Add(_playlist[i].PlaybillItem);
            }

            // case 1: prevIndex + 1==nextIndex-1,替换起始位置prevIndex + 1,删除数量1 (nextIndex-1-prevIndex)
            // case 2: prevIndex + 1<nextIndex-1,替换起始位置prevIndex + 1,删除数量1 (nextIndex-1-prevIndex)
            // case 3: prevIndex + 1>nextIndex-1
            // 替换范围为[prevIndex + 1, nextIndex-1]
            // 触发事件(表示操作完成)。
        }