Function GetPlayerOfItem ohne Funktion

@Torben: Was stimmt hier nicht?:

const
  TITLE       = 'Test';
  
  EXTCOMMAND  = 'LOSGEHTS';
  EXTDURATION = 15;

procedure OnExecuteCommand(Command: string);
var
  i, NextIndex: integer;
  spi: ISilencePlaylistItem;
  pi:  IPlaylistItem;
begin
  if Command = EXTCOMMAND then
  begin
    spi := Factory.CreateSilencePlaylistItem;
    pi := spi;
    pi.SetTitle(TITLE);
    pi.SetDuration(EXTDURATION);
    CurrentPlaylist.BeginRead;
    try
      CurrentPlaylist.Insert(CurrentPlaylist.GetNextIndex, pi);
    finally
      CurrentPlaylist.EndRead;
    end;
    SystemLog('Playlist: ' + IntToStr(CurrentPlaylist.GetIndex));
    SystemLog('Titel: ' + pi.GetTitle);
    SystemLog('Player: ' + IntToStr(CurrentPlaylist.GetPlayerOfItem(pi)));
    ExecuteCommand('PLAYER ' + IntToStr(CurrentPlaylist.GetIndex + 1) +
      '-' + IntToStr(CurrentPlaybackControl.GetPlayerOfItem(pi) + 1) +
      ' START');
  end;
end;

Eine Stille wird erzeugt und an die nächste Stelle der Playlist gesetzt. Dann soll deren Player selbsttätig starten (daß er automatisch lädt, ist vorausgesetzt)., dafür brauche ich dessen Index. Die Funktion GetPlayerOfItem gibt mir aber stets den Wert -1 zurück, obwohl pi existiert und auch gefunden wird, denn der Titel wird im SysLog angezeigt. :thinking:

Da es sich um eine schreibende Operation handelt, musst du BeginUpdate und EndUpdate (statt BeginRead und EndRead) verwenden. Schau mal, ob das schon reicht.

Ob das Element dann nach dem EndUpdate tatsächlich direkt in einen Player geladen wird, hängt natürlich von Konfiguration und Zustand der Playlist ab (steht sie wirklich auf ASSIST, kein Link beim vorherigen gesetzt, ist nicht zufällig “Player bei Bedarf laden” aktiviert, etc.) - aber da hast du ja die Kontrolle drüber. Dennoch bietet es sich an, vorher zu kontrollieren, ob der Wert ungleich -1 is, bevor man weitermacht.

Weiterhin bitte daran denken, dass sich die Player asynchron laden. Der Player ist also erst eine Zeitlang im Zustand psLoading, und da ist es dann noch zu früh, um den START-Befehl zu schicken. Also vorher auf das Ende des Ladens warten:

while CurrentPlaybackControl.GetPlayer(CurrentPlaybackControl.GetPlayerOfItem(pi)).GetState = psLoading do 
  Sleep(100);
1 Like

Danke für die Tips. Leider geht’s nicht, denn GetPlayerOfItem liefert immer noch -1, und es gibt einen Range check error in der while-Zeile.


Edit: Kann es sein, daß es mit Stilleelementen nicht funktioniert, da GetPlayerOfItem dezidiert auf ein IPlaylistItem dressiert ist, und nicht auf ISilence…? Daher hatte ich auch diesen Umstand pi := spi; eingeführt.

Ja, es hat offenbar wirklich etwas mit den Interfaces zu tun. Schwer zu beschreiben. Auf welcher Version bist du?

7.1          

Ich lade gerade Build 5205 hoch, bitte teste den einmal.

1 Like

Es funktioniert, vielen Dank!!

Nur bleibt der Code an der psLoading-Schleife hängen. Aber GetPlayerOfItem gibt jetzt richtige Werte aus.


Edit: Jetzt geht’s, warum auch immer. Wahrscheinlich, weil ich mich beschwert hatte …