Ansteuerung des OnAirScreen

Hatte ich schon mal erwähnt, dass die Suchfunktion in diesem Forum Weltlkasse ist? Ich glaube diesen Monat noch nicht.

Ich habe diesen alten Thread ausgeraben: Codebeispiele mAirListScript
und daraus das OnAirScreen Script etwas erweitert.

const
  iMax = 5;                                        // Hier die maximale Senderanzahl einsetzen
  IP = '192.168.51.103';                           // <-- IP-Adresse
  PORT = '3310';                                   // <-- Port
  PATH = 'C:\ProgramData\mAirList\6.1\sfk174.exe'; // <-- Pfad
  
var
  sl: TStringList;
  pi: IPlaylistItem;
  idx, c, i: integer;
  EncoderState: array[0 .. iMax] of integer;  

  

procedure PostOnAirScreen(Befehl: string);
begin
  ShellExecuteHidden (PATH, 'udpsend ' + IP + Chr(32) + PORT + Chr(32) + Chr(34) + Befehl + Chr(34) + Chr(32) + '-quiet');
  //ShellExecute (PATH, 'udpsend ' + IP + Chr(32) + PORT + Chr(32) + Chr(34) + Befehl + Chr(34));
end;

procedure OnLoad;
begin
  // Eigentlich muss das nicht mal bei jedem Ladevorgang neu passieren aber so sind wir sicher, dass da keiner was verfummelt hat 
  // und man kann relativ komfortabel die Konfiguration anpassen ohne dass man an die eigentliche Anzeige ran muss
  PostOnAirScreen('CONF:LED2:autoflash=True'); // Diese Anzeige soll blinken, blinkede Anzeigen sehen immer wichtig aus.
  PostOnAirScreen('CONF:LED2:text=EOF'); // Auf dem Button soll EOF stehen.
  PostOnAirScreen('CONF:CONF:APPLY=TRUE'); 
  PostOnAirScreen('LED1:OFF');
  PostOnAirScreen('LED2:OFF');
  PostOnAirScreen('LED3:OFF');
  PostOnAirScreen('LED4:OFF');
  PostOnAirScreen('AIR4:OFF');
  PostOnAirScreen('AIR4:RESET');
  
end;

procedure OnRuntimeDataChange(Key, Value: string);
begin
  if Key = 'EncoderStatus' then begin
    if Value = ('false') then begin
	  PostOnAirScreen('AIR4:OFF');
      PostOnAirScreen('AIR4:RESET');
	  end
	else begin
	  PostOnAirScreen('AIR4:ON');
	  end;
	end
  else if Key = 'GamepadStatus' then begin
    PostOnAirScreen(Value);
	end
  else if Key = 'EncoderError' then begin
    PostOnAirScreen(Value);
	end;
end;

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);

begin
  idx := CurrentPlaylist.IndexOf(item);
  if idx = -1 then begin
    SystemLog('Das war kein Element aus unserer Playlist ...');
    exit;
  end;

  sl := TStringList.Create;
  c := 0;                                                                                                       
  while (idx < CurrentPlaylist.GetCount) and (c < 2) do begin
    pi := CurrentPlaylist.GetItem(idx);
    sl.Add(pi.GetArtist + Chr(32) + '-' + Chr(32) + pi.GetTitle );
    c := c + 1;
    idx := idx + 1;
  end;
  PostOnAirScreen('NOW:' + sl[0] );
  PostOnAirScreen('NEXT:' + sl[1] );
  sl.Free;
end;

procedure OnOnAir;
begin
  PostOnAirScreen('LED1:ON');
end;

procedure OnOffAir;
begin
  PostOnAirScreen('LED1:OFF');
end;

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);
begin
  PostOnAirScreen('LED2:ON');
end;

//procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
  PostOnAirScreen('LED2:OFF');
end;

procedure OnShutdown; // Sollte den Rechner mit den OnAirScreen herunterfahren, funktioniert bisher aber nicht.
begin
  PostOnAirScreen('CMD:SHUTDOWN');
end;


begin
end.

Wir haben nun den laufenden Titel und den folgenden Titel gelistet. Müsste man ggf. noch Typfilter einbauen und die Länge begrenzen. Für mich funktioniert das so aber erst mal.

EDIT: Oben war noch ein Copy & Paste Fehler drin.

1 Like

Hi,
da ich null Ahnung vom Coden habe frage ich jetzt einfach mal. Wie genau ist es jetzt möglich den OnAirScreen mit mAirList zu verbinden? Wo packe ich die Scipts hin? Ich steige da einfach nicht dahinter…

LG Gregor

Moin Gregor,
ich war der Meinung, dass in einem der alten Handbücher mehr über die Scripts steht, das ist aber nicht so. Ich werde dazu demnächst mal den Scripting-Kurs von @Tondose erweitern, hier im Forum.

In aller Kürze:
Es gibt im Prinzip 2 Script Typen. Scripts die man aus der Oberfläche von mAirlist heraus ausführt, also über das Menü oder beim starten eines (Audio)Elementes, dass ein Script hinterlegt hat oder beim laden einer Playliste und es gibt noch ein paar weitere Stellen, an denen man gezielt auf ein Script verweist.

Die 2. Variante sind Hintergrundscripte oder früher hießen sie mal Notification-Scripts. Diese werden in einem zentralen Bereich der mAirlist Konfiguration definiert.


Das Verzeichnis, was ich hier gewählt habe um die Scripte zu speichern ist nicht unbedingt die beste Wahl, also nimm das bitte nicht als Vorbild, dazu später mehr.

Diese Scripte laufen, wie der Name vermuten lässt, immer im Hintergrund mit und warten auf gewisse Trigger um etwas auszuführen. Welche Trigger das sind und was dann ausgeführt wird, definierst Du innerhalb des Scriptes. Gerade wenn man noch daran schraubt, ist der Haken “Automatisches neu laden, wenn die Datei sich geändert hat”, Gold wert. So kannst Du Dein Hintergrundscript nämlich während mAirlist läuft, in einem Editor bearbeiten und es wird neu eingelesen, wenn Du es dort gespeichert hast. Sobald dann alles läuft kann man diesen Haken eigentlich raus nehmen und etwas Ressourcen sparen.

Also, wo muss das jetzt hin?
Das spielt genau genommen, keine Rolle, Du musst nur wissen wo Du Deine Sctipt Dateien gespeichert hast und der Windows User, mit dem Du mAirlist ausführst muss natürlich Zugriff darauf haben.
Ein dedizierter mAirlist Ordner unter eigene Dateien, wäre z.B. eine Möglichkeit. Etwa so wie bei der mAirlist DB, im Lokalen Modus. Die DB Datei hast Du ja auch irgendwo abgelegt.

Dann musst Du also nur noch Deine Script Dateien hier eintragen und dann laufen die los.
Im Script musst Du natürlich Die “PATH” Variable anpassen, auf den Verzeichnispfad wo du die "Swiss army Knife.exe hingelegt hast.

sorry dass ich dieses thema wieder öffne bei mir klappt das nicht kann mir jemand helfen vielleicht hat sich da was geändert

Hey @shorty.xs,
könntest du mich mal privat anschreiben?

Beste Grüße

@FlorianG, zur Zeit sind meine Ressourcen für kostenpflichtigen mAirlist Support/ Systmadministration, leider ausgerizt. Wenn ich hier neue Möglichkeiten habe, werde ich das hier gerne kun tuen.

Ansonsten bitte einfach hier den Faden weiterühren, dann haben andre vielleicht auch etwas davon. Gelegentlich schaue ich hier im Forum vorbei.

Ich muss dieses alte Thema noch mal hoch holen mit einer Frage.
Die ansteuerung erfolgt ja hier mit einem externen Tool. Kann ich nicht aus dem Script heraus direkt einen UDP Befehl absetzen?
mAirlist Home-Studio?

Wenn ja wie sähe das dann aus?

1 Like

Here an example of what we are using here.

const
  iMax = 2;                                        
  IP = '10.0.0.7';                          
  PORT = '3310';                                  
  PATH = 'C:\sfk174.exe'; 
  
var
  sl: TStringList;
  pi: IPlaylistItem;
  idx, c, i: integer;
  EncoderState: array[0 .. iMax] of integer;  


procedure PostOnAirScreen(Command: string);
begin
  ShellExecuteHidden (PATH, 'udpsend ' + IP + Chr(32) + PORT + Chr(32) + Chr(34) + Command + Chr(34) + Chr(32) + '-quiet');
 end;

procedure OnLoad;
begin
end;

procedure OnRuntimeDataChange(Key, Value: string);
begin
  if Key = 'EncoderStatus' then begin
    if Value = ('false') then begin
	  PostOnAirScreen('AIR4:OFF');
      PostOnAirScreen('AIR4:RESET');
	  end
	else begin
	  PostOnAirScreen('AIR4:ON');
	  end;
	end
  else if Key = 'GamepadStatus' then begin
    PostOnAirScreen(Value);
	end
  else if Key = 'EncoderError' then begin
    PostOnAirScreen(Value);
	end;
end;


procedure OnExecuteCommand(Command: string);
begin
  if Command = 'TALKTIMER START' then begin
    PostOnAirScreen('AIR1:ON');
	end
	else begin
	PostOnAirScreen('AIR1:OFF');
end;
   if Command = 'PHONE ON' then begin
    PostOnAirScreen('AIR2:ON');
	end;
	if Command = 'PHONE OFF' then begin
    PostOnAirScreen('AIR2:OFF');
end;
end;


procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);

begin
  idx := CurrentPlaylist.IndexOf(item);
  if idx = -1 then begin
    SystemLog('Niets in de Playlist ...');
    exit;
  end;
  
  sl := TStringList.Create;
  c := 0;                                                                                                       
  while (idx < CurrentPlaylist.GetCount) and (c < 2) do begin
    pi := CurrentPlaylist.GetItem(idx);
    sl.Add(pi.GetArtist + Chr(32) + '-' + Chr(32) + pi.GetTitle );
    c := c + 1;
    idx := idx + 1;
  end;
  if (Item.GetItemType = pitMusic) OR

    (Item.GetItemType = pitDummy) OR

    (Item.GetItemType = pitNews) then  
  PostOnAirScreen('NOW:' + sl[0] );
 sl.Free;
end;

procedure OnOnAir;
begin
  PostOnAirScreen('LED1:ON');

end;

procedure OnOffAir;
begin
  PostOnAirScreen('LED1:OFF');
end;

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);
begin
  PostOnAirScreen('LED2:ON');
end;

procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
  PostOnAirScreen('LED2:OFF');
end;

begin
end.