![]() |
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; |
Re: Brauche hilfe beim übersetzen von C code nach delphi
Auf Anhieb stach mir eins ins Auge:
Code:
nennt man auch forever. Also
for (;;) {
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 ;) |
Re: Brauche hilfe beim übersetzen von C code nach delphi
Im C-Code ist recbuf als
Code:
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.
byte *recbuf;
Hoffe geholfen zu haben Apollonius |
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; |
Re: Brauche hilfe beim übersetzen von C code nach delphi
Du solltest halt in der Schleife Rechenzeit abgeben (Application.ProcessMessages)
|
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 16:58 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