Scripting-Hilfe: Alle Player aus?

So umfangreich … usw. (Ich lasse das Vorwort für diesen kleinen Artikel mal weg, das kennt Ihr ja schon.) Also:

Abgefragt: Sind alle Player aus?

Mir ist es kürzlich vorgekommen, daß ich wissen wollte, ob z. B. alle Cart-Player aus sind, weil ich die Cartwall nicht verschwinden lassen will (CARTWALL HIDE), solange einer noch spielt. Im Falle des PFL gibt es dazu die Variable PlayerCount, die genau dann null ist, wenn kein PFL läuft. Leider gibt es das (noch?) nicht für die Playlist-Player und die Cartwall. Kriegen wir aber mit ein paar Zeilen Code auch so hin:

var
  CartState: integer;

procedure OnLoad;
begin
  ExecuteCommand('CARTWALL ALL STOP');
  CartState := 0;
end;

procedure OnCartwallPlayerStateChange(PlayerIndex: integer;
  OldState: TPlayerState; NewState: TPlayerState;
  Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem;
  OnAirMode: TCartwallOnAirMode);
begin	
  if (NewState = psPlaying) AND NOT (OldState = psPaused) then  // Wenn ein Cartplayer startet (außer nach Pause) …
    Inc(CartState)                                              // … Zähler erhöhen
  else if NewState = psStopped then                             // Wenn ein Cartplayer stoppt oder in Pause geht …
    Dec(CartState);                                             // … Zähler erniedrigen
  if CartState = 0 then begin
    // Auswertung: Wenn Zähler null, ist alles gestoppt
  end;
end;

Die Prozedur OnCartwallPlayerStateChange sieht erstmal furchtbar aus, aber das liegt bloß an den vielen Variablen, die sie zur Verfügung stellt. Und an dem langen Namen. Sie liefert die Stati der einzelnen Player (die wiederum selber durch PlayerIndex identifiziert werden können), also ob sie leer sind, pausiert, gerade abspielen oder eben gestoppt. NewState gibt zum Zeitpunkt des Statuswechsels, also genau dann, wenn ein Player beispielsweise gestartet wird, einen Wert aus, in diesem Falle heißt der psPlaying. Im Falle des Stopps heißt der Wert psStopped, bei Pause psPaused. (Es gibt noch andere, s. u.).

Zunächst einmal wird zum Programmstart die Variable CartState auf null gesetzt und alle Cartplayer gestoppt (was sie dann sowieso sind, aber ich will da sichergehen). Wird jetzt ein Cartplayer angeworfen, d. h., die Variable NewState hat den Wert psPlaying, dann wird CartState um eins erhöht.

Achtung, neue Prozedur (für einige Mitleser jedenfalls):

Inc(CartState);

heißt dasselbe wie

CartState := CartState + 1;

Wird ein Player gestoppt (NewState hat den Wert psStopped), dann wird der Wert wieder um eins verringert: Dec(CartState). Startbefehle nach Pause werden nicht berücksichtigt, weil der Zähler sonst durcheinanderkommt. Das heißt, wenn alle Player angehalten haben, muß CartState wieder null sein – auf zur Auswertung!

Das gleiche gibt es auch für Playlist-Player, dann heißt die Prozedur

OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer;
  OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
  // gleicher Code wie oben
end;

 
Die einzelnen Zustände, die die Player annehmen (und somit abgefragt werden) können, sind:

Zustand Player …
psEmpty … ist leer
psLoading … lädt gerade ein Audio
psLoaded … ist startbereit
psPlaying … spielt gerade ein Audio aus
psFading … blendet gerade ein Audio aus
psEOF … hat das Ende des Audios erreicht
psError … hat z. B. Audio nicht gefunden
psPaused … pausiert gerade
psStopped … ist gestoppt
psPFL … wird vorgehört
psFlashEOF … gibt EOF-Warnung aus
psNext … ist als nächster an der Reihe
psPlayed … ist abgespielt
psSkipped … wurde geskippt
psOverflow … hat Kopfschmerzen
psUnderrun … hat Bauchschmerzen
psRegion … spielt regionalisiert aus (?)
psOffAir … ist Off Air

Und wenn @Torben das jetzt liest und denkt: „Stimmt, das PlayerCount habe ich da tatsächlich vergessen!“, dann ist es in einem der kommenden Releases verwirklicht, und ich habe das hier umsonst geschrieben.*

Gestoppte Grüße

TSD


* Nicht ganz, dann habt Ihr wenigstens Inc( ) und Dec( ) gelernt.

Nachtrag: Es bestünde auch die Möglichkeit, den Status direkt über

Cartwall.GetPlayer(i).GetState = psPlaying

abzufragen, aus irgendeinem Grunde funktioniert das bei mir aber nicht (Unknown Identifier: GetPlayer). Aber das liegt wahrscheinlich an mir.

Nicht identifizierte Grüße

TSD