Liebe Programmierspezialisten,
ich hätte da gerne mal ein Problem: In Fortführung des Projekts Auto-Backtiming arbeite ich zur Zeit an einem Skript, welches das ganze auch im Automatikbetrieb wuppt, bzw. beim Downmix in eine Datei. Insbesondere im letzten Falle kann ich mich wohl nicht auf die aktuelle mAirList-Zeit FakeNow
beziehen, ich muß also die laufende Zeit woanders hernehmen. Kein Problem, wir haben ja einen eingebauten Timer, also:
var
ElapsedTime, StartTime, EndTime: TDateTime;
EndTitleDuration: TTimeValue;
procedure OnPlayerStart(...);
begin
if Item = CurrentPlaylist.GetItem(0) then begin // Beim Start des ersten Elements geht's los
ElapsedTime := StartTime; // Startwert für laufende Zeit
EnableTimerEx('Time', 1000); // Timer loslaufen lassen
// usw...
end;
end
procedure OnTimerEx(...);
begin
if ID = Timer then begin
ElasedTime := (ElapsedTime * 86400 + 1) / 86400 // Laufende Zeit inkrementell erhöhen
end;
end;
Soweit alles gut, funktioniert. Jetzt muß ich das CueIn
des letzten Titel entsprechend anpassen. Dazu muß ich mich auf die Spieldauer des letzten Titels beziehen:
procedure OnExecuteCommand(...);
begin
if Command = 'SollBacktimen' then begin
EndTitleDuration := CurrentPlaylist.GetItem(CurrentPlaylist.GetCount - 1).GetAudibleDuration;
// Dauer des letzten Titels der Playlist
// ...
end;
end;
procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);
begin
//...
EnableTimerEx('Cue', 1000); // Timer starten
end;
procedure OnTimerEx(...);
begin
// ...
if ID := 'Cue' then begin
<Letzter Titel>.SetCuePosition(ptCueIn, (ElapsedTime - ((EndTime * 86400 - EndTitleDuration)) / 86400) * 86400);
// CuePosition nachführen
end;
end;
Und jetzt kommt das Problem: Dadurch, daß ich die CueIn
-Position ändere, ändert sich auch ständig die Dauer des Titels, das CueIn
springt also ständig zwischen zwei Werten hin und her.
Das darf sie aber gar nicht!
Denn, nach meinem Verständnis, die Dauer des Titels wird nur ein einziges mal festgestellt, nämlich in OnExecuteCommand
. Alles andere was danach kommt, der Timer z. B., darf diese Variable doch nicht mehr verändern?! Tut es aber. Auch, wenn ich die Erzeugung der Dauer davon abhängig mache, daß die Player nicht laufen. Beweise: Anzeige von EndTitleDuration
in einem Feld, es springt hin und her. Und: Lege ich zum Beispiel fest (Titeldauer 2’21"):
EndTitleDuration := 141;
Dann funktioniert alles wunderbar und wie es sein soll! Ich kapier’s nicht, denn das andere Skript tut’s ja auch, lediglich beziehe ich mich da halt auf die mAirList-interne Zeit.
(Bis auf dieses Malheur läuft das Programm auch wunderbar, es sind keine Fehler in der Berechnung der einzelnen Start- und Endezeiten vorhanden. Und wenn, wär’s auch egal, denn das änderte ja nichts am Prinzip.)
Ratlose Grüße
TSD