Bug in Prozedur OnCartwallPlayerStart

Mir ist schon öfter aufgefallen, daß die Prozeduren OnPlayerStart, OnPlayerStop, OnCartwallPlayerStart und OnCartwallPlayerStop hin und wieder Laufzeitfehler erzeugen. Im Falle OnCartwallPlayerStart kann ich es jetzt nachvollziehen:

procedure OnCartwallPlayerStart(PlayerIndex: integer; Item: IAudioCartwallItem;
  PlaylistItem: IPlaylistItem; Duration: TTimeValue);                           // Wenn Cartplayer startet ...
begin
  { if NOT DHDCartTouch then                                                      // Nur wenn Regler nicht berührt ---
    DHDRemote(0).SendPacketRaw($11030000, $04, $00, $04, $00,                   
      $00, $00, $00, $01, $00); }                                                 // ... entspr. Regler auf
      SystemLog('trara!');
end;

Dieser an sich sehr übersichtliche Code erzeugt beim Starten folgenden Fehler:

|24.02.2026 08:37:29|Information|Hintergrund-Script C:\yyyyy\yyyyyy\yyyyyyy\yyyyyyyy.mls wurde geladen|
|---|---|---|
|24.02.2026 08:37:39|Playlist|Start: \\xxx\xxxx\xxxxxxxxx\xxxxxxxxxxxxxxxxx.mp3|
|24.02.2026 08:37:39|Information|trara!|
|24.02.2026 08:37:39|Fehler|Runtime error List index out of bounds (11).  TInterfaceList range is 0..10 in background script C:\yyyyy\yyyyyy\yyyyyyy\yyyyyyyy.mls, handling message: MSG_CARTPLAYERCONTROL_START 697F86FE051560FD ?|
|24.02.2026 08:37:43|Playlist|Stop: \\xxx\xxxx\xxxxxxxxx\xxxxxxxxxxxxxxxxx.mp3 (4 seconds)|

(Im übrigen auch ohne den fröhlichen Log-Eintrag. Der ist nur da, um zu zeigen, daß das Skript tatsächlich läuft.)

Version ist 8.0.5 Build 6030 unter Parallels auf Mac/Arm. (Ist aber auch unter Mac/Intel.) Ich kann mir nicht erklären, wo ich mit den paar Zeilen Code irgendeinen Listenwert überschritten haben soll, außer, es war mAirList selber. Könntet Ihr diesem Phänomen bitte nachgehen? Vielen Dank!

1 Like

Ich habe es weitergeleitet. Danke für Deine große Mühe!

Deine Prozedur OnCartwallPlayerStart hat eine falsche Signatur. Der Parameter Duration muss weg - den gibt es nur bei der OnCartwallPlayerStop (tatsächliche Spiellänge).

// Called when cart player is started
procedure OnCartwallPlayerStart(PlayerIndex: integer; Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem);
begin
end;

Leider ist die Script-Engine technisch nicht in der Lage, die Parameterliste auf Korrektheit zu überprüfen.

Was dann passiert: Die Engine übergibt drei Parameter (legt sie auf den Stack), der Code holt aber vier ab. Dadurch gerät der Speicher durcheinander, und es kommt zu den merkwürdigsten Fehlern.

2 Likes

Oha, dann lag es an meiner Blindheit. Vielen Dank! (Wahrscheinlich war es die Copy-and-paste-Falle. Sowas sehen immer nur Dritte.)