"ON AIR Schalter" soll auf Verbindungsabbruch reagieren

Hmm…

Ich hatte da so die schräge Idee, dieses Skript bzw. die Funktionalität mit dem hier zu ersetzen, aber: Das Skript wird erfolgreich geladen, die Anklick-Funktionen (s. u.) klappen, aber es ändert sich farbentechnisch nichts.

Mein Weg:
Ich habe einen statischen Text namens SIGNAL.ENC (als Anklick-Aktion wird der Encoder gestartet/getrennt) sowie das Skript als *.mls abgespeichert und natürlich dann als Background-Script laufen. Es ist nur ein Encoder eingerichtet bei mir. Hab ich etwas vergessen?

@UliNobbe : Kann wohl auch in die Skript-Ecke verschoben werden, denke ich… :wink:

Ich krieg dieses Script nicht richtig zum laufen. Leider auch keine Fehlermeldung, deshalb bin ich etwas ratlos.

Ich habe:

  • Einen Statischen Text mit der Fernsteuerungs-ID “SIGNAL.ENC”. Den kann ich auch per Kommando erreichen (über die Fernsteuerungskonsole kann ich den umfärben und so)
  • Das Script als Hintergrundscript gestartet
  • Bekomme beim Start einen grünen Button, weil der Encoder sich erfolgreich verbunden hat

Wenn ich jetzt aber meinen VPN Kanal zum Icecast-Server trenne um einen Ausfall zu simulieren, geht der Encoder-Status von Online (1/1) auf Verbinde… (0/1) aber meine SIGNAL.ENC Anzeige bleibt grün. Sollte sie nicht gelb werden?
Wenn ich den Encoder manuell trenne, wird die Anzeige rot.

Keine Fehlermeldung, weil alles so läuft wie vorgesehen:

Wie gesagt:

Du betreibst nur einen einzigen Encoder. Trennst Du ihn (indem Du das Häkchen entfernst), sind also alle getrennt, die Anzeige leuchtet rot.

Korrekt, denn die Anzeige reagiert auf vollständige Trennung („disconnected“). Klaust Du des Encoders Verbindung, so will er sich möglichst schnell wiederaufschalten, der Zustand ist also ein anderer („connecting“).

Ersetze die Zeile

else if (NewState = ecsDisconnected) AND (OldState = ecsConnected) then

durch

else if ((NewState = ecsDisconnected) OR (NewState = ecsConnecting)) 
  AND (OldState = ecsConnected)) then

Dann funktioniert es auch für Deine Anforderung. (Was in der Praxis ja auch sinnvoll ist. Das obige Skript war eher ein Beispiel für die Funktionalität der Prozedur.)

2 Likes

Moin!

Ich bekomme folgenden Fehler:

19.07.2021 09:45:47 Fehler       Fehler beim Laden des Hintergrund-Scripts D:\mAirList\scripts\Signal.mls: [Error] (32:32): 'THEN' expected

Das Skript sieht bei mir so aus:

const
  BUTTONNAME = 'SIGNAL.ENC';

var
  Count: integer;
  EncoderState: Array of integer;

procedure OnLoad; 
var
  i: integer;
begin
  Count := Encoder.GetConnections.GetCount;
  SetLength(EncoderState, Count);
  for i := 0 to Count - 1 do
  begin
    if Encoder.GetConnections.GetItem(i).GetState = ecsConnected then
      EncoderState[i] := 1
    else
      EncoderState[i] := 0;
  end;
end;

procedure OnEncoderConnectionStateChange(Connection: IEncoderConnection; 
  OldState, NewState: TEncoderConnectionState);
var
  i, c: integer;
begin
  i := Encoder.GetConnections.IndexOf(Connection);
  if NewState = ecsConnected then
    EncoderState[i] := 1
  else if ((NewState = ecsDisconnected) OR (NewState = ecsConnecting)) 
  AND (OldState = ecsConnected)) then
    EncoderState[i] := 0;
  c := 0;
  Encoder.GetConnections.BeginRead;
  try
    for i := 0 to Count - 1 do
      c := c + EncoderState[i];
    if c = 0 then
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #FF0000')
    else if c = Count then
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #00FF00')
    else
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #FFFF00');
  finally
    Encoder.GetConnections.EndRead;
  end;
