Seltsames Verhalten OnPlayerStateChange

Hier mal eine Frage speziell @Torben:

Folgendes kleines Skript:

procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; 
  OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);

var
  NextIndex, i: integer;
  Duration: Array[0..1] of TTimeValue;

begin
  if NewState = psPlaying then  
  begin
    Duration[PlayerIndex] := Item.GetAudibleDuration;
    for i := 0 to 1 do
      SystemLog('Start ' + IntToStr(PlayerIndex) + ' Duration ' + IntToStr(i) + ': ' + FormatDateTime('hh:nn:ss', Duration[i]/86400));
  end
  else if NewState = psStopped then
  begin
    for i := 0 to 1 do
      SystemLog('Stop ' + IntToStr(PlayerIndex) + ' Duration ' + IntToStr(i) + ': ' + FormatDateTime('hh:nn:ss', Duration[i]/86400));
  end;
end;

begin
end.

Dieses sollte eigentlich die Länge des Titels in Player 0 in der Variablen Duration[0] speichern und ebenso für Player 1. Tut es zunächst auch, jedoch beim nächsten PlayerStateChange wird die gespeicherte Länge wieder mit 00:00:00 überschrieben:

07.02.21 07:57:32 Information  Start 0 Duration 0: 00:00:29
07.02.21 07:57:32 Information  Start 0 Duration 1: 00:00:00

07.02.21 07:57:40 Information  Start 1 Duration 0: 00:00:00
07.02.21 07:57:40 Information  Start 1 Duration 1: 00:03:45

07.02.21 07:57:46 Information  Stop 0 Duration 0: 00:00:00
07.02.21 07:57:46 Information  Stop 0 Duration 1: 00:00:00

07.02.21 07:57:49 Information  Stop 1 Duration 0: 00:00:00
07.02.21 07:57:49 Information  Stop 1 Duration 1: 00:00:00

Das dürfte nach meinem Verständnis doch gar nicht sein, denn Item bezieht sich ja auf den jeweiligen Player (den mit der Nummer PlayerIndex). Und wenn einmal was in Duration[0] drinnen ist, müßte das doch bleiben bis zum jüngsten Gericht (oder ich eben wieder Player 0 starte)?! Oder begehe ich hier einen Denkfehler?

Gelöschte Grüße

TSD

Du musst Duration als globale Variable, also außerhalb/oberhalb der Prozedur definieren. Nur so “überlebt” sie mehrere aufeinanderfolgende Aufrufe:

var
  Duration: Array[0..1] of TTimeValue;

procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; 
  OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
var
  NextIndex, i: integer;
begin
  if NewState = psPlaying then  
  begin
    Duration[PlayerIndex] := Item.GetAudibleDuration;
    for i := 0 to 1 do
      SystemLog('Start ' + IntToStr(PlayerIndex) + ' Duration ' + IntToStr(i) + ': ' + FormatDateTime('hh:nn:ss', Duration[i]/86400));
  end
  else if NewState = psStopped then
  begin
    for i := 0 to 1 do
      SystemLog('Stop ' + IntToStr(PlayerIndex) + ' Duration ' + IntToStr(i) + ': ' + FormatDateTime('hh:nn:ss', Duration[i]/86400));
  end;
end;

Dann bitte noch beachten, dass Variablen üblicherweise einen “undefinierten” Zustand haben am Anfang des Programmablaufs/Prozeduraufrufes. Also im Zweifel im OnLoad mit 0 initialisieren.

1 Like

Na klar, tausend Dank!! Da wäre ich in Jahren nicht draufgekommen, man ist in solchen Fällen ja wie vernagelt. Jetzt geht’s. Das hat mir jetzt sehr geholfen. :upside_down_face:

Ja, danke. Das ist der KĂĽrze des Beispiels zum Opfer gefallen.

Erleichterte GrĂĽĂźe

TSD