AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Eigenartig, im Debugger geht´s, sonst nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenartig, im Debugger geht´s, sonst nicht

Ein Thema von padavan · begonnen am 14. Jan 2007 · letzter Beitrag vom 16. Jan 2007
Antwort Antwort
padavan

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

Eigenartig, im Debugger geht´s, sonst nicht

  Alt 14. Jan 2007, 11: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
padavan

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

Re: Eigenartig, im Debugger geht´s, sonst nicht

  Alt 16. Jan 2007, 05:46
Guten Morgen,

hat denn niemand nen Tipp für mich?
Ich weiß nicht, wie ich das Problem näher beschreiben könnte.
Es scheint halt offenbar einen deutlichen Unterschied zu geben, ob man ein Programm im Debugger wirklich Schrittweise laufen lässt, oder es ganz normal läuft. Vielleicht hängt es sogar mit der Performance der Plattform zusammen, denn bei Schrittweisem Betrieb im Debugger, kann das Programm Werte evtl. besser zwischen einzelnen Threads übergeben ?!

Viele Grüße
Padavan
  Mit Zitat antworten Zitat
16. Jan 2007, 06:02
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Eigenartig, im Debugger geht´s, sonst nicht

  Alt 16. Jan 2007, 08:18
Hallo padavan!

ich hatte ein ähnliches Problem -- es waren mehrere Threads zu synchronisieren,
dies funktionierte jedoch nur, wenn ein "Sleep(100)" in einer der Funktionen stand.

Vielleicht kann man es sich so erklären, dass durch das Sleep ein Zusammenkrachen
der Threads weniger wahrscheinlich (oder auch nur herausgezögert wurde).
Das könnte auch beim schrittweisen debuggen einen Konflikt der Threads verhindern.

Letztendlich heißt es dann: Alles neu überdenken und auf wirkliche Synchronisierung
achten. Vielleicht schaust du nochmal genauer, wie die einzelnen Komponenten
zusammenspielen und wie Base.dll bzw. der Wrapper aufgebaut sind.



Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz