Unterscheidung des Typs im Script

Hallo,

ist es möglich in einem Script den Typ des Playlist Items rauszulesen? Hintergrund ist, dass ich das Blinken der EOF Signalampel nur bei Elementen des Typs Musik haben möchte.

Hier der Ausschnitt des Scripts:

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer); begin if (PlaybackControl(0).GetAutomation = true) then begin DisableTimer; IOWarriorRemote(0).SetPort(0, false); end; if (PlaybackControl(0).GetAutomation = false) then begin EnableTimer(700); end; end;

Hatte nochmal etwas gestöbert und mich an anderen Scripten gehalten. Leider mit keinem Erfolg.

[code]procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);

var Item: IPlaylistItem;

begin
if (PlaybackControl(0).GetAutomation = true) then begin
DisableTimer;
IOWarriorRemote(0).SetPort(0, false);
end;
if (PlaybackControl(0).GetAutomation = false) and (Item.GetItemType = pitMusic) then begin
EnableTimer(800);
end;
end;[/code]

Klar ist, dass ich eine zweite Abfrage brauche bei der zweiten IF/THEN Folge. Nun dachte ich, liest du den Typ des Elements mit GetItemType. Hierbei gab es den Fehler:

26.09.2016 01:37:57 Fehler Runtime error "Null Pointer Exception" in background script Z:\Scripts\EOF_Signalampel.mls (line 45, column 7) handling message:

Für was steht der Fehler grob?

Aber für heute bin ich erstmal raus. Mir raucht schon der Kopf von den ganzen Quellcodes. Gute Nacht. :-\

Oder anders gefragt. Gibt es in mAirlist eine Function aus der ich aus der ich GetItemType() des jetzt gerade spielenden Elements heraus extrahieren kann?
Denn wenn ich was mit for-Schleifen mache, rattert er logischerweise bis zum Ende der Playlist durch. Ich überlege mir mal heute Abend etwas.
Vielleicht mache ich auch “Summe aller Items” - “angezeigter Mülleimer am Anfang der Playlist” = Aktueller Titel. Anschließend noch eine If Playlist <= “angezeigter Mülleimer” then Abfrage.

Du musst natürlich Item auch irgendwie mit einem Wert versehen :wink:

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);

var Item: IPlaylistItem;

begin
      Item := PlaybackControl(PlaylistIndex).GetPlayer(PlayerIndex).GetItem;
      if Item = nil then exit;

      if (PlaybackControl(0).GetAutomation = true) then begin
        DisableTimer;
        IOWarriorRemote(0).SetPort(0, false);
      end;
      if (PlaybackControl(0).GetAutomation = false) and (Item.GetItemType = pitMusic)  then begin
        EnableTimer(800);
      end;
end;

Krass. Klasse Torben und danke; es läuft einwandfrei. Vielleicht sollte ich echt nochmal Informatik studieren.
Darf ich nochmal nachhaken?
Nachdem die Variable Item definiert wurde, fütterst du sie mit der Info “PlaybackControl(PlaylistIndex).GetPlayer(PlayerIndex).GetItem”. Sprich, aus der aktuellen Playlist und dem laufenden Player entnimmt mAirlist ab EOFWarning die Item Informationen, richtig? Darauf wäre ich nie gekommen. Hatte immer versucht Werte aus der Playlist zu gewinnen. Unten in der If Abfrage wird vom Item der ItemType herausgenommen und mit pitMusic verglichen.
Wozu dient:

if Item = nil then exit;

Dient es dazu, wenn ein Player leerläuft und kein Element hat?

Genau. Das Script wird ja asynchron ausgeführt, also nicht exakt in dem Moment, wo die EOF-Warnung anläuft, sondern “kurz danach”, in einem anderen Thread.

Auch wenn es unwahrscheinlich ist: Theoretisch könnte es passieren, dass dein Script-Code erst läuft, wenn der Player inzwischen entladen wurde. Daher sicherheitshalber die Abfrage, ob auch wirklich ein Element geladen ist (Item <> nil).

Viele weitere Funktionen übergeben das zugehörige Item inzwischen schon als zusätzlichen Parameter. OnPlayerEOFWarning leider (noch) nicht, und ich fürchte, wenn ich das jetzt einfach hinzufüge, dann mache ich ganz vielen Leuten ihre Scripts kaputt. Also sparen wir uns das mal für einen zukünftigen Release auf.