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 PLAYOUT
gegeben 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)