/// <summary> /// Sync up a sync point. /// </summary> /// <param name="thisPoint">E.g. the end of the action</param> /// <param name="withThis">The time to sync up with</param> public void Sync(SyncPoints thisPoint, float withThis) { float point = GetTime(thisPoint); float diff = point - withThis; Debug.Log(ID + "point " + point + " diff " + diff); Start -= diff; }
public override float GetTime(SyncPoints point) { switch (point) { case SyncPoints.Start: return Start; default: throw new System.ArgumentOutOfRangeException(); } }
/* Private members */ private SyncPoints AdaptForOperation (SyncPoints syncPoints, bool toSyncAll) { if ((syncPoints == null) || (!toSyncAll) || (toSyncAll && (syncPoints.Count < 2))) return syncPoints; SyncPoints adapted = syncPoints.Clone(); /* Add the first subtitle if possible */ int firstSubtitleNumber = 0; if ((subtitles.Collection.Count > 1) && (!adapted.Contains(firstSubtitleNumber))) { /* Calculate sync shift and factor using the last 2 sync points */ SyncPoint firstSyncPoint = adapted[0]; SyncPoint secondSyncPoint = adapted[1]; Subtitle firstSyncPointSubtitle = subtitles.Collection[firstSyncPoint.SubtitleNumber]; Subtitle secondSyncPointSubtitle = subtitles.Collection[secondSyncPoint.SubtitleNumber]; TimeSpan shift = firstSyncPoint.Correct.Time - firstSyncPointSubtitle.Times.PreciseStart; double factor = (secondSyncPoint.Correct.Time - firstSyncPoint.Correct.Time).TotalMilliseconds / (secondSyncPointSubtitle.Times.PreciseStart - firstSyncPointSubtitle.Times.PreciseStart).TotalMilliseconds; /* Calculate new time */ Subtitle firstSubtitle = subtitles.Collection[firstSubtitleNumber]; TimeSpan firstSubtitleNewTime = firstSubtitle.Times.Start + shift; //Apply shift firstSubtitleNewTime = SyncUtil.Scale(firstSubtitleNewTime, TimeSpan.Zero, factor); if (firstSubtitleNewTime < TimeSpan.Zero) { //Can't have negative start firstSubtitleNewTime = TimeSpan.Zero; } int firstSubtitleNewFrame = (int)TimingUtil.TimeToFrames(firstSubtitleNewTime, subtitles.Properties.CurrentFrameRate); Domain.Timing firstSubtitleNewTiming = new Domain.Timing(firstSubtitleNewFrame, firstSubtitleNewTime); Domain.Timing firstSubtitleCurrentTiming = new Domain.Timing(firstSubtitle.Frames.Start, firstSubtitle.Times.Start); SyncPoint newFirstSyncPoint = new SyncPoint(firstSubtitleNumber, firstSubtitleCurrentTiming, firstSubtitleNewTiming); adapted.Add(newFirstSyncPoint); } /* Add last subtitle if possible */ int lastSubtitleNumber = subtitles.Collection.Count - 1; if ((subtitles.Collection.Count > 1) && (!adapted.Contains(lastSubtitleNumber))) { /* Calculate sync shift and factor using the last 2 sync points */ SyncPoint penultSyncPoint = adapted[adapted.Count - 2]; SyncPoint lastSyncPoint = adapted[adapted.Count - 1]; Subtitle penultSyncPointSubtitle = subtitles.Collection[penultSyncPoint.SubtitleNumber]; Subtitle lastSyncPointSubtitle = subtitles.Collection[lastSyncPoint.SubtitleNumber]; TimeSpan shift = penultSyncPoint.Correct.Time - penultSyncPointSubtitle.Times.PreciseStart; double factor = (lastSyncPoint.Correct.Time - penultSyncPoint.Correct.Time).TotalMilliseconds / (lastSyncPointSubtitle.Times.PreciseStart - penultSyncPointSubtitle.Times.PreciseStart).TotalMilliseconds; /* Calculate new time */ Subtitle lastSubtitle = subtitles.Collection[lastSubtitleNumber]; TimeSpan lastSubtitleNewTime = lastSubtitle.Times.Start + shift; //Apply shift lastSubtitleNewTime = SyncUtil.Scale(lastSubtitleNewTime, penultSyncPoint.Correct.Time, factor); int lastSubtitleNewFrame = (int)TimingUtil.TimeToFrames(lastSubtitleNewTime, subtitles.Properties.CurrentFrameRate); Domain.Timing lastSubtitleNewTiming = new Domain.Timing(lastSubtitleNewFrame, lastSubtitleNewTime); Domain.Timing lastSubtitleCurrentTiming = new Domain.Timing(lastSubtitle.Frames.Start, lastSubtitle.Times.Start); SyncPoint newLastSyncPoint = new SyncPoint(lastSubtitleNumber, lastSubtitleCurrentTiming, lastSubtitleNewTiming); adapted.Add(newLastSyncPoint); } return adapted; }
private bool AreSyncArgsValid (SyncPoints syncPoints) { if ((syncPoints == null) || (syncPoints.Count < 2) || (syncPoints[syncPoints.Count - 1].SubtitleNumber > subtitles.Collection.Count)) return false; SyncPoint previous = syncPoints[0]; for (int index = 1 ; index < syncPoints.Count ; index++) { SyncPoint current = syncPoints[index]; if (!SyncUtil.AreSyncPointsValid(subtitles, previous, current)) return false; previous = current; } return true; }
public override float GetTime(SyncPoints point) { switch (point) { case SyncPoints.Start: return Start; case SyncPoints.Relax: return Start + Relax; case SyncPoints.End: return Start + End; case SyncPoints.AttackPeak: return Start + AttackPeak; default: throw new System.ArgumentOutOfRangeException(); } }
/* Public members */ public bool Sync (SyncPoints syncPoints, bool toSyncAll) { SyncPoints pointsToUse = AdaptForOperation(syncPoints, toSyncAll); if (!AreSyncArgsValid(pointsToUse)) { return false; } SyncPoint previous = pointsToUse[0]; for (int index = 1 ; index < pointsToUse.Count ; index++) { bool syncLast = (index == pointsToUse.Count - 1); SyncPoint current = pointsToUse[index]; SyncUtil.Sync(subtitles, previous, current, syncLast); previous = current; } return true; }
public override float GetTime(SyncPoints point) { switch (point) { case SyncPoints.Start: return Start; case SyncPoints.Ready: return Start + Ready; case SyncPoints.Relax: return Start + Relax; case SyncPoints.End: return Start + End; case SyncPoints.StrokeStart: return Start + StrokeStart; case SyncPoints.Stroke: return Start + Stroke; case SyncPoints.StrokeEnd: return Start + StrokeEnd; default: throw new System.ArgumentOutOfRangeException(); } }
public SynchronizeTimingsCommand(SyncPoints syncPoints, bool toSyncAll, SelectionIntended selectionIntended, TreePath[] pathRange) : base(description, false, selectionIntended, pathRange, true) { this.syncPoints = syncPoints; this.toSyncAll = toSyncAll; }
/// <summary> /// Gets the time of a sync point. To be used to synchronise /// behaviour with generated speech. /// </summary> /// <param name="point"></param> /// <returns></returns> public virtual float GetTime(SyncPoints point) { return 0f; }