Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rückgabe von SpectrumDaten als PChar (https://www.delphipraxis.net/88419-rueckgabe-von-spectrumdaten-als-pchar.html)

EWeiss 16. Mär 2007 07:11

Re: Rückgabe von SpectrumDaten als PChar
 
Hallo
Niemand eine andere Idee wie ich an die Daten herankommen kann?
im Spectrum array sind sie ja vorhanden das ist nicht das problem.

kann sie nur nicht der im thread angezeigten Schleife zuweisen.
Würd mich aber wundern das dies in Delphi nicht gehen soll.

gruss Emil

Muetze1 16. Mär 2007 08:13

Re: Rückgabe von SpectrumDaten als PChar
 
1. Speicher alloziieren/freigeben: AllocMem(), FreeMem()
2. Typ definieren:
Delphi-Quellcode:
Type
  TSpectrumData = Array[0..576] Of Byte;
  PSpectrumData = ^TSpectrumData;
Diesen Typ kannst du dann leicht für den Typecast nutzen und wenn du ihn alloziieren willst, reicht ein einfaches New() aus (bzw. Dispose() zum freigeben).

EWeiss 16. Mär 2007 08:19

Re: Rückgabe von SpectrumDaten als PChar
 
Zitat:

Zitat von Muetze1
1. Speicher alloziieren/freigeben: AllocMem(), FreeMem()
2. Typ definieren:
Delphi-Quellcode:
Type
  TSpectrumData = Array[0..576] Of Byte;
  PSpectrumData = ^TSpectrumData;
Diesen Typ kannst du dann leicht für den Typecast nutzen und wenn du ihn alloziieren willst, reicht ein einfaches New() aus (bzw. Dispose() zum freigeben).

ahh danke ... Kein schleimen ;) Du bist einer der besten
werd es mal versuchen umzusetzen ob die Schleife damit die Daten berechnen kann.

gruss Emil

EWeiss 16. Mär 2007 09:18

Re: Rückgabe von SpectrumDaten als PChar
 
Gibt mir auch keine Daten zurück :(
Ich denke das es auch das gleiche wie die Daten in Spectrum selber sind.

Delphi-Quellcode:
  // Spektrum Analyser Daten glaetten
  for c := 0 to 1 do
  begin
    for i := 0 to 72 do
    begin
      h := 0.0;
      for j := 0 to 8 do
      begin
        //h := (h + specdata[i * 8 + j + c * 576]);
        h := (h + ord(this_mod^.spectrumData[0][i * 8]) +
                  ord(this_mod^.spectrumData[0][j]) +
                  ord(this_mod^.spectrumData[0][c * 576]));
        h := h / (1.0 * 255.0);

        h := Ln(h + 1.0) * 10.0;

        delta := (currenttime - lastcurrenttime) * 10.0;
        delta2 := (currenttime - lastcurrenttime) * 2.0;
        if (h > heights[c][i] - delta) then
          h := heights[c][i]
        else
          heights[c][i] := heights[c][i] - delta;

        if (h > heights2[c][i] - delta2) then
          h := heights2[c][i]
        else
          heights2[c][i] := heights2[c][i] - delta2;
      end;
    end;
  end;
Die beiden zeilen verglichen müßte eigentlich den gleichen wert ergeben!
Delphi-Quellcode:
        //h := (h + specdata[i * 8 + j + c * 576]);
        h := (h + ord(this_mod^.spectrumData[0][i * 8]) +
                  ord(this_mod^.spectrumData[0][j]) +
                  ord(this_mod^.spectrumData[0][c * 576]));
Delphi-Quellcode:
heights[c][i] := heights[c][i] - delta;
Ist aber immer 0

Hänge mal ein Bild an wie specdata in C# ausschaut.
Anfangen kann ich damit nix aber es funktioniert... wie auch immer.

gruss Emil

EWeiss 16. Mär 2007 18:16

Re: Rückgabe von SpectrumDaten als PChar
 
Ich versuchs nochmal

Delphi-Quellcode:
TSpectrumData = Array[0..576] Of Byte;
 PSpectrumData = ^TSpectrumData;

specdata      : PSpectrumData;

specdata := @This_Mod^.spectrumData[0][0];
Delphi-Quellcode:
lastcurrenttime := currenttime;
currenttime := GetTickCount();

DrawSpectrum(This_mod);
Delphi-Quellcode:
procedure DrawSpectrum(This_Mod: PWinAMPVisModule);
var
  i, j, c          : integer;
  h, delta, delta2  : single;
  x1, x2, z1, z2, y : GLfloat;
  h2, h3, d12d     : GLfloat;
  hd               : GLfloat;

const
  overdraw : GLfloat = 0.01;
  d1       : GLfloat = 0.05;
   d2       : GLfloat = 0.01;

begin

  // Spektrum Analyser Daten glaetten
  for c := 0 to 1 do
  begin
    for i := 0 to 72 do
    begin
      h := 0.0;
      for j := 0 to 8 do h := (h + specData[i * 8 + j + c * 576]);
        h := h / (1.0 * 255.0);
        h := Ln(h + 1.0) * 10.0;

        delta := (currenttime - lastcurrenttime) * 10.0;
        delta2 := (currenttime - lastcurrenttime) * 2.0;
        if (h > heights[c][i] - delta) then
          heights[c][i] := h
        else
          heights[c][i] := heights[c][i] - delta;

        if (h > heights2[c][i] - delta2) then
          heights2[c][i] := h
        else
       >>>>>>> heights2[c][i] := heights2[c][i] - delta2;
    end;
  end;
  .............
end;
Soweit funktioniert jetzt alles zumindest werden die Daten richtig erkannt und
das Spectrum ausgegeben.

Nun zu meinen letzten problem!
Die Zeile '>>>>>>>' in der schleife wird nie ausgeführt da die bedingung aus irgendeinen grund nicht erfüllt wird.
Die auswirkung davon ist das die Peaks sich nicht von den Spectrumbalken lösen.

Jetzt weiss ich nicht liegt es am Timing ?
Habe es schon mit timeGetTime versucht oder wie oben mit GetTickCount!

Denke das die Schleife ansicht richtig übersetzt ist.
Code:
   for (c=0;c<=1;c++)
   {
      for ( i = 0; i < 72; i++ )
      {
         h=0.0f;
         for (j=0;j<8;j++) h+=specdata[i*8+j+c*576];
         h/=(1.0f*255.0f);

         h=(float)(log(h+1.0f))*10.0f;

         delta=(currenttime-lastcurrenttime)*10.0f;
         delta2=(currenttime-lastcurrenttime)*2.0f;
         //if (h>heights[c][i]-delta)
         //   heights[c][i]=h;
         //else
         //   heights[c][i]=heights[c][i]-delta;
                 
         if (h>heights2[c][i]-delta2)
            heights2[c][i]=h;
         else
            heights2[c][i]=heights2[c][i]-delta2;
               
      }
   }
Gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr.
Seite 2 von 2     12   

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