![]() |
Eigenartig, im Debugger geht´s, sonst nicht
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 :wink: 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. :wiejetzt: (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 |
Re: Eigenartig, im Debugger geht´s, sonst nicht
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 |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
|
Re: Eigenartig, im Debugger geht´s, sonst nicht
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz