Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Brauche hilfe beim übersetzen von C code nach delphi (https://www.delphipraxis.net/92458-brauche-hilfe-beim-uebersetzen-von-c-code-nach-delphi.html)

Wishmaster 20. Mai 2007 07:20


Brauche hilfe beim übersetzen von C code nach delphi
 
Hi



Ich versuche en C++ coden nach delphi zu übersetzen leider funzt es nicht so wie es soll.
Feileicht findet ihr den feiler. Danke in voraus


Delphi-Quellcode:
BYTE *recbuf; // recording buffer pointer
DWORD reclen; // recording buffer length

DWORD CALLBACK FeederProc(HSTREAM handle, void *buf, DWORD len, DWORD user)
{
   if (len>reclen) len=reclen; // restrict to recording buffer length
   memcpy(buf, recbuf, len); // copy data from recording buffer
   recbuf+=len;
   reclen-=len;
   return len;
}

BOOL CALLBACK RecordProc(HRECORD handle, void *buf, DWORD len, DWORD user)
{
   recbuf=buf; // set recording buffer details for FeederProc
   reclen=len;
   for (;;) {
      BYTE mixbuf[10000]; // mixer buffer
      int c=BASS_ChannelGetData(mixer, mixbuf, sizeof(mixbuf));
      if (!c) break; // used up all data
      BASS_WMA_EncodeWrite(encoder, mixbuf, c); // feed data to encoder
   }
   return TRUE; // continue recording
}

...

mixer=BASS_Mixer_StreamCreate(32000, 2, BASS_STREAM_DECODE); // create mixer (32000hz output)
mixfeed=BASS_StreamCreate(44100, 2, BASS_STREAM_DECODE, FeederProc, 0); // create mixer feeder
BASS_Mixer_StreamAddChannel(mixer, mixfeed, 0); // plug in the feeder
record=BASS_RecordStart(44100, 2, 0, RecordProc, 0); // start recording






Das ist mein versuch

Delphi-Quellcode:
var WriteToWave : Boolean = false;
    Mixer, mixfeed : DWORD;
    recbuf : byte;
    reclen : DWORD;


function FeederProc(handle: HSTREAM; buf: Pointer; len: DWORD; user: DWORD): DWORD; stdcall;
begin

 if len >reclen then
  len:= reclen;
  move(recbuf, buf, len);
  recbuf:= recbuf + len;
  reclen:= reclen - len;
  result:= len;

end;



function RecordingCallback(channel : HRECORD; buf:Pointer; len, user:DWORD): Boolean; stdcall;
var mixbuf: array[0..10000] of Byte;
    c: DWORD;
begin
 recbuf:= SizeOf(Buf);
 reclen:= len;

  With FBassEngine do
   begin
     if WriteToWave then
      begin
        c:= BASS_ChannelGetData(mixer, @mixbuf, SizeOf(mixbuf));
        FRecDiskWriter.Write(mixbuf, C);
        FRecSize:= FRecDiskWriter.Position;
        FRecTime:= Channel_Get_Time(Channel);
        result:= true;
       end;
      end;

end;

OregonGhost 20. Mai 2007 09:13

Re: Brauche hilfe beim übersetzen von C code nach delphi
 
Auf Anhieb stach mir eins ins Auge:
Code:
for (;;) {
nennt man auch forever. Also
Delphi-Quellcode:
while true do begin
.

Kleiner Tipp noch fürs Forum, wenn du C statt Delphi im Tag schreibst, sind nicht die ganzen C-Codeblöcke auskommentiert ;)

Apollonius 20. Mai 2007 11:00

Re: Brauche hilfe beim übersetzen von C code nach delphi
 
Im C-Code ist recbuf als
Code:
byte *recbuf;
definiert. Das ist ein Zeiger auf ein Byte, also ein PByte! Daraus ergeben sich noch andere Sachen, zum Beispiel heißt es in RecordingCallback nicht recbuf:=sizeof(buf), was ja konstant 4 wäre, sondern recbuf:=buf.
Hoffe geholfen zu haben
Apollonius

Wishmaster 21. Mai 2007 11:48

Re: Brauche hilfe beim übersetzen von C code nach delphi
 
Hi

Danke für eure hilfe, aber es funzt immer noch nicht wie es soll

Wen ich while true do einsetze steigt meine cpu Auslastung auf 100%

Ps. Es gibt ne bessere Lösung für das Problem. Man starte einfach mehrere recording channels mit Verschiedenen Samplerates, allerdings funst das nur unter WinXP.


Es muss en feiler in der Übersetzung sein.


Delphi-Quellcode:
var WriteToWave : Boolean = false;
    Mixer, mixfeed : DWORD;
    recbuf : pbyte;
    reclen : DWORD;

function FeederProc(handle: HSTREAM; buf: Pointer; len: DWORD; user: DWORD): DWORD; stdcall;
begin
 if len >reclen then len:= reclen;
  CopyMemory(recbuf, buf, len);
  recbuf^:= recbuf^ + len;
  reclen:= reclen - len;
  result:= len;
end;



function RecordingCallback(channel : HRECORD; buf:Pointer; len, user:DWORD): Boolean; stdcall;
var mixbuf: array[0..10000] of Byte;
 c : DWORD;
begin
 recbuf:= Buf;
 reclen:= len;

  With FBassEngine do
   begin
     if WriteToWave then
      begin
     while true do
      begin
         C:= BASS_ChannelGetData(mixer, @mixbuf, SizeOf(mixbuf));
         BASS_Encode_Write(FChannel_Enc, @mixbuf, c);
        end;
        result:= true;
      end;
     end;
end;

//

                   Mixer:= BASS_Mixer_StreamCreate(32000, 2, BASS_STREAM_DECODE);
                   Mixfeed:= BASS_StreamCreate(44100, 2, BASS_STREAM_DECODE, @FeederProc, 0);
                   BASS_Mixer_StreamAddChannel(mixer, Mixfeed, 0);


                  FChannel_Enc:= BASS_Encode_Start(Mixer, Pchar(fOutStr + '.wav'), Flag or BASS_ENCODE_PCM, @EncoderCallback, 0);
               if FChannel_Enc = 0 then
                begin
                   //Error
                  Exit;
                end;
                  BASS_ChannelPlay(mixfeed, false);
                  BASS_ChannelPlay(mixer, false);



                if BASS_Encode_SetPaused(FChannel_Enc, False) then
                 begin
                 WriteToWave:= true;

mkinzler 21. Mai 2007 11:50

Re: Brauche hilfe beim übersetzen von C code nach delphi
 
Du solltest halt in der Schleife Rechenzeit abgeben (Application.ProcessMessages)

Wishmaster 21. Mai 2007 12:34

Re: Brauche hilfe beim übersetzen von C code nach delphi
 
Darauf bin ich auch schon gekommen, aber ne das ganze Programm friert sofort ein.

Wen ich while true do entferne legt der encoder ne *,wav Datei an der header ist auch wir er sein soll (32000hz, 16 bit Stereo), nur wen du die datei Abspiels hörst du nur klicken


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