Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Algorithmus von C99 in Delphi übersetzen (https://www.delphipraxis.net/143583-algorithmus-von-c99-delphi-uebersetzen.html)

Rer 18. Nov 2009 19:36


Algorithmus von C99 in Delphi übersetzen
 
Hi @all,
ich wollte fragen ob mir jemand folgenden Algorithmus von C99 in Delphi übersetzen kann:
Wikipedia - ADX (file format) (beim Abschnitt ADX Decoding)
Ich hab mich schon ein wenig dran versucht, bin jedoch nicht mit der Syntax dieser Sprache vertraut... Daher dachte ich mir, dass ich mal in diesem Forum nachfrage. Der Codeausschnitt ist ja auch nicht übermäßig lang ;)
mfg
Rer

himitsu 18. Nov 2009 19:49

Re: Algorithmus von C99 in Delphi übersetzen
 
Wie sieht denn dein Versuch derzeit aus?

Einfach den Code soweit wie möglich übersetzen und dann können wir ja mal sehn, wie wir dir bei den fehlenden bzw. noch nicht übersetzten Stellen helfen können :)

SirThornberry 18. Nov 2009 20:24

Re: Algorithmus von C99 in Delphi übersetzen
 
Ich sehe es wie himitsu. Ein Forum ist da um zu helfen und nicht um für andere die komplette Arbeit zu machen.
Vor allem lernst du rein gar nichts wenn es immer Andere machen statt das du es selbst versuchst und dann nur bei konkreten Problemen nachfragst.

Rer 19. Nov 2009 16:04

Re: Algorithmus von C99 in Delphi übersetzen
 
so weit bin ich bis jetzt^^
Delphi-Quellcode:
type
  ADX_HEADER = packed record
    Begin_0x80 : Byte;
    Begin_0x00 : Byte;
    crOffset  : Word;
    encType   : Byte;
    blockSize : Byte;
    smplbitdpth: Byte;
    NumChannels: Byte;
    sampleRate : LongWord;
    totalSamples: LongWord;
    hpfrequency: Word;
    Version   : Byte;
    flags     : Byte;
  end;

  ADX_LOOP_V3 = packed record
    loopEnabled: LongWord;
    loopBegSamInd:LongWord;
    loopBegBytInd:LongWord;
    loopEndSamInd:LongWord;
    loopEndBytInd:LongWord;
  end;

  ADX_LOOP_V4 = packed record
    loopEnabled: LongWord;
    loopBegSamInd:LongWord;
    loopBegBytInd:LongWord;
    loopEndSamInd:LongWord;
    loopEndBytInd:LongWord;
  end;
{...}

var
  Form1      : TForm1;
  adxhdr    : ADX_HEADER;
  adxloopv3  : ADX_LOOP_V3;
  adxloopv4  : ADX_LOOP_V4;

function READ_HEADER(efile:string):boolean;
function read_loopv3(efile:string):boolean;
function read_loopv4(efile:string):boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  M_PI : double;
  a,b,c : double;
  coefficient: array [0..1] of double;

begin
  READ_HEADER('c:\MeineDatei.adx');

  if adxhdr.Version=3 then
    read_loopv3('c:\MeineDatei.adx')
  else if adxhdr.Version=4 then
    read_loopv4('c:\MeineDatei.adx');

  //-------> coefficients must be calculated

  M_PI:=ArcCos(-1.0);
  a := sqrt(2.0) - cos(2.0 * M_PI * (adxhdr.hpfrequency/adxhdr.sampleRate));
  b := sqrt(2.0) - 1.0;
  c := (a - sqrt((a + b) * (a - b))) / b;

  // double coefficient[2];
  coefficient[0] := c * 2.0;
  coefficient[1] := -(c * c);


end;

function READ_HEADER(efile:string):boolean;
var
  edat    : file;
  buffer  : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  assignfile(edat,efile);
  reset(edat,1);
  blockread(edat,buffer,sizeof(adxhdr),gelesen);
  move(buffer[0],adxhdr,sizeof(adxhdr));
  if (adxhdr.Begin_0x80=128) and (adxhdr.Begin_0x00=0) then begin
    result:=true;
  end;
  closefile(edat);
end;

function read_loopv3(efile:string):boolean;
var
  edat    : file;
  buffer  : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  try
    assignfile(edat,efile);
    reset(edat,1);
    seek(edat, 24);
    blockread(edat,buffer,sizeof(adxloopv3),gelesen);
    move(buffer[0],adxloopv3,sizeof(adxloopv3));
  finally
    result:=true;
    closefile(edat);
  end;
end;

function read_loopv4(efile:string):boolean;
var
  edat    : file;
  buffer  : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  try
    assignfile(edat,efile);
    reset(edat,1);
    seek(edat, 36);
    blockread(edat,buffer,sizeof(adxloopv3),gelesen);
    move(buffer[0],adxhdr,sizeof(adxloopv3));
  finally
    result:=true;
    closefile(edat);
  end;
end;

end.
Nun steht in den nächsten Zeilen bei wikipedia:
Code:
static int32_t*      past_samples;
 static uint_fast32_t sample_index = 0;
 static ADX_header*   adx_header;
Sieht für mich wie eine Variablendeklaration aus. Ich weiß jedoch nicht was da genau gemacht wird.
Außerdem werden zwischendurch die funktionen "ntohs" und "sign_extend" verwendet... mit denen kann ich ebenfalls nichts anfangen. Gibt es gleichbedeutende funktionen bei Delphi?
Code:
scale[i] = ntohs( bitstream_read( 16 ) );
sample_error = sign_extend( sample_error, adx_header->sample_bitdepth );
fortsetzung folgt :-P
mfg
Rer


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 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