Implements Module Player working in Form
* Implements Embedding .xm music in Final Application
This commit is contained in:
216
UOS/examples/uos_soundtouch.pas
Normal file
216
UOS/examples/uos_soundtouch.pas
Normal file
@@ -0,0 +1,216 @@
|
||||
{This unit is part of United Openlibraries of Sound (uos)}
|
||||
|
||||
{This is the Dynamic loading + Unix compatible version of SoundTouch Pascal Wrapper
|
||||
from Sandro Cumerlato <sandro.cumerlato@gmail.com>.
|
||||
of the original C version of Olli Parviainen <oparviai@iki.fi>.
|
||||
|
||||
Added BPMdetect method too.
|
||||
Load library with St_load() and release with St_unload().
|
||||
License : modified LGPL.
|
||||
Fred van Stappen / fiens@hotmail.com}
|
||||
|
||||
unit uos_soundtouch;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
{$PACKRECORDS C}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
ctypes, DynLibs;
|
||||
|
||||
const
|
||||
libst=
|
||||
|
||||
{$IFDEF darwin}
|
||||
'libSoundTouchDLL.dylib';
|
||||
{$ELSE}
|
||||
{$IFDEF unix}
|
||||
'libSoundTouch.so.1';
|
||||
{$ELSE}
|
||||
{$if defined(cpu64)}
|
||||
'SoundTouch_x64.dll';
|
||||
{$else}
|
||||
'SoundTouch.dll';
|
||||
{$endif}
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
|
||||
{$IF not DEFINED(windows)}
|
||||
type
|
||||
THandle = pointer;
|
||||
{$endif}
|
||||
|
||||
type
|
||||
Tt_bs2bdp = ^Tt_bs2bd;
|
||||
Tt_bs2bd = packed record
|
||||
level : CInt32;
|
||||
srate : CInt32;
|
||||
a0_lo : CDouble;
|
||||
b1_lo : CDouble;
|
||||
a0_hi : CDouble;
|
||||
a1_hi : CDouble;
|
||||
b1_hi : CDouble;
|
||||
gain : CDouble;
|
||||
lfs : packed record
|
||||
asis : array[0..1] of cdouble;
|
||||
lo : array[0..1] of cdouble;
|
||||
hi : array[0..1] of cdouble;
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
bpm_createInstance: function(chan: CInt32; sampleRate : CInt32): THandle; cdecl;
|
||||
bpm_destroyInstance: procedure(h: THandle); cdecl;
|
||||
bpm_getBpm: function(h: THandle): cfloat; cdecl;
|
||||
bpm_putSamples: procedure(h: THandle; const samples: pcfloat;
|
||||
numSamples: cardinal); cdecl;
|
||||
|
||||
soundtouch_clear: procedure(h: THandle); cdecl;
|
||||
soundtouch_createInstance: function(): THandle; cdecl;
|
||||
soundtouch_flush: procedure(h: THandle); cdecl;
|
||||
soundtouch_getSetting: function(h: THandle; settingId: integer): integer; cdecl;
|
||||
soundtouch_getVersionId: function(): cardinal; cdecl;
|
||||
soundtouch_getVersionString2: procedure(VersionString: PAnsiChar;
|
||||
bufferSize: integer); cdecl;
|
||||
soundtouch_getVersionString: function(): PAnsiChar; cdecl;
|
||||
soundtouch_isEmpty: function(h: THandle): integer; cdecl;
|
||||
soundtouch_numSamples: function(h: THandle): cardinal; cdecl;
|
||||
soundtouch_numUnprocessedSamples: function(h: THandle): cardinal; cdecl;
|
||||
soundtouch_putSamples: procedure(h: THandle; const samples: pcfloat;
|
||||
numSamples: cardinal); cdecl;
|
||||
soundtouch_receiveSamples: function(h: THandle; outBuffer: pcfloat;
|
||||
maxSamples: cardinal): cardinal; cdecl;
|
||||
soundtouch_setChannels: procedure(h: THandle; numChannels: cardinal); cdecl;
|
||||
soundtouch_setPitch: procedure(h: THandle; newPitch: single); cdecl;
|
||||
soundtouch_setPitchOctaves: procedure(h: THandle; newPitch: single); cdecl;
|
||||
soundtouch_setPitchSemiTones: procedure(h: THandle; newPitch: single); cdecl;
|
||||
soundtouch_setRate: procedure(h: THandle; newRate: single); cdecl;
|
||||
soundtouch_setRateChange: procedure(h: THandle; newRate: single); cdecl;
|
||||
soundtouch_setSampleRate: procedure(h: THandle; srate: cardinal); cdecl;
|
||||
soundtouch_destroyInstance: procedure(h: THandle); cdecl;
|
||||
soundtouch_setSetting: function(h: THandle; settingId: integer; Value: integer): boolean; cdecl;
|
||||
soundtouch_setTempo: procedure(h: THandle; newTempo: single); cdecl;
|
||||
soundtouch_setTempoChange: procedure(h: THandle; newTempo: single); cdecl;
|
||||
|
||||
LibHandle:TLibHandle=dynlibs.NilHandle; // this will hold our handle for the lib
|
||||
ReferenceCounter : cardinal = 0; // Reference counter
|
||||
|
||||
function ST_IsLoaded : boolean; inline;
|
||||
function ST_Load(const libfilename: string): boolean; // load the lib
|
||||
procedure ST_Unload(); // unload and frees the lib from memory : do not forget to call it before close application.
|
||||
|
||||
implementation
|
||||
|
||||
function ST_IsLoaded: boolean;
|
||||
begin
|
||||
Result := (LibHandle <> dynlibs.NilHandle);
|
||||
end;
|
||||
|
||||
function ST_Load(const libfilename: string): boolean;
|
||||
var
|
||||
thelib: string;
|
||||
begin
|
||||
Result := False;
|
||||
if LibHandle<>0 then
|
||||
begin
|
||||
Inc(ReferenceCounter);
|
||||
result:=true
|
||||
end else begin
|
||||
if Length(libfilename) = 0 then thelib := libst else thelib := libfilename;
|
||||
LibHandle:=DynLibs.SafeLoadLibrary(thelib); // obtain the handle we want.
|
||||
if LibHandle <> DynLibs.NilHandle then
|
||||
begin
|
||||
try
|
||||
Pointer(soundtouch_createInstance) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_createInstance');
|
||||
if Pointer(soundtouch_createInstance) = nil then // not the SoundTouchDLL library.
|
||||
begin
|
||||
ST_Unload;
|
||||
result := false end
|
||||
else
|
||||
begin
|
||||
Pointer(soundtouch_clear) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_clear');
|
||||
Pointer(soundtouch_destroyInstance) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_destroyInstance');
|
||||
Pointer(soundtouch_flush) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_flush');
|
||||
Pointer(soundtouch_getSetting) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_getSetting');
|
||||
Pointer(soundtouch_getVersionId) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_getVersionId');
|
||||
Pointer(soundtouch_getVersionString2) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_getVersionString2');
|
||||
Pointer(soundtouch_getVersionString) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_getVersionString');
|
||||
Pointer(soundtouch_isEmpty) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_isEmpty');
|
||||
Pointer(soundtouch_numSamples) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_numSamples');
|
||||
Pointer(soundtouch_numUnprocessedSamples) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_numUnprocessedSamples');
|
||||
Pointer(soundtouch_putSamples) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_putSamples');
|
||||
Pointer(soundtouch_receiveSamples) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_receiveSamples');
|
||||
Pointer(soundtouch_setChannels) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setChannels');
|
||||
Pointer(soundtouch_setPitch) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setPitch');
|
||||
Pointer(soundtouch_setPitchOctaves) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setPitchOctaves');
|
||||
Pointer(soundtouch_setPitchSemiTones) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setPitchSemiTones');
|
||||
Pointer(soundtouch_setRate) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setRate');
|
||||
Pointer(soundtouch_setRateChange) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setRateChange');
|
||||
Pointer(soundtouch_setSampleRate) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setSampleRate');
|
||||
Pointer(soundtouch_setSetting) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setSetting');
|
||||
Pointer(soundtouch_setTempo) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setTempo');
|
||||
Pointer(soundtouch_setTempoChange) :=
|
||||
GetProcAddress(LibHandle, 'soundtouch_setTempoChange');
|
||||
|
||||
Pointer(bpm_createInstance) :=
|
||||
GetProcAddress(LibHandle, 'bpm_createInstance');
|
||||
Pointer(bpm_destroyInstance) :=
|
||||
GetProcAddress(LibHandle, 'bpm_destroyInstance');
|
||||
Pointer(bpm_getBpm) :=
|
||||
GetProcAddress(LibHandle, 'bpm_getBpm');
|
||||
Pointer(bpm_putSamples) :=
|
||||
GetProcAddress(LibHandle, 'bpm_putSamples');
|
||||
|
||||
Result := St_IsLoaded;
|
||||
ReferenceCounter:=1;
|
||||
|
||||
end;
|
||||
|
||||
except
|
||||
ST_Unload;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure ST_Unload;
|
||||
begin
|
||||
// < Reference counting
|
||||
if ReferenceCounter > 0 then
|
||||
dec(ReferenceCounter);
|
||||
if ReferenceCounter > 0 then
|
||||
exit;
|
||||
// >
|
||||
|
||||
if LibHandle <> DynLibs.NilHandle then
|
||||
begin
|
||||
DynLibs.UnloadLibrary(LibHandle);
|
||||
LibHandle := DynLibs.NilHandle;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user