From 8adfb3bd99b4dcff2459756af090a640fd7a4b4a Mon Sep 17 00:00:00 2001 From: yo mama Date: Fri, 19 Jun 2015 16:24:27 -0400 Subject: clone --- .../source/SoundTouchDLL/SoundTouchDLL.cpp | 327 ++++++++++++++ .../source/SoundTouchDLL/SoundTouchDLL.h | 164 +++++++ .../source/SoundTouchDLL/SoundTouchDLL.pas | 469 +++++++++++++++++++++ .../source/SoundTouchDLL/SoundTouchDLL.rc | 113 +++++ .../source/SoundTouchDLL/SoundTouchDLL.sln | 32 ++ .../source/SoundTouchDLL/SoundTouchDLL.vcproj | 158 +++++++ 6 files changed, 1263 insertions(+) create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.cpp create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.h create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.pas create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.rc create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.sln create mode 100644 pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.vcproj (limited to 'pysoundtouch/soundtouch/source/SoundTouchDLL') diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.cpp b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.cpp new file mode 100644 index 0000000..485811c --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.cpp @@ -0,0 +1,327 @@ +////////////////////////////////////////////////////////////////////////////// +/// +/// SoundTouch DLL wrapper - wraps SoundTouch routines into a Dynamic Load +/// Library interface. +/// +/// Author : Copyright (c) Olli Parviainen +/// Author e-mail : oparviai 'at' iki.fi +/// SoundTouch WWW: http://www.surina.net/soundtouch +/// +//////////////////////////////////////////////////////////////////////////////// +// +// $Id: SoundTouchDLL.cpp 65 2009-02-23 08:33:13Z oparviai $ +// +//////////////////////////////////////////////////////////////////////////////// +// +// License : +// +// SoundTouch audio processing library +// Copyright (c) Olli Parviainen +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include "SoundTouchDLL.h" +#include "soundtouch.h" + +using namespace soundtouch; + +BOOL APIENTRY DllMain( HANDLE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + + +////////////// + +typedef struct +{ + DWORD dwMagic; + SoundTouch *pst; +} STHANDLE; + +#define STMAGIC 0x1770C001 + +SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance() +{ + STHANDLE *tmp = new STHANDLE; + + if (tmp) + { + tmp->dwMagic = STMAGIC; + tmp->pst = new SoundTouch(); + if (tmp->pst == NULL) + { + delete tmp; + tmp = NULL; + } + } + return (HANDLE)tmp; +} + + +SOUNDTOUCHDLL_API void __stdcall soundtouch_destroyInstance(HANDLE h) +{ + /* + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; +*/ + + /* + sth->dwMagic = 0; + delete sth->pst; + sth->pst = NULL; + delete sth; +*/ +} + + +/// Get SoundTouch library version string +SOUNDTOUCHDLL_API const char *__stdcall soundtouch_getVersionString() +{ + return SoundTouch::getVersionString(); +} + +/// Get SoundTouch library version Id +SOUNDTOUCHDLL_API uint __stdcall soundtouch_getVersionId() +{ + return SoundTouch::getVersionId(); +} + +/// Sets new rate control value. Normal rate = 1.0, smaller values +/// represent slower rate, larger faster rates. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setRate(HANDLE h, float newRate) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setRate(newRate); +} + + +/// Sets new tempo control value. Normal tempo = 1.0, smaller values +/// represent slower tempo, larger faster tempo. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempo(HANDLE h, float newTempo) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setTempo(newTempo); +} + +/// Sets new rate control value as a difference in percents compared +/// to the original rate (-50 .. +100 %) +SOUNDTOUCHDLL_API void __stdcall soundtouch_setRateChange(HANDLE h, float newRate) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setRateChange(newRate); +} + +/// Sets new tempo control value as a difference in percents compared +/// to the original tempo (-50 .. +100 %) +SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange(HANDLE h, float newTempo) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setTempoChange(newTempo); +} + +/// Sets new pitch control value. Original pitch = 1.0, smaller values +/// represent lower pitches, larger values higher pitch. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitch(HANDLE h, float newPitch) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setPitch(newPitch); +} + +/// Sets pitch change in octaves compared to the original pitch +/// (-1.00 .. +1.00) +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitchOctaves(HANDLE h, float newPitch) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setPitchOctaves(newPitch); +} + +/// Sets pitch change in semi-tones compared to the original pitch +/// (-12 .. +12) +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitchSemiTones(HANDLE h, float newPitch) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setPitchSemiTones(newPitch); +} + + +/// Sets the number of channels, 1 = mono, 2 = stereo +SOUNDTOUCHDLL_API void __stdcall soundtouch_setChannels(HANDLE h, uint numChannels) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setChannels(numChannels); +} + +/// Sets sample rate. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setSampleRate(HANDLE h, uint srate) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->setSampleRate(srate); +} + +/// Flushes the last samples from the processing pipeline to the output. +/// Clears also the internal processing buffers. +// +/// Note: This function is meant for extracting the last samples of a sound +/// stream. This function may introduce additional blank samples in the end +/// of the sound stream, and thus it's not recommended to call this function +/// in the middle of a sound stream. +SOUNDTOUCHDLL_API void __stdcall soundtouch_flush(HANDLE h) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->flush(); +} + +/// Adds 'numSamples' pcs of samples from the 'samples' memory position into +/// the input of the object. Notice that sample rate _has_to_ be set before +/// calling this function, otherwise throws a runtime_error exception. +SOUNDTOUCHDLL_API void __stdcall soundtouch_putSamples(HANDLE h, + const SAMPLETYPE *samples, ///< Pointer to sample buffer. + uint numSamples ///< Number of samples in buffer. Notice + ///< that in case of stereo-sound a single sample + ///< contains data for both channels. + ) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->putSamples(samples, numSamples); +} + +/// Clears all the samples in the object's output and internal processing +/// buffers. +SOUNDTOUCHDLL_API void __stdcall soundtouch_clear(HANDLE h) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return; + + sth->pst->clear(); +} + +/// Changes a setting controlling the processing system behaviour. See the +/// 'SETTING_...' defines for available setting ID's. +/// +/// \return 'TRUE' if the setting was succesfully changed +SOUNDTOUCHDLL_API BOOL __stdcall soundtouch_setSetting(HANDLE h, + int settingId, ///< Setting ID number. see SETTING_... defines. + int value ///< New setting value. + ) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return FALSE; + + return sth->pst->setSetting(settingId, value); +} + +/// Reads a setting controlling the processing system behaviour. See the +/// 'SETTING_...' defines for available setting ID's. +/// +/// \return the setting value. +SOUNDTOUCHDLL_API int __stdcall soundtouch_getSetting(HANDLE h, + int settingId ///< Setting ID number, see SETTING_... defines. + ) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return -1; + + return sth->pst->getSetting(settingId); +} + + +/// Returns number of samples currently unprocessed. +SOUNDTOUCHDLL_API uint __stdcall soundtouch_numUnprocessedSamples(HANDLE h) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return 0; + + return sth->pst->numUnprocessedSamples(); +} + + +/// 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. +SOUNDTOUCHDLL_API uint __stdcall soundtouch_receiveSamples(HANDLE h, + SAMPLETYPE *outBuffer, ///< Buffer where to copy output samples. + uint maxSamples ///< How many samples to receive at max. + ) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return 0; + + if (outBuffer) + { + return sth->pst->receiveSamples(outBuffer, maxSamples); + } + else + { + return sth->pst->receiveSamples(maxSamples); + } +} + +/// Returns number of samples currently available. +SOUNDTOUCHDLL_API uint __stdcall soundtouch_numSamples(HANDLE h) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return 0; + + return sth->pst->numSamples(); +} + + +/// Returns nonzero if there aren't any samples available for outputting. +SOUNDTOUCHDLL_API int __stdcall soundtouch_isEmpty(HANDLE h) +{ + STHANDLE *sth = (STHANDLE*)h; + if (sth->dwMagic != STMAGIC) return -1; + + return sth->pst->isEmpty(); +} diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.h b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.h new file mode 100644 index 0000000..696b6b6 --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.h @@ -0,0 +1,164 @@ +////////////////////////////////////////////////////////////////////////////// +/// +/// SoundTouch DLL wrapper - wraps SoundTouch routines into a Dynamic Load +/// Library interface. +/// +/// Author : Copyright (c) Olli Parviainen +/// Author e-mail : oparviai 'at' iki.fi +/// SoundTouch WWW: http://www.surina.net/soundtouch +/// +//////////////////////////////////////////////////////////////////////////////// +// +// $Id: SoundTouchDLL.h 65 2009-02-23 08:33:13Z oparviai $ +// +//////////////////////////////////////////////////////////////////////////////// +// +// License : +// +// SoundTouch audio processing library +// Copyright (c) Olli Parviainen +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef _SoundTouchDLL_h_ +#define _SoundTouchDLL_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef DLL_EXPORTS + #define SOUNDTOUCHDLL_API __declspec(dllexport) +#else + #define SOUNDTOUCHDLL_API __declspec(dllimport) +#endif + +typedef void * HANDLE; + +/// Create a new instance of SoundTouch processor. +SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance(); + +/// Destroys a SoundTouch processor instance. +SOUNDTOUCHDLL_API void __stdcall soundtouch_destroyInstance(HANDLE h); + +/// Get SoundTouch library version string +SOUNDTOUCHDLL_API const char *__stdcall soundtouch_getVersionString(); + +/// Get SoundTouch library version Id +SOUNDTOUCHDLL_API unsigned int __stdcall soundtouch_getVersionId(); + +/// Sets new rate control value. Normal rate = 1.0, smaller values +/// represent slower rate, larger faster rates. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setRate(HANDLE h, float newRate); + +/// Sets new tempo control value. Normal tempo = 1.0, smaller values +/// represent slower tempo, larger faster tempo. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempo(HANDLE h, float newTempo); + +/// Sets new rate control value as a difference in percents compared +/// to the original rate (-50 .. +100 %); +SOUNDTOUCHDLL_API void __stdcall soundtouch_setRateChange(HANDLE h, float newRate); + +/// Sets new tempo control value as a difference in percents compared +/// to the original tempo (-50 .. +100 %); +SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange(HANDLE h, float newTempo); + +/// Sets new pitch control value. Original pitch = 1.0, smaller values +/// represent lower pitches, larger values higher pitch. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitch(HANDLE h, float newPitch); + +/// Sets pitch change in octaves compared to the original pitch +/// (-1.00 .. +1.00); +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitchOctaves(HANDLE h, float newPitch); + +/// Sets pitch change in semi-tones compared to the original pitch +/// (-12 .. +12); +SOUNDTOUCHDLL_API void __stdcall soundtouch_setPitchSemiTones(HANDLE h, float newPitch); + + +/// Sets the number of channels, 1 = mono, 2 = stereo +SOUNDTOUCHDLL_API void __stdcall soundtouch_setChannels(HANDLE h, unsigned int numChannels); + +/// Sets sample rate. +SOUNDTOUCHDLL_API void __stdcall soundtouch_setSampleRate(HANDLE h, unsigned int srate); + +/// Flushes the last samples from the processing pipeline to the output. +/// Clears also the internal processing buffers. +// +/// Note: This function is meant for extracting the last samples of a sound +/// stream. This function may introduce additional blank samples in the end +/// of the sound stream, and thus it's not recommended to call this function +/// in the middle of a sound stream. +SOUNDTOUCHDLL_API void __stdcall soundtouch_flush(HANDLE h); + +/// Adds 'numSamples' pcs of samples from the 'samples' memory position into +/// the input of the object. Notice that sample rate _has_to_ be set before +/// calling this function, otherwise throws a runtime_error exception. +SOUNDTOUCHDLL_API void __stdcall soundtouch_putSamples(HANDLE h, + const float *samples, ///< Pointer to sample buffer. + unsigned int numSamples ///< Number of samples in buffer. Notice + ///< that in case of stereo-sound a single sample + ///< contains data for both channels. + ); + +/// Clears all the samples in the object's output and internal processing +/// buffers. +SOUNDTOUCHDLL_API void __stdcall soundtouch_clear(HANDLE h); + +/// Changes a setting controlling the processing system behaviour. See the +/// 'SETTING_...' defines for available setting ID's. +/// +/// \return 'TRUE' if the setting was succesfully changed +SOUNDTOUCHDLL_API BOOL __stdcall soundtouch_setSetting(HANDLE h, + int settingId, ///< Setting ID number. see SETTING_... defines. + int value ///< New setting value. + ); + +/// Reads a setting controlling the processing system behaviour. See the +/// 'SETTING_...' defines for available setting ID's. +/// +/// \return the setting value. +SOUNDTOUCHDLL_API int __stdcall soundtouch_getSetting(HANDLE h, + int settingId ///< Setting ID number, see SETTING_... defines. + ); + + +/// Returns number of samples currently unprocessed. +SOUNDTOUCHDLL_API unsigned int __stdcall 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. +/// +/// Used to reduce the number of samples in the buffer when accessing the sample buffer directly +/// with 'ptrBegin' function. +SOUNDTOUCHDLL_API unsigned int __stdcall soundtouch_receiveSamples(HANDLE h, + float *outBuffer, ///< Buffer where to copy output samples. + unsigned int maxSamples ///< How many samples to receive at max. + ); + +/// Returns number of samples currently available. +SOUNDTOUCHDLL_API unsigned int __stdcall soundtouch_numSamples(HANDLE h); + +/// Returns nonzero if there aren't any samples available for outputting. +SOUNDTOUCHDLL_API int __stdcall soundtouch_isEmpty(HANDLE h); + +#ifdef __cplusplus +} +#endif + +#endif // _SoundTouchDLL_h_ + diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.pas b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.pas new file mode 100644 index 0000000..f6a4911 --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.pas @@ -0,0 +1,469 @@ +unit SoundTouchDLL; + +////////////////////////////////////////////////////////////////////////////// +// +// SoundTouch.dll wrapper for accessing SoundTouch routines from Delphi/Pascal +// +// Module Author : Christian Budde +// +//////////////////////////////////////////////////////////////////////////////// +// +// $Id: SoundTouchDLL.pas 66 2009-02-24 14:32:44Z oparviai $ +// +//////////////////////////////////////////////////////////////////////////////// +// +// License : +// +// SoundTouch audio processing library +// Copyright (c) Olli Parviainen +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +//////////////////////////////////////////////////////////////////////////////// + +interface + +uses + Windows; + +type + TSoundTouchHandle = THandle; + + // Create a new instance of SoundTouch processor. + TSoundTouchCreateInstance = function : TSoundTouchHandle; stdcall; + + // Destroys a SoundTouch processor instance. + TSoundTouchDestroyInstance = procedure (Handle: TSoundTouchHandle); stdcall; + + // Get SoundTouch library version string + TSoundTouchGetVersionString = function : PChar; stdcall; + + // Get SoundTouch library version Id + TSoundTouchGetVersionId = function : Cardinal; stdcall; + + // Sets new rate control value. Normal rate = 1.0, smaller values + // represent slower rate, larger faster rates. + TSoundTouchSetRate = procedure (Handle: TSoundTouchHandle; newRate: Single); stdcall; + + // Sets new tempo control value. Normal tempo = 1.0, smaller values + // represent slower tempo, larger faster tempo. + TSoundTouchSetTempo = procedure (Handle: TSoundTouchHandle; newTempo: Single); stdcall; + + // Sets new rate control value as a difference in percents compared + // to the original rate (-50 .. +100 %); + TSoundTouchSetRateChange = procedure (Handle: TSoundTouchHandle; newRate: Single); stdcall; + + // Sets new tempo control value as a difference in percents compared + // to the original tempo (-50 .. +100 %); + TSoundTouchSetTempoChange = procedure (Handle: TSoundTouchHandle; newTempo: Single); stdcall; + + // Sets new pitch control value. Original pitch = 1.0, smaller values + // represent lower pitches, larger values higher pitch. + TSoundTouchSetPitch = procedure (Handle: TSoundTouchHandle; newPitch: Single); stdcall; + + // Sets pitch change in octaves compared to the original pitch + // (-1.00 .. +1.00); + TSoundTouchSetPitchOctaves = procedure (Handle: TSoundTouchHandle; newPitch: Single); stdcall; + + // Sets pitch change in semi-tones compared to the original pitch + // (-12 .. +12); + TSoundTouchSetPitchSemiTones = procedure (Handle: TSoundTouchHandle; newPitch: Single); stdcall; + + + // Sets the number of channels, 1 = mono, 2 = stereo + TSoundTouchSetChannels = procedure (Handle: TSoundTouchHandle; numChannels: Cardinal); stdcall; + + // Sets sample rate. + TSoundTouchSetSampleRate = procedure (Handle: TSoundTouchHandle; SampleRate: Cardinal); stdcall; + + // Flushes the last samples from the processing pipeline to the output. + // Clears also the internal processing buffers. + // + // Note: This function is meant for extracting the last samples of a sound + // stream. This function may introduce additional blank samples in the end + // of the sound stream, and thus it + // in the middle of a sound stream. + TSoundTouchFlush = procedure (Handle: TSoundTouchHandle); stdcall; + + // Adds 'numSamples' pcs of samples from the 'samples' memory position into + // the input of the object. Notice that sample rate _has_to_ be set before + // calling this function, otherwise throws a runtime_error exception. + TSoundTouchPutSamples = procedure (Handle: TSoundTouchHandle; + const Samples: PSingle; //< 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. + ); stdcall; + + // Clears all the samples in the object's output and internal processing + // buffers. + TSoundTouchClear = procedure (Handle: TSoundTouchHandle); stdcall; + + // Changes a setting controlling the processing system behaviour. See the + // 'SETTING_...' defines for available setting ID's. + // + // \return 'TRUE' if the setting was succesfully changed + TSoundTouchSetSetting = function (Handle: TSoundTouchHandle; + SettingId: Integer; //< Setting ID number. see SETTING_... defines. + Value: Integer //< New setting value. + ): Boolean; stdcall; + + // Reads a setting controlling the processing system behaviour. See the + // 'SETTING_...' defines for available setting ID's. + // + // \return the setting value. + TSoundTouchGetSetting = function (Handle: TSoundTouchHandle; + settingId: Integer //< Setting ID number, see SETTING_... defines. + ): Integer; stdcall; + + + // Returns number of samples currently unprocessed. + TSoundTouchNumUnprocessedSamples = function (Handle: TSoundTouchHandle): Cardinal; stdcall; + + // 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. + TSoundTouchReceiveSamples = function (Handle: TSoundTouchHandle; + outBuffer: PSingle; //< Buffer where to copy output samples. + maxSamples: Integer //< How many samples to receive at max. + ): Cardinal; stdcall; + + // Returns number of samples currently available. + TSoundTouchNumSamples = function (Handle: TSoundTouchHandle): Cardinal; stdcall; + + // Returns nonzero if there aren't any samples available for outputting. + TSoundTouchIsEmpty = function (Handle: TSoundTouchHandle): Integer; stdcall; + +var + SoundTouchCreateInstance : TSoundTouchCreateInstance; + SoundTouchDestroyInstance : TSoundTouchDestroyInstance; + SoundTouchGetVersionString : TSoundTouchGetVersionString; + SoundTouchGetVersionId : TSoundTouchGetVersionId; + SoundTouchSetRate : TSoundTouchSetRate; + SoundTouchSetTempo : TSoundTouchSetTempo; + SoundTouchSetRateChange : TSoundTouchSetRateChange; + SoundTouchSetTempoChange : TSoundTouchSetTempoChange; + SoundTouchSetPitch : TSoundTouchSetPitch; + SoundTouchSetPitchOctaves : TSoundTouchSetPitchOctaves; + SoundTouchSetPitchSemiTones : TSoundTouchSetPitchSemiTones; + SoundTouchSetChannels : TSoundTouchSetChannels; + SoundTouchSetSampleRate : TSoundTouchSetSampleRate; + SoundTouchFlush : TSoundTouchFlush; + SoundTouchPutSamples : TSoundTouchPutSamples; + SoundTouchClear : TSoundTouchClear; + SoundTouchSetSetting : TSoundTouchSetSetting; + SoundTouchGetSetting : TSoundTouchGetSetting; + SoundTouchNumUnprocessedSamples : TSoundTouchNumUnprocessedSamples; + SoundTouchReceiveSamples : TSoundTouchReceiveSamples; + SoundTouchNumSamples : TSoundTouchNumSamples; + SoundTouchIsEmpty : TSoundTouchIsEmpty; + +type + TSoundTouch = class + private + FHandle : TSoundTouchHandle; + FRate : Single; + FPitch : Single; + FTempo : Single; + FSampleRate : Single; + FChannels : Cardinal; + function GetNumSamples: Cardinal; + function GetNumUnprocessedSamples: Cardinal; + function GetIsEmpty: Integer; + function GetPitchChange: Single; + function GetRateChange: Single; + function GetTempoChange: Single; + procedure SetRate(const Value: Single); + procedure SetPitch(const Value: Single); + procedure SetTempo(const Value: Single); + procedure SetPitchChange(const Value: Single); + procedure SetRateChange(const Value: Single); + procedure SetTempoChange(const Value: Single); + procedure SetChannels(const Value: Cardinal); + procedure SetSampleRate(const Value: Single); + protected + procedure SamplerateChanged; virtual; + procedure ChannelsChanged; virtual; + procedure PitchChanged; virtual; + procedure TempoChanged; virtual; + procedure RateChanged; virtual; + public + class function GetVersionString: string; + class function GetVersionId: Cardinal; + constructor Create; virtual; + destructor Destroy; override; + procedure Flush; virtual; + procedure Clear; virtual; + + procedure PutSamples(const Samples: PSingle; const NumSamples: Cardinal); + function ReceiveSamples(const outBuffer: PSingle; const maxSamples: Integer): Cardinal; + + function SetSetting(const SettingId: Integer; const Value: Integer): Boolean; + function GetSetting(const settingId: Integer): Integer; + + property VersionString: string read GetVersionString; + property VersionID: Cardinal read GetVersionId; + property Channels: Cardinal read FChannels write SetChannels; + property Rate: Single read FRate write SetRate; + property RateChange: Single read GetRateChange write SetRateChange; + property Tempo: Single read FTempo write SetTempo; + property TempoChange: Single read GetTempoChange write SetTempoChange; + property Pitch: Single read FPitch write SetPitch; + property PitchChange: Single read GetPitchChange write SetPitchChange; + property SampleRate: Single read FSampleRate write SetSampleRate; + + property NumSamples: Cardinal read GetNumSamples; + property NumUnprocessedSamples: Cardinal read GetNumUnprocessedSamples; + property IsEmpty: Integer read GetIsEmpty; + end; + +implementation + +uses + SysUtils; + +{ TSoundTouch } + +constructor TSoundTouch.Create; +begin + inherited; + FHandle := SoundTouchCreateInstance; + FRate := 1; + FTempo := 1; + FPitch := 1; + FChannels := 1; + FSampleRate := 44100; + SamplerateChanged; + ChannelsChanged; +end; + +destructor TSoundTouch.Destroy; +begin + SoundTouchDestroyInstance(FHandle); + inherited; +end; + +procedure TSoundTouch.Flush; +begin + SoundTouchFlush(FHandle); +end; + +procedure TSoundTouch.Clear; +begin + SoundTouchClear(FHandle); +end; + +function TSoundTouch.GetIsEmpty: Integer; +begin + result := SoundTouchIsEmpty(FHandle); +end; + +function TSoundTouch.GetNumSamples: Cardinal; +begin + result := SoundTouchNumSamples(FHandle); +end; + +function TSoundTouch.GetNumUnprocessedSamples: Cardinal; +begin + result := SoundTouchNumUnprocessedSamples(FHandle); +end; + +function TSoundTouch.GetPitchChange: Single; +begin + result := 100 * (FPitch - 1.0); +end; + +function TSoundTouch.GetRateChange: Single; +begin + result := 100 * (FRate - 1.0); +end; + +function TSoundTouch.GetTempoChange: Single; +begin + result := 100 * (FTempo - 1.0); +end; + +class function TSoundTouch.GetVersionId: Cardinal; +begin + result := SoundTouchGetVersionId; +end; + +class function TSoundTouch.GetVersionString: string; +begin + result := StrPas(SoundTouchGetVersionString); +end; + +procedure TSoundTouch.SetChannels(const Value: Cardinal); +begin + if FChannels <> Value then + begin + FChannels := Value; + ChannelsChanged; + end; +end; + +procedure TSoundTouch.ChannelsChanged; +begin + assert(FChannels in [1, 2]); + SoundTouchSetChannels(FHandle, FChannels); +end; + +procedure TSoundTouch.SetPitch(const Value: Single); +begin + if FPitch <> Value then + begin + FPitch := Value; + PitchChanged; + end; +end; + +procedure TSoundTouch.PitchChanged; +begin + SoundTouchSetPitch(FHandle, FPitch); +end; + +procedure TSoundTouch.putSamples(const Samples: PSingle; + const NumSamples: Cardinal); +begin + SoundTouchPutSamples(FHandle, Samples, NumSamples); +end; + +procedure TSoundTouch.RateChanged; +begin + SoundTouchSetRate(FHandle, FRate); +end; + +function TSoundTouch.ReceiveSamples(const outBuffer: PSingle; + const maxSamples: Integer): Cardinal; +begin + result := SoundTouchReceiveSamples(FHandle, outBuffer, maxSamples); +end; + +procedure TSoundTouch.SetPitchChange(const Value: Single); +begin + Pitch := 1.0 + 0.01 * Value; +end; + +procedure TSoundTouch.SetRate(const Value: Single); +begin + if FRate <> Value then + begin + FRate := Value; + RateChanged; + end; +end; + +procedure TSoundTouch.SetRateChange(const Value: Single); +begin + Rate := 1.0 + 0.01 * Value; +end; + +procedure TSoundTouch.SetSampleRate(const Value: Single); +begin + if FSampleRate <> Value then + begin + FSampleRate := Value; + SamplerateChanged; + end; +end; + +procedure TSoundTouch.SamplerateChanged; +begin + assert(FSampleRate > 0); + SoundTouchsetSampleRate(FHandle, round(FSampleRate)); +end; + +procedure TSoundTouch.SetTempo(const Value: Single); +begin + if FTempo <> Value then + begin + FTempo := Value; + TempoChanged; + end; +end; + +procedure TSoundTouch.SetTempoChange(const Value: Single); +begin + Tempo := 1.0 + 0.01 * Value; +end; + +function TSoundTouch.GetSetting(const SettingId: Integer): Integer; +begin + result := SoundTouchGetSetting(FHandle, SettingId); +end; + +function TSoundTouch.SetSetting(const SettingId: Integer; + const Value: Integer): Boolean; +begin + result := SoundTouchSetSetting(FHandle, SettingId, Value); +end; + +procedure TSoundTouch.TempoChanged; +begin + SoundTouchsetTempo(FHandle, FTempo); +end; + +var + SoundTouchLibHandle: HINST; + SoundTouchDLL: PAnsiChar = 'SoundTouch.DLL'; + +procedure InitDLL; +begin + SoundTouchLibHandle := LoadLibrary(SoundTouchDLL); + if SoundTouchLibHandle <> 0 then + try + SoundTouchCreateInstance := GetProcAddress(SoundTouchLibHandle, PAnsiChar( 2)); //'soundtouch_createInstance'); + SoundTouchDestroyInstance := GetProcAddress(SoundTouchLibHandle, PAnsiChar( 3)); //'soundtouch_destroyInstance'); + SoundTouchGetVersionString := GetProcAddress(SoundTouchLibHandle, PAnsiChar( 7)); //'soundtouch_getVersionString'); + SoundTouchGetVersionId := GetProcAddress(SoundTouchLibHandle, PAnsiChar( 6)); //'soundtouch_getVersionId'); + SoundTouchSetRate := GetProcAddress(SoundTouchLibHandle, PAnsiChar(17)); //'soundtouch_setRate'); + SoundTouchSetTempo := GetProcAddress(SoundTouchLibHandle, PAnsiChar(21)); //'soundtouch_setTempo'); + SoundTouchSetRateChange := GetProcAddress(SoundTouchLibHandle, PAnsiChar(18)); //'soundtouch_setRateChange'); + SoundTouchSetTempoChange := GetProcAddress(SoundTouchLibHandle, PAnsiChar(22)); //'soundtouch_setTempoChange'); + SoundTouchSetPitch := GetProcAddress(SoundTouchLibHandle, PAnsiChar(14)); //'soundtouch_setPitch'); + SoundTouchSetPitchOctaves := GetProcAddress(SoundTouchLibHandle, PAnsiChar(15)); //'soundtouch_setPitchOctaves'); + SoundTouchSetPitchSemiTones := GetProcAddress(SoundTouchLibHandle, PAnsiChar(16)); //'soundtouch_setPitchSemiTones'); + SoundTouchSetChannels := GetProcAddress(SoundTouchLibHandle, PAnsiChar(13)); //'soundtouch_setChannels'); + SoundTouchSetSampleRate := GetProcAddress(SoundTouchLibHandle, PAnsiChar(19)); //'soundtouch_setSampleRate'); + SoundTouchFlush := GetProcAddress(SoundTouchLibHandle, PAnsiChar(4)); //'soundtouch_flush'); + SoundTouchPutSamples := GetProcAddress(SoundTouchLibHandle, PAnsiChar(11)); //'soundtouch_putSamples'); + SoundTouchClear := GetProcAddress(SoundTouchLibHandle, PAnsiChar(1)); //'soundtouch_clear'); + SoundTouchSetSetting := GetProcAddress(SoundTouchLibHandle, PAnsiChar(20)); //'soundtouch_SetSetting'); + SoundTouchGetSetting := GetProcAddress(SoundTouchLibHandle, PAnsiChar(5)); //'soundtouch_setSetting'); + SoundTouchNumUnprocessedSamples := GetProcAddress(SoundTouchLibHandle, PAnsiChar(10)); //'soundtouch_numUnprocessedSamples'); + SoundTouchReceiveSamples := GetProcAddress(SoundTouchLibHandle, PAnsiChar(12)); //'soundtouch_receiveSamples'); + SoundTouchNumSamples := GetProcAddress(SoundTouchLibHandle, PAnsiChar(9)); //'soundtouch_numSamples'); + SoundTouchIsEmpty := GetProcAddress(SoundTouchLibHandle, PAnsiChar(8)); //'soundtouch_isEmpty'); + + except + FreeLibrary(SoundTouchLibHandle); + SoundTouchLibHandle := 0; + end; +end; + +procedure FreeDLL; +begin + if SoundTouchLibHandle <> 0 then FreeLibrary(SoundTouchLibHandle); +end; + +initialization + InitDLL; + +finalization + FreeDLL; + +end. diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.rc b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.rc new file mode 100644 index 0000000..dca9a7c --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.rc @@ -0,0 +1,113 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Finnish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN) +#ifdef _WIN32 +LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,5,0,0 + PRODUCTVERSION 1,5,0,0 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "FileDescription", "SoundTouch Dynamic Link Library" + VALUE "FileVersion", "1, 5, 0, 0" + VALUE "InternalName", "SoundTouch" + VALUE "LegalCopyright", "Copyright (C) Olli Parviainen 1999-2009" + VALUE "OriginalFilename", "SoundTouch.dll" + VALUE "ProductName", " SoundTouch Dynamic Link Library" + VALUE "ProductVersion", "1, 5, 0, 0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // Finnish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.sln b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.sln new file mode 100644 index 0000000..61b1acf --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.sln @@ -0,0 +1,32 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouchDLL", "SoundTouchDLL.vcproj", "{164DE61D-6391-4265-8273-30740117D356}" + ProjectSection(ProjectDependencies) = postProject + {68A5DD20-7057-448B-8FE0-B6AC8D205509} = {68A5DD20-7057-448B-8FE0-B6AC8D205509} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\SoundTouch\SoundTouch.vcproj", "{68A5DD20-7057-448B-8FE0-B6AC8D205509}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {164DE61D-6391-4265-8273-30740117D356}.Debug.ActiveCfg = Debug|Win32 + {164DE61D-6391-4265-8273-30740117D356}.Debug.Build.0 = Debug|Win32 + {164DE61D-6391-4265-8273-30740117D356}.Release.ActiveCfg = Release|Win32 + {164DE61D-6391-4265-8273-30740117D356}.Release.Build.0 = Release|Win32 + {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug.ActiveCfg = Debug|Win32 + {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Debug.Build.0 = Debug|Win32 + {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release.ActiveCfg = Release|Win32 + {68A5DD20-7057-448B-8FE0-B6AC8D205509}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.vcproj b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.vcproj new file mode 100644 index 0000000..485f7db --- /dev/null +++ b/pysoundtouch/soundtouch/source/SoundTouchDLL/SoundTouchDLL.vcproj @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-70-g09d2