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.
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);
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.