Bug: Fixzeitelement kümmert sich nicht um Fixzeit

Das ist wahrscheinlich ein Fall für @Torben: In einem Skript erstelle ich ein Fixzeitelement und stelle es in eine Playlist, etwa so:

var
  Path: string;
  Time: TDateTime;

begin
  Item := Factory.CreateFilePlaylistItem(Path, []);
  Item.SetTiming(timHard); 
  Item.SetFixTime((Time * 86400 - 7) / 86400);
  Playlist(1).BeginUpdate;
  try
    Playlist(1).Add(Item);
  finally
    Playlist(1).EndUpdate;
  end;
  Playlist(1).SetAutomation(true);
  Playlist(1).AutomationPlay;
end.

Das funktioniert soweit auch gut: Das Element landet in der Playlist, hat die richtige Fixzeit, die Automation geht an usw. (Es kann sein, daß ich mich für das Beispiel hier vertippt habe. Aber „in echt“ geht es.) Jedoch: Sobald das Element geladen ist, startet es unverzüglich, ohne auf die Fixzeit zu warten. Und zwar egal, wann SetAutomation(true) und/oder AutomationPlay gegeben werden (vor oder nach dem Update).

Was mag da los sein?

Praecoctische Grüße

TSD

Hast Du eventuell in den generellen Konfigurationseinstellungen für die Playlist " Im Automations-Modus automatisch zu Fix-Zeit -Elementen springen" aktiviert?

Das erste Problem, das ich sehe: Du deklarierst eine Variable Time aber initialisierst sie nicht (dadurch kann irgendwelcher “Müll” in ihr stehen).

@Stefan_Hillen: Du bist ein Genie! Leider hilft es nicht, den Haken zu entfernen.

Doch. Die wird anderweitig initialisiert. Ich dachte, das könnte man abstrahieren. Also im ganzen Skript:

const
  PATH_TO_FILE = 'C:\Path\to\files\';

var
  Lock: boolean;
  Time: TDateTime;

procedure OnLoad;
begin
  Lock := false;
end;

procedure ClearAuxPlaylist;
var
  i: integer;
begin
  for i := 0 to (Playlist(1).GetCount - 1) do
    Playlist(1).Delete(i);
end;

procedure OnPlaylistEmpty(PlaylistIndex: integer);
begin
  if PlaylistIndex = 1 then
  begin
    Playlist(1).AutomationStop;
    Lock := false;
    ClearAuxPlaylist;
  end;
end;

procedure FilePlayout;
var
  Path: string;
  Item: IPlaylistItem;
begin
  ClearAuxPlaylist;
  Lock := True;
  Path := PATH_TO_FILE + 'File.wav';
  Item := Factory.CreateFilePlaylistItem(Path, []);
  Item.SetTiming(timHard); 
  Item.SetFixTime((Time * 86400 + 7) / 86400);
  Playlist(1).BeginUpdate;
  try
    Playlist(1).Add(Item);
  finally
    Playlist(1).EndUpdate;
  end;
  Playlist(1).SetAutomation(true);
  Playlist(1).AutomationPlay;
end;
  
procedure OnExecuteCommand(Command: string);
begin
  if (Command = 'PLAYOUT') AND NOT Lock then
  begin
    Time := Now * 8640 + 2;
    Time := Time - 0.35;
    Time := (Time - frac(Time)) / 8640; 
    FilePlayout;
  end;
end;

begin
end.

Es wird eine Zeit definiert, wie genau, ist wurscht, aber sie liegt in der Zukunft. Mit Hilfe dieser wird ein Fixzeitelement gebaut. Jetzt kommt das Problem: Kommentierst Du die Zeile

 Playlist(1).AutomationPlay;

aus, siehst Du, daß die Fixzeit korrekt angezeigt wird (in der Zukunft liegt). Es liegt also nicht an einer womöglich abwegigen Zeitbestimmung. Mit dieser Zeile läuft das Element sofort los, sobald der Befehl PLAYOUTgegeben wird.

1 Like

Und da liegt dann nur dieses eine Element in der (zweiten) Playlist? Sonst nichts?

Erstmal ja. Ist das ein Problem?

Nein, aber es könnte sein, dass das AutomationPlay immer direkt das erste Element startet, auch wenn es eine Fixzeit hat.

Ändere mal testweise die Reihenfolge wie folgt:

Playlist(1).SetAutomation(true);
Playlist(1).AutomationPlay;
Playlist(1).Add(Item);

Also erst Automation “starten”, dann das Element einfügen.

Das BeginUpdate/EndUpdate kannst du dir übrigens sparen, wenn du nur eine einzelne Operation ausführst. Das sorgt nur dafür, dass das Playlist-Objekt für Operationen durch andere Threads gesperrt wird, wenn du mehrere Dinge machen möchtest, ohne dass jemand dazwischenfunkt.

Danke.

Das hilft leider nicht, ich hatte das schon wie oft (und jetzt auch nochmal) umgestellt. Ein Sleep vor Automation.Play bringt ebenfalls nichts (außer der Sleepzeit selber). Auch, wenn ich die Playlist manuell vorher mit einem Platzhalter bestücke, ändert sich nichts.

Bitte mach mal das Systemprotokoll auf und aktiviere oben im Filter die Kategorie “Debug” - evtl. steht da was zu den Fixzeiten, und warum er wann zu welchem Element spricht. Bitte kopier das hier mal rein.

Oje, ganz dünn:

19.05.21 17:50:22 Warnung      Playlist 1 ran empty.

Was ja völlig in Ordnung geht. Mehr ist nicht. (Ich hatte es natürlich vorher geleert.)

(Version 6.3.10 Build 4427)