Endlich: Automatisches Backtiming durch „stummes Abfahren“!

So, bitte sehr:

var                                                                            // Das übliche: Variablen deklarieren …
  NaechsteVolleStunde, DauerNT, AktuelleZeit, AktuellerCue, UrsprCueIn: TDateTime;
  SollBacktimen: boolean;
  NaechsterTitel: IPlaylistItem;

procedure OnLoad;                                                              // … und Startbedingungen festlegen
begin
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  SollBacktimen := false;
end;

procedure BacktimingAus;                                                       // Abschaltprozedur
begin
  SollBacktimen := false
  DisableTimer;
  ExecuteCommand('BUTTON.4 OFF');
  ExecuteCommand('BUTTON.4 TEXT B/T Auto');
  ExecuteCommand('BUTTON.1 OFF');
  NaechsterTitel.SetColor($EEEEEE);
  NaechsterTitel.SetCuePosition(ptCueIn, UrsprCueIn);
end;

procedure OnExecuteCommand(Command: string);
begin
  if (Command = 'BUTTON.4') AND NOT SollBacktimen then begin                   // Auto-Backtimer einschalten
    ExecuteCommand('BUTTON.4 ON');                                             // Den Schalter schön leuchten lassen
    SollBacktimen := true;                                                     // Zustand merken
    NaechsterTitel := CurrentPlaylist.GetItem(CurrentPlaylist.GetNextIndex);   // Nächsten ("Stand jetzt") Titel bestimmen und …
    DauerNT := TimeValueToSeconds(NaechsterTitel.GetAudibleDuration)/24/60/60; // … dessen Dauer feststellen
    UrsprCueIn := NaechsterTitel.GetCuePosition(ptCueIn);                      // Ursprüngliches CueIn merken
    NaechsterTitel.SetColor($00FF00);                                          // Grüne Marke setzen, damit man's weiß
    NaechsteVolleStunde := frac((Instance.FakeNow*24+1)/24 
      - frac(Instance.FakeNow*24)/24);                                         // Nächste volle Stunde bestimmen (die Methode mit "trunc" geht bei mir aus irgendeinem Grunde nicht)
    EnableTimer(500);                                                          // Timer in Halbsekundenschritten loslaufen lassen
  end
  else if (Command = 'BUTTON.4') AND SollBacktimen then begin                  // Alles wieder ausschalten
    BacktimingAus;
  end;
end;

procedure OnTimer;
begin
  AktuelleZeit := frac(Instance.FakeNow);                                      // Aktuelle Systemzeit ohne Jahr bestimmen
  if AktuelleZeit > NaechsteVolleStunde - DauerNT then begin                   // Wenn kritische Backtimingzeit erreicht, dann …
    ExecuteCommand('BUTTON.1 ON');                                             // … laß etwas leuchten
    AktuellerCue := AktuelleZeit - (NaechsteVolleStunde - DauerNT);            // Aus Randbedingungen aktuelle Cuezeit errechnen
    NaechsterTitel.SetCuePosition(ptCueIn, AktuellerCue * 86400);              // Titel bekommt laufend neues CueIn (in Sekunden) verpaßt (oder FadeIn, dann "ptFadeIn")
  end;
  ExecuteCommand('BUTTON.4 TEXT ' + FormatDateTime('hh:nn:ss', NaechsteVolleStunde - DauerNT) + '  ' 
    + FormatDateTime('nn:ss', AktuellerCue));                                  // Anzeigen: Sollstartzeit Nächster Titel, CueIn
  if AktuelleZeit >= NaechsteVolleStunde then                                  // Beim Erreichen der vollenStunde abschalten
    BacktimingAus;
end;


begin
end.

Die gesuchte Funktion heißt GetAudibleDuration! (Warum ich auf meinem System das Fade-Out nicht höre ist eine ganz andere Baustelle und hat mich tüchtig in die Irre geführt.)

Beharrliche Grüße

TSD