On Fri, Jan 20, 2017 at 3:45 PM, fredvs <fi...@hotmail.com> wrote:
>
> 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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to