Sorry, hat etwas gedauert, ich musste mich etwas in die Thematik reindenken.
Folgendes Script habe ich mir gerade ausgedacht:
[code]var i, player: integer;
pi: IPlaylistItem;
begin
player := -1;
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if CurrentPlaybackControl.GetPlayer(i).GetState = PS_EMPTY then begin
player := i;
break;
end;
if (player = -1) then
SystemLog(‘Keinen freien Player gefunden.’)
else begin
CurrentPlaybackControl.PlayerAutoLoad(player);
CurrentPlaybackControl.PlayerStart(player);
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if i <> player then CurrentPlaybackControl.PlayerFadeOut(i);
end;
end.[/code]
Es sucht zunächst einen freien Player. Falls einer gefunden wurde, wird er mit dem nächsten freien Element geladen und dann gestartet. Sodann werden alle anderen gerade laufenden Player ausgefadet.
Wir arbeiten ja wie beschrieben mit http://forum.mairlist.de/viewtopic.php?t=877&start=15. Geniale Sache. Dieses Script könnte von einem zusätzlichen Bedienelement (Taster) gestartet werden, und könnte den Moderator beim starten vieler Elemente unterstützen.
Habe das Script von Torben noch etwas ergänzt. So kann diese Next Taste auch im Automodus genutzt werden.
[code]
var i, player: integer;
pi: IPlaylistItem;
begin
if not CurrentPlaybackControl.GetAutomation then
begin
player := -1;
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if CurrentPlaybackControl.GetPlayer(i).GetState = PS_EMPTY then begin
player := i;
break;
end;
if (player = -1) then
SystemLog('Keinen freien Player gefunden.')
else begin
CurrentPlaybackControl.PlayerAutoLoad(player);
CurrentPlaybackControl.PlayerStart(player);
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if i <> player then CurrentPlaybackControl.PlayerFadeOut(i);
end;
end
else
CurrentPlaybackControl.AutomationNext;
end.[/code]
erst mal vielen Dank, dass du dir die Zeit genommen hast. Leider hilft mir dein Skript noch nicht so ganz. Es ist nämlich so, dass von meinen Playern A, B und C die ersten beiden automatisch beladen werden. Player C belade ich von Hand. Dein Skript beläd mir dann immer nur den dritten Player (weil der frei ist).
Ich hab hier noch mal meine Konfiguration zusammengefasst:
Ich habe eine Playlist mit 3 Playern:
Player A und B werden automatisch geladen, Player C von Hand
läuft Player A, so wird durch Drücken der Next-Taste Player A ausgeblendet und Player B startet
läuft nun Player B, so wird durch Drücken der Next-Taste Player B ausgeblendet und Player A startet
gleichzeitig muss das Skript die Reihenfolge berücksichtigen: angenommen, es läuft gerade kein Titel. Das nächste Element in der Playlist ist in Player B geladen. Dann darf über die Next-Taste nicht Player A gestartet werden, weil’s der erste ist, sondern Player B, weil dort das nächste Element in der Playlist geladen ist
Jetzt kommt Player C ins Spiel:
angenommen in Player A läuft ein Titel und Player B und C sind beide ebenfalls geladen. Jetzt prüft das Skript, welches Element das nächste in der Playlist ist und startet danach entweder Player B oder C (A wird ausgeblendet).
gleiches gilt, wenn in Player B ein Titel läuft und Player A und C beide geladen sind. Das Skript prüft, welcher Player das in der Playlist nächste Element enthält und startet dann entweder Player A oder C (B wird ausgeblendet).
läuft in Player C ein Titel, prüft das Skript, ob der nächste Titel in der Playlist in A oder B geladen ist und startet den entsprechenden Player (C fadet aus).
läuft gerade kein Titel und ist das nächste Element der Playlist in Player C geladen, so wird auch Player C durch Drücken der Next-Taste gestartet.
Ich gebe zu, dass diese Konfiguration relativ komplex ist und wahrscheinlich ein gutes Stück Denkarbeit dazu gehört, das in ein Skript zu fassen (falls es überhaupt möglich ist). Wäre trotzdem toll, wenn du da eine Lösung finden würdest!
Im Prinzip ja, aber die Next-Funktion soll die Faderstarter ja gerade überflüssig machen, damit während den Nachrichten nicht ständig die verschiedenen Fader betätigt werden müssen.
(DABiS arbeitet übrigens auch so ähnlich wie von mir oben beschrieben.)
Jetzt kommt Player C ins Spiel:
- angenommen in Player A läuft ein Titel und Player B und C sind beide ebenfalls geladen. Jetzt prüft das Skript, welches Element das nächste in der Playlist ist und startet danach entweder Player B oder C (A wird ausgeblendet).
- gleiches gilt, wenn in Player B ein Titel läuft und Player A und C beide geladen sind. Das Skript prüft, welcher Player das in der Playlist nächste Element enthält und startet dann entweder Player A oder C (B wird ausgeblendet).
- läuft in Player C ein Titel, prüft das Skript, ob der nächste Titel in der Playlist in A oder B geladen ist und startet den entsprechenden Player (C fadet aus).
- läuft gerade kein Titel und ist das nächste Element der Playlist in Player C geladen, so wird auch Player C durch Drücken der Next-Taste gestartet.
Sehe ich das richtig, dass sich diese Beschreibung folgendermaßen zusammenfassen lässt?
Es soll derjenige Player gestartet werden, dessen Element am weitesten oben in der Liste steht. Alle gerade laufenden Player werden ausgefadet.
Kleine Zwischenfrage: Wenn Du die Reihenfolge in der Playlist definieren würdest, könntest Du mit dem Script arbeiten. Der Player C wird dann zwar auch für andere Elemente verwendet, aber mit dem kann man leben. Du müsstest nur bei allen Playern die Option “Player automatisch laden” deaktivieren. Probier dies doch mal aus.
begin
player := -1;
item := -1;
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if (CurrentPlaybackControl.GetPlayer(i).GetState in [PS_LOADED, PS_PAUSED]) and
((item = -1) or (CurrentPlaylist.IndexOf(CurrentPlaybackControl.GetPlayer(i).GetItem) < item)) then begin
player := i;
item := CurrentPlaylist.IndexOf(CurrentPlaybackControl.GetPlayer(i).GetItem);
end;
if (player = -1) then
SystemLog(‘Keinen freien Player gefunden.’)
else begin
CurrentPlaybackControl.PlayerStart(player);
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if i <> player then CurrentPlaybackControl.PlayerFadeOut(i);
end;
end.[/code]
begin
player := -1;
item := -1;
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if ((CurrentPlaybackControl.GetPlayer(i).GetState = PS_LOADED) or
(CurrentPlaybackControl.GetPlayer(i).GetState = PS_PAUSED))
and
((item = -1) or
(CurrentPlaylist.IndexOf(CurrentPlaybackControl.GetPlayer(i).GetItem) < item)) then begin
player := i;
item := CurrentPlaylist.IndexOf(CurrentPlaybackControl.GetPlayer(i).GetItem);
end;
if (player = -1) then
SystemLog(‘Keinen freien Player gefunden.’)
else begin
CurrentPlaybackControl.PlayerStart(player);
for i := 0 to CurrentPlaybackControl.GetPlayerCount - 1 do
if i <> player then CurrentPlaybackControl.PlayerFadeOut(i);
end;
end.[/code]