📄 unadsplibh.pas
字号:
(*
DSP Lib header
----------------------------------------------
This source code cannot be used without
proper license granted to you as a private
person or an entity by the Lake of Soft, Ltd
Visit http://lakeofsoft.com/ for more information.
Copyright (c) 2001, 2007 Lake of Soft, Ltd
All rights reserved
----------------------------------------------
modified by:
Lake, Mar 2007
----------------------------------------------
*)
{$I unaDef.inc }
unit
unaDspLibH;
interface
uses
unaTypes, unaClasses;
//-- dsplconf.h --
type
dspl_id = unsigned; // class identtifier
dspl_handle = unsigned; // object handle (not a pointer)
//
dspl_float = single; // 4 bytes
pdspl_float = ^dspl_float;
//
dspl_double = double; // 8 bytes
pdspl_double = ^dspl_double; //
//
dspl_int = int; //
//
dspl_result = bool;
//
pdspl_chunk = ^dspl_chunk;
dspl_chunk = packed record
//
r_fp: pdspl_float;
r_len: dspl_int;
end;
const
dspl_empty_chunk: dspl_chunk = (r_fp: nil; r_len: 0);
// -- dsplmath.h --
type
//
pdspl_biq_values = ^dspl_biq_values;
dspl_biq_values = packed record
//
a0,a1,a2,b0,b1,b2: dspl_double;
end;
pdspl_biq_valuesArray = ^dspl_biq_valuesArray;
dspl_biq_valuesArray = array[0..$2AAAAA9] of dspl_biq_values;
//-- dsplconst.h --
const
DSPL_VERSION = '1.01b';
DSPL_DEFAULT_SAMPLE_FRQ = 44100;
DSPL_INVALID_HANDLE = dspl_handle(false);
DSPL_FAILURE = false;
DSPL_SUCCESS = true;
// class and parameters ids
// class ids
//enum dspl_id_class
// {
DSPL_OID = $00000;
DSPL_PID = $10000;
// };
// param ids
// enum dspl_param_class
// {
DSPL_P_IN = $0100;
DSPL_P_OUT = $0200;
DSPL_P_GAIN = $0300;
DSPL_P_FRQ = $0400;
DSPL_P_Q = $0500;
DSPL_P_TYPE = $0600;
DSPL_P_ATTACK = $0700;
DSPL_P_RELEASE = $0800;
DSPL_P_THRESHOLD = $0900;
DSPL_P_RATIO = $0A00;
DSPL_P_NFRQ = $0B00;
DSPL_P_OTHER = $FF00;
// };
// enum dspl_object_class
// {
DSPL_EQ2B = 1; // done
DSPL_LD = 2; // done
DSPL_DYNPROC = 3; // done
DSPL_SPEECHPROC = 4; // done
DSPL_ND = 5; // done
DSPL_EQMB = 6; // done
DSPL_MBSP = 7; // done
// };
// object's param id is constructed like this:
// id = id_class | param_class | param_index
//
// for example:
// define DSPL_EQ2B_FRQ2 DSPL_PID | DSPL_P_FRQ | 0x2
(*****************************************************************
EQ2B
*)
//enum dspl_biq_type
//{
DSPL_BIQ_PEAK = 1;
DSPL_BIQ_LP = 2;
DSPL_BIQ_HP = 3;
DSPL_BIQ_LS = 4;
DSPL_BIQ_HS = 5;
//};
//enum dspl_eq2b_band_id {
DSPL_EQ2B_BOTH = 0;
DSPL_EQ2B_BAND1 = 1;
DSPL_EQ2B_BAND2 = 2;
//};
//enum dspl_eq2b_band_type {
DSPL_EQ2B_OFF = 0;
DSPL_EQ2B_PEAK = DSPL_BIQ_PEAK;
DSPL_EQ2B_LP = DSPL_BIQ_LP;
DSPL_EQ2B_HP = DSPL_BIQ_HP;
DSPL_EQ2B_LS = DSPL_BIQ_LS;
DSPL_EQ2B_HS = DSPL_BIQ_HS;
//};
(*****************************************************************
Level Detector
*)
//enum dspl_ld_type {
DSPL_LD_RMS = 0;
DSPL_LD_PEAK = 1;
//};
(*****************************************************************
Dynamic Processor
*)
//enum dspl_dynproc_input {
DSPL_DYNPROC_IN = 0;
DSPL_DYNPROC_SC = 1;
//};
//enum dspl_dynproc_range {
DSPL_DYNPROC_ABOVE = 0;
DSPL_DYNPROC_BELOW = 1;
//};
(*****************************************************************
Speech Processor
*)
//enum dspl_speechproc_frq {
DSPL_SPEECHPROC_SAMPLE_RATE = 0;
DSPL_SPEECHPROC_ENHANCER = 1;
DSPL_SPEECHPROC_DEPOPPER = 2;
DSPL_SPEECHPROC_DEESSER = 3;
DSPL_SPEECHPROC_LOWCUT = 4;
DSPL_SPEECHPROC_CEIL = 5;
//};
//enum dspl_nd {
DSPL_ND_SAMPLE_RATE = 0;
DSPL_ND_BAND_LP = 1;
DSPL_ND_BAND_HP = 2;
//};
(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
//#define DSPL_INSTANCE(id,cname) case (DSPL_OID | id):return new cname((DSPL_OID | id));
//#define DSPL_INSTANCES \
// DSPL_INSTANCE(DSPL_EQ2B,DSPLEQ2b)\
// DSPL_INSTANCE(DSPL_LD,DSPLLD)\
// DSPL_INSTANCE(DSPL_DYNPROC,DSPLDynProc)\
// DSPL_INSTANCE(DSPL_SPEECHPROC,DSPLSpeechProc)\
// DSPL_INSTANCE(DSPL_ND,DSPLND)\
// DSPL_INSTANCE(DSPL_MBSP,DSPLMbSp)\
// DSPL_INSTANCE(DSPL_EQMB,DSPLEQMb)
// -- dsplapi.h --
type
// -- API --
proc_dspl_create = function(object_id: dspl_id): dspl_handle; cdecl;
proc_dspl_destroy = function(handle: dspl_handle): dspl_result; cdecl;
// Object's parameters setters
// handle - object handle
// param_id - property id
//
// dspl_setf -
// dspl_seti -
// dspl_setc
//
proc_dspl_setf = function(handle: dspl_handle; param_id: dspl_id; value: dspl_float): dspl_result; cdecl;
proc_dspl_seti = function(handle: dspl_handle; param_id: dspl_id; value: dspl_int): dspl_result; cdecl;
proc_dspl_setc = function(handle: dspl_handle; param_id: dspl_id; chunk: pdspl_float; length: dspl_int): dspl_result; cdecl;
// Object's parameters getters
// handle - object handle
// param_id - property id
//
proc_dspl_geti = function(handle: dspl_handle; param_id: dspl_id; out value: dspl_int): dspl_result; cdecl;
proc_dspl_getf = function(handle: dspl_handle; param_id: dspl_id; out value: dspl_float): dspl_result; cdecl;
// dspl_process -
proc_dspl_process = function(handle: dspl_handle; nSamples: dspl_int): dspl_result; cdecl;
// Version
proc_dspl_version = function(): pAnsiChar; cdecl;
// --- dsplprocessor.h --
//const
//DSPL_CHUNK = cparams;
//DSPL_FLOAT = fparams;
//DSPL_INT = iparams;
//#define DSPL_DECLARE_PARAM(param_type,param_class,id,default_value) \
// param_type[(DSPL_PID |param_class | id)]=default_value;
// -- --
const
// localize as necessary, order is important!
c_DSPL_OBJNAMES_FULL: array[DSPL_EQ2B..DSPL_MBSP] of string =
(
'2 Band Parametric Equalizer', // DSPL_EQ2B
'Level Detector', // DSPL_LD
'Dynamic Processor', // DSPL_DYNPROC
'Speech Processor', // DSPL_SPEECHPROC
'Noise Level Detector', // DSPL_ND
'Multiband Equalizer/Filter', // DSPL_EQMB
'Multiband Splitter' // DSPL_MBSP
);
// localize as necessary, order is important!
c_DSPL_OBJNAMES_SHORT: array[DSPL_EQ2B..DSPL_MBSP] of string =
(
'EQ2B', // DSPL_EQ2B
'LD', // DSPL_LD
'DynProc', // DSPL_DYNPROC
'SpeechProc', // DSPL_SPEECHPROC
'LD', // DSPL_ND
'EQMB', // DSPL_EQMB
'MBSP' // DSPL_MBSP
);
type
//
// -- unaDspLibAbstract --
//
unaDspLibAbstract = class(unaObject)
protected
f_libResult: dspl_result;
//
function dspl_create(object_id: dspl_id): dspl_handle; virtual; abstract;
function dspl_destroy(handle: dspl_handle): dspl_result; virtual; abstract;
function dspl_process(handle: dspl_handle; nSamples: dspl_int): dspl_result; virtual; abstract;
function dspl_version(): pAnsiChar; virtual; abstract;
//
function dspl_seti(handle: dspl_handle; param: dspl_id; value: dspl_int): dspl_result; virtual; abstract;
function dspl_setf(handle: dspl_handle; param: dspl_id; value: dspl_float): dspl_result; virtual; abstract;
function dspl_setc(handle: dspl_handle; param: dspl_id; chunk: pdspl_float; length: dspl_int): dspl_result; virtual; abstract;
//
function dspl_geti(handle: dspl_handle; param: dspl_id): dspl_int; virtual; abstract;
function dspl_getf(handle: dspl_handle; param: dspl_id): dspl_float; virtual; abstract;
function dspl_getc(handle: dspl_handle; param: dspl_id): pdspl_chunk; virtual; abstract;
//
function dspl_getID(handle: dspl_handle): dspl_int; virtual; abstract;
//
function dspl_isseti(handle: dspl_handle; param: dspl_id): dspl_result; virtual; abstract;
function dspl_issetf(handle: dspl_handle; param: dspl_id): dspl_result; virtual; abstract;
function dspl_issetc(handle: dspl_handle; param: dspl_id): dspl_result; virtual; abstract;
public
function createObj(object_id: dspl_id): dspl_handle;
function destroyObj(handle: dspl_handle): dspl_result;
//
function process(handle: dspl_handle; nSamples: dspl_int): dspl_result;
//
function seti(handle: dspl_handle; param: dspl_id; value: dspl_int): dspl_result;
function setf(handle: dspl_handle; param: dspl_id; value: dspl_float): dspl_result;
function setc(handle: dspl_handle; param: dspl_id; chunk: pdspl_float; length: dspl_int): dspl_result;
//
function geti(handle: dspl_handle; param: dspl_id): dspl_int;
function getf(handle: dspl_handle; param: dspl_id): dspl_float;
function getc(handle: dspl_handle; param: dspl_id): pdspl_chunk;
//
function getID(handle: dspl_handle): dspl_int;
//
function isseti(handle: dspl_handle; param: dspl_id): dspl_result;
function issetf(handle: dspl_handle; param: dspl_id): dspl_result;
function issetc(handle: dspl_handle; param: dspl_id): dspl_result;
//
function getVersion(): string;
//
property libResult: dspl_result read f_libResult;
end;
// -- --
function pow(const base, exponent: dspl_double): dspl_double;
// -- --
function db2v(decibels: dspl_float): dspl_float;
function v2db(voltage: dspl_float): dspl_float;
implementation
uses
unaUtils;
// -- from Math.pas --
// -- --
function Log10(const X: Extended): Extended;
{ Log.10(X) := Log.2(X) * Log.10(2) }
asm
FLDLG2 { Log base ten of 2 }
FLD X
FYL2X
FWAIT
end;
{ Invariant: Y >= 0 & Result*X**Y = X**I. Init Y = I and Result = 1. }
{function IntPower(X: Extended; I: Integer): Extended;
var
Y: Integer;
begin
Y := Abs(I);
Result := 1.0;
while Y > 0 do begin
while not Odd(Y) do
begin
Y := Y shr 1;
X := X * X
end;
Dec(Y);
Result := Result * X
end;
if I < 0 then Result := 1.0 / Result
end;
}
// -- --
function IntPower(const Base: Extended; const Exponent: int32): Extended;
asm
mov ecx, eax
cdq
fld1 { Result := 1 }
xor eax, edx
sub eax, edx { eax := Abs(Exponent) }
jz @@3
fld Base
jmp @@2
@@1: fmul ST, ST { X := Base * Base }
@@2: shr eax,1
jnc @@1
fmul ST(1),ST { Result := Result * X }
jnz @@1
fstp st { pop X from FPU stack }
cmp ecx, 0
jge @@3
fld1
fdivrp { Result := 1 / Result }
@@3:
fwait
end;
const
// -- --
FuzzFactor = 1000;
ExtendedResolution = 1E-19 * FuzzFactor;
DoubleResolution = 1E-15 * FuzzFactor;
SingleResolution = 1E-7 * FuzzFactor;
// -- --
function isZero(z: Extended): bool; overload;
begin
Result := (Abs(z) <= ExtendedResolution);
end;
// -- --
function isZero(z: dspl_double): bool; overload;
begin
Result := (Abs(z) <= DoubleResolution);
end;
// -- --
function isZero(z: dspl_float): bool; overload;
begin
Result := (Abs(z) <= SingleResolution);
end;
// -- --
function pow(const base, exponent: dspl_double): dspl_double;
begin
if (isZero(Exponent)) then
result := 1.0 { n**0 = 1 }
else
if (isZero(Base) and (Exponent > 0.0)) then
result := 0.0 { 0**n = 0, n > 0 }
else
if (isZero(Frac(Exponent)) and (Abs(Exponent) <= MaxInt)) then
result := IntPower(Base, int32(Trunc(Exponent)))
else
result := Exp(Exponent * Ln(Base));
//
end;
// -- --
function db2v(decibels: dspl_float): dspl_float;
begin
result := pow(10, decibels / 20);
end;
// -- --
function v2db(voltage: dspl_float): dspl_float;
begin
result := 10 * Log10(voltage * voltage);
end;
{ unaDspLibAbstract }
// -- --
function unaDspLibAbstract.createObj(object_id: dspl_id): dspl_handle;
begin
result := dspl_create(object_id);
end;
// -- --
function unaDspLibAbstract.destroyObj(handle: dspl_handle): dspl_result;
begin
result := dspl_destroy(handle);
end;
// -- --
function unaDspLibAbstract.getc(handle: dspl_handle; param: dspl_id): pdspl_chunk;
begin
result := dspl_getc(handle, param);
end;
// -- --
function unaDspLibAbstract.getf(handle: dspl_handle; param: dspl_id): dspl_float;
begin
result := dspl_getf(handle, param);
end;
// -- --
function unaDspLibAbstract.geti(handle: dspl_handle; param: dspl_id): dspl_int;
begin
result := dspl_geti(handle, param);
end;
// -- --
function unaDspLibAbstract.getID(handle: dspl_handle): dspl_int;
begin
result := dspl_getID(handle);
end;
// -- --
function unaDspLibAbstract.getVersion(): string;
begin
result := dspl_version();
end;
// -- --
function unaDspLibAbstract.issetc(handle: dspl_handle; param: dspl_id): dspl_result;
begin
result := dspl_issetc(handle, param);
end;
// -- --
function unaDspLibAbstract.issetf(handle: dspl_handle; param: dspl_id): dspl_result;
begin
result := dspl_issetf(handle, param);
end;
// -- --
function unaDspLibAbstract.isseti(handle: dspl_handle; param: dspl_id): dspl_result;
begin
result := dspl_isseti(handle, param);
end;
// -- --
function unaDspLibAbstract.process(handle: dspl_handle; nSamples: dspl_int): dspl_result;
begin
result := dspl_process(handle, nSamples);
end;
// -- --
function unaDspLibAbstract.setc(handle: dspl_handle; param: dspl_id; chunk: pdspl_float; length: dspl_int): dspl_result;
begin
result := dspl_setc(handle, param, chunk, length);
end;
// -- --
function unaDspLibAbstract.setf(handle: dspl_handle; param: dspl_id; value: dspl_float): dspl_result;
begin
result := dspl_setf(handle, param, value);
end;
// -- --
function unaDspLibAbstract.seti(handle: dspl_handle; param: dspl_id; value: dspl_int): dspl_result;
begin
result := dspl_seti(handle, param, value);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -