public void cancel() {
    synchronized (TimelineEngine.LOCK) {
      TimelineScenarioState oldState = this.state;
      if (oldState != TimelineScenarioState.PLAYING) return;
      this.state = TimelineScenarioState.DONE;

      for (TimelineScenarioActor waiting : this.waitingActors) {
        if (waiting instanceof Timeline) {
          ((Timeline) waiting).cancel();
        }
      }
      for (TimelineScenarioActor running : this.runningActors) {
        if (running instanceof Timeline) {
          ((Timeline) running).cancel();
        }
      }
    }
  }