Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions packages/job-worker/src/playout/timeline/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import { deserializePieceTimelineObjectsBlob } from '@sofie-automation/corelib/d
import { convertResolvedPieceInstanceToBlueprints } from '../../blueprints/context/lib'
import { buildTimelineObjsForRundown, RundownTimelineTimingContext } from './rundown'
import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
import { deNowifyMultiGatewayTimeline } from './multi-gateway'
import { calculateNowOffsetLatency, deNowifyMultiGatewayTimeline } from './multi-gateway'
import { validateTimeline } from 'superfly-timeline'
import { getPartTimingsOrDefaults, PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings'
import { applyAbPlaybackForTimeline } from '../abPlayback'
Expand Down Expand Up @@ -144,14 +144,21 @@ export async function updateTimeline(context: JobContext, playoutModel: PlayoutM
throw new Error(`RundownPlaylist ("${playoutModel.playlist._id}") is not active")`)
}

const { versions, objs: timelineObjs, timingContext: timingInfo } = await getTimelineRundown(context, playoutModel)
const nowOffsetLatency = calculateNowOffsetLatency(context, playoutModel)
const targetNowTime = getCurrentTime() + (nowOffsetLatency ?? 0)

const {
versions,
objs: timelineObjs,
timingContext: timingInfo,
} = await getTimelineRundown(context, playoutModel, targetNowTime)

flattenAndProcessTimelineObjects(context, timelineObjs)

preserveOrReplaceNowTimesInObjects(playoutModel, timelineObjs)

if (playoutModel.isMultiGatewayMode) {
deNowifyMultiGatewayTimeline(context, playoutModel, timelineObjs, timingInfo)
deNowifyMultiGatewayTimeline(playoutModel, timelineObjs, timingInfo, targetNowTime)

logAnyRemainingNowTimes(context, timelineObjs)
}
Expand Down Expand Up @@ -281,7 +288,8 @@ function getPartInstanceTimelineInfo(
*/
async function getTimelineRundown(
context: JobContext,
playoutModel: PlayoutModel
playoutModel: PlayoutModel,
targetNowTime: number
): Promise<{
objs: Array<TimelineObjRundown>
versions: TimelineCompleteGenerationVersions
Expand Down Expand Up @@ -311,11 +319,10 @@ async function getTimelineRundown(
)
}

const currentTime = getCurrentTime()
const partInstancesInfo: SelectedPartInstancesTimelineInfo = {
current: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, currentPartInstance),
next: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, nextPartInstance),
previous: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, previousPartInstance),
current: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, currentPartInstance),
next: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, nextPartInstance),
previous: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, previousPartInstance),
}

if (partInstancesInfo.next && nextPartInstance) {
Expand Down Expand Up @@ -352,7 +359,7 @@ async function getTimelineRundown(
const resolvedPieces = getResolvedPiecesForPartInstancesOnTimeline(
context,
partInstancesInfo,
getCurrentTime()
targetNowTime
)
const blueprintContext = new OnTimelineGenerateContext(
context.studio,
Expand Down
8 changes: 3 additions & 5 deletions packages/job-worker/src/playout/timeline/multi-gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { PieceTimelineMetadata } from './pieceGroup'
import { StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel'
import { logger } from '../../logging'
import { JobContext } from '../../jobs'
import { getCurrentTime } from '../../lib'
import { PlayoutModel } from '../model/PlayoutModel'
import { RundownTimelineTimingContext, getInfinitePartGroupId } from './rundown'
import { getExpectedLatency } from '@sofie-automation/corelib/dist/studio/playout'
Expand All @@ -23,17 +22,16 @@ import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel'
* This does introduce a risk of error when changes are made to how we generate the timeline, but that risk should be small.
*/
export function deNowifyMultiGatewayTimeline(
context: JobContext,
playoutModel: PlayoutModel,
timelineObjs: TimelineObjRundown[],
timingContext: RundownTimelineTimingContext | undefined
timingContext: RundownTimelineTimingContext | undefined,
targetNowTime: number
): void {
if (!timingContext) return

const timelineObjsMap = normalizeArray(timelineObjs, 'id')

const nowOffsetLatency = calculateNowOffsetLatency(context, playoutModel)
const targetNowTime = getCurrentTime() + (nowOffsetLatency ?? 0)
logger.info(`deNowifyMultiGatewayTimeline: ${targetNowTime}`)

// Replace `start: 'now'` in currentPartInstance on timeline
const currentPartInstance = playoutModel.currentPartInstance
Expand Down
Loading