mAirList steuert DHD

Hallo,

ich weiß nicht, ob es schonmal so einen Thread gab - ich habe zumindest über Google nichts gefunden.

Ich möchte von mAirList ein Signal an DHD schicken, so dass z.B. die Hotstart-Buttons ausgehen, sobald ein Titel im Assist-Modus bei Playern und Cartwall beendet ist (Cue-Out erreicht).
Wie genau heißt denn die Option, unter der ich das konfigurieren kann? Ist das SAS?

Hat da jemand ein Beispiel, eine Anleitung / Tipp?

Nachtrag:

Folgendes Szenario möchte ich realisieren: Im Assist-Modus bleiben die Kanäle der Ausspielstrecken (Player und Cartwall) aktiviert, wenn das Lied beendet und ausgeworfen wurde. Also der Hot-Start Button am DHD-Pult unterhalb des Faders leuchtet weiterhin rot, aber es müsste ja eigentlich so sein, dass dieser wieder deaktiviert / ausgemacht wird, sobald ein Lied im Player ausgespielt hat, oder?

So kenne ich das zumindest von anderen Radiostudios. Nun meine Frage: Was muss ich in mAirList drücken, um das zu realisieren. Ich hab den Code für die Kanalzüge und weiß, wie der Button angesteuert wird, aber nicht, wie ich von mAirList etwas an DHD schicken kann.
Hat jemand einen Tipp?

Also grundsätzlich kann mAirList Logik-Kommandos an das Pult senden, per Script:

begin
  RM4200DRemote(0).SetLogic(123, true);
  RM4200DRemote(0).SetLogic(456, false);
end.

Die Logik-Adressen müssen dann natürlich im Pult mit den entsprechenden Aktionen (Kanal aus) verknüpft sein bzw. die korrekten Logik-Adressen bekannt sein.

Um das dann “automatisch” ausführen zu lassen, braucht man ein Notification Script, das auf OnPlayerStateChange reagiert:

// Called when (playlist) player changes its state
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
  if (Playlist = 0) and (Player = 0) and (NewState = psEmpty) then
    RM4200DRemote(0).SetLogic(123, true);
  // usw.
end;

begin
end.

Ob mAirList den Kanal selbst ausschalten muss, darüber lässt sich streiten. Ich persönlich bevorzuge eine andere Variante: Ich schalte die Option “Automatisch schließen bei EOF im Assist-Modus” aus. Dann bleibt der Player im EOF-Modus stehen, bis der Moderator den Kanal wirklich ausschaltet. So kann man auch den Titel des gerade abgelaufenen Liedes noch ablesen und ggf. abmoderieren.

Ist aber Geschmackssache.

Danke für die Info, das hilft mir sehr. Dasa EOF-Verfahren dürfte reichen. Gibt es das auch für die Cartwall oder wie ist das hier gedacht?

Für die Cartwall nutzt man:

// Called when cart player changes its state
procedure OnCartPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
end;

Danke, aber eine Art EOF-Verfahren gibt es nicht?

Es gibt psEOF als State, der sollte kurz erscheinen, bevor der Player sich dann (je nach Einstellungen) entlädt.

Wo finde ich denn in den Settings diesen psEOF State oder wie kann ich ihn ansteuern?

Na innerhalb des Scripts so wie in Antwort #2 gezeigt.

Die Prozedur OnPlayerStateChange wird immer dann aufgerufen, wenn ein Player seinen Zustand ändert, und als Parameter werden Nummer der Playlist (beginnend mit 0), Nummer des Players (beginnend mit 0), der alte Zustand und der neue Zustand übergeben.

Dann kann man anfangen zu programmieren, was bei bestimmten Zustandswechseln passieren soll.

Danke, wo genau werden diese Skripte in den Einstellungen eingefügt?

Unter dem Punkt “Benachrichtigungs-Scripts”.

Danke, ich habe mir nun für Cartwall und Player ein Skript gebaut, leider scheint es falsch zu sein. Wo liegt der Fehler?

[code]// Called when (playlist) player changes its state
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
if (Playlist = 0) and (Player = 0) and (NewState = psEmpty) then
RM4200DRemote(0).SetLogic(149, false);
// usw.
if ((Playlist = 0) and (Player = 1) and (NewState = psEmpty) then
RM4200DRemote(0).SetLogic(152, false);
end;

// Called when cart player changes its state
procedure OnCartPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
if (Playlist = 0) and (Player = 0) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(132, false);
// usw.
if ((Playlist = 0) and (Player = 1) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(155, false);
if ((Playlist = 0) and (Player = 2) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(163, false);
end;

begin
end.[/code]

Ich vermute, du erhälst (im Systemprotokoll) eine Fehlermeldung “Unknown identifier: Playlist” oder so ähnlich?

Es wäre gut, wenn du die Fehlermeldung jeweils mit angeben könntest, dann muss ich nicht raten :wink: Tipp: Doppelklick auf Statusleiste, es öffnet sich das Systemprotokoll, hier kann man Einträge mit Strg+C als Text kopieren!

Vorhandene Parameter und ihre Namen überprüfen!

  • In OnPlayerStateChange: “PlaylistIndex” statt “Playlist”, “PlayerIndex” statt “Player”

  • In OnCartPlayerStateChange: Hier gibt es keinen Parameter “Playlist” bzw. “PlaylistIndex” - den ersten Teil der if-Bedingung kannst du also streichen: if (Player = 0) then…

Sorry, danke für die Info. Nun kommt keine Fehlermeldung mehr, sondern Skript wurde geladen. Hab alles verbessert, allerdings bewirkt das Skript keine Aktion am DHD.

[code]// Called when (playlist) player changes its state
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
if (PlaylistIndex = 0) and (PlayerIndex = 0) and (NewState = psEmpty) then
RM4200DRemote(0).SetLogic(149, false);
// usw.
if (PlaylistIndex = 0) and (PlayerIndex = 1) and (NewState = psEmpty) then
RM4200DRemote(0).SetLogic(152, false);
end;
// Called when cart player changes its state
procedure OnCartPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
begin
if (PlayerIndex = 0) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(132, false);
// usw.
if (PlayerIndex = 1) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(155, false);
if (PlayerIndex = 2) and (NewState = psEOF) then
RM4200DRemote(0).SetLogic(163, false);
end;

begin
end.[/code]

Ich muss den Befehl false nehmen, wenn die Lampe ausgehen soll, richtig?

Genau, false setzt die Logik wieder auf aus.

Ich habe allerdings absolut keine Ahnung, welche Logikadressen welche Dinge im Pult bewirken. Das musst du selbst ausprobieren.

Am besten machst du dir dafür ein kleines Script “test.mls” mit dem folgenden Inhalt:

begin
  RM4200DRemote(0).SetLogic(149, false);
end.

Dies ist jetzt kein “Benachrichtungs-Script”, das im Hintergrund läuft (und in der Konfiguration registriert wird). Stattdessen musst du es manuell über “Öffnen (Pfeil neben Öffnen-Button) -> Script ausführen” starten.

In dem Script kannst du jetzt mit den Adressen und Werten experimentieren, bis du die passende Kombination gefunden hast.

Danke, wie sieht das eigentlich mit der Unterscheidung zwischen AUTO und ASSIST aus bei diesen Skripten? Muss diese extra einprogrammiert werden?

Ja, muss extra abgefragt werden. Mit CurrentPlaylist.GetAutomation.

Willst du z.B., dass die Scripts nur dann arbeiten, wenn man im ASSIST-Modus ist, dann fügst du folgende Zeile jeweils am Anfang der Prozeduren, nach dem begin, ein:

if CurrentPlaylist.GetAutomation then exit;