Hallo Community, hallo Torben,
seit meiner Umstellung auf das neue mAirList 6.x funktioniert das folgende Script nicht mehr und eine Ausführung ist nicht mehr möglich. Das Problem konnte im Bereich [tt]if LevelInfo.GetLevels(Levels) then[/tt] lokalisiert werden. Hat jemand eine Lösung?
procedure OnTimer;
var
Levels: TLevelArray;
NewLevelLeft, NewLevelRight: Single;
begin
if LevelInfo.GetLevels(Levels) then
begin
if CurrentLevelLeft > -200 then CurrentLevelLeft := CurrentLevelLeft - 1.5;
if CurrentLevelRight > -200 then CurrentLevelRight := CurrentLevelRight - 1.5;
NewLevelLeft := Trunc(Levels[0] * 15);
NewLevelRight := Trunc(Levels[1] * 15);
if NewLevelLeft > CurrentLevelLeft then CurrentLevelLeft := NewLevelLeft;
if NewLevelRight > CurrentLevelRight then CurrentLevelRight := NewLevelRight;
MidiOut(MM1, 180, 80, 48 + Trunc(CurrentLevelLeft));
MidiOut(MM1, 180, 81, 48 + Trunc(CurrentLevelRight));
end;
end;
LG Holger
In mAirList 6 ist GetLevels nun anders deklariert:
ILevelInfo = interface(IObservable) ['{DC19434C-BAA8-4DFE-9433-82B89BE6BDE1}']
procedure GetLevels(var oLevels: TLevelArray);
end;
Ist also keine Funktion mehr, die true oder false zurückgibt, sondern lediglich eine Prozedur, die ein Array zurückliefert.
Um festzustellen, ob gültige Werte ermittelt werden konnten, überprüft man nun einfach die Länge des Arrays. In deinem Fall solltest du kontrollieren, ob die Werte für mindestens zwei Kanäle (stereo) zurückgeliefert wurden:
LevelInfo.GetLevels(Levels);
if length(Levels) >= 2 then begin
// ... wie gehabt
end;
Die Anzahl der Kanäle kann tatsächlich variieren. Wenn der Player leer ist, sind es 0. Bei Mono-Inhalten ist es 1 Kanal. Der Encoder hat noch viel mehr Kanäle, wenn er mit Regionalisierung betrieben wird.
Damit du auch Mono-Dateien richtig handhaben kannst, könntest du das Script noch wie folgt erweitern:
LevelInfo.GetLevels(Levels);
if length(Levels) >= 1 then begin
if CurrentLevelLeft > -200 then CurrentLevelLeft := CurrentLevelLeft - 1.5;
if CurrentLevelRight > -200 then CurrentLevelRight := CurrentLevelRight - 1.5;
NewLevelLeft := Trunc(Levels[0] * 15);
if lengths(Levels) = 1 then
NewLevelRight := Trunc(Levels[0] * 15)
else
NewLevelRight := Trunc(Levels[1] * 15);
if NewLevelLeft > CurrentLevelLeft then CurrentLevelLeft := NewLevelLeft;
if NewLevelRight > CurrentLevelRight then CurrentLevelRight := NewLevelRight;
MidiOut(MM1, 180, 80, 48 + Trunc(CurrentLevelLeft));
MidiOut(MM1, 180, 81, 48 + Trunc(CurrentLevelRight));
end;
Hier wird also zunächst überprüft, ob mindestens ein Kanal zurückgeliefert wurde. Und für diesen Spezialfall (Länge = 1) bedienen sich dann beide Anzeigen aus dem linken Kanal (Levels[0]).