Einzelnen Beitrag anzeigen

padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#1

Eigenartig, im Debugger geht´s, sonst nicht

  Alt 14. Jan 2007, 12:21
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
  Mit Zitat antworten Zitat