Registriert seit: 7. Apr 2007
13 Beiträge
|
Re: Algorithmus von C99 in Delphi übersetzen
19. Nov 2009, 17:04
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
mfg
Rer
|
|
Zitat
|