mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-22 11:29:27 +02:00
* and delete 4 pkgs leftovers, ldap mad modplug dts
git-svn-id: trunk@9969 -
This commit is contained in:
parent
26ce512061
commit
6fb3d9cd7a
18
.gitattributes
vendored
18
.gitattributes
vendored
@ -1098,9 +1098,6 @@ packages/extra/chm/htmlutil.pas svneol=native#text/plain
|
|||||||
packages/extra/chm/paslznonslide.pas svneol=native#text/plain
|
packages/extra/chm/paslznonslide.pas svneol=native#text/plain
|
||||||
packages/extra/chm/paslzx.pas svneol=native#text/plain
|
packages/extra/chm/paslzx.pas svneol=native#text/plain
|
||||||
packages/extra/chm/paslzxcomp.pas svneol=native#text/plain
|
packages/extra/chm/paslzxcomp.pas svneol=native#text/plain
|
||||||
packages/extra/dts/Makefile svneol=native#text/plain
|
|
||||||
packages/extra/dts/Makefile.fpc svneol=native#text/plain
|
|
||||||
packages/extra/dts/dts.pas svneol=native#text/plain
|
|
||||||
packages/extra/fftw/Makefile -text
|
packages/extra/fftw/Makefile -text
|
||||||
packages/extra/fftw/Makefile.fpc -text
|
packages/extra/fftw/Makefile.fpc -text
|
||||||
packages/extra/fftw/example.pas -text
|
packages/extra/fftw/example.pas -text
|
||||||
@ -2035,15 +2032,6 @@ packages/extra/imlib/fpmake.inc svneol=native#text/plain
|
|||||||
packages/extra/imlib/fpmake.pp svneol=native#text/plain
|
packages/extra/imlib/fpmake.pp svneol=native#text/plain
|
||||||
packages/extra/imlib/gdk_imlib/gdk_imlib.pp svneol=native#text/plain
|
packages/extra/imlib/gdk_imlib/gdk_imlib.pp svneol=native#text/plain
|
||||||
packages/extra/imlib/imlib/imlib.pp svneol=native#text/plain
|
packages/extra/imlib/imlib/imlib.pp svneol=native#text/plain
|
||||||
packages/extra/ldap/Makefile svneol=native#text/plain
|
|
||||||
packages/extra/ldap/Makefile.fpc svneol=native#text/plain
|
|
||||||
packages/extra/ldap/lber.pas svneol=native#text/plain
|
|
||||||
packages/extra/ldap/lber_typesh.inc svneol=native#text/plain
|
|
||||||
packages/extra/ldap/lberh.inc svneol=native#text/plain
|
|
||||||
packages/extra/ldap/ldap.pas svneol=native#text/plain
|
|
||||||
packages/extra/ldap/ldap_featuresh.inc svneol=native#text/plain
|
|
||||||
packages/extra/ldap/ldap_schemah.inc svneol=native#text/plain
|
|
||||||
packages/extra/ldap/ldaph.inc svneol=native#text/plain
|
|
||||||
packages/extra/libcurl/Makefile svneol=native#text/plain
|
packages/extra/libcurl/Makefile svneol=native#text/plain
|
||||||
packages/extra/libcurl/Makefile.fpc svneol=native#text/plain
|
packages/extra/libcurl/Makefile.fpc svneol=native#text/plain
|
||||||
packages/extra/libcurl/fpmake.inc svneol=native#text/plain
|
packages/extra/libcurl/fpmake.inc svneol=native#text/plain
|
||||||
@ -2216,15 +2204,9 @@ packages/extra/lua/fpmake.pp svneol=native#text/plain
|
|||||||
packages/extra/lua/lauxlib.pas svneol=native#text/plain
|
packages/extra/lua/lauxlib.pas svneol=native#text/plain
|
||||||
packages/extra/lua/lua.pas svneol=native#text/plain
|
packages/extra/lua/lua.pas svneol=native#text/plain
|
||||||
packages/extra/lua/lualib.pas svneol=native#text/plain
|
packages/extra/lua/lualib.pas svneol=native#text/plain
|
||||||
packages/extra/mad/Makefile svneol=native#text/plain
|
|
||||||
packages/extra/mad/Makefile.fpc svneol=native#text/plain
|
|
||||||
packages/extra/mad/mad.pas svneol=native#text/plain
|
|
||||||
packages/extra/matroska/Makefile svneol=native#text/plain
|
packages/extra/matroska/Makefile svneol=native#text/plain
|
||||||
packages/extra/matroska/Makefile.fpc svneol=native#text/plain
|
packages/extra/matroska/Makefile.fpc svneol=native#text/plain
|
||||||
packages/extra/matroska/matroska.pas svneol=native#text/plain
|
packages/extra/matroska/matroska.pas svneol=native#text/plain
|
||||||
packages/extra/modplug/Makefile svneol=native#text/plain
|
|
||||||
packages/extra/modplug/Makefile.fpc svneol=native#text/plain
|
|
||||||
packages/extra/modplug/modplug.pas svneol=native#text/plain
|
|
||||||
packages/extra/newt/Makefile svneol=native#text/plain
|
packages/extra/newt/Makefile svneol=native#text/plain
|
||||||
packages/extra/newt/Makefile.fpc svneol=native#text/plain
|
packages/extra/newt/Makefile.fpc svneol=native#text/plain
|
||||||
packages/extra/newt/README -text
|
packages/extra/newt/README -text
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile.fpc for A52DEC bindings
|
|
||||||
#
|
|
||||||
|
|
||||||
[package]
|
|
||||||
name=dts
|
|
||||||
version=2.0.0
|
|
||||||
|
|
||||||
[target]
|
|
||||||
units=dts
|
|
||||||
|
|
||||||
[require]
|
|
||||||
|
|
||||||
[install]
|
|
||||||
fpcpackage=y
|
|
||||||
|
|
||||||
[default]
|
|
||||||
fpcdir=../../..
|
|
||||||
|
|
||||||
[rules]
|
|
||||||
.NOTPARALLEL:
|
|
@ -1,529 +0,0 @@
|
|||||||
{
|
|
||||||
Translation of the DTS headers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
(*
|
|
||||||
* dts.h
|
|
||||||
* Copyright (C) 2004 Gildas Bazin <gbazin@videolan.org>
|
|
||||||
*
|
|
||||||
* This file is part of dtsdec, a free DTS Coherent Acoustics stream decoder.
|
|
||||||
* See http://www.videolan.org/dtsdec.html for updates.
|
|
||||||
*
|
|
||||||
* dtsdec is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* dtsdec is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*)
|
|
||||||
|
|
||||||
{
|
|
||||||
Using the libdts API
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
libdts provides a low-level interface to decoding audio frames encoded
|
|
||||||
using DTS Coherent Acoustics. libdts provides downmixing and
|
|
||||||
dynamic range compression for the following output configurations:
|
|
||||||
|
|
||||||
DTS_CHANNEL : Dual mono. Two independant mono channels.
|
|
||||||
DTS_CHANNEL1 : First of the two mono channels above.
|
|
||||||
DTS_CHANNEL2 : Second of the two mono channels above.
|
|
||||||
DTS_MONO : Mono.
|
|
||||||
DTS_STEREO : Stereo.
|
|
||||||
DTS_DOLBY : Dolby surround compatible stereo.
|
|
||||||
DTS_3F : 3 front channels (left, center, right)
|
|
||||||
DTS_2F1R : 2 front, 1 rear surround channel (L, R, S)
|
|
||||||
DTS_3F1R : 3 front, 1 rear surround channel (L, C, R, S)
|
|
||||||
DTS_2F2R : 2 front, 2 rear surround channels (L, R, LS, RS)
|
|
||||||
DTS_3F2R : 3 front, 2 rear surround channels (L, C, R, LS, RS)
|
|
||||||
|
|
||||||
DTS_LFE : Low frequency effects channel. Normally used to connect a
|
|
||||||
subwoofer. Can be combined with any of the above channels.
|
|
||||||
For example: DTS_3F2R | DTS_LFE -> 3 front, 2 rear, 1 LFE (5.1)
|
|
||||||
|
|
||||||
|
|
||||||
Initialization
|
|
||||||
--------------
|
|
||||||
|
|
||||||
dts_state_t * dts_init (uint32_t mm_accel);
|
|
||||||
|
|
||||||
Initializes the DTS library. Takes as a parameter the acceptable
|
|
||||||
optimizations which may be used, such as MMX. These are found in the
|
|
||||||
included header file 'mm_accel', along with an autodetection function
|
|
||||||
(mm_accel()). Currently, there is no accelleration implemented.
|
|
||||||
|
|
||||||
The return value is a pointer to a dts state object.
|
|
||||||
|
|
||||||
|
|
||||||
Probing the bitstream
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
int dts_syncinfo (uint8_t * buf, int * flags,
|
|
||||||
int * sample_rate, int * bit_rate, int * frame_length);
|
|
||||||
|
|
||||||
The DTS bitstream is composed of several dts frames concatenated one
|
|
||||||
after each other. A dts frame is the smallest independantly decodable
|
|
||||||
unit in the stream.
|
|
||||||
|
|
||||||
buf must contain at least 14 bytes from the input stream. If these look
|
|
||||||
like the start of a valid dts frame, dts_syncinfo() returns the size
|
|
||||||
of the coded frame in bytes, and fills flags, sample_rate, bit_rate and
|
|
||||||
frame_length with the information encoded in the stream. The returned size
|
|
||||||
is guaranteed to be an even number between 96 and 16384 for the 16 bits
|
|
||||||
version of the bitstream and 109 and 18726 for the 14 bits version.
|
|
||||||
sample_rate will be the sampling frequency in Hz, bit_rate is for the
|
|
||||||
compressed stream and is in bits per second, and flags is a description of
|
|
||||||
the coded channels: the DTS_LFE bit is set if there is an LFE channel coded
|
|
||||||
in this stream, and by masking flags with DTS_CHANNEL_MASK you will get a
|
|
||||||
value that describes the full-bandwidth channels, as one of the
|
|
||||||
DTS_CHANNEL...DTS_3F2R flags.
|
|
||||||
|
|
||||||
If this can not possibly be a valid frame, then the function returns
|
|
||||||
0. You should then try to re-synchronize with the dts stream - one way
|
|
||||||
to try this would be to advance buf by one byte until its contents
|
|
||||||
looks like a valid frame, but there might be better
|
|
||||||
application-specific ways to synchronize.
|
|
||||||
|
|
||||||
You need to call this function for each frame, for several
|
|
||||||
reasons: this function detects errors that the other functions will
|
|
||||||
not double-check, consecutive frames might have different lengths, and
|
|
||||||
it helps you re-sync with the stream if you get de-synchronized. It will as
|
|
||||||
well detect the kind of bitstream it is dealing with (big/little endian,
|
|
||||||
16/14 bits mode)
|
|
||||||
|
|
||||||
|
|
||||||
Starting to decode a frame
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
int dts_frame (dts_state_t * state, uint8_t * buf, int * flags,
|
|
||||||
sample_t * level, sample_t bias);
|
|
||||||
|
|
||||||
This starts the work of decoding the DTS frame (to be completed using
|
|
||||||
dts_block()). buf should point to the beginning of the complete frame
|
|
||||||
of the full size returned by dts_syncinfo().
|
|
||||||
|
|
||||||
You should pass in the flags the speaker configuration that you
|
|
||||||
support, and libdts will return the speaker configuration it will use
|
|
||||||
for its output, based on what is coded in the stream and what you
|
|
||||||
asked for. For example, if the stream contains 2+2 channels
|
|
||||||
(dts_syncinfo() returned DTS_2F2R in the flags), and you have 3+1
|
|
||||||
speakers (you passed DTS_3F1R), then libdts will choose do downmix to
|
|
||||||
2+1 speakers, since there is no center channel to send to your center
|
|
||||||
speaker. So in that case the left and right channels will be
|
|
||||||
essentially unmodified by the downmix, and the two surround channels
|
|
||||||
will be added together and sent to your surround speaker. libdts will
|
|
||||||
return DTS_2F1R to indicate this.
|
|
||||||
|
|
||||||
The good news is that when you downmix to stereo you dont have to
|
|
||||||
worry about this, you will ALWAYS get a stereo output no matter what
|
|
||||||
was coded in the stream. For more complex output configurations you
|
|
||||||
will have to handle the case where libdts couldnt give you what you
|
|
||||||
wanted because some of the channels were not encoded in the stream
|
|
||||||
though.
|
|
||||||
|
|
||||||
Level, bias, and DTS_ADJUST_LEVEL:
|
|
||||||
|
|
||||||
Before downmixing, samples are floating point values with a range of
|
|
||||||
[-1,1]. Most types of downmixing will combine channels together, which
|
|
||||||
will potentially result in a larger range for the output
|
|
||||||
samples. libdts provides two methods of controlling the range of the
|
|
||||||
output, either before or after the downmix stage.
|
|
||||||
|
|
||||||
If you do not set DTS_ADJUST_LEVEL, libdts will multiply the samples
|
|
||||||
by your level value, so that they fit in the [-level,level]
|
|
||||||
range. Then it will apply the standardized downmix equations,
|
|
||||||
potentially making the samples go out of that interval again. The
|
|
||||||
level parameter is not modified.
|
|
||||||
|
|
||||||
Setting the DTS_ADJUST_LEVEL flag will instruct libdts to treat your
|
|
||||||
level value as the intended range interval after downmixing. It will
|
|
||||||
then figure out what level to use before the downmix (what you should
|
|
||||||
have passed if you hadnt used the DTS_ADJUST_LEVEL flag), and
|
|
||||||
overwrite the level value you gave it with that new level value.
|
|
||||||
|
|
||||||
The bias represents a value which should be added to the result
|
|
||||||
regardless:
|
|
||||||
|
|
||||||
output_sample = (input_sample * level) + bias;
|
|
||||||
|
|
||||||
For example, a bias of 384 and a level of 1 tells liba52 you want
|
|
||||||
samples between 383 and 385 instead of -1 and 1. This is what the
|
|
||||||
sample program dtsdec does, as it makes it faster to convert the
|
|
||||||
samples to integer format, using a trick based on the IEEE
|
|
||||||
floating-point format.
|
|
||||||
|
|
||||||
This function also initialises the state for that frame, which will be
|
|
||||||
reused next when decoding blocks.
|
|
||||||
|
|
||||||
|
|
||||||
Dynamic range compression
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
void dts_dynrng (dts_state_t * state,
|
|
||||||
sample_t (* call) (sample_t, void *), void * data);
|
|
||||||
|
|
||||||
This function is purely optional. If you dont call it, libdts will
|
|
||||||
provide the default behaviour, which is to apply the full dynamic
|
|
||||||
range compression as specified in the DTS stream. This basically
|
|
||||||
makes the loud sounds softer, and the soft sounds louder, so you can
|
|
||||||
more easily listen to the stream in a noisy environment without
|
|
||||||
disturbing anyone.
|
|
||||||
|
|
||||||
If you do call this function and set a NULL callback, this will
|
|
||||||
totally disable the dynamic range compression and provide a playback
|
|
||||||
more adapted to a movie theater or a listening room.
|
|
||||||
|
|
||||||
If you call this function and specify a callback function, this
|
|
||||||
callback might be called up to once for each block, with two
|
|
||||||
arguments: the compression factor 'c' recommended by the bitstream,
|
|
||||||
and the private data pointer you specified in dts_dynrng(). The
|
|
||||||
callback will then return the amount of compression to actually use -
|
|
||||||
typically pow(c,x) where x is somewhere between 0 and 1. More
|
|
||||||
elaborate compression functions might want to use a different value
|
|
||||||
for 'x' depending wether c>1 or c<1 - or even something more complex
|
|
||||||
if this is what you want.
|
|
||||||
|
|
||||||
|
|
||||||
Finding the number of blocks
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
int dts_blocks_num (dts_state_t * state);
|
|
||||||
|
|
||||||
Every DTS frame is composed of a variable number of blocks. Calling
|
|
||||||
dts_blocks_num() after dts_frame() will give you the number of blocks in the
|
|
||||||
current frame.
|
|
||||||
|
|
||||||
Decoding blocks
|
|
||||||
---------------
|
|
||||||
|
|
||||||
int dts_block (dts_state_t * state);
|
|
||||||
|
|
||||||
Every DTS frame is composed of a variable number of blocks, each with an
|
|
||||||
output of 256 samples for each channel. The dts_block() function decodes
|
|
||||||
the next block in the frame, and should be called dts_blocks_num() times to
|
|
||||||
decode all of the audio in the frame.
|
|
||||||
|
|
||||||
Getting the decoded audio samples
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
sample_t * dts_samples (dts_state_t * state);
|
|
||||||
|
|
||||||
After each call to dts_block(), you should extract the audio data from the
|
|
||||||
internal samples buffer.
|
|
||||||
|
|
||||||
This function returns a pointer to an internal buffer which will contain 256
|
|
||||||
samples for the first channel, followed by 256 samples for the second
|
|
||||||
channel, etc... the channel order is center, left, right, left
|
|
||||||
surround, right surround, LFE. If one of the channels is not present in the
|
|
||||||
libdts output, as indicated by the flags returned by dts_frame(), then
|
|
||||||
this channel is skipped and the following channels are shifted so
|
|
||||||
libdts does not leave an empty space between channels.
|
|
||||||
|
|
||||||
|
|
||||||
Pseudocode example
|
|
||||||
------------------
|
|
||||||
|
|
||||||
dts_state_t * state = dts_init (mm_accel());
|
|
||||||
|
|
||||||
loop on input bytes:
|
|
||||||
if at least 14 bytes in the buffer:
|
|
||||||
|
|
||||||
bytes_to_get = dts_syncinfo (...)
|
|
||||||
|
|
||||||
if bytes_to_get == 0:
|
|
||||||
goto loop to keep looking for sync point
|
|
||||||
else
|
|
||||||
get rest of bytes
|
|
||||||
|
|
||||||
dts_frame (state, buf, ...)
|
|
||||||
[dts_dynrng (state, ...); this is only optional]
|
|
||||||
for i = 1 ... dts_blocks_num():
|
|
||||||
dts_block (state)
|
|
||||||
dts_samples (state)
|
|
||||||
convert samples to integer and queue to soundcard
|
|
||||||
}
|
|
||||||
|
|
||||||
unit dts;
|
|
||||||
|
|
||||||
{$mode objfpc}
|
|
||||||
{$MINENUMSIZE 4}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
ctypes;
|
|
||||||
|
|
||||||
{$UNDEF LIBA52_DOUBLE}
|
|
||||||
|
|
||||||
{$IFDEF WINDOWS}
|
|
||||||
{$DEFINE DYNLINK}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{$IFDEF DYNLINK}
|
|
||||||
const
|
|
||||||
{$IF Defined(WINDOWS)}
|
|
||||||
dtslib = 'dts.dll';
|
|
||||||
{$ELSEIF Defined(UNIX)}
|
|
||||||
dtslib = 'libdts.so';
|
|
||||||
{$ELSE}
|
|
||||||
{$MESSAGE ERROR 'DYNLINK not supported'}
|
|
||||||
{$IFEND}
|
|
||||||
{$ELSE}
|
|
||||||
{$LINKLIB dts}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
(* x86 accelerations *)
|
|
||||||
const
|
|
||||||
MM_ACCEL_X86_MMX = $80000000;
|
|
||||||
MM_ACCEL_X86_3DNOW = $40000000;
|
|
||||||
MM_ACCEL_X86_MMXEXT = $20000000;
|
|
||||||
|
|
||||||
function mm_accel: cuint32; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
pdts_sample_t = ^dts_sample_t;
|
|
||||||
{$IF Defined(LIBDTS_FIXED)}
|
|
||||||
dts_sample_t = cint32;
|
|
||||||
{$ELSEIF Defined(LIBDTS_DOUBLE)}
|
|
||||||
dts_sample_t = cdouble;
|
|
||||||
{$ELSE}
|
|
||||||
dts_sample_t = cfloat;
|
|
||||||
{$IFEND}
|
|
||||||
|
|
||||||
pdts_level_t = ^dts_level_t;
|
|
||||||
dts_level_t = dts_sample_t;
|
|
||||||
|
|
||||||
pdts_state_t = ^dts_state_t;
|
|
||||||
dts_state_t = record
|
|
||||||
end;
|
|
||||||
|
|
||||||
dts_dynrng_call = function(s: dts_sample_t; data: pointer): dts_level_t; cdecl;
|
|
||||||
|
|
||||||
const
|
|
||||||
DTS_MONO = 0;
|
|
||||||
DTS_CHANNEL = 1;
|
|
||||||
DTS_STEREO = 2;
|
|
||||||
DTS_STEREO_SUMDIFF = 3;
|
|
||||||
DTS_STEREO_TOTAL = 4;
|
|
||||||
DTS_3F = 5;
|
|
||||||
DTS_2F1R = 6;
|
|
||||||
DTS_3F1R = 7;
|
|
||||||
DTS_2F2R = 8;
|
|
||||||
DTS_3F2R = 9;
|
|
||||||
DTS_4F2R = 10;
|
|
||||||
|
|
||||||
DTS_DOLBY = 101; (* FIXME *)
|
|
||||||
|
|
||||||
DTS_CHANNEL_MAX = DTS_3F2R; (* We don't handle anything above that *)
|
|
||||||
DTS_CHANNEL_BITS = 6;
|
|
||||||
DTS_CHANNEL_MASK = $3F;
|
|
||||||
|
|
||||||
DTS_LFE = $80;
|
|
||||||
DTS_ADJUST_LEVEL = $100;
|
|
||||||
|
|
||||||
|
|
||||||
function dts_init(mm_accel: cuint32): pdts_state_t; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
function dts_syncinfo(state: pdts_state_t; buf: pcuint8; var flags: cint; var sample_rate: cint; var bit_rate: cint; var frame_length: cint): cint; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
function dts_frame(state: pdts_state_t; buf: pcuint8; var flags: cint; var level: dts_level_t; bias: dts_sample_t): cint; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
procedure dts_dynrng(state: pdts_state_t; call: dts_dynrng_call; data: pointer); cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
function dts_blocks_num(state: pdts_state_t): cint; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
function dts_block(state: pdts_state_t): cint; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
function dts_samples(state: pdts_state_t): pdts_sample_t; cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
procedure dts_free(state: pdts_state_t); cdecl; external {$IFDEF DYNLINK}dtslib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
Developer of the A52 helpers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
type
|
|
||||||
dts_read_func = function(user: pointer; ptr: pointer; size: cuint): cuint; cdecl;
|
|
||||||
dts_seek_func = function(user: pointer; offset: clong; whence: cint): clong; cdecl;
|
|
||||||
dts_close_func = function(user: pointer): cint; cdecl;
|
|
||||||
dts_tell_func = function(user: pointer): clong; cdecl;
|
|
||||||
|
|
||||||
pdts_decoder = ^dts_decoder;
|
|
||||||
dts_decoder = record
|
|
||||||
inbuf : array[0..24576-1] of cuint8;
|
|
||||||
inbuf_ptr : pcuint8;
|
|
||||||
frame_size : cint;
|
|
||||||
state : pdts_state_t;
|
|
||||||
fsamples : pdts_sample_t; // internal samples buffer of dts (returned by dts_samples)
|
|
||||||
|
|
||||||
samples : array[0..1,0..6*256-1] of cint16;
|
|
||||||
samplecnt : cint;
|
|
||||||
sampleofs : cint;
|
|
||||||
user : pointer;
|
|
||||||
read : dts_read_func;
|
|
||||||
seek : dts_seek_func;
|
|
||||||
close : dts_close_func;
|
|
||||||
tell : dts_tell_func;
|
|
||||||
|
|
||||||
// Userinfo
|
|
||||||
flags : cint;
|
|
||||||
channels : cint;
|
|
||||||
sample_rate : cint;
|
|
||||||
bit_rate : cint;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
function dts_decoder_init(mm_accel: cuint32; user: pointer; read: dts_read_func; seek: dts_seek_func; close: dts_close_func; tell: dts_tell_func): pdts_decoder;
|
|
||||||
function dts_decoder_read(decoder: pdts_decoder; buffer: pointer; length: cint): cint;
|
|
||||||
procedure dts_decoder_free(decoder: pdts_decoder);
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
function dts_decoder_init(mm_accel: cuint32; user: pointer; read: dts_read_func; seek: dts_seek_func; close: dts_close_func; tell: dts_tell_func): pdts_decoder;
|
|
||||||
begin
|
|
||||||
GetMem(Result, Sizeof(dts_decoder));
|
|
||||||
FillChar(Result^, Sizeof(dts_decoder), 0);
|
|
||||||
Result^.state := dts_init(mm_accel);
|
|
||||||
Result^.fsamples := dts_samples(Result^.state);
|
|
||||||
Result^.inbuf_ptr := @Result^.inbuf[0];
|
|
||||||
Result^.user := user;
|
|
||||||
Result^.read := read;
|
|
||||||
Result^.seek := seek;
|
|
||||||
Result^.close := close;
|
|
||||||
Result^.tell := tell;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure dts_decoder_free(decoder: pdts_decoder);
|
|
||||||
begin
|
|
||||||
if not Assigned(decoder) then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
dts_free(decoder^.state);
|
|
||||||
decoder^.close(decoder^.user);
|
|
||||||
FreeMem(decoder);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function dts_decoder_read(decoder: pdts_decoder; buffer: pointer; length: cint): cint;
|
|
||||||
const
|
|
||||||
HEADER_SIZE = 14;
|
|
||||||
// ac3_channels: array[0..7] of cint = (2,1,2,3,3,4,4,5);
|
|
||||||
var
|
|
||||||
num, ofs: cint;
|
|
||||||
flags, len, i, j: cint;
|
|
||||||
sample_rate, bit_rate: cint;
|
|
||||||
level: dts_sample_t;
|
|
||||||
begin
|
|
||||||
// check blocksize here!
|
|
||||||
|
|
||||||
ofs := 0;
|
|
||||||
num := length;
|
|
||||||
|
|
||||||
while num > 0 do
|
|
||||||
begin
|
|
||||||
if decoder^.samplecnt = 0 then
|
|
||||||
begin
|
|
||||||
len := ptrint(decoder^.inbuf_ptr) - ptrint(@decoder^.inbuf);
|
|
||||||
|
|
||||||
if (len < HEADER_SIZE) or (len < decoder^.frame_size) then
|
|
||||||
begin
|
|
||||||
(* inbuf too small : enlarge *)
|
|
||||||
len := Sizeof(dts_decoder.inbuf) - len;
|
|
||||||
len := decoder^.read(decoder^.user, decoder^.inbuf_ptr, len);
|
|
||||||
if len <= 0 then
|
|
||||||
Exit(ofs);
|
|
||||||
|
|
||||||
Inc(decoder^.inbuf_ptr, len);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if decoder^.frame_size = 0 then
|
|
||||||
begin
|
|
||||||
(* no header seen : find one. We need at least 7 bytes to parse it *)
|
|
||||||
|
|
||||||
len := dts_syncinfo(decoder^.state, @decoder^.inbuf[0], decoder^.flags, sample_rate, bit_rate, i{dummy});
|
|
||||||
if len = 0 then
|
|
||||||
begin
|
|
||||||
(* no sync found : move by one byte (inefficient, but simple!) *)
|
|
||||||
Move(decoder^.inbuf[1], decoder^.inbuf[0], ptrint(decoder^.inbuf_ptr) - ptrint(@decoder^.inbuf) - 1);
|
|
||||||
Dec(decoder^.inbuf_ptr, 1);
|
|
||||||
end else begin
|
|
||||||
decoder^.frame_size := len;
|
|
||||||
|
|
||||||
(* update codec info *)
|
|
||||||
decoder^.sample_rate := sample_rate;
|
|
||||||
decoder^.bit_rate := bit_rate;
|
|
||||||
{decoder^.channels := ac3_channels[decoder^.flags and $7];
|
|
||||||
if decoder^.flags and A52_LFE <> 0 then
|
|
||||||
Inc(decoder^.channels);}
|
|
||||||
|
|
||||||
{WriteLn(' frame_size : ', decoder^.frame_size);
|
|
||||||
WriteLn(' sample_rate : ', sample_rate);
|
|
||||||
WriteLn(' bit_rate : ', bit_rate);
|
|
||||||
WriteLn(' channels : ', decoder^.channels);}
|
|
||||||
end;
|
|
||||||
|
|
||||||
Continue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* decode the frame *)
|
|
||||||
flags := DTS_STEREO or DTS_ADJUST_LEVEL;//decoder^.flags;
|
|
||||||
level := 0;//High(Smallint)-30;
|
|
||||||
(* FIXME dts_frame dont care on level parameters, so I set it to zero and multiply with High(Smallint) later *)
|
|
||||||
|
|
||||||
if dts_frame(decoder^.state, @decoder^.inbuf[0], flags, level, 0) <> 0 then
|
|
||||||
begin
|
|
||||||
decoder^.inbuf_ptr := @decoder^.inbuf[0];
|
|
||||||
decoder^.frame_size := 0;
|
|
||||||
Continue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
len := dts_blocks_num(decoder^.state);
|
|
||||||
for i := 0 to len - 1 do
|
|
||||||
begin
|
|
||||||
if dts_block(decoder^.state) <> 0 then
|
|
||||||
begin
|
|
||||||
decoder^.inbuf_ptr := @decoder^.inbuf[0];
|
|
||||||
decoder^.frame_size := 0;
|
|
||||||
Exit(-1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
for j := 0 to 255 do
|
|
||||||
begin
|
|
||||||
decoder^.samples[0, i*256+j] := Round(High(Smallint)*decoder^.fsamples[j + 000]);
|
|
||||||
decoder^.samples[1, i*256+j] := Round(High(Smallint)*decoder^.fsamples[j + 256]);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* skip decoded frame *)
|
|
||||||
Move(decoder^.inbuf[decoder^.frame_size], decoder^.inbuf[0], ptrint(decoder^.inbuf_ptr) - ptrint(@decoder^.inbuf) - decoder^.frame_size);
|
|
||||||
Dec(decoder^.inbuf_ptr, decoder^.frame_size);
|
|
||||||
decoder^.frame_size := 0;
|
|
||||||
|
|
||||||
decoder^.sampleofs := 0;
|
|
||||||
decoder^.samplecnt := len*256;
|
|
||||||
end;
|
|
||||||
|
|
||||||
len := num div 4;
|
|
||||||
if len > decoder^.samplecnt then
|
|
||||||
len := decoder^.samplecnt;
|
|
||||||
|
|
||||||
for i := 0 to len - 1 do
|
|
||||||
begin
|
|
||||||
pcint16(ptrint(buffer) + ofs + 0)^ := decoder^.samples[0][decoder^.sampleofs];
|
|
||||||
pcint16(ptrint(buffer) + ofs + 2)^ := decoder^.samples[1][decoder^.sampleofs];
|
|
||||||
|
|
||||||
Inc(decoder^.sampleofs);
|
|
||||||
Dec(decoder^.samplecnt);
|
|
||||||
ofs := ofs + 4;
|
|
||||||
num := num - 4;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Result := ofs;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile.fpc for LDAP bindings
|
|
||||||
#
|
|
||||||
|
|
||||||
[package]
|
|
||||||
name=ldap
|
|
||||||
version=2.0.0
|
|
||||||
|
|
||||||
[target]
|
|
||||||
units=lber ldap
|
|
||||||
|
|
||||||
[require]
|
|
||||||
packages=hash
|
|
||||||
|
|
||||||
[install]
|
|
||||||
fpcpackage=y
|
|
||||||
|
|
||||||
[default]
|
|
||||||
fpcdir=../../..
|
|
||||||
|
|
||||||
[rules]
|
|
||||||
.NOTPARALLEL:
|
|
@ -1,99 +0,0 @@
|
|||||||
{
|
|
||||||
Translation of the LDAP lber headers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
unit lber;
|
|
||||||
|
|
||||||
{$mode objfpc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
{$linklib lber}
|
|
||||||
|
|
||||||
{$include lber_typesh.inc}
|
|
||||||
{$include lberh.inc}
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
function LBER_INVALID(t: ber_tag_t): ber_tag_t;
|
|
||||||
// #define LBER_INVALID(t) (((t) & (ber_tag_t) = $080UL) && (((t) & (ber_tag_t) ~ = $0FF))
|
|
||||||
begin
|
|
||||||
LBER_INVALID := (t and $80) and (t and $FF);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LBER_OPT_ON: Pointer;
|
|
||||||
// #define LBER_OPT_ON ((void *) &ber_pvt_opt_on)
|
|
||||||
begin
|
|
||||||
LBER_OPT_ON := @ber_pvt_opt_on;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LBER_SBIOD_READ_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t;
|
|
||||||
// #define LBER_SBIOD_READ_NEXT( sbiod, buf, len ) ( (sbiod)->sbiod_next->sbiod_io->sbi_read( (sbiod)->sbiod_next, buf, len ) )
|
|
||||||
begin
|
|
||||||
LBER_SBIOD_READ_NEXT := sbiod^.sbiod_next^.sbiod_io^.sbi_read(sbiod^.sbiod_next, buf, len);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LBER_SBIOD_WRITE_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t;
|
|
||||||
// #define LBER_SBIOD_WRITE_NEXT( sbiod, buf, len ) ( (sbiod)->sbiod_next->sbiod_io->sbi_write( (sbiod)->sbiod_next, buf, len ) )
|
|
||||||
begin
|
|
||||||
LBER_SBIOD_WRITE_NEXT := sbiod^.sbiod_next^.sbiod_io^.sbi_write(sbiod^.sbiod_next, buf, len);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LBER_SBIOD_CTRL_NEXT(sbiod: PSockbuf_IO_Desc; opt: cint; arg: Pointer): cint;
|
|
||||||
// #define LBER_SBIOD_CTRL_NEXT( sbiod, opt, arg ) ( (sbiod)->sbiod_next ? ( (sbiod)->sbiod_next->sbiod_io->sbi_ctrl( (sbiod)->sbiod_next, opt, arg ) ) : 0 )
|
|
||||||
begin
|
|
||||||
if Assigned(sbiod^.sbiod_next) then
|
|
||||||
LBER_SBIOD_CTRL_NEXT := sbiod^.sbiod_next^.sbiod_io^.sbi_ctrl(sbiod^.sbiod_next, opt, arg) else
|
|
||||||
LBER_SBIOD_CTRL_NEXT := 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function ber_bvstr(const str: pcchar): PBerval;
|
|
||||||
begin
|
|
||||||
ber_bvstr := ber_str2bv(str, 0, false, nil);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function ber_bvstrdup(const str: pcchar): PBerval;
|
|
||||||
begin
|
|
||||||
ber_bvstrdup := ber_str2bv(str, 0, true, nil);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function memcmp(p1, p2: Pointer; len: cint): cint;
|
|
||||||
var
|
|
||||||
I: cint;
|
|
||||||
begin
|
|
||||||
for I := 0 to len -1 do
|
|
||||||
begin
|
|
||||||
if pbyte(p1)^ < pbyte(p2)^ then
|
|
||||||
begin
|
|
||||||
memcmp := -1;
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if pbyte(p1)^ > pbyte(p2)^ then
|
|
||||||
begin
|
|
||||||
memcmp := 1;
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
inc(p1, 1);
|
|
||||||
inc(p2, 1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
memcmp := 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function ber_bvcmp(v1, v2: PBerval): cint;
|
|
||||||
// #define ber_bvcmp(v1,v2) ((v1)->bv_len < (v2)->bv_len ? -1 : ((v1)->bv_len > (v2)->bv_len ? 1 : memcmp((v1)->bv_val, (v2)->bv_val, (v1)->bv_len) ))
|
|
||||||
begin
|
|
||||||
if v1^.bv_len < v2^.bv_len then ber_bvcmp := -1 else
|
|
||||||
if v1^.bv_len > v2^.bv_len then ber_bvcmp := 1 else
|
|
||||||
ber_bvcmp := memcmp(v1^.bv_val, v2^.bv_val, v1^.bv_len);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function ber_errno: cint;
|
|
||||||
begin
|
|
||||||
ber_errno := ber_errno_addr^;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
@ -1,67 +0,0 @@
|
|||||||
(* include/lber_types.h. Generated by configure. *)
|
|
||||||
(* $OpenLDAP: pkg/ldap/include/lber_types.h.in,v 1.10.2.3 2005/01/20 17:00:58 kurt Exp $ *)
|
|
||||||
(* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
*
|
|
||||||
* Copyright 1998-2005 The OpenLDAP Foundation.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted only as authorized by the OpenLDAP
|
|
||||||
* Public License.
|
|
||||||
*
|
|
||||||
* A copy of this license is available in file LICENSE in the
|
|
||||||
* top-level directory of the distribution or, alternatively, at
|
|
||||||
* <http://www.OpenLDAP.org/license.html>.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(*
|
|
||||||
* LBER types
|
|
||||||
*)
|
|
||||||
|
|
||||||
uses
|
|
||||||
ctypes;
|
|
||||||
|
|
||||||
type
|
|
||||||
ppcchar = ^pcchar;
|
|
||||||
pppcchar = ^ppcchar;
|
|
||||||
|
|
||||||
(* LBER Boolean, enum, integers (32 bits or larger) *)
|
|
||||||
LBER_INT_T = cint;
|
|
||||||
|
|
||||||
(* LBER tags (32 bits or larger) *)
|
|
||||||
LBER_TAG_T = clong;
|
|
||||||
|
|
||||||
(* LBER socket descriptor *)
|
|
||||||
LBER_SOCKET_T = cint;
|
|
||||||
|
|
||||||
(* LBER lengths (32 bits or larger) *)
|
|
||||||
LBER_LEN_T = clong;
|
|
||||||
|
|
||||||
(* ------------------------------------------------------------ *)
|
|
||||||
|
|
||||||
(* Booleans, enumerations, and integers *)
|
|
||||||
pber_int_t = ^ber_int_t;
|
|
||||||
ber_int_t = cint; // LBER_INT_T;
|
|
||||||
|
|
||||||
(* signed and unsigned versions *)
|
|
||||||
pber_sint_t = ^ber_sint_t;
|
|
||||||
ber_sint_t = csint; // signed LBER_INT_T
|
|
||||||
|
|
||||||
pber_uint_t = ^ber_uint_t;
|
|
||||||
ber_uint_t = cuint; // unsigned LBER_INT_T
|
|
||||||
|
|
||||||
(* tags *)
|
|
||||||
pber_tag_t = ^ber_tag_t;
|
|
||||||
ber_tag_t = culong; // unsigned LBER_TAG_T
|
|
||||||
|
|
||||||
(* "socket" descriptors *)
|
|
||||||
pber_socket_t = ^ber_socket_t;
|
|
||||||
ber_socket_t = cint; // LBER_SOCKET_T
|
|
||||||
|
|
||||||
(* lengths *)
|
|
||||||
pber_len_t = ^ber_len_t;
|
|
||||||
ber_len_t = culong; // unsigned LBER_LEN_T
|
|
||||||
|
|
||||||
(* signed lengths *)
|
|
||||||
pber_slen_t = ^ber_slen_t;
|
|
||||||
ber_slen_t = clong; // signed LBER_LEN_T;
|
|
@ -1,427 +0,0 @@
|
|||||||
(* $OpenLDAP: pkg/ldap/include/lber.h,v 1.83.2.11 2005/01/20 17:00:58 kurt Exp $ *)
|
|
||||||
(* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
*
|
|
||||||
* Copyright 1998-2005 The OpenLDAP Foundation.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted only as authorized by the OpenLDAP
|
|
||||||
* Public License.
|
|
||||||
*
|
|
||||||
* A copy of this license is available in file LICENSE in the
|
|
||||||
* top-level directory of the distribution or, alternatively, at
|
|
||||||
* <http://www.OpenLDAP.org/license.html>.
|
|
||||||
*)
|
|
||||||
(* Portions Copyright (c) 1990 Regents of the University of Michigan.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted
|
|
||||||
* provided that this notice is preserved and that due credit is given
|
|
||||||
* to the University of Michigan at Ann Arbor. The name of the University
|
|
||||||
* may not be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission. This software
|
|
||||||
* is provided ``as is'' without express or implied warranty.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* Overview of LBER tag construction
|
|
||||||
*
|
|
||||||
* Bits
|
|
||||||
* ______
|
|
||||||
* 8 7 | CLASS
|
|
||||||
* 0 0 = UNIVERSAL
|
|
||||||
* 0 1 = APPLICATION
|
|
||||||
* 1 0 = CONTEXT-SPECIFIC
|
|
||||||
* 1 1 = PRIVATE
|
|
||||||
* _____
|
|
||||||
* | 6 | DATA-TYPE
|
|
||||||
* 0 = PRIMITIVE
|
|
||||||
* 1 = CONSTRUCTED
|
|
||||||
* ___________
|
|
||||||
* | 5 ... 1 | TAG-NUMBER
|
|
||||||
*)
|
|
||||||
|
|
||||||
const
|
|
||||||
(* BER classes and mask *)
|
|
||||||
LBER_CLASS_UNIVERSAL = ber_tag_t($00);
|
|
||||||
LBER_CLASS_APPLICATION = ber_tag_t($40);
|
|
||||||
LBER_CLASS_CONTEXT = ber_tag_t($80);
|
|
||||||
LBER_CLASS_PRIVATE = ber_tag_t($c0);
|
|
||||||
LBER_CLASS_MASK = ber_tag_t($c0);
|
|
||||||
|
|
||||||
(* BER encoding type and mask *)
|
|
||||||
LBER_PRIMITIVE = ber_tag_t($00);
|
|
||||||
LBER_CONSTRUCTED = ber_tag_t($20);
|
|
||||||
LBER_ENCODING_MASK = ber_tag_t($20);
|
|
||||||
|
|
||||||
LBER_BIG_TAG_MASK = ber_tag_t($1f);
|
|
||||||
LBER_MORE_TAG_MASK = ber_tag_t($80);
|
|
||||||
|
|
||||||
(*
|
|
||||||
* Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
|
|
||||||
* as valid BER tags, and so it is safe to use them to report errors. In
|
|
||||||
* fact, any tag for which the following is true is invalid:
|
|
||||||
*)
|
|
||||||
function LBER_INVALID(t: ber_tag_t): ber_tag_t;
|
|
||||||
|
|
||||||
const
|
|
||||||
LBER_ERROR = ber_tag_t(-1);
|
|
||||||
LBER_DEFAULT = ber_tag_t(-1);
|
|
||||||
|
|
||||||
(* general BER types we know about *)
|
|
||||||
LBER_BOOLEAN = ber_tag_t($01);
|
|
||||||
LBER_INTEGER = ber_tag_t($02);
|
|
||||||
LBER_BITSTRING = ber_tag_t($03);
|
|
||||||
LBER_OCTETSTRING = ber_tag_t($04);
|
|
||||||
LBER_NULL = ber_tag_t($05);
|
|
||||||
LBER_ENUMERATED = ber_tag_t($0a);
|
|
||||||
LBER_SEQUENCE = ber_tag_t($30); (* constructed *)
|
|
||||||
LBER_SET = ber_tag_t($31); (* constructed *)
|
|
||||||
|
|
||||||
(* LBER BerElement options *)
|
|
||||||
LBER_USE_DER = $01;
|
|
||||||
|
|
||||||
(* get/set options for BerElement *)
|
|
||||||
LBER_OPT_BER_OPTIONS = $01;
|
|
||||||
LBER_OPT_BER_DEBUG = $02;
|
|
||||||
LBER_OPT_BER_REMAINING_BYTES = $03;
|
|
||||||
LBER_OPT_BER_TOTAL_BYTES = $04;
|
|
||||||
LBER_OPT_BER_BYTES_TO_WRITE = $05;
|
|
||||||
LBER_OPT_BER_MEMCTX = $06;
|
|
||||||
|
|
||||||
LBER_OPT_DEBUG_LEVEL = LBER_OPT_BER_DEBUG;
|
|
||||||
LBER_OPT_REMAINING_BYTES = LBER_OPT_BER_REMAINING_BYTES;
|
|
||||||
LBER_OPT_TOTAL_BYTES = LBER_OPT_BER_TOTAL_BYTES;
|
|
||||||
LBER_OPT_BYTES_TO_WRITE = LBER_OPT_BER_BYTES_TO_WRITE;
|
|
||||||
|
|
||||||
LBER_OPT_LOG_PRINT_FN = $8001;
|
|
||||||
LBER_OPT_MEMORY_FNS = $8002;
|
|
||||||
LBER_OPT_ERROR_FN = $8003;
|
|
||||||
LBER_OPT_LOG_PRINT_FILE = $8004;
|
|
||||||
|
|
||||||
(* get/set Memory Debug options *)
|
|
||||||
LBER_OPT_MEMORY_INUSE = $8005; (* for memory debugging *)
|
|
||||||
LBER_OPT_LOG_PROC = $8006; (* for external logging function *)
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
BER_ERRNO_FN = function: pcint; cdecl;
|
|
||||||
|
|
||||||
BER_LOG_PRINT_FN = procedure(const buf: pcchar); cdecl;
|
|
||||||
|
|
||||||
BER_MEMALLOC_FN = function(size: ber_len_t): Pointer; cdecl;
|
|
||||||
BER_MEMCALLOC_FN = function(n: ber_len_t; size: ber_len_t): Pointer; cdecl;
|
|
||||||
BER_MEMREALLOC_FN = function(p: Pointer; size: ber_len_t): Pointer; cdecl;
|
|
||||||
BER_MEMFREE_FN = function(p: Pointer): Pointer; cdecl;
|
|
||||||
|
|
||||||
plber_memory_fns = ^lber_memory_fns;
|
|
||||||
lber_memory_fns = record
|
|
||||||
bmf_malloc : BER_MEMALLOC_FN;
|
|
||||||
bmf_calloc : BER_MEMCALLOC_FN;
|
|
||||||
bmf_realloc : BER_MEMREALLOC_FN;
|
|
||||||
bmf_free : BER_MEMFREE_FN;
|
|
||||||
end;
|
|
||||||
|
|
||||||
PBerMemoryFunctions = ^BerMemoryFunctions;
|
|
||||||
BerMemoryFunctions = lber_memory_fns;
|
|
||||||
|
|
||||||
const
|
|
||||||
(* LBER Sockbuf_IO options *)
|
|
||||||
LBER_SB_OPT_GET_FD = 1;
|
|
||||||
LBER_SB_OPT_SET_FD = 2;
|
|
||||||
LBER_SB_OPT_HAS_IO = 3;
|
|
||||||
LBER_SB_OPT_SET_NONBLOCK = 4;
|
|
||||||
LBER_SB_OPT_GET_SSL = 7;
|
|
||||||
LBER_SB_OPT_DATA_READY = 8;
|
|
||||||
LBER_SB_OPT_SET_READAHEAD = 9;
|
|
||||||
LBER_SB_OPT_DRAIN = 10;
|
|
||||||
LBER_SB_OPT_NEEDS_READ = 11;
|
|
||||||
LBER_SB_OPT_NEEDS_WRITE = 12;
|
|
||||||
LBER_SB_OPT_GET_MAX_INCOMING = 13;
|
|
||||||
LBER_SB_OPT_SET_MAX_INCOMING = 14;
|
|
||||||
(* Largest option used by the library *)
|
|
||||||
LBER_SB_OPT_OPT_MAX = 14;
|
|
||||||
|
|
||||||
(* LBER IO operations stacking levels *)
|
|
||||||
LBER_SBIOD_LEVEL_PROVIDER = 10;
|
|
||||||
LBER_SBIOD_LEVEL_TRANSPORT = 20;
|
|
||||||
LBER_SBIOD_LEVEL_APPLICATION = 30;
|
|
||||||
|
|
||||||
(* get/set options for Sockbuf *)
|
|
||||||
LBER_OPT_SOCKBUF_DESC = $1000;
|
|
||||||
LBER_OPT_SOCKBUF_OPTIONS = $1001;
|
|
||||||
LBER_OPT_SOCKBUF_DEBUG = $1002;
|
|
||||||
|
|
||||||
LBER_OPT_SUCCESS = 0;
|
|
||||||
LBER_OPT_ERROR = -1;
|
|
||||||
|
|
||||||
(* on/off values *)
|
|
||||||
const
|
|
||||||
LBER_OPT_OFF = Pointer(0);
|
|
||||||
|
|
||||||
var
|
|
||||||
ber_pvt_opt_on: cchar; cvar; external;
|
|
||||||
|
|
||||||
function LBER_OPT_ON: Pointer;
|
|
||||||
|
|
||||||
(* Structure for LBER IO operarion descriptor *)
|
|
||||||
type
|
|
||||||
PBerElement = Pointer;
|
|
||||||
|
|
||||||
PSockbuf = Pointer;
|
|
||||||
|
|
||||||
PSeqorset = Pointer;
|
|
||||||
|
|
||||||
PSockbuf_IO = ^Sockbuf_IO;
|
|
||||||
|
|
||||||
PSockbuf_IO_Desc = ^Sockbuf_IO_Desc;
|
|
||||||
Sockbuf_IO_Desc = record
|
|
||||||
sbiod_level : cint;
|
|
||||||
sbiod_sb : PSockbuf;
|
|
||||||
sbiod_io : PSockbuf_IO;
|
|
||||||
sbiod_pvt : Pointer;
|
|
||||||
sbiod_next : PSockbuf_IO_Desc;
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* Structure for LBER IO operation functions *)
|
|
||||||
Sockbuf_IO = record
|
|
||||||
sbi_setup : function(sbiod: PSockbuf_IO_Desc; arg: Pointer): cint; cdecl;
|
|
||||||
sbi_remove : function(sbiod: PSockbuf_IO_Desc): cint; cdecl;
|
|
||||||
sbi_ctrl : function(sbiod: PSockbuf_IO_Desc; opt: cint; arg: Pointer): cint; cdecl;
|
|
||||||
sbi_read : function(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; cdecl;
|
|
||||||
sbi_write : function(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; cdecl;
|
|
||||||
sbi_close : function(sbiod: PSockbuf_IO_Desc): cint; cdecl;
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* Helper macros for LBER IO functions *)
|
|
||||||
function LBER_SBIOD_READ_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t;
|
|
||||||
|
|
||||||
function LBER_SBIOD_WRITE_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t;
|
|
||||||
|
|
||||||
function LBER_SBIOD_CTRL_NEXT(sbiod: PSockbuf_IO_Desc; opt: cint; arg: Pointer): cint;
|
|
||||||
|
|
||||||
|
|
||||||
(* structure for returning a sequence of octet strings + length *)
|
|
||||||
type
|
|
||||||
PPPBerval = ^PPBerval;
|
|
||||||
PPBerval = ^PBerval;
|
|
||||||
PBerval = ^Berval;
|
|
||||||
Berval = record
|
|
||||||
bv_len : ber_len_t;
|
|
||||||
bv_val : pcchar;
|
|
||||||
end;
|
|
||||||
|
|
||||||
PBerVarray = ^BerVarray;
|
|
||||||
BerVarray = ^PBerval; (* To distinguish from a single bv *)
|
|
||||||
|
|
||||||
|
|
||||||
(* this should be moved to lber-cint.h *)
|
|
||||||
|
|
||||||
(*
|
|
||||||
* in bprint.c:
|
|
||||||
*)
|
|
||||||
procedure ber_error_print(const data: pcchar); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_bprint(const data: pcchar; len: ber_len_t); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_dump(ber: PBerElement; inout : cint); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_sos_dump(sos: PSeqorset); cdecl; external;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* in decode.c:
|
|
||||||
*)
|
|
||||||
type
|
|
||||||
BERDecodeCallback = function(ber: PBerElement; data: Pointer; mode: cint): cint; cdecl;
|
|
||||||
|
|
||||||
|
|
||||||
function ber_get_tag(ber: PBerElement): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_skip_tag(ber: PBerElement; var len: ber_len_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_peek_tag(ber: PBerElement; var len: ber_len_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_int(ber: PBerElement; var num: ber_int_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_enum(ber: PBerElement; var num: ber_int_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_stringb(ber: PBerElement; buf: pcchar; var len: ber_len_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_stringbv(ber: PBerElement; bv: PBerval; alloc: cbool): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_stringa(ber: PBerElement; var buf: pcchar): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_stringal(ber: PBerElement; var bv: PBerval): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_bitstringa(ber: PBerElement; var buf: pcchar; var len: ber_len_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_null(ber: PBerElement): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_Boolean(ber: PBerElement; var boolval: ber_int_t): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_first_element(ber: PBerElement; var len: ber_len_t; var last: pcchar): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_next_element(ber: PBerElement; var len: ber_len_t; const last: pcchar): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_scanf(ber: PBerElement;const fmt: pcchar): ber_tag_t; cdecl; varargs; external;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* in encode.c
|
|
||||||
*)
|
|
||||||
type
|
|
||||||
BEREncodeCallback = function(ber: PBerElement; data: Pointer): cint;
|
|
||||||
|
|
||||||
|
|
||||||
function ber_put_enum(ber: PBerElement; num: ber_int_t; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_int(ber: PBerElement; num: ber_int_t; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_ostring(ber: PBerElement; const str: pcchar; len: ber_len_t; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_berval(ber: PBerElement; bv: PBerval; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_string(ber: PBerElement; const str: pcchar; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_bitstring(ber: PBerElement; const str: pcchar; bitlen: ber_len_t; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_null(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_boolean(ber: PBerElement; boolval: ber_int_t; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_start_seq(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_start_set(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_seq(ber: PBerElement): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_put_set(ber: PBerElement): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_printf(ber: PBerElement; const fmt: pcchar): cint; cdecl; varargs; external;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* in io.c:
|
|
||||||
*)
|
|
||||||
|
|
||||||
function ber_read(ber: PBerElement; buf: pcchar; len: ber_len_t): ber_slen_t; cdecl; external;
|
|
||||||
|
|
||||||
function ber_write(ber: PBerElement; const buf: pcchar; len: ber_len_t; nosos: cint): ber_slen_t; cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_free(ber: PBerElement; freebuf: cbool); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_free_buf(ber: PBerElement); cdecl; external;
|
|
||||||
|
|
||||||
function ber_flush(sb: PSockbuf; ber: PBerElement; freeit: cbool): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_alloc: PBerElement; cdecl; external; deprecated;
|
|
||||||
|
|
||||||
function der_alloc: PBerElement; cdecl; external; deprecated;
|
|
||||||
|
|
||||||
function ber_alloc_t(beroptions: cint): PBerElement; cdecl; external;
|
|
||||||
|
|
||||||
function ber_dup(ber: PBerElement): PBerElement; cdecl; external;
|
|
||||||
|
|
||||||
function ber_get_next(sb: PSockbuf; var len: ber_len_t; ber: PBerElement): ber_tag_t; cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_init2(ber: PBerElement; bv: PBerval; options: cint); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_init_w_nullc(ber: PBerElement; options: cint); cdecl; external; deprecated;
|
|
||||||
|
|
||||||
procedure ber_reset(ber: PBerElement; was_writing: cbool); cdecl; external;
|
|
||||||
|
|
||||||
function ber_init(bv: PBerval): PBerElement; cdecl; external;
|
|
||||||
|
|
||||||
function ber_flatten(ber: PBerElement; var bvPtr: PBerval): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_flatten2(ber: PBerElement; bv: PBerval; alloc: cbool): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_remaining(ber: PBerElement): cint; cdecl; external;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* LBER ber accessor functions
|
|
||||||
*)
|
|
||||||
|
|
||||||
function ber_get_option(item: Pointer; option: cint; outvalue: Pointer): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_set_option(item: Pointer; option: cint; const invalue: Pointer): cint; cdecl; external;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* LBER sockbuf.c
|
|
||||||
*)
|
|
||||||
|
|
||||||
function ber_sockbuf_alloc: PSockbuf; cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_sockbuf_free(sb: PSockbuf); cdecl; external;
|
|
||||||
|
|
||||||
function ber_sockbuf_add_io(sb: PSockbuf; sbio: PSockbuf_IO; layer: cint; arg: Pointer): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_sockbuf_remove_io(sb: PSockbuf; sbio: PSockbuf_IO; layer: cint): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_sockbuf_ctrl(sb: PSockbuf; opt: cint; arg: Pointer): cint; cdecl; external;
|
|
||||||
|
|
||||||
var
|
|
||||||
ber_sockbuf_io_tcp : Sockbuf_IO; cvar; external;
|
|
||||||
ber_sockbuf_io_readahead : Sockbuf_IO; cvar; external;
|
|
||||||
ber_sockbuf_io_fd : Sockbuf_IO; cvar; external;
|
|
||||||
ber_sockbuf_io_debug : Sockbuf_IO; cvar; external;
|
|
||||||
{$IFDEF LDAP_CONNECTIONLESS}
|
|
||||||
ber_sockbuf_io_udp : Sockbuf_IO; cvar; external;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* LBER memory.c
|
|
||||||
*)
|
|
||||||
|
|
||||||
function ber_memalloc(s: ber_len_t): Pointer; cdecl; external;
|
|
||||||
|
|
||||||
function ber_memrealloc(p: Pointer; s: ber_len_t): Pointer; cdecl; external;
|
|
||||||
|
|
||||||
function ber_memcalloc(n: ber_len_t; s: ber_len_t): Pointer; cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_memfree(p: Pointer); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_memvfree(vector: PPointer); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_bvfree(bv: PBerval); cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_bvecfree(bv: PPBerval); cdecl; external;
|
|
||||||
|
|
||||||
function ber_bvecadd(var bvec: PPBerval; bv: PBerval): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_dupbv(dst: PBerval; src: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ber_bvdup(src: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ber_str2bv(const str: pcchar; len: ber_len_t; duplicate: cbool; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ber_mem2bv(const str: pcchar; len: ber_len_t; duplicate: cbool; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ber_bvstr(const str: pcchar): PBerval;
|
|
||||||
|
|
||||||
function ber_bvstrdup(const str: pcchar): PBerval;
|
|
||||||
|
|
||||||
function ber_strdup(const str: pcchar): pcchar; cdecl; external;
|
|
||||||
|
|
||||||
procedure ber_bvarray_free(p: BerVarray); cdecl; external;
|
|
||||||
|
|
||||||
function ber_bvarray_add(p: PBerVarray; bv: PBerval): cint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_bvcmp(v1, v2: PBerval): cint;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* error.c
|
|
||||||
*)
|
|
||||||
|
|
||||||
function ber_errno_addr: pcint; cdecl; external;
|
|
||||||
|
|
||||||
function ber_errno: cint;
|
|
||||||
|
|
||||||
const
|
|
||||||
LBER_ERROR_NONE = $0;
|
|
||||||
LBER_ERROR_PARAM = $1;
|
|
||||||
LBER_ERROR_MEMORY = $2;
|
|
@ -1,78 +0,0 @@
|
|||||||
{
|
|
||||||
Translation of the LDAP headers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
unit ldap;
|
|
||||||
|
|
||||||
{$mode objfpc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
ctypes,
|
|
||||||
lber;
|
|
||||||
|
|
||||||
{$linklib ldap}
|
|
||||||
|
|
||||||
{$include ldap_featuresh.inc}
|
|
||||||
{$include ldap_schemah.inc}
|
|
||||||
{$include ldaph.inc}
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
function LDAP_OPT_ON: Pointer;
|
|
||||||
// #define LDAP_OPT_ON ((void *) &ber_pvt_opt_on)
|
|
||||||
begin
|
|
||||||
LDAP_OPT_ON := @ber_pvt_opt_on;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_RANGE(n, x, y: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_RANGE(n,x,y) (((x) <= (n)) && ((n) <= (y)))
|
|
||||||
begin
|
|
||||||
LDAP_RANGE := (x <= n) and (n <= y);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_ATTR_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_ATTR_ERROR(n) LDAP_RANGE((n),0x10,0x15) (* 16-21 *)
|
|
||||||
begin
|
|
||||||
LDAP_ATTR_ERROR := LDAP_RANGE(n, $10, $15);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_NAME_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_NAME_ERROR(n) LDAP_RANGE((n),0x20,0x24) (* 32-34,36 *)
|
|
||||||
begin
|
|
||||||
LDAP_NAME_ERROR := LDAP_RANGE(n, $20, $24);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_SECURITY_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_SECURITY_ERROR(n) LDAP_RANGE((n),0x2F,0x32) (* 47-50 *)
|
|
||||||
begin
|
|
||||||
LDAP_SECURITY_ERROR := LDAP_RANGE(n, $2F, $32);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_SERVICE_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_SERVICE_ERROR(n) LDAP_RANGE((n),0x33,0x36) (* 51-54 *)
|
|
||||||
begin
|
|
||||||
LDAP_SERVICE_ERROR := LDAP_RANGE(n, $33, $36);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_UPDATE_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_UPDATE_ERROR(n) LDAP_RANGE((n),0x40,0x47) (* 64-69,71 *)
|
|
||||||
begin
|
|
||||||
LDAP_UPDATE_ERROR := LDAP_RANGE(n, $40, $47);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_API_ERROR(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_API_ERROR(n) LDAP_RANGE((n),0x51,0x61) (* 81-97 *)}
|
|
||||||
begin
|
|
||||||
LDAP_API_ERROR := n < 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function LDAP_API_RESULT(n: ber_int_t): Boolean;
|
|
||||||
// #define LDAP_API_RESULT(n) (((n) == LDAP_SUCCESS) || LDAP_RANGE((n),0x51,0x61)) (* 0,81-97 *)
|
|
||||||
begin
|
|
||||||
LDAP_API_RESULT := n <= 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
@ -1,59 +0,0 @@
|
|||||||
(* include/ldap_features.h. Generated automatically by configure. *)
|
|
||||||
(* $OpenLDAP: pkg/ldap/include/ldap_features.h.in,v 1.13.2.1 2003/02/09 17:02:17 kurt Exp $ *)
|
|
||||||
(*
|
|
||||||
* Copyright 1998-2003 The OpenLDAP Foundation, Redwood City, California, USA
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted only as authorized by the OpenLDAP
|
|
||||||
* Public License. A copy of this license is available at
|
|
||||||
* http://www.OpenLDAP.org/license.html or in file LICENSE in the
|
|
||||||
* top-level directory of the distribution.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(*
|
|
||||||
* LDAP Features
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* OpenLDAP API version macros *)
|
|
||||||
const
|
|
||||||
LDAP_VENDOR_VERSION = 20228;
|
|
||||||
LDAP_VENDOR_VERSION_MAJOR = 2;
|
|
||||||
LDAP_VENDOR_VERSION_MINOR = 2;
|
|
||||||
LDAP_VENDOR_VERSION_PATCH = 28;
|
|
||||||
|
|
||||||
(*
|
|
||||||
** WORK IN PROGRESS!
|
|
||||||
**
|
|
||||||
** OpenLDAP reentrancy/thread-safeness should be dynamically
|
|
||||||
** checked using ldap_get_option().
|
|
||||||
**
|
|
||||||
** The -lldap implementation is not thread-safe.
|
|
||||||
**
|
|
||||||
** The -lldap_r implementation is:
|
|
||||||
** LDAP_API_FEATURE_THREAD_SAFE (basic thread safety)
|
|
||||||
** but also be:
|
|
||||||
** LDAP_API_FEATURE_SESSION_THREAD_SAFE
|
|
||||||
** LDAP_API_FEATURE_OPERATION_THREAD_SAFE
|
|
||||||
**
|
|
||||||
** The preprocessor flag LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE
|
|
||||||
** can be used to determine if -lldap_r is available at compile
|
|
||||||
** time. You must define LDAP_THREAD_SAFE if and only if you
|
|
||||||
** link with -lldap_r.
|
|
||||||
**
|
|
||||||
** If you fail to define LDAP_THREAD_SAFE when linking with
|
|
||||||
** -lldap_r or define LDAP_THREAD_SAFE when linking with -lldap,
|
|
||||||
** provided header definations and declarations may be incorrect.
|
|
||||||
**
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* is -lldap_r available or not *)
|
|
||||||
{$DEFINE LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE}
|
|
||||||
|
|
||||||
(* LDAP v2 Kerberos Bind *)
|
|
||||||
//{$UNDEF LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND}
|
|
||||||
|
|
||||||
(* LDAP v2 Referrals *)
|
|
||||||
//{$UNDEF LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS}
|
|
||||||
|
|
||||||
|
|
@ -1,255 +0,0 @@
|
|||||||
(* $OpenLDAP: pkg/ldap/include/ldap_schema.h,v 1.32.2.3 2005/01/20 17:00:59 kurt Exp $ *)
|
|
||||||
(* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
*
|
|
||||||
* Copyright 1998-2005 The OpenLDAP Foundation.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted only as authorized by the OpenLDAP
|
|
||||||
* Public License.
|
|
||||||
*
|
|
||||||
* A copy of this license is available in file LICENSE in the
|
|
||||||
* top-level directory of the distribution or, alternatively, at
|
|
||||||
* <http://www.OpenLDAP.org/license.html>.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* ldap-schema.h - Header for basic schema handling functions that can be
|
|
||||||
* used by both clients and servers.
|
|
||||||
* these routines should be renamed ldap_x_...
|
|
||||||
*)
|
|
||||||
|
|
||||||
|
|
||||||
(* Codes for parsing errors *)
|
|
||||||
|
|
||||||
const
|
|
||||||
LDAP_SCHERR_OUTOFMEM = 1;
|
|
||||||
LDAP_SCHERR_UNEXPTOKEN = 2;
|
|
||||||
LDAP_SCHERR_NOLEFTPAREN = 3;
|
|
||||||
LDAP_SCHERR_NORIGHTPAREN = 4;
|
|
||||||
LDAP_SCHERR_NODIGIT = 5;
|
|
||||||
LDAP_SCHERR_BADNAME = 6;
|
|
||||||
LDAP_SCHERR_BADDESC = 7;
|
|
||||||
LDAP_SCHERR_BADSUP = 8;
|
|
||||||
LDAP_SCHERR_DUPOPT = 9;
|
|
||||||
LDAP_SCHERR_EMPTY = 10;
|
|
||||||
LDAP_SCHERR_MISSING = 11;
|
|
||||||
LDAP_SCHERR_OUT_OF_ORDER = 12;
|
|
||||||
|
|
||||||
type
|
|
||||||
pldap_schema_extension_item = ^ldap_schema_extension_item;
|
|
||||||
ldap_schema_extension_item = record
|
|
||||||
lsei_name : pcchar;
|
|
||||||
lsei_values : ppcchar;
|
|
||||||
end;
|
|
||||||
|
|
||||||
PPLDAPSchemaExtensionItem = ^PLDAPSchemaExtensionItem;
|
|
||||||
PLDAPSchemaExtensionItem = ^LDAPSchemaExtensionItem;
|
|
||||||
LDAPSchemaExtensionItem = ldap_schema_extension_item;
|
|
||||||
|
|
||||||
pldap_syntax = ^ldap_syntax;
|
|
||||||
ldap_syntax = record
|
|
||||||
syn_oid : pcchar; (* REQUIRED *)
|
|
||||||
syn_names : ppcchar; (* OPTIONAL *)
|
|
||||||
syn_desc : pcchar; (* OPTIONAL *)
|
|
||||||
syn_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPSyntax = ^ldap_syntax;
|
|
||||||
LDAPSyntax = ldap_syntax;
|
|
||||||
|
|
||||||
pldap_matchingrule = ^ldap_matchingrule;
|
|
||||||
ldap_matchingrule = record
|
|
||||||
mr_oid : pcchar; (* REQUIRED *)
|
|
||||||
mr_names : ppcchar; (* OPTIONAL *)
|
|
||||||
mr_desc : pcchar; (* OPTIONAL *)
|
|
||||||
mr_obsolete : cint; (* OPTIONAL *)
|
|
||||||
mr_syntax_oid : pcchar; (* REQUIRED *)
|
|
||||||
mr_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPMatchingRule = ^LDAPMatchingRule;
|
|
||||||
LDAPMatchingRule = ldap_matchingrule;
|
|
||||||
|
|
||||||
pldap_matchingruleuse = ^ldap_matchingruleuse;
|
|
||||||
ldap_matchingruleuse = record
|
|
||||||
mru_oid : pcchar; (* REQUIRED *)
|
|
||||||
mru_names : ppcchar; (* OPTIONAL *)
|
|
||||||
mru_desc : pcchar; (* OPTIONAL *)
|
|
||||||
mru_obsolete : cint; (* OPTIONAL *)
|
|
||||||
mru_applies_oids: ppcchar; (* REQUIRED *)
|
|
||||||
mru_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPMatchingRuleUse = ^LDAPMatchingRuleUse;
|
|
||||||
LDAPMatchingRuleUse = ldap_matchingruleuse;
|
|
||||||
|
|
||||||
pldap_attributetype = ^ldap_attributetype;
|
|
||||||
ldap_attributetype = record
|
|
||||||
at_oid : pcchar; (* REQUIRED *)
|
|
||||||
at_names : ppcchar; (* OPTIONAL *)
|
|
||||||
at_desc : pcchar; (* OPTIONAL *)
|
|
||||||
at_obsolete : cint; (* 0=no, 1=yes *)
|
|
||||||
at_sup_oid : pcchar; (* OPTIONAL *)
|
|
||||||
at_equality_oid : pcchar; (* OPTIONAL *)
|
|
||||||
at_ordering_oid : pcchar; (* OPTIONAL *)
|
|
||||||
at_substr_oid : pcchar; (* OPTIONAL *)
|
|
||||||
at_syntax_oid : pcchar; (* OPTIONAL *)
|
|
||||||
at_syntax_len : cint; (* OPTIONAL *)
|
|
||||||
at_single_value : cint; (* 0=no, 1=yes *)
|
|
||||||
at_collective : cint; (* 0=no, 1=yes *)
|
|
||||||
at_no_user_mod : cint; (* 0=no, 1=yes *)
|
|
||||||
at_usage : cint; (* 0=userApplications, 1=directoryOperation, 2=distributedOperation, 3=dSAOperation *)
|
|
||||||
at_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPAttributeType = ^LDAPAttributeType;
|
|
||||||
LDAPAttributeType = ldap_attributetype;
|
|
||||||
|
|
||||||
pldap_objectclass = ^ldap_objectclass;
|
|
||||||
ldap_objectclass = record
|
|
||||||
oc_oid : pcchar; (* REQUIRED *)
|
|
||||||
oc_names : ppcchar; (* OPTIONAL *)
|
|
||||||
oc_desc : pcchar; (* OPTIONAL *)
|
|
||||||
oc_obsolete : cint; (* 0=no, 1=yes *)
|
|
||||||
oc_sup_oids : ppcchar; (* OPTIONAL *)
|
|
||||||
oc_kind : cint; (* 0=ABSTRACT, 1=STRUCTURAL, 2=AUXILIARY *)
|
|
||||||
oc_at_oids_must : ppcchar; (* OPTIONAL *)
|
|
||||||
oc_at_oids_may : ppcchar; (* OPTIONAL *)
|
|
||||||
oc_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPObjectClass = ^LDAPObjectClass;
|
|
||||||
LDAPObjectClass = ldap_objectclass;
|
|
||||||
|
|
||||||
pldap_contentrule = ^ldap_contentrule;
|
|
||||||
ldap_contentrule = record
|
|
||||||
cr_oid : pcchar; (* REQUIRED *)
|
|
||||||
cr_names : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_desc : pcchar; (* OPTIONAL *)
|
|
||||||
cr_sup_oids : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_obsolete : cint; (* 0=no, 1=yes *)
|
|
||||||
cr_oc_oids_aux : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_at_oids_must : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_at_oids_may : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_at_oids_not : ppcchar; (* OPTIONAL *)
|
|
||||||
cr_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPContentRule = ^LDAPContentRule;
|
|
||||||
LDAPContentRule = ldap_contentrule;
|
|
||||||
|
|
||||||
pldap_nameform = ^ldap_nameform;
|
|
||||||
ldap_nameform = record
|
|
||||||
nf_oid : pcchar; (* REQUIRED *)
|
|
||||||
nf_names : ppcchar; (* OPTIONAL *)
|
|
||||||
nf_desc : pcchar; (* OPTIONAL *)
|
|
||||||
nf_obsolete : cint; (* 0=no, 1=yes *)
|
|
||||||
nf_objectclass : pcchar; (* REQUIRED *)
|
|
||||||
nf_at_oids_must : ppcchar; (* REQUIRED *)
|
|
||||||
nf_at_oids_may : ppcchar; (* OPTIONAL *)
|
|
||||||
nf_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPNameForm = ^LDAPNameForm;
|
|
||||||
LDAPNameForm = ldap_nameform;
|
|
||||||
|
|
||||||
pldap_structurerule = ^ldap_structurerule;
|
|
||||||
ldap_structurerule = record
|
|
||||||
sr_ruleid : cint; (* REQUIRED *)
|
|
||||||
sr_names : ppcchar; (* OPTIONAL *)
|
|
||||||
sr_desc : pcchar; (* OPTIONAL *)
|
|
||||||
sr_obsolete : cint; (* 0=no, 1=yes *)
|
|
||||||
sr_nameform : pcchar; (* REQUIRED *)
|
|
||||||
sr_nsup_ruleids : cint; (* number of sr_sup_ruleids *)
|
|
||||||
sr_sup_ruleids : pcint; (* OPTIONAL *)
|
|
||||||
sr_extensions : PPLDAPSchemaExtensionItem; (* OPTIONAL *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
PLDAPStructureRule = ^LDAPStructureRule;
|
|
||||||
LDAPStructureRule = ldap_structurerule;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* Misc macros
|
|
||||||
*)
|
|
||||||
const
|
|
||||||
LDAP_SCHEMA_NO = 0;
|
|
||||||
LDAP_SCHEMA_YES = 1;
|
|
||||||
|
|
||||||
LDAP_SCHEMA_USER_APPLICATIONS = 0;
|
|
||||||
LDAP_SCHEMA_DIRECTORY_OPERATION = 1;
|
|
||||||
LDAP_SCHEMA_DISTRIBUTED_OPERATION = 2;
|
|
||||||
LDAP_SCHEMA_DSA_OPERATION = 3;
|
|
||||||
|
|
||||||
LDAP_SCHEMA_ABSTRACT = 0;
|
|
||||||
LDAP_SCHEMA_STRUCTURAL = 1;
|
|
||||||
LDAP_SCHEMA_AUXILIARY = 2;
|
|
||||||
|
|
||||||
|
|
||||||
(*
|
|
||||||
* Flags that control how liberal the parsing routines are.
|
|
||||||
*)
|
|
||||||
const
|
|
||||||
LDAP_SCHEMA_ALLOW_NONE = $00; (* Strict parsing *)
|
|
||||||
LDAP_SCHEMA_ALLOW_NO_OID = $01; (* Allow missing oid *)
|
|
||||||
LDAP_SCHEMA_ALLOW_QUOTED = $02; (* Allow bogus extra quotes *)
|
|
||||||
LDAP_SCHEMA_ALLOW_DESCR = $04; (* Allow descr instead of OID *)
|
|
||||||
LDAP_SCHEMA_ALLOW_DESCR_PREFIX = $08; (* Allow descr as OID prefix *)
|
|
||||||
LDAP_SCHEMA_ALLOW_OID_MACRO = $10; (* Allow OID macros in slapd *)
|
|
||||||
LDAP_SCHEMA_ALLOW_OUT_OF_ORDER_FIELDS = $20; (* Allow fields in most any order *)
|
|
||||||
LDAP_SCHEMA_ALLOW_ALL = $3f; (* Be very liberal in parsing *)
|
|
||||||
LDAP_SCHEMA_SKIP = $80; (* Don't malloc any result *)
|
|
||||||
|
|
||||||
|
|
||||||
function ldap_syntax2name(syn: PLDAPSyntax): pcchar; cdecl; external;
|
|
||||||
function ldap_matchingrule2name(mr: PLDAPMatchingRule): pcchar; cdecl; external;
|
|
||||||
function ldap_matchingruleuse2name(mru: PLDAPMatchingRuleUse): pcchar; cdecl; external;
|
|
||||||
function ldap_attributetype2name(_at: PLDAPAttributeType): pcchar; cdecl; external;
|
|
||||||
function ldap_objectclass2name(oc: PLDAPObjectClass): pcchar; cdecl; external;
|
|
||||||
function ldap_contentrule2name(cr: PLDAPContentRule): pcchar; cdecl; external;
|
|
||||||
function ldap_nameform2name(nf: PLDAPNameForm): pcchar; cdecl; external;
|
|
||||||
function ldap_structurerule2name(sr: PLDAPStructureRule): pcchar; cdecl; external;
|
|
||||||
|
|
||||||
procedure ldap_syntax_free(syn: PLDAPSyntax); cdecl; external;
|
|
||||||
procedure ldap_matchingrule_free(mr: PLDAPMatchingRule); cdecl; external;
|
|
||||||
procedure ldap_matchingruleuse_free(mru: PLDAPMatchingRuleUse); cdecl; external;
|
|
||||||
procedure ldap_attributetype_free(_at: PLDAPAttributeType); cdecl; external;
|
|
||||||
procedure ldap_objectclass_free(oc: PLDAPObjectClass); cdecl; external;
|
|
||||||
procedure ldap_contentrule_free(cr: PLDAPContentRule); cdecl; external;
|
|
||||||
procedure ldap_nameform_free(nf: PLDAPNameForm); cdecl; external;
|
|
||||||
procedure ldap_structurerule_free(sr: PLDAPStructureRule); cdecl; external;
|
|
||||||
|
|
||||||
function ldap_str2structurerule(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPStructureRule; cdecl; external;
|
|
||||||
function ldap_str2nameform(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPNameForm; cdecl; external;
|
|
||||||
function ldap_str2contentrule(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPContentRule; cdecl; external;
|
|
||||||
function ldap_str2objectclass(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPObjectClass; cdecl; external;
|
|
||||||
function ldap_str2attributetype(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPAttributeType; cdecl; external;
|
|
||||||
function ldap_str2syntax(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPSyntax; cdecl; external;
|
|
||||||
function ldap_str2matchingrule(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPMatchingRule; cdecl; external;
|
|
||||||
function ldap_str2matchingruleuse(const s: pcchar; code: pcint; const errp: ppcchar; flags: cuint): PLDAPMatchingRuleUse; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_structurerule2str(sr: PLDAPStructureRule): pcchar; cdecl; external;
|
|
||||||
function ldap_structurerule2bv(sr: PLDAPStructureRule; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_nameform2str(nf: PLDAPNameForm): pcchar; cdecl; external;
|
|
||||||
function ldap_nameform2bv(nf: PLDAPNameForm; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_contentrule2str(cr: PLDAPContentRule): pcchar; cdecl; external;
|
|
||||||
function ldap_contentrule2bv(cr: PLDAPContentRule; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_objectclass2str(oc: PLDAPObjectClass): pcchar; cdecl; external;
|
|
||||||
function ldap_objectclass2bv(oc: PLDAPObjectClass; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_attributetype2str(_at: PLDAPAttributeType): pcchar; cdecl; external;
|
|
||||||
function ldap_attributetype2bv(_at: PLDAPAttributeType; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_syntax2str(syn: PLDAPSyntax): pcchar; cdecl; external;
|
|
||||||
function ldap_syntax2bv(syn: PLDAPSyntax; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_matchingrule2str(mr: PLDAPMatchingRule): pcchar; cdecl; external;
|
|
||||||
function ldap_matchingrule2bv(mr: PLDAPMatchingRule; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_matchingruleuse2str(mru: PLDAPMatchingRuleUse): pcchar; cdecl; external;
|
|
||||||
function ldap_matchingruleuse2bv(mru: PLDAPMatchingRuleUse; bv: PBerval): PBerval; cdecl; external;
|
|
||||||
|
|
||||||
function ldap_scherr2str(code: cint): pcchar; cdecl; external;
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile.fpc for libmad bindings
|
|
||||||
#
|
|
||||||
|
|
||||||
[package]
|
|
||||||
name=mad
|
|
||||||
version=2.0.0
|
|
||||||
|
|
||||||
[target]
|
|
||||||
units=mad
|
|
||||||
|
|
||||||
[require]
|
|
||||||
|
|
||||||
[install]
|
|
||||||
fpcpackage=y
|
|
||||||
|
|
||||||
[default]
|
|
||||||
fpcdir=../../..
|
|
||||||
|
|
||||||
[rules]
|
|
||||||
.NOTPARALLEL:
|
|
@ -1,717 +0,0 @@
|
|||||||
{
|
|
||||||
Translation of the libmad headers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
(*
|
|
||||||
* libmad - MPEG audio decoder library
|
|
||||||
* Copyright (C) 2000-2003 Underbit Technologies, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
* If you would like to negotiate alternate licensing terms, you may do
|
|
||||||
* so by contacting: Underbit Technologies, Inc. <info@underbit.com>
|
|
||||||
*)
|
|
||||||
|
|
||||||
unit mad;
|
|
||||||
|
|
||||||
{$mode objfpc}
|
|
||||||
{$MINENUMSIZE 4}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
ctypes;
|
|
||||||
|
|
||||||
{$IFDEF WINDOWS}
|
|
||||||
{$DEFINE DYNLINK}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{$DEFINE MAD_DISABLE_BUILTIN_DECODER}
|
|
||||||
|
|
||||||
{$IFDEF DYNLINK}
|
|
||||||
const
|
|
||||||
{$IF Defined(WINDOWS)}
|
|
||||||
madlib = 'libmad.dll';
|
|
||||||
{$ELSEIF Defined(UNIX)}
|
|
||||||
madlib = 'libmad.so';
|
|
||||||
{$ELSE}
|
|
||||||
{$MESSAGE ERROR 'DYNLINK not supported'}
|
|
||||||
{$IFEND}
|
|
||||||
{$ELSE}
|
|
||||||
{$LINKLIB mad}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : version.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_VERSION_MAJOR = 0;
|
|
||||||
MAD_VERSION_MINOR = 15;
|
|
||||||
MAD_VERSION_PATCH = 1;
|
|
||||||
MAD_VERSION_EXTRA = ' (beta)';
|
|
||||||
|
|
||||||
function MAD_VERSION_STRINGIZE(num: cint): String;
|
|
||||||
function MAD_VERSION_STRING(num: cint): String;
|
|
||||||
function MAD_VERSION: String;
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_PUBLISHYEAR = '2000-2004';
|
|
||||||
MAD_AUTHOR = 'Underbit Technologies, Inc.';
|
|
||||||
MAD_EMAIL = 'info@underbit.com';
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : fixed.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_fixed_t = csint;
|
|
||||||
mad_fixed64hi_t = csint;
|
|
||||||
mad_fixed64lo_t = cuint;
|
|
||||||
mad_fixed64_t = cslonglong;
|
|
||||||
mad_sample_t = mad_fixed_t;
|
|
||||||
|
|
||||||
{*
|
|
||||||
* Fixed-point format: 0xABBBBBBB
|
|
||||||
* A == whole part (sign + 3 bits)
|
|
||||||
* B == fractional part (28 bits)
|
|
||||||
*
|
|
||||||
* Values are signed two's complement, so the effective range is:
|
|
||||||
* 0x80000000 to 0x7fffffff
|
|
||||||
* -8.0 to +7.9999999962747097015380859375
|
|
||||||
*
|
|
||||||
* The smallest representable value is:
|
|
||||||
* 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
|
|
||||||
*
|
|
||||||
* 28 bits of fractional accuracy represent about
|
|
||||||
* 8.6 digits of decimal accuracy.
|
|
||||||
*
|
|
||||||
* Fixed-point numbers can be added or subtracted as normal
|
|
||||||
* integers, but multiplication requires shifting the 64-bit result
|
|
||||||
* from 56 fractional bits back to 28 (and rounding.)
|
|
||||||
*
|
|
||||||
* Changing the definition of MAD_F_FRACBITS is only partially
|
|
||||||
* supported, and must be done with care.
|
|
||||||
*}
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_F_FRACBITS = 28;
|
|
||||||
// MAD_F_MIN = mad_fixed_t(-$80000000);
|
|
||||||
MAD_F_MAX = mad_fixed_t(+$7fffffff);
|
|
||||||
MAD_F_ONE = mad_fixed_t( $10000000);
|
|
||||||
MAD_F_SCALEBITS = MAD_F_FRACBITS;
|
|
||||||
|
|
||||||
//function mad_f_tofixed(x: double): mad_fixed_t;
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : bit.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_bitptr = record
|
|
||||||
byte : ^cuchar;
|
|
||||||
cache : cushort;
|
|
||||||
left : cushort;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_bit_init(var bitptr: mad_bitptr; byte: pcuchar); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_bit_finish(var bitptr: mad_bitptr);
|
|
||||||
function mad_bit_length(var begin_, end_: mad_bitptr): cuint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_bit_bitsleft(var bitptr: mad_bitptr): cushort;
|
|
||||||
function mad_bit_nextbyte(var bitptr: mad_bitptr): pcuchar; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_bit_skip(var bitptr: mad_bitptr); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_bit_read(var bitptr: mad_bitptr; len: cuint): culong; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_bit_write(var bitptr: mad_bitptr; len: cuint; value: culong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_bit_crc(bitptr: mad_bitptr; len: cuint; init: cushort): cushort; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : timer.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_timer_t = record
|
|
||||||
seconds : cslong; { whole seconds }
|
|
||||||
fraction : culong; { 1/MAD_TIMER_RESOLUTION seconds }
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_TIMER_RESOLUTION = 352800000;
|
|
||||||
mad_timer_zero : mad_timer_t = (seconds:0; fraction:0);
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_units = (
|
|
||||||
MAD_UNITS_HOURS = -2,
|
|
||||||
MAD_UNITS_MINUTES = -1,
|
|
||||||
MAD_UNITS_SECONDS = 0,
|
|
||||||
|
|
||||||
{ metric units }
|
|
||||||
|
|
||||||
MAD_UNITS_DECISECONDS = 10,
|
|
||||||
MAD_UNITS_CENTISECONDS = 100,
|
|
||||||
MAD_UNITS_MILLISECONDS = 1000,
|
|
||||||
|
|
||||||
{ audio sample units }
|
|
||||||
|
|
||||||
MAD_UNITS_8000_HZ = 8000,
|
|
||||||
MAD_UNITS_11025_HZ = 11025,
|
|
||||||
MAD_UNITS_12000_HZ = 12000,
|
|
||||||
|
|
||||||
MAD_UNITS_16000_HZ = 16000,
|
|
||||||
MAD_UNITS_22050_HZ = 22050,
|
|
||||||
MAD_UNITS_24000_HZ = 24000,
|
|
||||||
|
|
||||||
MAD_UNITS_32000_HZ = 32000,
|
|
||||||
MAD_UNITS_44100_HZ = 44100,
|
|
||||||
MAD_UNITS_48000_HZ = 48000,
|
|
||||||
|
|
||||||
{ video frame/field units }
|
|
||||||
|
|
||||||
MAD_UNITS_24_FPS = 24,
|
|
||||||
MAD_UNITS_25_FPS = 25,
|
|
||||||
MAD_UNITS_30_FPS = 30,
|
|
||||||
MAD_UNITS_48_FPS = 48,
|
|
||||||
MAD_UNITS_50_FPS = 50,
|
|
||||||
MAD_UNITS_60_FPS = 60,
|
|
||||||
|
|
||||||
{ CD audio frames }
|
|
||||||
|
|
||||||
MAD_UNITS_75_FPS = 75,
|
|
||||||
|
|
||||||
{ video drop-frame units }
|
|
||||||
|
|
||||||
MAD_UNITS_23_976_FPS = -24,
|
|
||||||
MAD_UNITS_24_975_FPS = -25,
|
|
||||||
MAD_UNITS_29_97_FPS = -30,
|
|
||||||
MAD_UNITS_47_952_FPS = -48,
|
|
||||||
MAD_UNITS_49_95_FPS = -50,
|
|
||||||
MAD_UNITS_59_94_FPS = -60
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
procedure mad_timer_reset(var timer: mad_timer_t);
|
|
||||||
function mad_timer_compare(timer1: mad_timer_t; timer2: mad_timer_t): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_timer_sign(timer: mad_timer_t): cint;
|
|
||||||
procedure mad_timer_negate(var timer: mad_timer_t); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_timer_abs(timer: mad_timer_t): mad_timer_t; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_timer_set(var timer: mad_timer_t; seconds, numer, denom: culong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_timer_add(var timer: mad_timer_t; incr: mad_timer_t); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_timer_multiply(var timer: mad_timer_t; scalar: cslong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_timer_count(timer: mad_timer_t; units: mad_units): cslong; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_timer_fraction(timer: mad_timer_t; denom: culong): culong; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_timer_string(timer: mad_timer_t; dest, format: pcchar; units, fracunits: mad_units; subparts: culong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : stream.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_error = (
|
|
||||||
MAD_ERROR_NONE = $0000, { no error }
|
|
||||||
|
|
||||||
MAD_ERROR_BUFLEN = $0001, { input buffer too small (or EOF) }
|
|
||||||
MAD_ERROR_BUFPTR = $0002, { invalid (null) buffer pointer }
|
|
||||||
|
|
||||||
MAD_ERROR_NOMEM = $0031, { not enough memory }
|
|
||||||
|
|
||||||
MAD_ERROR_LOSTSYNC = $0101, { lost synchronization }
|
|
||||||
MAD_ERROR_BADLAYER = $0102, { reserved header layer value }
|
|
||||||
MAD_ERROR_BADBITRATE = $0103, { forbidden bitrate value }
|
|
||||||
MAD_ERROR_BADSAMPLERATE = $0104, { reserved sample frequency value }
|
|
||||||
MAD_ERROR_BADEMPHASIS = $0105, { reserved emphasis value }
|
|
||||||
|
|
||||||
MAD_ERROR_BADCRC = $0201, { CRC check failed }
|
|
||||||
MAD_ERROR_BADBITALLOC = $0211, { forbidden bit allocation value }
|
|
||||||
MAD_ERROR_BADSCALEFACTOR = $0221, { bad scalefactor index }
|
|
||||||
MAD_ERROR_BADFRAMELEN = $0231, { bad frame length }
|
|
||||||
MAD_ERROR_BADBIGVALUES = $0232, { bad big_values count }
|
|
||||||
MAD_ERROR_BADBLOCKTYPE = $0233, { reserved block_type }
|
|
||||||
MAD_ERROR_BADSCFSI = $0234, { bad scalefactor selection info }
|
|
||||||
MAD_ERROR_BADDATAPTR = $0235, { bad main_data_begin pointer }
|
|
||||||
MAD_ERROR_BADPART3LEN = $0236, { bad audio data length }
|
|
||||||
MAD_ERROR_BADHUFFTABLE = $0237, { bad Huffman table select }
|
|
||||||
MAD_ERROR_BADHUFFDATA = $0238, { Huffman data overrun }
|
|
||||||
MAD_ERROR_BADSTEREO = $0239 { incompatible block_type for JS }
|
|
||||||
);
|
|
||||||
|
|
||||||
function MAD_RECOVERABLE(error: mad_error) : Boolean;
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_stream = record
|
|
||||||
buffer : pointer; { input bitstream buffer }
|
|
||||||
bufend : pointer; { end of buffer }
|
|
||||||
skiplen : culong; { bytes to skip before next frame }
|
|
||||||
sync : cint; { stream sync found }
|
|
||||||
freerate : culong; { free bitrate (fixed) }
|
|
||||||
this_frame : pointer; { start of current frame }
|
|
||||||
next_frame : pointer; { start of next frame }
|
|
||||||
ptr : mad_bitptr; { current processing bit pointer }
|
|
||||||
anc_ptr : mad_bitptr; { ancillary bits pointer }
|
|
||||||
anc_bitlen : cuint; { number of ancillary bits }
|
|
||||||
main_data : pointer; { Layer III main_data() }
|
|
||||||
md_len : cuint; { bytes in main_data }
|
|
||||||
options : cint; { decoding options (see below) }
|
|
||||||
error : mad_error; { error code (see above) }
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_BUFFER_GUARD = 8;
|
|
||||||
MAD_BUFFER_MDLEN = 511 + 2048 + MAD_BUFFER_GUARD;
|
|
||||||
|
|
||||||
MAD_OPTION_IGNORECRC = $0001; { ignore CRC errors }
|
|
||||||
MAD_OPTION_HALFSAMPLERATE = $0002; { generate PCM at 1/2 sample rate }
|
|
||||||
{$if defined(false)} { not yet implemented }
|
|
||||||
MAD_OPTION_LEFTCHANNEL = $0010; { decode left channel only }
|
|
||||||
MAD_OPTION_RIGHTCHANNEL = $0020; { decode right channel only }
|
|
||||||
MAD_OPTION_SINGLECHANNEL = $0030; { combine channels }
|
|
||||||
{$ifend}
|
|
||||||
|
|
||||||
procedure mad_stream_init(var stream: mad_stream); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_stream_finish(var stream: mad_stream); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_stream_options(stream: mad_stream; opts: cint);
|
|
||||||
procedure mad_stream_buffer(var stream: mad_stream; buffer: pcuchar; length: culong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_stream_skip(var stream: mad_stream; length: culong); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_stream_sync(var stream: mad_stream): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_stream_errorstr(var stream: mad_stream): pcchar; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : frame.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_layer = (
|
|
||||||
MAD_LAYER_I = 1, { Layer I }
|
|
||||||
MAD_LAYER_II = 2, { Layer II }
|
|
||||||
MAD_LAYER_III = 3 { Layer III }
|
|
||||||
);
|
|
||||||
|
|
||||||
mad_mode = (
|
|
||||||
MAD_MODE_SINGLE_CHANNEL = 0, { single channel }
|
|
||||||
MAD_MODE_DUAL_CHANNEL = 1, { dual channel }
|
|
||||||
MAD_MODE_JOINT_STEREO = 2, { joint (MS/intensity) stereo }
|
|
||||||
MAD_MODE_STEREO = 3 { normal LR stereo }
|
|
||||||
);
|
|
||||||
|
|
||||||
mad_emphasis = (
|
|
||||||
MAD_EMPHASIS_NONE = 0, { no emphasis }
|
|
||||||
MAD_EMPHASIS_50_15_US = 1, { 50/15 microseconds emphasis }
|
|
||||||
MAD_EMPHASIS_CCITT_J_17 = 3, { CCITT J.17 emphasis }
|
|
||||||
MAD_EMPHASIS_RESERVED = 2 { unknown emphasis }
|
|
||||||
);
|
|
||||||
|
|
||||||
mad_header = record
|
|
||||||
layer : mad_layer; { audio layer (1, 2, or 3) }
|
|
||||||
mode : mad_mode; { channel mode (see above) }
|
|
||||||
mode_extension : cint; { additional mode info }
|
|
||||||
emphasis : mad_emphasis; { de-emphasis to use (see above) }
|
|
||||||
bitrate : culong; { stream bitrate (bps) }
|
|
||||||
samplerate : cuint; { sampling frequency (Hz) }
|
|
||||||
crc_check : cushort; { frame CRC accumulator }
|
|
||||||
crc_target : cushort; { final target CRC checksum }
|
|
||||||
flags : cint; { flags (see below) }
|
|
||||||
private_bits : cint; { private bits (see below) }
|
|
||||||
duration : mad_timer_t; { audio playing time of frame }
|
|
||||||
end;
|
|
||||||
|
|
||||||
mad_overlap = array[0..1, 0..31, 0..17] of mad_fixed_t;
|
|
||||||
|
|
||||||
mad_frame = record
|
|
||||||
header : mad_header; { MPEG audio header }
|
|
||||||
options : cint; { decoding options (from stream) }
|
|
||||||
{ synthesis subband filter samples }
|
|
||||||
sbsample : packed array[0..1, 0..35, 0..31] of mad_fixed_t;
|
|
||||||
overlap : ^mad_overlap; { Layer III block overlap data }
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
MAD_FLAG_NPRIVATE_III = $0007; { number of Layer III private bits }
|
|
||||||
MAD_FLAG_INCOMPLETE = $0008; { header but not data is decoded }
|
|
||||||
|
|
||||||
MAD_FLAG_PROTECTION = $0010; { frame has CRC protection }
|
|
||||||
MAD_FLAG_COPYRIGHT = $0020; { frame is copyright }
|
|
||||||
MAD_FLAG_ORIGINAL = $0040; { frame is original (else copy) }
|
|
||||||
MAD_FLAG_PADDING = $0080; { frame has additional slot }
|
|
||||||
|
|
||||||
MAD_FLAG_I_STEREO = $0100; { uses intensity joint stereo }
|
|
||||||
MAD_FLAG_MS_STEREO = $0200; { uses middle/side joint stereo }
|
|
||||||
MAD_FLAG_FREEFORMAT = $0400; { uses free format bitrate }
|
|
||||||
|
|
||||||
MAD_FLAG_LSF_EXT = $1000; { lower sampling freq. extension }
|
|
||||||
MAD_FLAG_MC_EXT = $2000; { multichannel audio extension }
|
|
||||||
MAD_FLAG_MPEG_2_5_EXT = $4000; { MPEG 2.5 (unofficial) extension }
|
|
||||||
|
|
||||||
MAD_PRIVATE_HEADER = $0100; { header private bit }
|
|
||||||
MAD_PRIVATE_III = $001f; { Layer III private bits (up to 5) }
|
|
||||||
|
|
||||||
function mad_nchannels(header: mad_header): cint;
|
|
||||||
function mad_nsbsamples(header: mad_header): cint;
|
|
||||||
procedure mad_header_init(var header: mad_header); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_header_finish(var header: mad_header);
|
|
||||||
function mad_header_decode(var header: mad_header; var stream: mad_stream): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_frame_init(var frame: mad_frame); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_frame_finish(var frame: mad_frame); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_frame_decode(var frame: mad_frame; var stream: mad_stream): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_frame_mute(var frame: mad_frame); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : synth.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_pcm = record
|
|
||||||
samplerate : cuint; { sampling frequency (Hz) }
|
|
||||||
channels : cushort; { number of channels }
|
|
||||||
length : cushort; { number of samples per channel }
|
|
||||||
{ PCM output samples [ch][sample] }
|
|
||||||
samples : packed array [0..1, 0..1151] of mad_fixed_t;
|
|
||||||
end;
|
|
||||||
|
|
||||||
mad_synth = record
|
|
||||||
{ polyphase filterbank outputs [ch][eo][peo][s][v] }
|
|
||||||
filter : array[0..1, 0..1, 0..1, 0..15, 0..7] of mad_fixed_t;
|
|
||||||
phase : cuint; { current processing phase }
|
|
||||||
pcm : mad_pcm; { PCM output }
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
{ single channel PCM selector }
|
|
||||||
MAD_PCM_CHANNEL_SINGLE = 0;
|
|
||||||
|
|
||||||
{ dual channel PCM selector }
|
|
||||||
MAD_PCM_CHANNEL_DUAL_1 = 0;
|
|
||||||
MAD_PCM_CHANNEL_DUAL_2 = 1;
|
|
||||||
|
|
||||||
{ stereo PCM selector }
|
|
||||||
MAD_PCM_CHANNEL_STEREO_LEFT = 0;
|
|
||||||
MAD_PCM_CHANNEL_STEREO_RIGHT = 1;
|
|
||||||
|
|
||||||
procedure mad_synth_init(var synth: mad_synth); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_synth_finish(var synth: mad_synth);
|
|
||||||
procedure mad_synth_mute(var synth: mad_synth); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
procedure mad_synth_frame(var synth: mad_synth; var frame: mad_frame); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
(***********************************************************************)
|
|
||||||
(* Header : decoder.h *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
{$IFNDEF MAD_DISABLE_BUILTIN_DECODER}
|
|
||||||
type
|
|
||||||
mad_decoder_mode = (
|
|
||||||
MAD_DECODER_MODE_SYNC = 0,
|
|
||||||
MAD_DECODER_MODE_ASYNC = 1
|
|
||||||
);
|
|
||||||
|
|
||||||
mad_flow = (
|
|
||||||
MAD_FLOW_CONTINUE = $0000, { continue normally }
|
|
||||||
MAD_FLOW_STOP = $0010, { stop decoding normally }
|
|
||||||
MAD_FLOW_BREAK = $0011, { stop decoding and signal an error }
|
|
||||||
MAD_FLOW_IGNORE = $0020 { ignore the current frame }
|
|
||||||
);
|
|
||||||
|
|
||||||
async_struct = record
|
|
||||||
pid : clong;
|
|
||||||
_in : cint;
|
|
||||||
_out : cint;
|
|
||||||
end;
|
|
||||||
|
|
||||||
sync_struct = record
|
|
||||||
stream : mad_stream;
|
|
||||||
frame : mad_frame;
|
|
||||||
synth : mad_synth;
|
|
||||||
end;
|
|
||||||
|
|
||||||
mad_input_func = function(user: Pointer; var stream: mad_stream): mad_flow; cdecl;
|
|
||||||
mad_header_func = function(user: Pointer; var header: mad_header): mad_flow; cdecl;
|
|
||||||
mad_filter_func = function(user: Pointer; var frame: mad_frame): mad_flow; cdecl;
|
|
||||||
mad_output_func = function(user: Pointer; var header: mad_header; var pcm: mad_pcm): mad_flow; cdecl;
|
|
||||||
mad_error_func = function(user: Pointer; var stream: mad_stream; var frame: mad_frame): mad_flow; cdecl;
|
|
||||||
mad_message_func = function(user, msg: Pointer; var l: cuint): mad_flow; cdecl;
|
|
||||||
|
|
||||||
mad_decoder = record
|
|
||||||
mode : mad_decoder_mode;
|
|
||||||
options : cint;
|
|
||||||
async : async_struct;
|
|
||||||
sync : ^sync_struct;
|
|
||||||
data : pointer;
|
|
||||||
InputFunc : mad_input_func;
|
|
||||||
HeaderFunc : mad_header_func;
|
|
||||||
FilterFunc : mad_filter_func;
|
|
||||||
OutputFunc : mad_output_func;
|
|
||||||
ErrorFunc : mad_error_func;
|
|
||||||
MessageFunc : mad_message_func;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_decoder_init(var decoder: mad_decoder; user: pointer; Input: mad_input_func; Header: mad_header_func; Filter: mad_filter_func; Output: mad_output_func; Error: mad_error_func; Message: mad_message_func); cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_decoder_finish(var decoder: mad_decoder): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_decoder_run(var decoder: mad_decoder; mode: mad_decoder_mode): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
function mad_decoder_message(var decoder: mad_decoder; msg: Pointer; var l: cuint): cint; cdecl; external {$IFDEF DYNLINK}madlib{$ENDIF};
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
Developer of the MAD helpers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
{$IFDEF MAD_DISABLE_BUILTIN_DECODER}
|
|
||||||
const
|
|
||||||
MAD_INPUT_BUFFER_SIZE = 5*8192;
|
|
||||||
|
|
||||||
type
|
|
||||||
mad_read_func = function(user: pointer; ptr: pointer; size: cuint): cuint; cdecl;
|
|
||||||
mad_seek_func = function(user: pointer; offset: clong; whence: cint): clong; cdecl;
|
|
||||||
mad_close_func = function(user: pointer): cint; cdecl;
|
|
||||||
mad_tell_func = function(user: pointer): clong; cdecl;
|
|
||||||
|
|
||||||
pmad_decoder = ^mad_decoder;
|
|
||||||
mad_decoder = record
|
|
||||||
inbuf : array[0..MAD_INPUT_BUFFER_SIZE-1] of cuint8;
|
|
||||||
stream : mad_stream;
|
|
||||||
frame : mad_frame;
|
|
||||||
synth : mad_synth;
|
|
||||||
samplecnt : cint;
|
|
||||||
sampleofs : cint;
|
|
||||||
user : pointer;
|
|
||||||
read : mad_read_func;
|
|
||||||
seek : mad_seek_func;
|
|
||||||
close : mad_close_func;
|
|
||||||
tell : mad_tell_func;
|
|
||||||
|
|
||||||
// Userinfo
|
|
||||||
sample_rate : cint;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_decoder_init(user: pointer; read: mad_read_func; seek: mad_seek_func; close: mad_close_func; tell: mad_tell_func): pmad_decoder;
|
|
||||||
function mad_decoder_read(decoder: pmad_decoder; buffer: pointer; length: cint): cint;
|
|
||||||
procedure mad_decoder_free(decoder: pmad_decoder);
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
function MAD_VERSION_STRINGIZE(num: cint): String;
|
|
||||||
begin
|
|
||||||
MAD_VERSION_STRINGIZE := '';
|
|
||||||
Str(num, MAD_VERSION_STRINGIZE);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function MAD_VERSION_STRING(num: cint): String;
|
|
||||||
begin
|
|
||||||
MAD_VERSION_STRING := MAD_VERSION_STRINGIZE(num);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function MAD_VERSION: String;
|
|
||||||
begin
|
|
||||||
MAD_VERSION :=
|
|
||||||
MAD_VERSION_STRING(MAD_VERSION_MAJOR) + '.' +
|
|
||||||
MAD_VERSION_STRING(MAD_VERSION_MINOR) + '.' +
|
|
||||||
MAD_VERSION_STRING(MAD_VERSION_PATCH) +
|
|
||||||
MAD_VERSION_EXTRA;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{function mad_f_tofixed(x: double): mad_fixed_t;
|
|
||||||
begin
|
|
||||||
Result := mad_fixed_t(x * double(1 shl MAD_F_FRACBITS) + 0.5);
|
|
||||||
end;}
|
|
||||||
|
|
||||||
procedure mad_bit_finish(var bitptr: mad_bitptr);
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_bit_bitsleft(var bitptr: mad_bitptr): cushort;
|
|
||||||
begin
|
|
||||||
mad_bit_bitsleft := bitptr.left;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_timer_reset(var timer: mad_timer_t);
|
|
||||||
begin
|
|
||||||
timer := mad_timer_zero;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_timer_sign(timer: mad_timer_t): cint;
|
|
||||||
begin
|
|
||||||
mad_timer_sign := mad_timer_compare(timer, mad_timer_zero);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function MAD_RECOVERABLE(error: mad_error): Boolean;
|
|
||||||
begin
|
|
||||||
MAD_RECOVERABLE := word(error) and $ff00 > 0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_stream_options(stream: mad_stream; opts: cint);
|
|
||||||
begin
|
|
||||||
stream.options := opts;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_header_finish(var header: mad_header);
|
|
||||||
begin
|
|
||||||
FillChar(header, sizeof(mad_header), 0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_nchannels(header: mad_header): cint;
|
|
||||||
begin
|
|
||||||
if longword(header.mode) <> 0 then
|
|
||||||
mad_nchannels := 2 else
|
|
||||||
mad_nchannels := 1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_nsbsamples(header: mad_header): cint;
|
|
||||||
begin
|
|
||||||
if header.layer = MAD_LAYER_I then mad_nsbsamples := 12 else
|
|
||||||
if (header.layer = MAD_LAYER_III) and (header.flags and MAD_FLAG_LSF_EXT > 0)
|
|
||||||
then mad_nsbsamples := 18
|
|
||||||
else mad_nsbsamples := 36;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_synth_finish(var synth: mad_synth);
|
|
||||||
begin
|
|
||||||
FillChar(synth, sizeof(mad_synth), 0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$IFDEF MAD_DISABLE_BUILTIN_DECODER}
|
|
||||||
function mad_decoder_init(user: pointer; read: mad_read_func; seek: mad_seek_func; close: mad_close_func; tell: mad_tell_func): pmad_decoder;
|
|
||||||
begin
|
|
||||||
GetMem(Result, Sizeof(mad_decoder));
|
|
||||||
FillChar(Result^, Sizeof(mad_decoder), 0);
|
|
||||||
mad_stream_init(Result^.stream);
|
|
||||||
mad_frame_init(Result^.frame);
|
|
||||||
mad_synth_init(Result^.synth);
|
|
||||||
Result^.user := user;
|
|
||||||
Result^.read := read;
|
|
||||||
Result^.seek := seek;
|
|
||||||
Result^.close := close;
|
|
||||||
Result^.tell := tell;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure mad_decoder_free(decoder: pmad_decoder);
|
|
||||||
begin
|
|
||||||
if not Assigned(decoder) then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
mad_synth_finish(decoder^.synth);
|
|
||||||
mad_frame_finish(decoder^.frame);
|
|
||||||
mad_stream_finish(decoder^.stream);
|
|
||||||
decoder^.close(decoder^.user);
|
|
||||||
FreeMem(decoder);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function mad_decoder_read(decoder: pmad_decoder; buffer: pointer; length: cint): cint;
|
|
||||||
var
|
|
||||||
ofs, num, i: cint;
|
|
||||||
inbuf_ptr: pointer;
|
|
||||||
len, remaining: cint;
|
|
||||||
begin
|
|
||||||
// check blocksize here!
|
|
||||||
|
|
||||||
ofs := 0;
|
|
||||||
num := length;
|
|
||||||
|
|
||||||
while num > 0 do
|
|
||||||
begin
|
|
||||||
if decoder^.samplecnt = 0 then
|
|
||||||
begin
|
|
||||||
if (decoder^.stream.buffer = nil) or (decoder^.stream.error = MAD_ERROR_BUFLEN) then
|
|
||||||
begin
|
|
||||||
if Assigned(decoder^.stream.next_frame) then
|
|
||||||
begin
|
|
||||||
remaining := ptrint(decoder^.stream.bufend) - ptrint(decoder^.stream.next_frame);
|
|
||||||
inbuf_ptr := pointer(ptrint(@decoder^.inbuf) + remaining);
|
|
||||||
len := MAD_INPUT_BUFFER_SIZE - remaining;
|
|
||||||
Move(decoder^.stream.next_frame^, decoder^.inbuf, remaining);
|
|
||||||
end else begin
|
|
||||||
remaining := 0;
|
|
||||||
len := MAD_INPUT_BUFFER_SIZE;
|
|
||||||
inbuf_ptr := @decoder^.inbuf;
|
|
||||||
end;
|
|
||||||
|
|
||||||
len := decoder^.read(decoder^.user, inbuf_ptr, len);
|
|
||||||
if len <= 0 then
|
|
||||||
Exit(ofs);
|
|
||||||
|
|
||||||
mad_stream_buffer(decoder^.stream, decoder^.inbuf, len+remaining);
|
|
||||||
decoder^.stream.error := MAD_ERROR_NONE;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if mad_frame_decode(decoder^.frame, decoder^.stream) <> 0 then
|
|
||||||
begin
|
|
||||||
if MAD_RECOVERABLE(decoder^.stream.error) or (decoder^.stream.error = MAD_ERROR_BUFLEN) then
|
|
||||||
Continue;
|
|
||||||
|
|
||||||
Exit(ofs);
|
|
||||||
end;
|
|
||||||
|
|
||||||
mad_synth_frame(decoder^.synth, decoder^.frame);
|
|
||||||
|
|
||||||
with decoder^.synth do
|
|
||||||
if pcm.channels = 2 then
|
|
||||||
begin
|
|
||||||
for i := 0 to pcm.length -1 do
|
|
||||||
begin
|
|
||||||
if pcm.samples[0][i] >= MAD_F_ONE then
|
|
||||||
pcm.samples[0][i] := MAD_F_ONE - 1;
|
|
||||||
if pcm.samples[0][i] < -MAD_F_ONE then
|
|
||||||
pcm.samples[0][i] := -MAD_F_ONE;
|
|
||||||
pcm.samples[0][i] := pcm.samples[0][i] shr (MAD_F_FRACBITS + 1 - 16 + 1);
|
|
||||||
|
|
||||||
if pcm.samples[1][i] >= MAD_F_ONE then
|
|
||||||
pcm.samples[1][i] := MAD_F_ONE - 1;
|
|
||||||
if pcm.samples[1][i] < -MAD_F_ONE then
|
|
||||||
pcm.samples[1][i] := -MAD_F_ONE;
|
|
||||||
pcm.samples[1][i] := pcm.samples[1][i] shr (MAD_F_FRACBITS + 1 - 16 + 1);
|
|
||||||
end;
|
|
||||||
end else begin
|
|
||||||
for i := 0 to pcm.length -1 do
|
|
||||||
begin
|
|
||||||
if pcm.samples[0][i] >= MAD_F_ONE then
|
|
||||||
pcm.samples[0][i] := MAD_F_ONE - 1;
|
|
||||||
if pcm.samples[0][i] < -MAD_F_ONE then
|
|
||||||
pcm.samples[0][i] := -MAD_F_ONE;
|
|
||||||
pcm.samples[0][i] := pcm.samples[0][i] shr (MAD_F_FRACBITS + 1 - 16 + 1);
|
|
||||||
pcm.samples[1][i] := pcm.samples[0][i];
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
decoder^.sampleofs := 0;
|
|
||||||
decoder^.samplecnt := decoder^.synth.pcm.length;
|
|
||||||
decoder^.sample_rate := decoder^.synth.pcm.samplerate;
|
|
||||||
end;
|
|
||||||
|
|
||||||
len := num div 4;
|
|
||||||
if len > decoder^.samplecnt then
|
|
||||||
len := decoder^.samplecnt;
|
|
||||||
|
|
||||||
for i := 0 to len - 1 do
|
|
||||||
begin
|
|
||||||
pcint16(ptrint(buffer) + ofs + 0)^ := decoder^.synth.pcm.samples[0][decoder^.sampleofs];
|
|
||||||
pcint16(ptrint(buffer) + ofs + 2)^ := decoder^.synth.pcm.samples[1][decoder^.sampleofs];
|
|
||||||
|
|
||||||
Inc(decoder^.sampleofs);
|
|
||||||
Dec(decoder^.samplecnt);
|
|
||||||
ofs := ofs + 4;
|
|
||||||
num := num - 4;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Result := ofs;
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
end.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile.fpc for libmodplug bindings
|
|
||||||
#
|
|
||||||
|
|
||||||
[package]
|
|
||||||
name=modplug
|
|
||||||
version=2.0.0
|
|
||||||
|
|
||||||
[target]
|
|
||||||
units=modplug
|
|
||||||
|
|
||||||
[require]
|
|
||||||
|
|
||||||
[install]
|
|
||||||
fpcpackage=y
|
|
||||||
|
|
||||||
[default]
|
|
||||||
fpcdir=../../..
|
|
||||||
|
|
||||||
[rules]
|
|
||||||
.NOTPARALLEL:
|
|
@ -1,130 +0,0 @@
|
|||||||
{
|
|
||||||
Translation of the libmodplug headers for FreePascal
|
|
||||||
Copyright (C) 2006 by Ivo Steinmann
|
|
||||||
}
|
|
||||||
|
|
||||||
(*
|
|
||||||
* This source code is public domain.
|
|
||||||
*
|
|
||||||
* Authors: Kenton Varda <temporal@gauge3d.org> (C interface wrapper)
|
|
||||||
*)
|
|
||||||
|
|
||||||
unit modplug;
|
|
||||||
|
|
||||||
{$mode objfpc}
|
|
||||||
{$MINENUMSIZE 4}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
ctypes;
|
|
||||||
|
|
||||||
{$IFDEF WINDOWS}
|
|
||||||
{$DEFINE DYNLINK}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
//{$DEFINE DYNLINK}
|
|
||||||
|
|
||||||
{$IFDEF DYNLINK}
|
|
||||||
const
|
|
||||||
{$IF Defined(WINDOWS)}
|
|
||||||
modpluglib = 'libmodplug.dll';
|
|
||||||
{$ELSEIF Defined(UNIX)}
|
|
||||||
modpluglib = 'libmodplug.so';
|
|
||||||
{$ELSE}
|
|
||||||
{$MESSAGE ERROR 'DYNLINK not supported'}
|
|
||||||
{$IFEND}
|
|
||||||
{$ELSE}
|
|
||||||
//{$LINKLIB stdc++}
|
|
||||||
{$LINKLIB modplug}
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
PModPlugFile = ^ModPlugFile;
|
|
||||||
ModPlugFile = record
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* Load a mod file. [data] should point to a block of memory containing the complete
|
|
||||||
* file, and [size] should be the size of that block.
|
|
||||||
* Return the loaded mod file on success, or NULL on failure. *)
|
|
||||||
function ModPlug_Load(data: pointer; size: cint): PModPlugFile; cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
(* Unload a mod file. *)
|
|
||||||
procedure ModPlug_Unload(_file: PModPlugFile); cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
(* Read sample data into the buffer. Returns the number of bytes read. If the end
|
|
||||||
* of the mod has been reached, zero is returned. *)
|
|
||||||
function ModPlug_Read(_file: PModPlugFile; buffer: pointer; size: cint): cint; cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
(* Get the name of the mod. The returned buffer is stored within the ModPlugFile
|
|
||||||
* structure and will remain valid until you unload the file. *)
|
|
||||||
function ModPlug_GetName(_file: PModPlugFile): pcchar; cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
(* Get the length of the mod, in milliseconds. Note that this result is not always
|
|
||||||
* accurate, especially in the case of mods with loops. *)
|
|
||||||
function ModPlug_GetLength(_file: PModPlugFile): cint; cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
(* Seek to a particular position in the song. Note that seeking and MODs don't mix very
|
|
||||||
* well. Some mods will be missing instruments for a short time after a seek, as ModPlug
|
|
||||||
* does not scan the sequence backwards to find out which instruments were supposed to be
|
|
||||||
* playing at that time. (Doing so would be difficult and not very reliable.) Also,
|
|
||||||
* note that seeking is not very exact in some mods -- especially those for which
|
|
||||||
* ModPlug_GetLength() does not report the full length. *)
|
|
||||||
procedure ModPlug_Seek(_file: PModPlugFile; millisecond: cint); cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
// _ModPlug_Flags
|
|
||||||
MODPLUG_ENABLE_OVERSAMPLING = 1 shl 0; (* Enable oversampling (highly recommended) *)
|
|
||||||
MODPLUG_ENABLE_NOISE_REDUCTION = 1 shl 1; (* Enable noise reduction *)
|
|
||||||
MODPLUG_ENABLE_REVERB = 1 shl 2; (* Enable reverb *)
|
|
||||||
MODPLUG_ENABLE_MEGABASS = 1 shl 3; (* Enable megabass *)
|
|
||||||
MODPLUG_ENABLE_SURROUND = 1 shl 4; (* Enable surround sound. *)
|
|
||||||
|
|
||||||
// _ModPlug_ResamplingMode
|
|
||||||
MODPLUG_RESAMPLE_NEAREST = 0; (* No interpolation (very fast, extremely bad sound quality) *)
|
|
||||||
MODPLUG_RESAMPLE_LINEAR = 1; (* Linear interpolation (fast, good quality) *)
|
|
||||||
MODPLUG_RESAMPLE_SPLINE = 2; (* Cubic spline interpolation (high quality) *)
|
|
||||||
MODPLUG_RESAMPLE_FIR = 3; (* 8-tap fir filter (extremely high quality) *)
|
|
||||||
|
|
||||||
type
|
|
||||||
PModPlug_Settings = ^ModPlug_Settings;
|
|
||||||
ModPlug_Settings = record
|
|
||||||
mFlags : cint; (* One or more of the MODPLUG_ENABLE_* flags above, bitwise-OR'ed *)
|
|
||||||
|
|
||||||
(* Note that ModPlug always decodes sound at 44100kHz, 32 bit, stereo and then
|
|
||||||
* down-mixes to the settings you choose. *)
|
|
||||||
mChannels : cint; (* Number of channels - 1 for mono or 2 for stereo *)
|
|
||||||
mBits : cint; (* Bits per sample - 8, 16, or 32 *)
|
|
||||||
mFrequency : cint; (* Sampling rate - 11025, 22050, or 44100 *)
|
|
||||||
mResamplingMode : cint; (* One of MODPLUG_RESAMPLE_*, above *)
|
|
||||||
|
|
||||||
mReverbDepth : cint; (* Reverb level 0(quiet)-100(loud) *)
|
|
||||||
mReverbDelay : cint; (* Reverb delay in ms, usually 40-200ms *)
|
|
||||||
mBassAmount : cint; (* XBass level 0(quiet)-100(loud) *)
|
|
||||||
mBassRange : cint; (* XBass cutoff in Hz 10-100 *)
|
|
||||||
mSurroundDepth : cint; (* Surround level 0(quiet)-100(heavy) *)
|
|
||||||
mSurroundDelay : cint; (* Surround delay in ms, usually 5-40ms *)
|
|
||||||
mLoopCount : cint; (* Number of times to loop. Zero prevents looping. -1 loops forever. *)
|
|
||||||
end;
|
|
||||||
|
|
||||||
(* Get and set the mod decoder settings. All options, except for channels, bits-per-sample,
|
|
||||||
* sampling rate, and loop count, will take effect immediately. Those options which don't
|
|
||||||
* take effect immediately will take effect the next time you load a mod. *)
|
|
||||||
procedure ModPlug_GetSettings(settings: PModPlug_Settings); cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
procedure ModPlug_SetSettings(const settings: PModPlug_Settings); cdecl; external {$IFDEF DYNLINK}modpluglib{$ENDIF};
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
function cppNew(s: cint): pointer; cdecl; public; alias : '_Znaj'; alias : '_Znwj';
|
|
||||||
begin
|
|
||||||
GetMem(Result, s);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure cppDelete(p: pointer); cdecl; public; alias : '_ZdlPv'; alias : '_ZdaPv';
|
|
||||||
begin
|
|
||||||
FreeMem(p);
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
Loading…
Reference in New Issue
Block a user