end;

begin
end.

Nebenbei noch eine Frage: Ich würde gerne auch den Button-Text dem Zustand entsprechend anpassen, im Moment erschliesst sich mir nämlich nicht, ob das Skript dieses tut…

Mit einem erweiterten Button vielleicht? Mal prüfen, ob und wie das ginge.

Grübel, grübel… Ich rieche ein Cross-Posting (von mir selbst), denn im Prinzip macht dieses hier ja genau das, was ich/wir wollen…

Wenn sich das hektische Blinken bei Verbindungsabbruch noch realisieren liesse und vielleicht auch das Polling durch die neue Funktion

// Called when the state of an encoder connection changes
procedure OnEncoderConnectionStateChange(Connection: IEncoderConnection; OldState, NewState: TEncoderConnectionState);
begin
end;

ersetzen lässt, wäre das Skript, zumindest für alle die nur einen Encoder verwenden wie ich, glaube ich genau richtig und wohl dann auch recht elegant.

To do:

  • Bildschirmobjekt “Statischer Text”, Aktion beim Anklicken “Encoder connect/disconnect”, Fernsteuerungs-ID “ONAIRPRG”
  • Background-Skript (noch ohne die genannten Wünsche):
procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
    if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
      ExecuteCommand('ONAIRPRG TEXT ON AIR');
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      end	
    else if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
      ExecuteCommand('ONAIRPRG TEXT !OFF AIR!');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
      Sleep(1000);
      end  
    else begin
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #00FF00');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      ExecuteCommand('ONAIRPRG TEXT EDIT');
   end;
  end;

begin
end.

Das funktioniert so schon einmal. Die zusätzlichen Funktionen bzw. Änderungen einzubauen übersteigt dann doch bei weitem meine Fähigkeiten und ich wäre seeehr dankbar für Hilfe… :wink:

Schönen Wochenstart!

Sollte eigentlich wurscht sein, aber schreibe mal

else if ((NewState = ecsDisconnected) OR (NewState = ecsConnecting)) AND (OldState = ecsConnected)) then

in eine einzige Zeile.

@Tondose:

Funktioniert leider nicht:

19.07.2021 13:02:10 Fehler       Fehler beim Laden des Hintergrund-Scripts D:\mAirList\scripts\Signal.mls: [Error] (31:101): 'THEN' expected

Irgendwo ist ein Knoten…

Oh, da scheint eine Klammer zuviel. Probiere:

else if ((NewState = ecsDisconnected) OR (NewState = ecsConnecting)) AND (OldState = ecsConnected) then

Grmbl, wenn mal mal nicht am Ausprobierrechner sitzt …

1 Like

Danke @Tondose , nu’ geht’s!
Irgendwie muss ich jetzt noch die Texte zustandsbedingt verändern, also während des Verbindens als Anzeige “verbinde…”, “On AIr” & “Offline” oder ähnliches… Ich bastele mal… :wink:

Das machst Du, indem Du, wie beim zweiten, dem pollenden Skript, die Befehle jeweils in begin und end einpackst. Bzw. end;. Aber: keine Semikola vor else!

Sodele, hab’s zu 90% hinbekommen! Das einzige, was nicht funktioniert, ist der Wechsel auf Gelb (miit entsprechendem Text), wenn ich dem Rechner die Internetverbindung kurz klaue zum Testen, da springt die Anzeige dann nur auf (in meinem Fall) Farbe Grün und Text “EDIT”.

const
  BUTTONNAME = 'SIGNAL.ENC';

var
  Count: integer;
  EncoderState: Array of integer;

procedure OnLoad; 
var
  i: integer;
begin
  Count := Encoder.GetConnections.GetCount;
  SetLength(EncoderState, Count);
  for i := 0 to Count - 1 do
  begin
    if Encoder.GetConnections.GetItem(i).GetState = ecsConnected then
      EncoderState[i] := 1
    else
      EncoderState[i] := 0;
  end;
end;

procedure OnEncoderConnectionStateChange(Connection: IEncoderConnection; 
  OldState, NewState: TEncoderConnectionState);
var
  i, c: integer;
