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
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 16: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 17:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:32
PS: als kleine Rechenbeispiele:
https://www.delphipraxis.net/204656-...ml#post1467491

Da wird zwar von 4 auf 8 Bit umgerechnet, aber der "Scheiß" ist bestimmt dennoch nett anzuschauen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:33
PS: als kleine Rechenbeispiele:
https://www.delphipraxis.net/204656-...ml#post1467491

Da wird zwar von 4 auf 8 Bit umgerechnet, aber der "Scheiß" ist bestimmt dennoch nett anzuschauen.
Danke gute Leseprobe hilft mir aber im Moment nicht weiter

Das
Code:
   for(int i=0;i<1024;i++)
      tl.frequency[0][i] = tl.frequency[1][i] = (BYTE)min(255,fft[i]*512)*25;
geht in Delphi ja so auch nicht.

Geändert von venice2 (29. Jun 2020 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#4

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:37
Für später, falls du überlegst deinen Code dann noch zu optimieren, oder so.


Es sieht so aus, als wenn da Audio mit 2 Channels rein kommt und das auf zwei Streams mit jeweils einem Channel zerlegt wird,
für eine Fast Forward Transformation.
Da gibt es bestimmt unter den vielen BASS-Beispielen irgendwo schon was Fertiges für.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Jun 2020 um 17:43 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:39
Für später, falls du überlegst deinen Code dann noch zu optimieren, oder so.


Es sieht so aus, als wenn da Audio mit 2 Channels rein kommt und das auf zwei Streams mit jeweils einem Channel zerlegt wird.
Da gibt es bestimmt unter den vielen BASS-Beispielen irgendwo schon was Fertiges für.
Nein nicht für den besonderen Fall.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#6

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 17:48
geht in Delphi ja so auch nicht.
Ist das zweite = ein Vergleich (oder war das dieses ==) oder auch eine Zuweisung?

Ist wohl eher das Zweite?
Delphi-Quellcode:
for var i := 0 to 1023 do // das VAR im neusten Delphi, aber muß man nicht so machen, nur weil es in dem C-Code auch so gemacht wird
  tl.frequency[0][i] := tl.frequency[1][i] = Byte(Min(255, fft[i] * 512) * 25);
Delphi-Quellcode:
for var i := 0 to 1023 do begin
  tl.frequency[0][i] := Byte(Min(255, fft[i] * 512) * 25);
  tl.frequency[1][i] := tl.frequency[0][i];
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 18:30
Zitat:
Ist das zweite = ein Vergleich (oder war das dieses ==) oder auch eine Zuweisung?
In C (==) bedeutet in Delphi
if (x = x1) then

und (=)
x := x1;

Danke dir werde es mal testen.

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

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#8

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 20:37
Noch eine Kleinigkeit: den Byte Array kann man evtl. auch durch den in SysUtils vordefinierten TBytes Datentyp ersetzen.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Konvertierung von C nach Delphi

  Alt 29. Jun 2020, 21:26
Noch eine Kleinigkeit: den Byte Array kann man evtl. auch durch den in SysUtils vordefinierten TBytes Datentyp ersetzen.
Nein geht nicht weil die Definition Byte ist.

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;
Den Record kann ich nicht mal so eben umschreiben der ist vorgegeben.

so gehts..

Delphi-Quellcode:
for var i := 0 to 1023 do
begin
  tl.frequency[0, i] := Trunc(Min(255, fft[i] * 512) * 25); // Byte geht nicht. fft ist single
  tl.frequency[1, i] := tl.frequency[0, i];
end;
in C kann man das auf byte casten in Delphi nicht das verlangt round oder Trunc warum auch immer.

Geändert von venice2 (29. Jun 2020 um 21:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:09 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-2025 by Thomas Breitkreuz