diff --git a/cmd/qrunproxy/mockshow.go b/cmd/qrunproxy/mockshow.go index da525c5..820addd 100644 --- a/cmd/qrunproxy/mockshow.go +++ b/cmd/qrunproxy/mockshow.go @@ -79,8 +79,9 @@ func GenerateMockShow(numTracks, numScenes, avgCuesPerScene, avgBlocksPerCue int } type chainable struct { - block *Block - trackIdx int + block *Block + trackIdx int + sameTrackOnly bool } triggerIdx := map[TriggerSource]*Trigger{} @@ -110,10 +111,13 @@ func GenerateMockShow(numTracks, numScenes, avgCuesPerScene, avgBlocksPerCue int show.Blocks = append(show.Blocks, cue) cueTargets := []TriggerTarget{} - - endingTracks := map[int]*Block{} for trackIdx, blk := range needsEnd { - endingTracks[trackIdx] = blk + hook := "END" + if rng.Float64() < 0.3 { + hook = "FADE_OUT" + } + cueTargets = append(cueTargets, TriggerTarget{Block: blk.ID, Hook: hook}) + chainFrom = append(chainFrom, chainable{block: blk, trackIdx: trackIdx, sameTrackOnly: true}) delete(needsEnd, trackIdx) } @@ -122,7 +126,7 @@ func GenerateMockShow(numTracks, numScenes, avgCuesPerScene, avgBlocksPerCue int blocksThisCue := 1 + rng.IntN(avgBlocksPerCue*2) for range blocksThisCue { trackIdx := rng.IntN(numTracks) - if needsEnd[trackIdx] != nil || usedTracks[trackIdx] { + if usedTracks[trackIdx] { continue } @@ -131,37 +135,34 @@ func GenerateMockShow(numTracks, numScenes, avgCuesPerScene, avgBlocksPerCue int usedTracks[trackIdx] = true triggered := false - if prev := endingTracks[trackIdx]; prev != nil { - cueTargets = append(cueTargets, TriggerTarget{Block: prev.ID, Hook: "FADE_OUT"}) - addTrigger( - TriggerSource{Block: prev.ID, Signal: "END"}, - TriggerTarget{Block: block.ID, Hook: "START"}, - ) - delete(endingTracks, trackIdx) - triggered = true - } - if !triggered { - for i, c := range chainFrom { - if c.trackIdx == trackIdx { - addTrigger( - TriggerSource{Block: c.block.ID, Signal: "END"}, - TriggerTarget{Block: block.ID, Hook: "START"}, - ) - chainFrom = append(chainFrom[:i], chainFrom[i+1:]...) - triggered = true - break - } + for i, c := range chainFrom { + if c.trackIdx == trackIdx { + addTrigger( + TriggerSource{Block: c.block.ID, Signal: "END"}, + TriggerTarget{Block: block.ID, Hook: "START"}, + ) + chainFrom = append(chainFrom[:i], chainFrom[i+1:]...) + triggered = true + break } } - if !triggered && rng.Float64() < 0.3 && len(chainFrom) > 0 { - idx := rng.IntN(len(chainFrom)) - c := chainFrom[idx] - addTrigger( - TriggerSource{Block: c.block.ID, Signal: "END"}, - TriggerTarget{Block: block.ID, Hook: "START"}, - ) - chainFrom = append(chainFrom[:idx], chainFrom[idx+1:]...) - triggered = true + if !triggered && rng.Float64() < 0.3 { + var candidates []int + for i, c := range chainFrom { + if !c.sameTrackOnly { + candidates = append(candidates, i) + } + } + if len(candidates) > 0 { + idx := candidates[rng.IntN(len(candidates))] + c := chainFrom[idx] + addTrigger( + TriggerSource{Block: c.block.ID, Signal: "END"}, + TriggerTarget{Block: block.ID, Hook: "START"}, + ) + chainFrom = append(chainFrom[:idx], chainFrom[idx+1:]...) + triggered = true + } } if !triggered { cueTargets = append(cueTargets, TriggerTarget{Block: block.ID, Hook: "START"}) @@ -174,17 +175,6 @@ func GenerateMockShow(numTracks, numScenes, avgCuesPerScene, avgBlocksPerCue int } } - for trackIdx, blk := range endingTracks { - hook := "END" - if rng.Float64() < 0.3 { - hook = "FADE_OUT" - } - cueTargets = append(cueTargets, TriggerTarget{Block: blk.ID, Hook: hook}) - if hook == "FADE_OUT" { - newChainFrom = append(newChainFrom, chainable{block: blk, trackIdx: trackIdx}) - } - } - chainFrom = newChainFrom if len(cueTargets) > 0 { diff --git a/cmd/qrunproxy/show.go b/cmd/qrunproxy/show.go index 29924e9..6811750 100644 --- a/cmd/qrunproxy/show.go +++ b/cmd/qrunproxy/show.go @@ -125,7 +125,10 @@ func (show *Show) Validate() error { } if t, ok := signalTargetedBy[blockEvent{trigger.Source.Block, trigger.Source.Signal}]; ok { - return fmt.Errorf("trigger conflict: %s vs %s", t, trigger) + sameTrackSingle := len(trigger.Targets) == 1 && blocksByID[trigger.Targets[0].Block].Track == sourceBlock.Track + if !sameTrackSingle { + return fmt.Errorf("trigger conflict: %s vs %s", t, trigger) + } } if !isValidEventForBlock(sourceBlock, trigger.Source.Signal) { return fmt.Errorf("trigger source signal %q is invalid for block %q", trigger.Source.Signal, trigger.Source.Block)