begin
  i := Encoder.GetConnections.IndexOf(Connection);
  if NewState = ecsConnected then
    EncoderState[i] := 1
 else if ((NewState = ecsDisconnected) OR (NewState = ecsConnecting)) 
  AND (OldState = ecsConnected) then
    EncoderState[i] := 0;
  c := 0;
  Encoder.GetConnections.BeginRead;
  try
    for i := 0 to Count - 1 do
      c := c + EncoderState[i];
    if c = 0 then begin
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #00FF00');
	  ExecuteCommand(BUTTONNAME + ' TEXT EDIT');
	  end
    else if c = Count then begin
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #FF000000');
	  ExecuteCommand(BUTTONNAME + ' TEXT ON AIR');
	  end
    else begin
      ExecuteCommand(BUTTONNAME + ' BACKGROUNDCOLOR #FFFF00');
	  ExecuteCommand(BUTTONNAME + ' TEXT !Verbinde...!');
	  end;
  finally
    Encoder.GetConnections.EndRead;
  end;
end;

begin
end.

Hab’ ich was falsch gemacht?

Na ja, dafür ist das Skript nicht gedacht gewesen. Es zeigt gelb, wenn von mehreren Verbindungen eine oder mehrere

abk*ckt. Ich dachte, ich hätte das erwähnt. Wenn Du die Zustände als solche unterscheiden willst, dann mußt Du für jeden eine Bedingung formulieren:

if NewState = ecsConnected then
begin
  // mach was
  // mach noch was
end
else if NewState = ecsConnecting then
begin
  // mach was anderes
  // mach noch was anderes
end;

1 Like

Ich bin so selten dämlich… Ich hab echt die ganze Zeit in der Birne ausgeblendet, das dieses Skript ja für mehrere Streams ausgelegt ist.

Von daher reicht dieses hier ja vollkommen für mich aus und macht - bis auf das bereits erwähnte Blinken - was es soll.

Vielen Dank für deine Mühe, TSD!!!

1 Like

Moin!
entstaub

Ich komme mal zurück auf das Skript von @Tondose in #33.
Irgendwie verweigert es bei mir die volle Funktionalität und ich krieg’s grad’ nicht auf die Reihe.

Also…

  • In v7.1 wird es nie grün, egal, ob ich nur einen oder mehrere Encoder angehakt habe.
    Wenn zwei von zwei Encodern verbunden sind, bleibt alles gelb.

  • In v6.3 verhält es sich ebenso.

Übrigens wäre es hilfreich, wenn der Status des Encoders gleich zu Beginn abgefragt und entsprechend im statischen Text angezeigt würde.
Falls es das tun soll: Bei mir nicht, sorry.

Wo ist jetzt der Fehler?

@Myka:
Streng genommen muss ich - aktuell - ja auch nur einen Encoder abfragen, nämlich den produktiven Livestream (die Aufzeichnung in Datei funktioniert ja sowieso).
Wie gut klappt das bei dir? Rückmeldung und ggf. Austausch zwecks Ausbau meines Systems wäre erfreulich.

Ich war zwar nicht angesprochen, aber ich schaue mir das heute nachmittag oder gegen abend auch nochmal an.

Halt, Stop. Kann ich gar nicht mangels Streamserver… :open_mouth:

Doch, durchaus:

 

Sollte “Aufzeichnung in Datei” etwa nicht als Encoder gelten?
Das würde einiges erklären…

Sorry, hatte erst eine Tasse Kaffee… :smiley:

Ich kann’s nicht testen, da ich schon seit einer Weile keinen Server mehr habe… Zuletzt noch vor V7, und soweit ich mich erinnerte, lief es da auch noch… Dementsprechend habe ich sowohl Skript als auch das Screenobject wieder entfernt (und idiotischerweise die Skriptdatei nicht gesichert…).

Ich schaue mal, ob ich einen kostenlosen Streamserver zum Testen auftreiben kann und berichte dann, ob ich es wieder hinbekommen habe.

Kann aber dauern, Wochenende und so… Montag ist da eher wahrscheinlich, von daher; patience, please :smiley:

1 Like

Stimmt eigentlich… sofern ich das richtig verstanden habe… grübel

… und dann noch den integrierten Streaming-Server, die lokale Audio-Ausgabe… sie alle connecten.
Zumindest im Encoder-Status wird mir da 2/2 angezeigt, und es würde mich doch wundern, wenn das Script sich da sperren würde.