Codebeispiele mAirListScript

was mach ich da falsch?
[error] (41:41): Type missmatch
ohne 41, 42 & 47, 48 geht das script perfekt!

[code] if (n.GetNotificationType = ntMask) then
// we want to be notified when players start
SetNotificationTypes([ntPlayerStart])
else
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));
pi2 := CurrentPlaylist.GetItem(2);
pi3 := CurrentPlaylist.GetItem(3);
pi4 := CurrentPlaylist.GetItem(4);
pi5 := CurrentPlaylist.GetItem(5);

sl := TStringList.Create;
sl.Add('<?php');

sl.Add('$playa1="' + pi.GetArtist + '";');
sl.Add('$playb1="' + pi.GetTitle + '";');
sl.Add('$playc1="' + pi.GetDuration + '";');    #####das ist Zeile 41
sl.Add('$playd1="' + pi.GetStartTime + '";');

sl.Add('$playa2="' + pi2.GetArtist + '";');
sl.Add('$playb2="' + pi2.GetTitle + '";');
sl.Add('$playc2="' + pi2.GetDuration + '";');
sl.Add('$playd2="' + pi2.GetStartTime + '";');[/code]

GetDuration liefert den Wert als Zahl (int64) zurück (in Einheiten von 1/10,000,000 Sekunden), nicht als String. GetStartTime die Zeit als TDateTime (Delphi-eigenes Format: Tage seit dem 1.1… Du musst beides von Hand in einen String konvertieren. Zum Beispiel so:

Die Startzeit kannst du ganz einfach an FormatDateTime übergeben:

sl.Add('$playd1="' +FormatDateTime('hh:mm:ss', pi.GetStartTime)+ '";');

Die Laufzeit musst du vorher in einen TDateTime umwandeln. Das ist ein sehr kranker Delphi-Typ: Eine Fließkommazahl, die die Zeit in Tagen seit dem 30.12.1899 angibt. Das Datum ignorieren wir hier mal, und um die Länge in die richtige Einheit zu kriegen, müssen wir sie erst durch 10.000.000 teilen (dann haben wir Sekunden) und dann nochmal durch 246060. Danach können wir wieder FormatDateTime verwenden:

sl.Add('$playc1="' + FormatDateTime('hh:mm:ss', (pi.GetDuration/10000000)/(24*60*60)) + '";');

Torben

PS: Was mir an deinem Script noch auffällt: Du solltest überprüfen, ob die Playlist auch wirklich noch genügend Einträge hat, sonst gibt das GetItem(2) usw. eine Exception.

ist mir bewusst…

wie geht das mit GetStartTime ???

Vorher mit CurrentPlaylist.GetCount nachgucken.

sl.Add('$playc1="' + FormatDateTime('hh:mm:ss', (pi.GetStartTime/10000000)/(24*60*60)) + '";');

geht nicht…

Guck nochmal genau hin, was oben steht:

[code]sl.Add('$playd1="' +FormatDateTime('hh:mm:ss', pi.GetStartTime)+ '";');[/code]
Vorher mit CurrentPlaylist.GetCount nachgucken.

Wie meinst das?
wo soll ich das abfragen und wie?

Vorher mit CurrentPlaylist.GetCount nachgucken.

Wie meinst das?
wo soll ich das abfragen und wie?

Das war die Antwort auf die Frage “Wie überprüfe ich, ob noch genug Elemente in der Playlist sind?”.

Wie du die Startzeit ausgibst, hab ich dir explizit oben geschrieben und ein weiteres Mal zitiert.

Torben

Hallo!

hab eine ganz andere Frage:
Gibt es eine Möglichkeit, ein Script zu schreiben, mit dem man beim Drücken auf die PFL Taste eines Steuerbefehl (z.B. auf der Com Schnittstelle) anspricht, damit im Studio die Boxen umgeschalten werden.

Weiß nicht, ob das so klar ürber kam, was ich meinte. Das Endergebnis sollte sein:

Man drückt auf PFL (egal in welchem PLayer/Playlist/cart) und es wird ein Steuersignal geschickt, das eine Schaltung aspricht, die die Studioboxen auf die PFL Soundcard umschaltet. Das ganze sollte beim Beenden von PFL wieder zurück gehen.
Wichtig ist, dass man nur eine PFL Soundkarte dabei verwendet (dann wirds ja auch einfacher)

Danke!

Markus

Ja, das geht. Ein solches Script findest du im mAirList-Ordner, es heißt “IOWarriorPFLSwitch.mls” und verwendet den IO-Warrior zum Ausgeben der Umschaltsignale. Du müsstest in diesem Script also nur noch die IO-Warrior-Befehle durch das austauschen, was deiner Umschalthardware gerecht wird.

Wie gedenkst du das denn auf Hardware-Seite zu realisieren?

Torben

Hallo!

danke für die schnelle antwort.
ich denke an solch eine Lösung:
http://www.conrad.at/goto.php?artikel=967720
dahinter eben eine art weiche - habs aber noch nicht ganz durchgedacht.

Es ist halt eine sehr angenehme Art zu arbeiten, wenn die Boxen automatisch auf PFL umgeschaltet werden :slight_smile:

grüße

markus

Hallo TW

Hab eine Frage zu der Funktion “ComPort”

Hab die Funktion und Methoden so verstanden:
ComPort.SetParameters()
setzt Parameter wie z.B. Baud Rate usw

ComPort.Open()
    öffnet einen Com Port (z.B. 9 für USB - wobei ich nicht weiß, ob USB so funkt wie seriell)
ComPort.SendStr()
     kann ich hier nun einen Befehl schicken (und zwar so einen wie ich ihn in der Referenz der IO Karte finde)?

Weiß nicht, ob ich das so verstanden hab, aber diese Funktion mit den Methoden müsste doch das obige Problem lösen können

grüße

markus

Soweit alles richtig. SendStr erwartet einen String (z.b. SendStr(‘hallo’)), du kannst aber natürlich auch beliebige Bytes rüberschicken, das geht in Pascal so:

SendStr(#12 + #5 + #77);

sendet die Bytes 12, 5, und 77 (huch, mein Geburtstdatum!)

Die Routinen können Prinzipiell alle Schnittstellen ansprechen, die in der Systemsteuerung sichtbar sind. Dazu zählen auch USB-Seriell-Wandler, wenn die sich da brav eintragen.

Was hast du denn da für eine Karte? Normalerweise bringen USB-Relaiskarten nämlich ihre eigenen Treiber mit und stellen keine emulierte serielle Schnittstelle zur Verfügung.

Torben

haben tu ich noch keine, ich überleg mir nur eine zu kaufen…

entweder die:
http://www.conrad.at/goto.php?artikel=967720
Die hat nur das Problem sie schaltet um, dafür hätt ich glaub ich schon die anweisung zuammen (so stehts zu mindest in der anleitung bzw. so les ichs raus)

procedure OnPFLOn(PlayerControl: IPlayerControl; Item: IPlaylistItem; PFLCount: integer);
begin
if PFLCount = 1 then
ComPort.SetParameters(19200, 8, “0”, 1);
ComPort.Open(1);
ComPort.SendStr(“3012”);
end;

Problem bei dieser Karte ist, dass die die Relais nur umschaltet und nicht ein oder aus - die Kontrolle ist nicht wirklich da

anders ists dann bei dieser:
http://www.conrad.at/goto.php?artikel=190989

Da sieht die Programmierung wieder etwas komplizierter aus.

es geht mir ja wieder um das alte spiel - muting bei pfl.

wobei ich bin schon am überlegen, ob ich nicht einfach doch den io warrior nehme. denn meine “joystick steuerung” spinnt ein wenig. manchmal reagiert das mairlist nicht mehr auf die buttons - das liegt ja wohl nicht daran, dass ich den selben controller 3 mal habe (natürlich physisch 3 mal - sprich 3 mal das selbe game poad gekauft und herum gekötet) um 18 buttons anzusprechen.

grüße

markus

Ich glaube, letztgenannte ist die Karte, die RG hatte, und die so ewig zum Umschalten brauchte.

ja das hab ich auch schon gehört - hmm ist echt schwierig - naja offenbar scheint der io warrior am geeignetsten - ist halt leider eine recht teure angelegenheit

hallo torben,

was hältst du von dieser karte?

http://cgi.ebay.at/Relaiskarte-PC-RS232-seriell-6-bis-20x-10A-250V-1xUM_W0QQitemZ300079024086QQihZ020QQcategoryZ10662QQssPageNameZWDVWQQrdZ1QQcmdZViewItem

grüße

markus

bin für diese…

http://www.conrad.at/goto.php?artikel=198196

die hab ich bereits ;))

da gibts lt. beschreibung auch was für delphi

interessant und hast du sie schon mit mairlist getestet?

markus

nö… aber mit ner software von bksoft…
läuft perfekt…

wenn die noch mairlist ansteuern könnt wärs super…