fredvs wrote 18 lines
Here, for example from OpusFile.h =>
OP_WARN_UNUSED_RESULT int op_read_float(OggOpusFile *_of,
float *_pcm,int _buf_size,int *_li) OP_ARG_NONNULL(1);
Translated in fpc with:
op_read: function(OpusFile: TOggOpusFile; var pcm; SampleCount: Integer;
li:
pointer): Integer;
And used like this:
BufferIn : array of cfloat;
outframes := op_read_float(HandleOF,BufferIn[0],Wantframes *Channels,
nil);
You should keep the Pascal code syntax closest to the C one, something like this:
uses ctypes;
POggOpusFile = ^TOggOpusFile
TOggOpusFile = record // please check if original C struct uses some alignment ...
end;
function op_read_float(_of: POggOpusFile; _pcm: Pcfloat; _buf_size: cint;
_li: pcint): cint; cdecl; ... blah blah blah
// or dynamic loading like you showed (on Delphi you can use the `delayed`
keyword instead of declaring `GetProcedureAddress` by hand :-) )
{$MACRO ON}
{$DEFINE OP_ARG_NONNULL := op_read_float}
It is useful when we need to translate the examples.
It seems that function just increment the address of a (float) buffer, so:
var
...
buf: pcfloat;
begin
... HandleOF/buf initialization etc. ...
outframes := OP_ARG_NONNULL(HandleOF, buf, Wantframes * Channels, nil);
... code ...
buf += (Wantframes * Channels) * sizeof(cfloat) // or inc(buf,
(Wantframes * Channels) * sizeof(cfloat));
( you can try "buf += Wantframes * Channels; // or inc(buf, Wantframes *
Channels);" too )
I'm not sure if it works, but you can check it by yourself. :-)
The nice thing is that BufferIn can be used for portaudio, soundfile,
mpg123, aac buffers and is working like charm.
Awesome. :-)
Fre;D
-----
Many thanks ;-)
Silvio Clécio