AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konvertierung von C nach Delphi

Ein Thema von venice2 · begonnen am 29. Jun 2020 · letzter Beitrag vom 29. Jun 2020
 
venice2
(Gast)

n/a Beiträge
 
#6

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:58
Hi venice2,

hast du denn die Ausgangsdaten überhaubt?
Sprich das was bei "source" und "samples" rein muss?
Und wohin willst du dann "dest" weiter reichen?
Vielleicht kann man Anhand dessen schonmal die Datentypen ermitteln!

Sonst rate ich, wäre das sowas:
Delphi-Quellcode:
type WordArr = Array of Word;
type ByteArr = Array of Byte;
function Cnv16to8 (const source WordArr; var dest ByteArr; const samlpes : Cardinal) : Cardinal;
var i2 : Cardinal;
begin
  for i2 := 0 to (samples div 2) do
  begin
    dest[i2] := source[i2 shr 1] shl 8;
  end;
  Result := i2;
end;
Annahmen:
- signed short = 16 Bit // Word = 16 Bit
- signed char = 8 Bit // Byte = 8 Bit
C arbeitet hier mit Pointern, da die Werte ja geändert werden müssen,
was wir uns ja bei Delphi prinzipiell schenken können, dank dem hilfreichen Compiler.
Da i immer 2 hochgezählt wird, habe ich mal "i2" genommen.
Ich hoffe nur, ich habe mich beim Umsetzen jetzt nicht verkaspert!
Ansonsten: Gegenvorschläge? Hinweise? Fehler? Ich bin für alles zu haben!

MfG
Incocnito
Die Ausgangsdaten sind

Delphi-Quellcode:
  TimedLevel = record
    frequency : array [0..1, 0..SA_BUFFER_SIZE-1] of byte;
    waveform : array [0..1, 0..SA_BUFFER_SIZE-1] of byte;
    state : integer;
    timeStamp : int64;
  end;
Code:
typedef struct tagTimedLevel
{
    unsigned char frequency[ 2 ][ 1024 ];
    unsigned char waveform[ 2 ][ 1024 ];
    int state;
    __int64 timeStamp;
}   TimedLevel;
Code:
{
   RECT rect;
   rect.left = rect.top = 0;
   rect.right = visWidth;
   rect.bottom = visHeight;
   TimedLevel tl;
   tl.state = play_state;

   short data[2048]={0};
   BASS_CHANNELINFO info;
   BASS_ChannelGetInfo(hStream, &info);
   
   BASS_ChannelGetData(hStream, data, 2048);
   for (int a=0;a<2048;a++)
      data[a] = (signed short)(data[a]);

   if(info.chans==1) {
      Cnv16to8(data,(signed char*) &tl.waveform[0][0], 1024);
      Cnv16to8(data,(signed char*) &tl.waveform[1][0], 1024);
   } else {
      Cnv16to8(data,(signed char*) &tl.waveform[0][0], 1024);
      Cnv16to8(data+1,(signed char*) &tl.waveform, 1024);
   }

   float fft[1024]={0};
   BASS_ChannelGetData(hStream, fft, BASS_DATA_FFT2048);
   for(int i=0;i<1024;i++)
      tl.frequency[0][i] = tl.frequency[1][i] = (BYTE)min(255,fft[i]*512)*25;
}
Zitat:
und ich würde ehre auf SHR tippen
Ja.. >> ist in Delphi SHR (Shift Right) bzw. << (Shift Left)

Geändert von venice2 (29. Jun 2020 um 18:16 Uhr)
  Mit Zitat antworten Zitat
 


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 01:27 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