Skip to content

RFC: Updates to Rehearsal Mode #1470

@hummelstrand

Description

@hummelstrand

About Me

This RFC is posted on behalf of SuperFly.tv

Use Case

In today's Sofie, the Rehearsal Mode acts and behaves exactly as the On Air mode, without giving the users any rehearsal-specific tools.
Thanks to Sofie's state-based architecture we propose to improve to the Rehearsal Mode in six ways.

We welcome discussions and feedback about these changes!

Proposal

1. Click to Play-From-Anywhere

To make it easier for the user to preview any part of the planned show, we propose that holding down a modifier key (such as *Shift) *and hovering over any segment will show a vertical line that follows the cursor. Clicking will instantly move the On Air line to this position and start playing. This feature will only be available in Rehearsal Mode.

2. Rehearsal Bar

Image

This new UI area is permanently pinned to the bottom of the Top Bar when the studio is in Rehearsal Mode. It contains controls for the following features...

3. Always-enabled Adlib Testing

When you activate a studio in Rehearsal Mode, you expect to be able to start controlling it—either by switching cameras or by starting to play the rundown. This is not the way Sofie works today.

The current implementation of the Adlib Testing requires the user to enable this mode by context-clicking the Top Bar. The current implementation presents the user with an awkward UI representation resembling a segment and two parts, but without allowing many of the standard operations such as "Set as Next". And once the user starts playing from the normal rundown, the UI element lingers without any use.

We instead propose that this mode is enabled automatically, but hidden. This means that adlibs can be played via keyboard shortcuts and devices as soon as Rehearsal Mode is enabled. There's no point in showing a UI representation of these adlibs that are played before the rundown—if the user wants to test a complicated multi-piece adlib and see it visually represented in the UI, it can always be played in a rundown with a complete UI representation.

As a bonus this means we can remove the context-menu item, and we can also avoid forcing the user to understand the name of the feature. The aim is that the feature can be described as "adlibs can be played freely as soon as you enter Rehearsal Mode".

4. Preview Takes

With Sofie's Play-from-Anywhere feature it is already possible to preview just certain sections of a show that the user wants to rehearse, instead of, for example, being forced to play an entire video clip just to be able to see it transitions to the following part. With the new Preview Takes feature this becomes much easier with buttons in the Rehearsal Bar that will let you jump to x seconds before each Take. The amount of pre-roll can easily be changed by the user.

5. Pause/Continue Time

Once Sofie starts to play a busy part such as a video clip, the only way to stop the playback is to take another part. With the new button in the Rehearsal Bar the user can in effect freeze/unfreeze time (but since that terminology is already reserved in Sofie, it should be called Pause/Continue in the documentation).

6. The Color of the Top Bar

The three states of a rundown playlist (deactivatedactivated in rehearsalactivated in on air) and how to switch between them has always been a bit unintuitive and cumbersome. Awaiting the implementation of a redesigned Top Barwith further improvements, in this RFC we propose that the color of the Top Bar only indicates the state of the studio as deactivated (blue) and activated (black). That the studio is in Rehearsal Mode is instead indicated by the presence of the Rehearsal Bar.


Implementation Proposal (rough draft)

As the TSR is timeline-based, this is the natural place to have any time related changes.

It’s important to note that this is ONLY for rehearsal, as the impact of jumping/freezing a timeline, can be strange. e.g. if a camera has got a command for a new shot just before a freeze, it will continue that movement.

An draft of the implementation can be found in:
https://github.com/SuperFlyTV/sofie-timeline-state-resolver/tree/feat/freeze-continue-seek

The functions are (in conductor.ts):

//Conductor:
public getCurrentTime(): number {
    // Normal operation: real time minus any accumulated frozen time
}
public getDateNowWithFreezeOffset(): number {
    // This is the time that is used for resolving the timeline
    // It takes into account the frozen state and the accumulated frozen time
    // this time should replace Date.Now() multiple places in the code
    // Both this and getCurrentTime() 
    // Could/Should be placed in a NowHandler() 
    // (something like the rough draft in server/nowHandler.ts)
}

public freeze(): void {
    // This function "stops" the timeline and sends the command 
    // To those devices who supports a freeze
}

public continue(): void {
    // Stops the freeze
    // re-trigger the timeline and recalculates
}

public jumpto(seconds: number): void {
    // call Freeze timeline
    // Dips those devices who support it
    // Moved timeline to new position
    // Continue
}

And the devices should have these new capabilities:
(draft is in service/device.ts → )

/** Freeze the device at its current state */
async freeze?(): Promise<void>

/** Continue from frozen state, accounting for the time that passed while frozen */
async continue?(): Promise<void>

/** 
* This should be called to make a dip (black or silence) in devices while recalculating 
* a new state/position 
**/
async dipUnderRecalculation?(dipTime: number): Promise<void>

/** Whether this device supports freeze/continue functionality */
get supportsFreezing(): boolean {
    return false
}

Timing Across All devices and clients (e.g. Core):

We should also consider if there should be one central time in the TSR, there is some with the _getCurrentTime().
But currently Date.now() is used a lot of places, some where it’s for the actual timestamps, and some where it relates to the timeline.
A small draft example of a central time is placed in service/nowHandler.ts


Possible Features for Future Consideration

These proposed features could be followed up by additional features, such as being able to activate a studio in Rehearsal Mode without any active rundowns.

Process

The Sofie Team will evaluate this RFC and open up a discussion about it, usually within a week.

  • RFC created
  • Sofie Team has evaluated the RFC
  • A workshop has been planned
  • RFC has been discussed in a workshop
  • A conclusion has been reached, see comments in thread

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions