From 17925302ae153e34db41f0c025df325d67f98781 Mon Sep 17 00:00:00 2001 From: Olli Date: Mon, 10 Oct 2022 17:49:15 +0300 Subject: [PATCH] Migrate configuration file, add building of dynamic-link version to the master makefile - Migrate configuration.ac file to new autotools - add building of also the dynamic-link version within 'source/SoundTouchDLL' directory from the main-level makefile - add a simple lazarus/pascal example project that uses the dynamic-link version of the SoundTouch library Signed-off-by: Olli --- configure.ac | 57 ++++-- source/Makefile.am | 8 +- source/SoundTouchDLL/LazarusTest/README.txt | 10 + .../{ => LazarusTest}/SoundTouchDLL.pas | 61 ++++-- .../LazarusTest/libSoundTouchDll.so | 1 + source/SoundTouchDLL/LazarusTest/main.lfm | 36 ++++ source/SoundTouchDLL/LazarusTest/main.pas | 49 +++++ .../LazarusTest/soundtouchtest.ico | Bin 0 -> 65738 bytes .../LazarusTest/soundtouchtest.lpi | 78 ++++++++ .../LazarusTest/soundtouchtest.lpr | 25 +++ .../LazarusTest/soundtouchtest.lps | 186 ++++++++++++++++++ source/SoundTouchDLL/Makefile.am | 57 ++++++ source/SoundTouchDLL/SoundTouchDLL.cpp | 24 ++- 13 files changed, 534 insertions(+), 58 deletions(-) create mode 100644 source/SoundTouchDLL/LazarusTest/README.txt rename source/SoundTouchDLL/{ => LazarusTest}/SoundTouchDLL.pas (87%) create mode 120000 source/SoundTouchDLL/LazarusTest/libSoundTouchDll.so create mode 100644 source/SoundTouchDLL/LazarusTest/main.lfm create mode 100644 source/SoundTouchDLL/LazarusTest/main.pas create mode 100644 source/SoundTouchDLL/LazarusTest/soundtouchtest.ico create mode 100644 source/SoundTouchDLL/LazarusTest/soundtouchtest.lpi create mode 100644 source/SoundTouchDLL/LazarusTest/soundtouchtest.lpr create mode 100644 source/SoundTouchDLL/LazarusTest/soundtouchtest.lps create mode 100644 source/SoundTouchDLL/Makefile.am diff --git a/configure.ac b/configure.ac index d557fb6..6db05e2 100644 --- a/configure.ac +++ b/configure.ac @@ -1,33 +1,33 @@ dnl This file is part of SoundTouch, an audio processing library for pitch/time adjustments -dnl +dnl dnl SoundTouch is free software; you can redistribute it and/or modify it under the dnl terms of the GNU General Public License as published by the Free Software dnl Foundation; either version 2 of the License, or (at your option) any later dnl version. -dnl +dnl dnl SoundTouch is distributed in the hope that it will be useful, but WITHOUT ANY dnl WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dnl FOR A PARTICULAR PURPOSE. See the GNU General Public License for more dnl details. -dnl +dnl dnl You should have received a copy of the GNU General Public License along with dnl this program; if not, write to the Free Software Foundation, Inc., 59 Temple dnl Place - Suite 330, Boston, MA 02111-1307, USA # Process this file with autoconf to produce a configure script. -AC_INIT([SoundTouch], [2.3.1], [http://www.surina.net/soundtouch]) +AC_INIT([SoundTouch],[2.3.1],[http://www.surina.net/soundtouch]) dnl Default to libSoundTouch.so.$LIB_SONAME.0.0 LIB_SONAME=1 AC_SUBST(LIB_SONAME) AC_CONFIG_AUX_DIR(config) AC_CONFIG_MACRO_DIR([config/m4]) -AM_CONFIG_HEADER([config.h include/soundtouch_config.h]) +AC_CONFIG_HEADERS([config.h include/soundtouch_config.h]) AM_INIT_AUTOMAKE AM_SILENT_RULES([yes]) -#AC_DISABLE_SHARED dnl This makes libtool only build static libs +#AC_DISABLE_SHARED dnl This makes libtool only build static libs AC_DISABLE_STATIC dnl This makes libtool only build shared libs -#AC_GNU_SOURCE dnl enable posix extensions in glibc +#AC_USE_SYSTEM_EXTENSIONS dnl enable posix extensions in glibc AC_LANG(C++) @@ -51,7 +51,7 @@ AC_PROG_INSTALL #AC_PROG_LN_S AC_PROG_MAKE_SET -AM_PROG_LIBTOOL dnl turn on using libtool +LT_INIT dnl turn on using libtool @@ -59,7 +59,7 @@ AM_PROG_LIBTOOL dnl turn on using libtool dnl ############################################################################ dnl # Checks for header files # dnl ############################################################################ -AC_HEADER_STDC + #AC_HEADER_SYS_WAIT # add any others you want to check for here AC_CHECK_HEADERS([cpuid.h]) @@ -70,7 +70,7 @@ if test "x$ac_cv_header_cpuid_h" = "xno"; then AC_MSG_WARN([If using a x86 architecture and optimizations are desired then please install gcc (>= 4.3).]) AC_MSG_WARN([If using a non-x86 architecture then this is expected and can be ignored.]) fi - + dnl ############################################################################ dnl # Checks for typedefs, structures, and compiler characteristics $ @@ -82,14 +82,12 @@ AC_C_INLINE AC_ARG_ENABLE(integer-samples, - [AC_HELP_STRING([--enable-integer-samples], - [use integer samples instead of floats [default=no]])],, + [AS_HELP_STRING([--enable-integer-samples],[use integer samples instead of floats [default=no]])],, [enable_integer_samples=no]) AC_ARG_ENABLE(openmp, - [AC_HELP_STRING([--enable-openmp], - [use parallel multicore calculation through OpenMP [default=no]])],, + [AS_HELP_STRING([--enable-openmp],[use parallel multicore calculation through OpenMP [default=no]])],, [enable_openmp=no]) # Let the user enable/disable the x86 optimizations. @@ -232,6 +230,26 @@ if test "x$enable_neon_optimizations" = "xyes" -a "x$ac_cv_header_arm_neon_h" = fi fi + +AC_CANONICAL_HOST +HOST_OS="" +AS_CASE([$host_cpu], + [x86_64], + [ + x86_64=true + x86=true + ], + [i?86], + [ + x86=true + ]) + +AM_CONDITIONAL([X86], [test "$x86" = true]) +AM_CONDITIONAL([X86_64], [test "$x86_64" = true]) + +AC_SUBST([HOST_OS]) + + # Set AM_CXXFLAGS AC_SUBST([AM_CXXFLAGS], [$AM_CXXFLAGS]) @@ -254,11 +272,9 @@ AM_CONDITIONAL([HAVE_SSE], [test "x$have_sse_intrinsics" = "xyes"]) dnl ############################################################################ dnl # Checks for library functions/classes # dnl ############################################################################ -AC_FUNC_MALLOC -AC_TYPE_SIGNAL dnl make -lm get added to the LIBS -AC_CHECK_LIB(m, sqrt,,AC_MSG_ERROR([compatible libc math library not found])) +AC_CHECK_LIB(m, sqrt,,AC_MSG_ERROR([compatible libc math library not found])) dnl add whatever functions you might want to check for here #AC_CHECK_FUNCS([floor ftruncate memmove memset mkdir modf pow realpath sqrt strchr strdup strerror strrchr strstr strtol]) @@ -288,11 +304,12 @@ AC_CONFIG_FILES([ source/Makefile source/SoundTouch/Makefile source/SoundStretch/Makefile + source/SoundTouchDLL/Makefile include/Makefile ]) -AC_OUTPUT( - soundtouch.pc -) +AC_CONFIG_FILES([soundtouch.pc +]) +AC_OUTPUT dnl use 'echo' to put stuff here if you want a message to the builder diff --git a/source/Makefile.am b/source/Makefile.am index f5c3edb..8463069 100644 --- a/source/Makefile.am +++ b/source/Makefile.am @@ -1,23 +1,23 @@ ## Process this file with automake to create Makefile.in ## ## This file is part of SoundTouch, an audio processing library for pitch/time adjustments -## +## ## SoundTouch 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. -## +## ## SoundTouch 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 include $(top_srcdir)/config/am_include.mk -SUBDIRS=SoundTouch SoundStretch +SUBDIRS=SoundTouch SoundStretch SoundTouchDLL # set to something if you want other stuff to be included in the distribution tarball #EXTRA_DIST= diff --git a/source/SoundTouchDLL/LazarusTest/README.txt b/source/SoundTouchDLL/LazarusTest/README.txt new file mode 100644 index 0000000..e1188c1 --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/README.txt @@ -0,0 +1,10 @@ +This is Lazarus Pascal example that loads the SoundTouch dynamic-load library +and queries the library version as a simple example how to load SoundTouch from +Pascal / Lazarus. + +Set the SoundTouch dynamic library file name in the 'InitDLL' procedure of +file 'SoundTouchDLL.pas' depending on if you're building for Windows or Linux. + +The example expects the the 'libSoundTouchDll.so' (linux) or 'SoundTouch.dll' (Windows) +library binary files is found within this project directory, either via soft-link +(in Linux) or as a copied file. diff --git a/source/SoundTouchDLL/SoundTouchDLL.pas b/source/SoundTouchDLL/LazarusTest/SoundTouchDLL.pas similarity index 87% rename from source/SoundTouchDLL/SoundTouchDLL.pas rename to source/SoundTouchDLL/LazarusTest/SoundTouchDLL.pas index 48e6251..3c6c362 100644 --- a/source/SoundTouchDLL/SoundTouchDLL.pas +++ b/source/SoundTouchDLL/LazarusTest/SoundTouchDLL.pas @@ -2,11 +2,8 @@ unit SoundTouchDLL; ////////////////////////////////////////////////////////////////////////////// // -// SoundTouch.dll wrapper for accessing SoundTouch routines from Delphi/Pascal -// -// Module Author : Christian Budde -// -// 2014-01-12 fixes by Sandro Cumerlato +// SoundTouch.dll / libSoundTouchDll.so wrapper for accessing SoundTouch +// routines from Delphi/Pascal/Lazarus // //////////////////////////////////////////////////////////////////////////////// // @@ -33,8 +30,8 @@ unit SoundTouchDLL; interface -uses - Windows; +//uses + //Windows; type TSoundTouchHandle = THandle; @@ -50,7 +47,7 @@ type // Get SoundTouch library version string 2 TSoundTouchGetVersionString2 = procedure(VersionString : PAnsiChar; BufferSize : Integer); cdecl; - + // Get SoundTouch library version Id TSoundTouchGetVersionId = function : Cardinal; cdecl; @@ -107,6 +104,13 @@ type //< contains data for both channels. ); cdecl; + TSoundTouchPutSamplesI16 = procedure (Handle: TSoundTouchHandle; + const Samples: Pint16; //< Pointer to sample buffer. + NumSamples: Cardinal //< Number of samples in buffer. Notice + //< that in case of stereo-sound a single sample + //< contains data for both channels. + ); cdecl; + // Clears all the samples in the object's output and internal processing // buffers. TSoundTouchClear = procedure (Handle: TSoundTouchHandle); cdecl; @@ -131,16 +135,20 @@ type // Returns number of samples currently unprocessed. TSoundTouchNumUnprocessedSamples = function (Handle: TSoundTouchHandle): Cardinal; cdecl; - // Adjusts book-keeping so that given number of samples are removed from beginning of the - // sample buffer without copying them anywhere. - // - // Used to reduce the number of samples in the buffer when accessing the sample buffer directly - // with 'ptrBegin' function. + /// Receive ready samples from the processing pipeline. + /// + /// if called with outBuffer=NULL, just reduces amount of ready samples within the pipeline. TSoundTouchReceiveSamples = function (Handle: TSoundTouchHandle; OutBuffer: PSingle; //< Buffer where to copy output samples. MaxSamples: Integer //< How many samples to receive at max. ): Cardinal; cdecl; + /// int16 version of soundtouch_receiveSamples(): This converts internal float samples + /// into int16 (short) return data type + TSoundTouchReceiveSamplesI16 = function (Handle: TSoundTouchHandle; + OutBuffer: int16; //< Buffer where to copy output samples. + MaxSamples: Integer //< How many samples to receive at max. + ): Cardinal; cdecl; // Returns number of samples currently available. TSoundTouchNumSamples = function (Handle: TSoundTouchHandle): Cardinal; cdecl; @@ -170,6 +178,7 @@ var SoundTouchGetSetting : TSoundTouchGetSetting; SoundTouchNumUnprocessedSamples : TSoundTouchNumUnprocessedSamples; SoundTouchReceiveSamples : TSoundTouchReceiveSamples; + SoundTouchReceiveSamplesI16 : TSoundTouchReceiveSamplesI16; SoundTouchNumSamples : TSoundTouchNumSamples; SoundTouchIsEmpty : TSoundTouchIsEmpty; @@ -232,6 +241,9 @@ type property IsEmpty: Integer read GetIsEmpty; end; + // list of exported functions and procedures +function IsSoundTouchLoaded: Boolean; + implementation { TSoundTouch } @@ -416,19 +428,20 @@ begin end; var - SoundTouchLibHandle: HINST; - SoundTouchDLLFile: PAnsiChar = 'SoundTouch.dll'; + SoundTouchLibHandle: THandle; + SoundTouchDLLFile: AnsiString = 'libSoundTouchDll.so'; + //SoundTouchDLLFile: AnsiString = 'SoundTouch.dll'; // bpm detect functions. untested -- if these don't work then remove: - bpm_createInstance: function(chan: CInt32; sampleRate : CInt32): THandle; cdecl; + bpm_createInstance: function(chan: int32; sampleRate : int32): 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; + bpm_getBpm: function(h: THandle): Single; cdecl; + bpm_putSamples: procedure(h: THandle; const samples: PSingle; numSamples: cardinal); cdecl; procedure InitDLL; begin - SoundTouchLibHandle := LoadLibrary(SoundTouchDLLFile); + // for Windows: use 'SoundTouch.dll` as filename + SoundTouchLibHandle := LoadLibrary('./libSoundTouchDll.so'); if SoundTouchLibHandle <> 0 then try Pointer(SoundTouchCreateInstance) := GetProcAddress(SoundTouchLibHandle, 'soundtouch_createInstance'); @@ -461,7 +474,7 @@ begin Pointer(bpm_destroyInstance) :=GetProcAddress(SoundTouchLibHandle, 'bpm_destroyInstance'); Pointer(bpm_getBpm) :=GetProcAddress(SoundTouchLibHandle, 'bpm_getBpm'); Pointer(bpm_putSamples) :=GetProcAddress(SoundTouchLibHandle, 'bpm_putSamples'); - + except FreeLibrary(SoundTouchLibHandle); SoundTouchLibHandle := 0; @@ -473,6 +486,12 @@ begin if SoundTouchLibHandle <> 0 then FreeLibrary(SoundTouchLibHandle); end; +// returns 'true' if SoundTouch dynamic library has been successfully loaded, otherwise 'false' +function IsSoundTouchLoaded: Boolean; +begin; + result := SoundTouchLibHandle <> 0 +end; + initialization InitDLL; diff --git a/source/SoundTouchDLL/LazarusTest/libSoundTouchDll.so b/source/SoundTouchDLL/LazarusTest/libSoundTouchDll.so new file mode 120000 index 0000000..6db5ce9 --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/libSoundTouchDll.so @@ -0,0 +1 @@ +../.libs/libSoundTouchDll.so \ No newline at end of file diff --git a/source/SoundTouchDLL/LazarusTest/main.lfm b/source/SoundTouchDLL/LazarusTest/main.lfm new file mode 100644 index 0000000..36ffb13 --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/main.lfm @@ -0,0 +1,36 @@ +object Form1: TForm1 + Left = 2237 + Height = 128 + Top = 242 + Width = 381 + Caption = 'SoundTouch test' + ClientHeight = 128 + ClientWidth = 381 + LCLVersion = '2.2.0.4' + object Load: TButton + Left = 19 + Height = 50 + Top = 16 + Width = 144 + Caption = 'Load SoundTouch' + OnClick = LoadClick + TabOrder = 0 + end + object EditVersion: TEdit + Left = 184 + Height = 34 + Top = 80 + Width = 184 + TabOrder = 1 + Text = 'n/a' + TextHint = 'click to populate' + end + object Label1: TLabel + Left = 19 + Height = 17 + Top = 90 + Width = 156 + Caption = 'Soundtouch lib version:' + WordWrap = True + end +end diff --git a/source/SoundTouchDLL/LazarusTest/main.pas b/source/SoundTouchDLL/LazarusTest/main.pas new file mode 100644 index 0000000..44ccce4 --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/main.pas @@ -0,0 +1,49 @@ +unit main; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, SoundTouchDLL; + + +type + + { TForm1 } + + TForm1 = class(TForm) + EditVersion: TEdit; + Label1: TLabel; + Load: TButton; + + procedure LoadClick(Sender: TObject); + private + + public + + end; + +var + Form1: TForm1; + +implementation + +{$R *.lfm} + +{ TForm1 } + +procedure TForm1.LoadClick(Sender: TObject); +var + version:string; +begin + if IsSoundTouchLoaded() then + version := SoundTouchGetVersionString() + else + version := ''; + + EditVersion.Text:= version; +end; + +end. + diff --git a/source/SoundTouchDLL/LazarusTest/soundtouchtest.ico b/source/SoundTouchDLL/LazarusTest/soundtouchtest.ico new file mode 100644 index 0000000000000000000000000000000000000000..25c186a5bb97a93fa24b5172021ab18cd3146e4f GIT binary patch literal 65738 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 literal 0 HcmV?d00001 diff --git a/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpi b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpi new file mode 100644 index 0000000..d2ce13e --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpi @@ -0,0 +1,78 @@ + + + + + + + + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> + <Icon Value="0"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="soundtouchtest.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="main.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="soundtouchtest"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpr b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpr new file mode 100644 index 0000000..e8fee83 --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lpr @@ -0,0 +1,25 @@ +program soundtouchtest; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, main + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. + diff --git a/source/SoundTouchDLL/LazarusTest/soundtouchtest.lps b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lps new file mode 100644 index 0000000..c80f75f --- /dev/null +++ b/source/SoundTouchDLL/LazarusTest/soundtouchtest.lps @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <Version Value="12"/> + <BuildModes Active="Default"/> + <Units> + <Unit> + <Filename Value="soundtouchtest.lpr"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="-1"/> + <WindowIndex Value="-1"/> + <TopLine Value="-1"/> + <CursorPos X="-1" Y="-1"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="main.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <IsVisibleTab Value="True"/> + <CursorPos X="26" Y="43"/> + <UsageCount Value="21"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit> + <Unit> + <Filename Value="../SoundTouchDLL.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="37"/> + <CursorPos X="19"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="/usr/lib/lazarus/2.2.0/lcl/interfaces/gtk2/gtk2proc.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="7149"/> + <CursorPos X="3" Y="7184"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="/usr/lib/lazarus/2.2.0/components/freetype/easylazfreetype.pas"/> + <UnitName Value="EasyLazFreeType"/> + <EditorIndex Value="-1"/> + <TopLine Value="539"/> + <CursorPos X="16" Y="574"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="SoundTouchDLL.pas"/> + <EditorIndex Value="1"/> + <TopLine Value="326"/> + <CursorPos X="127" Y="379"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit> + </Units> + <JumpHistory HistoryIndex="29"> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="439" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="427" Column="37" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="439" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="427" Column="32" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="444" Column="48" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="439" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="416" Column="116" TopLine="403"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="439" TopLine="403"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="45" Column="40"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="243" Column="38" TopLine="197"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="487" Column="38" TopLine="429"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="42" Column="8"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="41" Column="44"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="44" Column="6"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="43" Column="39"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="44" Column="7"/> + </Position> + <Position> + <Filename Value="main.pas"/> + <Caret Line="38" Column="7"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="467" TopLine="423"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="212" Column="32" TopLine="78"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="361" Column="37" TopLine="308"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="466" Column="37" TopLine="413"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="467" Column="37" TopLine="413"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="466" Column="13" TopLine="413"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="361" Column="13" TopLine="326"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="110" Column="3" TopLine="74"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="180" Column="37" TopLine="145"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="179" Column="55" TopLine="145"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="146" Column="3" TopLine="145"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="149" TopLine="111"/> + </Position> + <Position> + <Filename Value="SoundTouchDLL.pas"/> + <Caret Line="151" Column="31" TopLine="116"/> + </Position> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes ActiveMode=""/> + </RunParams> + </ProjectSession> +</CONFIG> diff --git a/source/SoundTouchDLL/Makefile.am b/source/SoundTouchDLL/Makefile.am new file mode 100644 index 0000000..65b764e --- /dev/null +++ b/source/SoundTouchDLL/Makefile.am @@ -0,0 +1,57 @@ +## Process this file with automake to create Makefile.in +## +## This file is part of SoundTouch, an audio processing library for pitch/time adjustments +## +## SoundTouch 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. +## +## SoundTouch 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 + +include $(top_srcdir)/config/am_include.mk + +#AUTOMAKE_OPTIONS = subdir-objects + + +noinst_HEADERS=../SoundTouch/AAFilter.h ../SoundTouch/cpu_detect.h ../SoundTouch/cpu_detect_x86.cpp ../SoundTouch/FIRFilter.h \ + ../SoundTouch/RateTransposer.h ../SoundTouch/TDStretch.h ../SoundTouch/PeakFinder.h ../SoundTouch/InterpolateCubic.h \ + ../SoundTouch/InterpolateLinear.h ../SoundTouch/InterpolateShannon.h + +include_HEADERS=SoundTouchDLL.h + +lib_LTLIBRARIES=libSoundTouchDll.la +# +libSoundTouchDll_la_SOURCES=../SoundTouch/AAFilter.cpp ../SoundTouch/FIRFilter.cpp \ + ../SoundTouch/FIFOSampleBuffer.cpp ../SoundTouch/RateTransposer.cpp ../SoundTouch/SoundTouch.cpp \ + ../SoundTouch/TDStretch.cpp ../SoundTouch/sse_optimized.cpp ../SoundTouch/cpu_detect_x86.cpp \ + ../SoundTouch/BPMDetect.cpp ../SoundTouch/PeakFinder.cpp ../SoundTouch/InterpolateLinear.cpp \ + ../SoundTouch/InterpolateCubic.cpp ../SoundTouch/InterpolateShannon.cpp SoundTouchDLL.cpp + +# Compiler flags + +# Modify the default 0.0.0 to LIB_SONAME.0.0 +#libSoundTouchDll_la_LDFLAGS=-version-info @LIB_SONAME@ +LDFLAGS=-version-info @LIB_SONAME@ + + +if X86 +CXXFLAGS1=-mstackrealign -msse +endif + +if X86_64 +CXXFLAGS2=-fPIC +endif + +#libSoundTouchDll_CXXFLAGS=$(AM_CXXFLAGS) $(CXXFLAGS1) $(CXXFLAGS2) -shared -DDLL_EXPORTS -fvisibility=hidden +CXXFLAGS=$(AM_CXXFLAGS) $(CXXFLAGS1) $(CXXFLAGS2) -shared -DDLL_EXPORTS -fvisibility=hidden + +# TODO: +# - saatu kääntymään +# - tee testi, toimiiko dll? diff --git a/source/SoundTouchDLL/SoundTouchDLL.cpp b/source/SoundTouchDLL/SoundTouchDLL.cpp index 1b6b8f2..3f78cca 100644 --- a/source/SoundTouchDLL/SoundTouchDLL.cpp +++ b/source/SoundTouchDLL/SoundTouchDLL.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// /// -/// SoundTouch DLL wrapper - wraps SoundTouch routines into a Dynamic Load +/// SoundTouch DLL wrapper - wraps SoundTouch routines into a Dynamic Load /// Library interface. /// /// Author : Copyright (c) Olli Parviainen @@ -119,7 +119,7 @@ SOUNDTOUCHDLL_API const char *__cdecl soundtouch_getVersionString() } -/// Get SoundTouch library version string - alternative function for +/// Get SoundTouch library version string - alternative function for /// environments that can't properly handle character string as return value SOUNDTOUCHDLL_API void __cdecl soundtouch_getVersionString2(char* versionString, int bufferSize) { @@ -185,7 +185,7 @@ SOUNDTOUCHDLL_API void __cdecl soundtouch_setPitch(HANDLE h, float newPitch) sth->pst->setPitch(newPitch); } -/// Sets pitch change in octaves compared to the original pitch +/// Sets pitch change in octaves compared to the original pitch /// (-1.00 .. +1.00) SOUNDTOUCHDLL_API void __cdecl soundtouch_setPitchOctaves(HANDLE h, float newPitch) { @@ -335,9 +335,9 @@ SOUNDTOUCHDLL_API void __cdecl soundtouch_clear(HANDLE h) /// Changes a setting controlling the processing system behaviour. See the /// 'SETTING_...' defines for available setting ID's. -/// +/// /// \return 'nonzero' if the setting was successfully changed -SOUNDTOUCHDLL_API int __cdecl soundtouch_setSetting(HANDLE h, +SOUNDTOUCHDLL_API int __cdecl soundtouch_setSetting(HANDLE h, int settingId, ///< Setting ID number. see SETTING_... defines. int value ///< New setting value. ) @@ -352,7 +352,7 @@ SOUNDTOUCHDLL_API int __cdecl soundtouch_setSetting(HANDLE h, /// 'SETTING_...' defines for available setting ID's. /// /// \return the setting value. -SOUNDTOUCHDLL_API int __cdecl soundtouch_getSetting(HANDLE h, +SOUNDTOUCHDLL_API int __cdecl soundtouch_getSetting(HANDLE h, int settingId ///< Setting ID number, see SETTING_... defines. ) { @@ -373,12 +373,10 @@ SOUNDTOUCHDLL_API uint __cdecl soundtouch_numUnprocessedSamples(HANDLE h) } -/// Adjusts book-keeping so that given number of samples are removed from beginning of the -/// sample buffer without copying them anywhere. +/// Receive ready samples from the processing pipeline. /// -/// Used to reduce the number of samples in the buffer when accessing the sample buffer directly -/// with 'ptrBegin' function. -SOUNDTOUCHDLL_API uint __cdecl soundtouch_receiveSamples(HANDLE h, +/// if called with outBuffer=NULL, just reduces amount of ready samples within the pipeline. +SOUNDTOUCHDLL_API uint __cdecl soundtouch_receiveSamples(HANDLE h, SAMPLETYPE *outBuffer, ///< Buffer where to copy output samples. unsigned int maxSamples ///< How many samples to receive at max. ) @@ -507,7 +505,7 @@ SOUNDTOUCHDLL_API void __cdecl bpm_destroyInstance(HANDLE h) /// Feed 'numSamples' sample frames from 'samples' into the BPM detection handler -SOUNDTOUCHDLL_API void __cdecl bpm_putSamples(HANDLE h, +SOUNDTOUCHDLL_API void __cdecl bpm_putSamples(HANDLE h, const float *samples, unsigned int numSamples) { @@ -520,7 +518,7 @@ SOUNDTOUCHDLL_API void __cdecl bpm_putSamples(HANDLE h, /// Feed 'numSamples' sample frames from 'samples' into the BPM detection handler. /// 16bit int sample format version. -SOUNDTOUCHDLL_API void __cdecl bpm_putSamples_i16(HANDLE h, +SOUNDTOUCHDLL_API void __cdecl bpm_putSamples_i16(HANDLE h, const short *samples, unsigned int numSamples) {