Blöder Titel, ich weiß....aber:
Hallo Delphianer und Bass.dll Spezialisten,
habe einen eigenartigen Fall bzgl. der Bass-Kompo-Erweiterung Omata!
Benutze in meinem Programm nämlich diese und habe ein eigenartiges Problem.
Habe so eine Art "PreScan" programmiert, wo ich ein Lied durchscanne nach dem höchsten Peak und anhand dessen eine Normalisierung einstelle.
(ich weiß, dass es bei Omatas Variante so was gibt, aber bin nicht ganz durchgestiegen wie ich es sinnvoll bei mir einarbeiten kann)
Die Funktion ging sogar schon mal, aber ich habe quasi kaputtoptimiert
Hier der Quellcode der
Unit, etwas abgespeckt, aber es geht ja nur um die Kernfuntion:
Delphi-Quellcode:
unit Unit_Prescan;
interface
procedure Scan;
implementation
uses
Unit_Dreamplayer,
unit_Bass,
BassChannelU,
BassdllPlayerEx,
ExtCtrls,
Windows,
Forms,
graphics,
classes,
sysutils
;
var
HighPeak: integer;
Peak, PeakLeft, PeakRight: integer;
Delta: integer;
(* die eigentliche PreScan Funktion *)
procedure Scan;
var
i: integer;
Data: TFFTData;
begin
with Form1
do
begin
if fileexists(Label_Titel_Anzeige.Caption)
then
begin
if (lowercase(extractfileext(lowercase(Label_Titel_Anzeige.Caption))) = '
.mp3')
or (lowercase(extractfileext(lowercase(Label_Titel_Anzeige.Caption))) = '
.wav')
then begin
LOG('
Prescan: starting...');
QProgressBar_normalization_measuredPeak.position := 0;
QProgressBar_normalization_calculatedDelta.position := 0;
try
if Image_mute_deaktivieren.Visible = false
then TrackBar_Volume.Position := Trackbar_Normalization_StartVolume.Position * 10;
HighPeak := 0;
if assigned(bassPreScan) = false
then bassPreScan := TBassdllplayerEx.Create(
nil);
BassPrescan.addChannel(0);
BassPrescan.Channel[0].LoadFromFile(Label_Titel_Anzeige.Caption);
BassPrescan.Channel[0].Play;
while BassPrescan.Channel[0].Position <= BassPrescan.Channel[0].SongLength - 10
do
begin
application.ProcessMessages;
//variant1)
PeakLeft := BassPrescan.Channel[0].getLeftPeak;
PeakRight := BassPrescan.Channel[0].getRightPeak;
Peak := (PeakLeft + PeakRight)
div 2;
if Peak > HighPeak
then
HighPeak := Peak;
//variant2)
{
data := BassPrescan.channel[0].GetFFTData;
for i := 0 to 255 do
Peak := Peak + round(Data[i] * 1000000);
Peak := Peak div 255;
if Peak > HighPeak then
HighPeak := Peak;
}
application.ProcessMessages;
BassPrescan.Channel[0].Position := BassPrescan.Channel[0].Position + 1;
//1
end;
begin
BassPrescan.delChannel;
if assigned(BassPrescan) = true
then freeandnil(BassPrescan);
if Image_mute_deaktivieren.Visible = false
then
begin
{
//variant1)
//32768-327 //1000-10
while (HighPeak < 32441) and (TrackBar_Volume.Position < 990) do // <990) do
begin
Trackbar_Volume.Position := Trackbar_Volume.Position + 10; //10;
HighPeak := HighPeak + (5100 - TrackBar_normalization_boost.Position * 10); //300; // errechneter Wert wäre 327, aber besser weniger -> mehr effekt
end;
}
//variant2) --> besser
Delta := ((32728 - Highpeak)
div 100) + (TrackBar_normalization_boost.Position);
Trackbar_Volume.Position := Trackbar_Volume.Position + Delta;
end;
LOG('
Prescan: Done with highpeak: ' + inttostr(HighPeak) + '
and volume: ' + inttostr(Trackbar_Volume.Position
div 10));
end;
except
if assigned(BassPrescan) = true
then freeandnil(BassPrescan);
LOG('
Prescan: Failed');
end;
end else begin
LOG('
Prescan: Normalization not possible (only mp3 & wav)');
end;
end;
end;
end;
end.
So und nun die Fehlerbeschreibung. Der Wert HighPeak bleibt immer 0 und kommt sozusagen nicht hoch.
Dies liegt scheinbar daran, dass die Bass-Kompo in einen anderen Thread läuft und die Werte nicht richtig zurückgeschrieben werden.
Ich kann es mir nur so irgenwdie erklären, denn:
Wenn ich einen Breakpoint setze und die ganze Prozedur durch-debugge, dann funktioniert es genauso wie es soll!!!!!!!
Das verstehe ich halt überhaupt gar nicht.
(hab schon alles mögliche ausprobiert, mit Sleep(10), oder prozessmessages, bringt alles nichts)
gibt auch jeweils 2 Varianten, beide funktionieren auch immer, aber halt nur im Debugger!
Kann mir dazu jemand einen Tipp geben?
Danke schon mal
Padavan