{"id":19177521,"url":"https://github.com/tencent-rtc/soundtouch","last_synced_at":"2025-04-09T21:50:52.984Z","repository":{"id":105024677,"uuid":"482857676","full_name":"Tencent-RTC/soundtouch","owner":"Tencent-RTC","description":null,"archived":false,"fork":false,"pushed_at":"2023-05-29T11:13:56.000Z","size":542,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-09T21:50:52.373Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tencent-RTC.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":"COPYING.TXT","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-18T13:30:55.000Z","updated_at":"2024-04-28T01:37:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"beb20888-ac59-42cc-bb46-336dfb1814d0","html_url":"https://github.com/Tencent-RTC/soundtouch","commit_stats":null,"previous_names":["tencent-rtc/soundtouch"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent-RTC%2Fsoundtouch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent-RTC%2Fsoundtouch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent-RTC%2Fsoundtouch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent-RTC%2Fsoundtouch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tencent-RTC","download_url":"https://codeload.github.com/Tencent-RTC/soundtouch/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248119403,"owners_count":21050754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T10:33:50.844Z","updated_at":"2025-04-09T21:50:52.962Z","avatar_url":"https://github.com/Tencent-RTC.png","language":"C++","readme":"\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\u003e\n\u003chtml\u003e\n\n\u003chead\u003e\n  \u003ctitle\u003eSoundTouch library README\u003c/title\u003e\n  \u003cmeta http-equiv=\"Content-Language\" content=\"en-us\"\u003e\n  \u003cmeta name=\"author\" content=\"Olli Parviainen\"\u003e\n  \u003cmeta name=\"description\" content=\"Readme file for SoundTouch audio processing library\"\u003e\n  \u003cstyle\u003e\n    body {\n      font-family: Arial, Helvetica;\n    }\n  \u003c/style\u003e\n\u003c/head\u003e\n\n\u003cbody class=\"normal\"\u003e\n  \u003chr\u003e\n  \u003ch1\u003eSoundTouch audio processing library v2.2\u003c/h1\u003e\n  \u003cp class=\"normal\"\u003eSoundTouch library Copyright \u0026copy; Olli Parviainen 2001-2020\u003c/p\u003e\n  \u003chr\u003e\n  \u003ch2\u003e1. Introduction \u003c/h2\u003e\n  \u003cp\u003eSoundTouch is an open-source audio processing library that allows\n    changing the sound tempo, pitch and playback rate parameters\n    independently from each other, i.e.:\u003c/p\u003e\n  \u003cul\u003e\n    \u003cli\u003e Sound tempo can be increased or decreased while maintaining the\n      original pitch\u003c/li\u003e\n    \u003cli\u003e Sound pitch can be increased or decreased while maintaining the\n      original tempo\u003c/li\u003e\n    \u003cli\u003e Change playback rate that affects both tempo and pitch at the\n      same time\u003c/li\u003e\n    \u003cli\u003e Choose any combination of tempo/pitch/rate\u003c/li\u003e\n  \u003c/ul\u003e\n  \u003ch3\u003e1.1 Contact information \u003c/h3\u003e\n  \u003cp\u003eAuthor email: oparviai 'at' iki.fi \u003c/p\u003e\n  \u003cp\u003eSoundTouch WWW page: \u003ca href=\"http://soundtouch.surina.net\"\u003ehttp://soundtouch.surina.net\u003c/a\u003e\u003c/p\u003e\n  \u003cp\u003eSoundTouch git repository: \u003ca\n      href=\"https://gitlab.com/soundtouch/soundtouch.git\"\u003ehttps://gitlab.com/soundtouch/soundtouch.git\u003c/a\u003e\u003c/p\u003e\n  \u003chr\u003e\n  \u003ch2\u003e2. Compiling SoundTouch\u003c/h2\u003e\n  \u003cp\u003eBefore compiling, notice that you can choose the sample data format if it's\n    desirable to use floating point sample data instead of 16bit integers. See\n    section \u0026quot;sample data format\u0026quot; for more information.\u003c/p\u003e\n  \u003cp\u003eAlso notice that SoundTouch can use OpenMP instructions for parallel\n    computation to accelerate the runtime processing speed in multi-core systems,\n    however, these improvements need to be separately enabled before compiling. See\n    OpenMP notes in Chapter 3 below.\u003c/p\u003e\n  \u003ch3\u003e2.1. Building in Microsoft Windows\u003c/h3\u003e\n  \u003cp\u003eProject files for Microsoft Visual C++ are supplied with the source\n    code package. Go to Microsoft WWW page to download\n    \u003ca href=\"http://www.visualstudio.com/en-US/products/visual-studio-express-vs\"\u003e\n      Microsoft Visual Studio Express version for free\u003c/a\u003e.\n  \u003c/p\u003e\n  \u003cp\u003eTo build the binaries with Visual C++ compiler, either run\n    \"make-win.bat\" script, or open the appropriate project files in source\n    code directories with Visual Studio. The final executable will appear\n    under the \"SoundTouch\\bin\" directory. If using the Visual Studio IDE\n    instead of the make-win.bat script, directories bin and lib may need to\n    be created manually to the SoundTouch package root for the final\n    executables. The make-win.bat script creates these directories\n    automatically. \u003c/p\u003e\n  \u003cp\u003e\u003cstrong\u003eC# example\u003c/strong\u003e: The source code package includes also a C# example\n    application for Windows that shows how to invoke SoundTouch.dll\n    dynamic-load library for processing mp3 audio.\n  \u003cp\u003e\u003cstrong\u003eOpenMP NOTE\u003c/strong\u003e: If activating the OpenMP parallel computing in\n    the compilation, the target program will require additional vcomp dll library to\n    properly run. In Visual C++ 9.0 these libraries can be found in the following\n    folders.\u003c/p\u003e\n  \u003cul\u003e\n    \u003cli\u003ex86 32bit: C:\\Program Files (x86)\\Microsoft Visual Studio\n      9.0\\VC\\redist\\x86\\Microsoft.VC90.OPENMP\\vcomp90.dll\u003c/li\u003e\n    \u003cli\u003ex64 64bit: C:\\Program Files (x86)\\Microsoft Visual Studio\n      9.0\\VC\\redist\\amd64\\Microsoft.VC90.OPENMP\\vcomp90.dll\u003c/li\u003e\n  \u003c/ul\u003e\n  \u003cp\u003eIn Visual Studio 2008, a SP1 version may be required for these libraries. In\n    other VC++ versions the required library will be expectedly found in similar\n    \u0026quot;redist\u0026quot; location.\u003c/p\u003e\n  \u003cp\u003eNotice that as minor demonstration of a \u0026quot;dll hell\u0026quot; phenomenon both the 32-bit\n    and 64-bit version of vcomp90.dll have the same filename but different contents,\n    thus choose the proper version to allow the program start.\u003c/p\u003e\n  \u003ch3\u003e2.2. Building in Gnu platforms\u003c/h3\u003e\n  \u003cp\u003eThe SoundTouch library compiles in practically any platform\n    supporting GNU compiler (GCC) tools. SoundTouch requires GCC version 4.3 or later.\u003c/p\u003e\n  \u003cp\u003eTo build and install the binaries, run the following commands in\n    /soundtouch directory:\u003c/p\u003e\n  \u003ctable border=\"0\" cellpadding=\"0\" cellspacing=\"4\"\u003e\n    \u003ctbody\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"vertical-align: top;\"\u003e\n          \u003cpre\u003e./bootstrap  -\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd style=\"vertical-align: top;\"\u003eCreates \"configure\" file with\n          local autoconf/automake toolset.\u003cbr\u003e\n        \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr valign=\"top\"\u003e\n        \u003ctd\u003e\n          \u003cpre\u003e./configure  -\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n          \u003cp\u003eConfigures the SoundTouch package for the local environment.\n            Notice that \"configure\" file is not available before running the\n            \"./bootstrap\" command as above.\u003cbr\u003e\n          \u003c/p\u003e\n        \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr valign=\"top\"\u003e\n        \u003ctd\u003e\n          \u003cpre\u003emake         -\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n          \u003cp\u003eBuilds the SoundTouch library \u0026amp; SoundStretch utility. You can\n            optionally add \u0026quot;-j\u0026quot; switch after \u0026quot;make\u0026quot; to speed up the compilation in\n            multi-core systems.\u003c/p\u003e\n        \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr valign=\"top\"\u003e\n        \u003ctd\u003e\n          \u003cpre\u003emake install -\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n          \u003cp\u003eInstalls the SoundTouch \u0026amp; BPM libraries to \u003cb\u003e/usr/local/lib\u003c/b\u003e\n            and SoundStretch utility to \u003cb\u003e/usr/local/bin\u003c/b\u003e. Please notice that\n            'root' privileges may be required to install the binaries to the\n            destination locations.\u003c/p\u003e\n        \u003c/td\u003e\n      \u003c/tr\u003e\n    \u003c/tbody\u003e\n  \u003c/table\u003e\n  \u003ch4\u003e\u003cb\u003e2.2.1 Required GNU tools\u003c/b\u003e\u003c/h4\u003e\n  \u003cp\u003e \u003cspan style=\"font-weight: bold;\"\u003eBash shell\u003c/span\u003e, \u003cspan style=\"font-weight: bold;\"\u003eGNU C++ compiler\u003c/span\u003e,\n    \u003cspan style=\"font-weight: bold;\"\u003elibtool\u003c/span\u003e, \u003cspan style=\"font-weight: bold;\"\u003eautoconf\u003c/span\u003e and \u003cspan\n      style=\"font-weight: bold;\"\u003eautomake\u003c/span\u003e tools\n    are required for compiling the SoundTouch library. These are usually\n    included with the GNU/Linux distribution, but if not, install these\n    packages first. For example, Ubuntu Linux can acquire and install\n    these with the following command:\u003c/p\u003e\n  \u003cpre\u003e\u003cb\u003esudo apt-get install automake autoconf libtool build-essential\u003c/b\u003e\u003c/pre\u003e\n  \u003ch4\u003e\u003cb\u003e2.2.2 Problems with GCC compiler compatibility\u003c/b\u003e\u003c/h4\u003e\n  \u003cp\u003eAt the release time the SoundTouch package has been tested to\n    compile in GNU/Linux platform. However, If you have problems getting the\n    SoundTouch library compiled, try disabling optimizations that are specific for\n    x86 processors by running \u003cb\u003e./configure\u003c/b\u003e script with switch\n  \u003cblockquote\u003e\n    \u003cpre\u003e--enable-x86-optimizations=no\u003c/pre\u003e\n  \u003c/blockquote\u003e\n\n  Alternatively, if you don't use GNU Configure system, edit file \"include/STTypes.h\"\n  directly and remove the following definition:\u003cblockquote\u003e\n    \u003cpre\u003e#define SOUNDTOUCH_ALLOW_X86_OPTIMIZATIONS 1\u003c/pre\u003e\n  \u003c/blockquote\u003e\n\n  \u003ch4\u003e\u003cb\u003e2.2.3 Compiling portable Shared Library / DLL version in GNU environment\u003c/b\u003e\u003c/h4\u003e\n  \u003cp\u003e The GNU compilation does not automatically create a shared-library version of\n    SoundTouch (.so or .dll) that features position-independent code and C-language\n    api that are more suitable for cross-language development than C++ libraries.\u003c/p\u003e\n  \u003cp\u003e Use script \"make-gnu-dll-sh\" to build a portable dynamic library version if such is desired.\u003c/p\u003e\n\n  \u003ch3\u003e2.3. Building in Android\u003c/h3\u003e\n  \u003cp\u003eAndroid compilation instructions are within the\n    source code package, see file \u0026quot;\u003cb\u003esource/Android-lib/README-SoundTouch-Android.html\u003c/b\u003e\u0026quot;\n    in the source code package. \u003c/p\u003e\n  \u003cp\u003eThe Android compilation automatically builds separate .so library binaries\n    for ARM, X86 and MIPS processor architectures. For optimal device support,\n    include all these .so library binaries into the Android .apk application\n    package, so the target Android device can automatically choose the proper\n    library binary version to use.\u003c/p\u003e\n  \u003cp\u003eThe \u003cstrong\u003esource/Android-lib\u003c/strong\u003e folder includes also an Android\n    example application that processes WAV audio files using SoundTouch library in\n    Android devices.\u003c/p\u003e\n\n  \u003ch3\u003e2.4. Building in Mac\u003c/h3\u003e\n  \u003cp\u003eInstall autoconf tool as instructed in \u003ca\n      href=\"http://macappstore.org/autoconf/\"\u003ehttp://macappstore.org/autoconf/\u003c/a\u003e.\u003c/p\u003e\n  \u003cp\u003eThen, build as described above in section \"Building in Gnu platforms\".\u003c/p\u003e\n\n  \u003chr\u003e\n  \u003ch2\u003e3. About implementation \u0026amp; Usage tips \u003ch3\u003e3.1. Supported sample data formats\u003c/h3\u003e\n    \u003cp\u003eThe sample data format can be chosen between 16bit signed integer\n      and 32bit floating point values.\u003c/p\u003e\n    \u003c/p\u003e The default sample type is 32bit floating point format,\n    which also provides better sound quality than integer format because\n    integer algorithms need to scale already intermediate calculation results to\n    avoid integer overflows. These early integer scalings can slightly degrade\n    output quality.\u003c/p\u003e\n    \u003cp\u003e In Windows environment, the sample data format is chosen in file\n      \"STTypes.h\" by choosing one of the following defines:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e \u003cspan style=\"font-weight: bold;\"\u003e#define\n          SOUNDTOUCH_INTEGER_SAMPLES\u003c/span\u003e for 16bit signed integer\u003c/li\u003e\n      \u003cli\u003e \u003cspan style=\"font-weight: bold;\"\u003e#define \u003c/span\u003e\u003cspan style=\"font-weight: bold;\"\u003eSOUNDTOUCH_\u003c/span\u003e\u003cspan\n          style=\"font-weight: bold;\"\u003eFLOAT_SAMPLES\u003c/span\u003e for 32bit floating\n        point\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e In GNU environment, the floating sample format is used by default,\n      but integer sample format can be chosen by giving the following switch\n      to the configure script: \u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003e./configure --enable-integer-samples\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003eThe sample data can have either single (mono) or double (stereo)\n      audio channel. Stereo data is interleaved so that every other data\n      value is for left channel and every second for right channel. Notice\n      that while it'd be possible in theory to process stereo sound as two\n      separate mono channels, this isn't recommended because processing the\n      channels separately would result in losing the phase coherency between\n      the channels, which consequently would ruin the stereo effect.\u003c/p\u003e\n    \u003cp\u003eSample rates between 8000-48000H are supported.\u003c/p\u003e\n    \u003ch3\u003e3.2. Processing latency\u003c/h3\u003e\n    \u003cp\u003eThe processing and latency constraints of the SoundTouch library are:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Input/output processing latency for the SoundTouch processor is\n        around 100 ms. This is when time-stretching is used. If the rate\n        transposing effect alone is used, the latency requirement is much\n        shorter, see section 'About algorithms'.\u003c/li\u003e\n      \u003cli\u003e Processing CD-quality sound (16bit stereo sound with 44100H\n        sample rate) in real-time or faster is possible starting from\n        processors equivalent to Intel Pentium 133Mh or better, if using the\n        \"quick\" processing algorithm. If not using the \"quick\" mode or if\n        floating point sample data are being used, several times more CPU power\n        is typically required.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003ch3\u003e3.3. About algorithms\u003c/h3\u003e\n    \u003cp\u003eSoundTouch provides three seemingly independent effects: tempo,\n      pitch and playback rate control. These three controls are implemented\n      as combination of two primary effects, \u003cem\u003esample rate transposing\u003c/em\u003e\n      and \u003cem\u003etime-stretching\u003c/em\u003e.\u003c/p\u003e\n    \u003cp\u003e\u003cem\u003eSample rate transposing\u003c/em\u003e affects both the audio stream\n      duration and pitch. It's implemented simply by converting the original\n      audio sample stream to the desired duration by interpolating from\n      the original audio samples. In SoundTouch, linear interpolation with\n      anti-alias filtering is used. Theoretically a higher-order\n      interpolation provide better result than 1st order linear\n      interpolation, but in audio application linear interpolation together\n      with anti-alias filtering performs subjectively about as well as\n      higher-order filtering would.\u003c/p\u003e\n    \u003cp\u003e\u003cem\u003eTime-stretching \u003c/em\u003emeans changing the audio stream duration\n      without affecting it's pitch. SoundTouch uses WSOLA-like\n      time-stretching routines that operate in the time domain. Compared to\n      sample rate transposing, time-stretching is a much heavier operation\n      and also requires a longer processing \"window\" of sound samples used by\n      the processing algorithm, thus increasing the algorithm input/output\n      latency. Typical i/o latency for the SoundTouch time-stretch algorithm\n      is around 100 ms.\u003c/p\u003e\n    \u003cp\u003eSample rate transposing and time-stretching are then used together\n      to produce the tempo, pitch and rate controls:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e \u003cstrong\u003e'Tempo'\u003c/strong\u003e control is implemented purely by\n        time-stretching.\u003c/li\u003e\n      \u003cli\u003e \u003cstrong\u003e'Rate\u003c/strong\u003e' control is implemented purely by sample\n        rate transposing.\u003c/li\u003e\n      \u003cli\u003e \u003cstrong\u003e'Pitch\u003c/strong\u003e' control is implemented as a\n        combination of time-stretching and sample rate transposing. For\n        example, to increase pitch the audio stream is first time-stretched to\n        longer duration (without affecting pitch) and then transposed back to\n        original duration by sample rate transposing, which simultaneously\n        reduces duration and increases pitch. The result is original duration\n        but increased pitch.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003ch3\u003e3.4 Tuning the algorithm parameters\u003c/h3\u003e\n    \u003cp\u003eThe time-stretch algorithm has few parameters that can be tuned to\n      optimize sound quality for certain application. The current default\n      parameters have been chosen by iterative if-then analysis (read: \"trial\n      and error\") to obtain best subjective sound quality in pop/rock music\n      processing, but in applications processing different kind of sound the\n      default parameter set may result into a sub-optimal result.\u003c/p\u003e\n    \u003cp\u003eThe time-stretch algorithm default parameter values are set by the\n      following #defines in file \"TDStretch.h\":\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003e#define DEFAULT_SEQUENCE_MS     AUTOMATIC\u003cbr\u003e#define DEFAULT_SEEKWINDOW_MS   AUTOMATIC\u003cbr\u003e#define DEFAULT_OVERLAP_MS      8\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003eThese parameters affect to the time-stretch algorithm as follows:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e \u003cstrong\u003eDEFAULT_SEQUENCE_MS\u003c/strong\u003e: This is the default\n        length of a single processing sequence in milliseconds which determines\n        the how the original sound is chopped in the time-stretch algorithm.\n        Larger values mean fewer sequences are used in processing. In principle\n        a larger value sounds better when slowing down the tempo, but worse\n        when increasing the tempo and vice versa.\u003cbr\u003e\n        \u003cbr\u003e\n        By default, this setting value is calculated automatically according to\n        tempo value.\u003cbr\u003e\n      \u003c/li\u003e\n      \u003cli\u003e \u003cstrong\u003eDEFAULT_SEEKWINDOW_MS\u003c/strong\u003e: The seeking window\n        default length in milliseconds is for the algorithm that seeks the best\n        possible overlapping location. This determines from how wide a sample\n        \"window\" the algorithm can use to find an optimal mixing location when\n        the sound sequences are to be linked back together.\u003cbr\u003e\n        \u003cbr\u003e\n        The bigger this window setting is, the higher the possibility to find a\n        better mixing position becomes, but at the same time large values may\n        cause a \"drifting\" sound artifact because neighboring sequences can be\n        chosen at more uneven intervals. If there's a disturbing artifact that\n        sounds as if a constant frequency was drifting around, try reducing\n        this setting.\u003cbr\u003e\n        \u003cbr\u003e\n        By default, this setting value is calculated automatically according to\n        tempo value.\u003cbr\u003e\n      \u003c/li\u003e\n      \u003cli\u003e \u003cstrong\u003eDEFAULT_OVERLAP_MS\u003c/strong\u003e: Overlap length in\n        milliseconds. When the sound sequences are mixed back together to form\n        again a continuous sound stream, this parameter defines how much the\n        ends of the consecutive sequences will overlap with each other.\u003cbr\u003e\n        \u003cbr\u003e\n        This shouldn't be that critical parameter. If you reduce the\n        DEFAULT_SEQUENCE_MS setting by a large amount, you might wish to try a\n        smaller value on this.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003eNotice that these parameters can also be set during execution time\n      with functions \"\u003cstrong\u003eTDStretch::setParameters()\u003c/strong\u003e\" and \"\u003cstrong\u003eSoundTouch::setSetting()\u003c/strong\u003e\".\u003c/p\u003e\n    \u003cp\u003eThe table below summaries how the parameters can be adjusted for\n      different applications:\u003c/p\u003e\n    \u003ctable border=\"1\"\u003e\n      \u003ctbody\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eParameter name\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eDefault value magnitude\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eLarger value affects...\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eSmaller value affects...\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003e\u003cstrong\u003eEffect to CPU burden\u003c/strong\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003eSEQUENCE_MS\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDefault value is relatively large, chosen for\n            slowing down music tempo\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eLarger value is usually better for slowing down\n            tempo. Growing the value decelerates the \"echoing\" artifact when\n            slowing down the tempo.\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eSmaller value might be better for speeding up\n            tempo. Reducing the value accelerates the \"echoing\" artifact when\n            slowing down the tempo \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eIncreasing the parameter value reduces\n            computation burden\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003eSEEKWINDOW_MS\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDefault value is relatively large, chosen for\n            slowing down music tempo\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eLarger value eases finding a good mixing\n            position, but may cause a \"drifting\" artifact\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eSmaller reduce possibility to find a good mixing\n            position, but reduce the \"drifting\" artifact.\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eIncreasing the parameter value increases\n            computation burden\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003eOVERLAP_MS\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDefault value is relatively large, chosen to\n            suit with above parameters.\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003e\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eIf you reduce the \"sequence ms\" setting, you\n            might wish to try a smaller value.\u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eIncreasing the parameter value increases\n            computation burden\u003c/td\u003e\n        \u003c/tr\u003e\n      \u003c/tbody\u003e\n    \u003c/table\u003e\n    \u003ch3\u003e3.5 Performance Optimizations \u003c/h3\u003e\n    \u003cp\u003e\u003cstrong\u003eInteger vs floating point:\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eFloating point sample type is generally recommended because it provides\n      better sound quality.\u003c/p\u003e\n\n    \u003cp\u003eHowever, execution speed difference between integer and floating point processing\n      depends on the CPU architecture. As rule of thumb,\n    \u003cul\u003e\n      \u003cli\u003ein 32-bit x86 floating point and integer are roughly equally fast\u003c/li\u003e\n      \u003cli\u003ein 64-bit x86/x64 floating point can be significantly faster than integer\n        version, because MMX integer optimizations are not available in the x64 architecture.\n        That depends on the compiler however, so that gcc can autovectorize integer routines\n        to work equally fast as floating point, where as Visual C++ (2017) does not\n        perform equally well and produces integer code that runs some 3x slower than\n        SSE-optimized floating poing code.\n      \u003c/li\u003e\n      \u003cli\u003ein ARMv7 integer routines are twice as fast as floating point. Their\n        relative difference is roughly the same both with and without NEON; NEON\n        vfpu can however bring 2.4x speed improvement.\n      \u003c/li\u003e\n      \u003cli\u003ein other platforms: try out if the execution time performance makes a\n        big difference\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003c/p\u003e\n    \u003cp\u003e\u003cstrong\u003eGeneral optimizations:\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe time-stretch routine has a 'quick' mode that substantially\n      speeds up the algorithm but may slightly compromise the sound quality.\n      This mode is activated by calling SoundTouch::setSetting()\n      function with parameter id of SETTING_USE_QUICKSEEK and value\n      \"1\", i.e. \u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cp\u003esetSetting(SETTING_USE_QUICKSEEK, 1);\u003c/p\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eCPU-specific optimizations:\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eIntel x86 specific SIMD optimizations are implemented using compiler\n      intrinsics, providing about a 3x processing speedup for x86 compatible\n      processors vs. non-SIMD implementation:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e MMX optimized routines are used in 32-bit x86 build when 16bit integer\n        sample type is used\u003c/li\u003e\n      \u003cli\u003e SSE optimized routines are used in 32- and 64-bit x86 CPUs when 32bit\n        floating point sample type is used\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003eThe algorithms are tuned to utilize autovectorization efficiently\n      also in other CPU architectures, for example ARM cpus see approx 2.4x processing\n      speedup when NEON SIMD support is present.\n    \u003c/p\u003e\n    \u003ch3\u003e3.5 OpenMP parallel computation\u003c/h3\u003e\n    \u003cp\u003eSoundTouch 1.9 onwards support running the algorithms parallel in several CPU\n      cores. Based on benchmark the experienced multi-core processing speed-up gain\n      ranges between +30% (on a high-spec dual-core x86 Windows PC) to 215% (on a moderately low-spec\n      quad-core ARM of Raspberry Pi2). \u003c/p\u003e\n    \u003cp\u003eSee an external blog article with more detailed discussion about the\n      \u003ca href=\"http://www.softwarecoven.com/parallel-computing-in-embedded-mobile-devices/\"\u003e\n        SoundTouch OpenMP optimization\u003c/a\u003e.\u003c/p\u003e\n    \u003cp\u003eThe parallel computing support is implemented using OpenMP spec 3.0\n      instructions. These instructions are supported by Visual C++ 2008 and later, and\n      GCC v4.2 and later. Compilers that do not supporting OpenMP will ignore these\n      optimizations and routines will still work properly. Possible warnings about\n      unknown #pragmas are related to OpenMP support and can be safely ignored.\u003c/p\u003e\n    \u003cp\u003eThe OpenMP improvements are disabled by default, and need to be enabled by\n      developer during compile-time. Reason for this is that parallel processing adds\n      moderate runtime overhead in managing the multi-threading, so it may not be\n      necessary nor desirable in all applications. For example real-time processing\n      that is not constrained by CPU power will not benefit of speed-up provided by\n      the parallel processing, in the contrary it may increase power consumption due\n      to the increased overhead.\u003c/p\u003e\n    \u003cp\u003eHowever, applications that run on low-spec multi-core CPUs and may otherwise\n      have possibly constrained performance will benefit of the OpenMP improvements.\n      This include for example multi-core embedded devices.\u003c/p\u003e\n    \u003cp\u003eOpenMP parallel computation can be enabled before compiling SoundTouch\n      library as follows:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e\u003cstrong\u003eVisual Studio\u003c/strong\u003e: Open properties for the \u003cstrong\u003eSoundTouch\n        \u003c/strong\u003esub-project, browse to \u003cstrong\u003eC/C++\u003c/strong\u003e and \u003cstrong\u003eLanguage\n        \u003c/strong\u003esettings. Set\n        there \u0026quot;\u003cstrong\u003eOpenMP support\u003c/strong\u003e\u0026quot; to \u0026quot;\u003cstrong\u003eYes\u003c/strong\u003e\u0026quot;. Alternatively add\n        \u003cstrong\u003e/openmp\u003c/strong\u003e switch to command-line\n        parameters\u003c/li\u003e\n      \u003cli\u003e\u003cstrong\u003eGNU\u003c/strong\u003e: Run the configure script with \u0026quot;\u003cstrong\u003e./configure\n          --enable-openmp\u003c/strong\u003e\u0026quot; switch, then run make as usually\u003c/li\u003e\n      \u003cli\u003e\u003cstrong\u003eAndroid\u003c/strong\u003e: Add \u0026quot;\u003cstrong\u003e-fopenmp\u003c/strong\u003e\u0026quot; switches to compiler \u0026amp; linker\n        options, see README-SoundTouch-Android.html in the source code package for\n        more detailed instructions.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003chr\u003e\n    \u003ch2\u003e\u003ca name=\"SoundStretch\"\u003e\u003c/a\u003e4. SoundStretch audio processing utility\n    \u003c/h2\u003e\n    \u003cp\u003eSoundStretch audio processing utility\u003cbr\u003e\n      Copyright (c) Olli Parviainen 2002-2015\u003c/p\u003e\n    \u003cp\u003eSoundStretch is a simple command-line application that can change\n      tempo, pitch and playback rates of WAV sound files. This program is\n      intended primarily to demonstrate how the \"SoundTouch\" library can be\n      used to process sound in your own program, but it can as well be used\n      for processing sound files.\u003c/p\u003e\n    \u003ch3\u003e4.1. SoundStretch Usage Instructions\u003c/h3\u003e\n    \u003cp\u003eSoundStretch Usage syntax:\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch infilename outfilename [switches]\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003eWhere: \u003c/p\u003e\n    \u003ctable width=\"100%\" border=\"0\" cellpadding=\"2\"\u003e\n      \u003ctbody\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e\"infilename\"\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eName of the input sound data file (in .WAV audio\n            file format). Give \"stdin\" as filename to use standard input pipe. \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e\"outfilename\"\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eName of the output sound file where the\n            resulting sound is saved (in .WAV audio file format). This parameter\n            may be omitted if you don't want to save the output (e.g. when\n            only calculating BPM rate with '-bpm' switch). Give \"stdout\" as\n            filename to use standard output pipe.\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e[switches]\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eAre one or more control switches.\u003c/td\u003e\n        \u003c/tr\u003e\n      \u003c/tbody\u003e\n    \u003c/table\u003e\n    \u003cp\u003eAvailable control switches are:\u003c/p\u003e\n    \u003ctable width=\"100%\" border=\"0\" cellpadding=\"2\"\u003e\n      \u003ctbody\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-tempo=n \u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eChange the sound tempo by n percents (n = -95.0\n            .. +5000.0 %) \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-pitch=n\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eChange the sound pitch by n semitones (n = -60.0\n            .. + 60.0 semitones) \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-rate=n\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eChange the sound playback rate by n percents (n\n            = -95.0 .. +5000.0 %) \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-bpm=n\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDetect the Beats-Per-Minute (BPM) rate of the\n            sound and adjust the tempo to meet 'n' BPMs. When this switch is\n            applied, the \"-tempo\" switch is ignored. If \"=n\" is omitted, i.e.\n            switch \"-bpm\" is used alone, then the BPM rate is estimated and\n            displayed, but tempo not adjusted according to the BPM value. \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-quick\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eUse quicker tempo change algorithm. Gains speed\n            but loses sound quality. \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-naa\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDon't use anti-alias filtering in sample rate\n            transposing. Gains speed but loses sound quality. \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd valign=\"top\"\u003e\n            \u003cpre\u003e-license\u003c/pre\u003e\n          \u003c/td\u003e\n          \u003ctd valign=\"top\"\u003eDisplays the program license text (LGPL)\u003c/td\u003e\n        \u003c/tr\u003e\n      \u003c/tbody\u003e\n    \u003c/table\u003e\n    \u003cp\u003eNotes:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e To use standard input/output pipes for processing, give \"stdin\"\n        and \"stdout\" as input/output filenames correspondingly. The standard\n        input/output pipes will still carry the audio data in .wav audio file\n        format.\u003c/li\u003e\n      \u003cli\u003e The numerical switches allow both integer (e.g. \"-tempo=123\")\n        and decimal (e.g. \"-tempo=123.45\") numbers.\u003c/li\u003e\n      \u003cli\u003e The \"-naa\" and/or \"-quick\" switches can be used to reduce CPU\n        usage while compromising some sound quality\u003c/li\u003e\n      \u003cli\u003e The BPM detection algorithm works by detecting repeating bass or\n        drum patterns at low frequencies of \u0026lt;250Hz. A lower-than-expected\n        BPM figure may be reported for music with uneven or complex bass\n        patterns.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003ch3\u003e4.2. SoundStretch usage examples \u003c/h3\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 1\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command increases tempo of the sound file\n      \"originalfile.wav\" by 12.5% and stores result to file\n      \"destinationfile.wav\":\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch originalfile.wav destinationfile.wav -tempo=12.5\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 2\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command decreases the sound pitch (key) of the sound\n      file \"orig.wav\" by two semitones and stores the result to file\n      \"dest.wav\":\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch orig.wav dest.wav -pitch=-2\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 3\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command processes the file \"orig.wav\" by decreasing\n      the sound tempo by 25.3% and increasing the sound pitch (key) by 1.5\n      semitones. Resulting .wav audio data is directed to standard output\n      pipe:\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch orig.wav stdout -tempo=-25.3 -pitch=1.5\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 4\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command detects the BPM rate of the file \"orig.wav\"\n      and adjusts the tempo to match 100 beats per minute. Result is stored\n      to file \"dest.wav\":\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch orig.wav dest.wav -bpm=100\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 5\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command reads .wav sound data from standard input pipe\n      and estimates the BPM rate:\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch stdin -bpm\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003cp\u003e\u003cstrong\u003eExample 6\u003c/strong\u003e\u003c/p\u003e\n    \u003cp\u003eThe following command tunes song from original 440Hz tuning to 432Hz tuning:\n      this corresponds to lowering the pitch by -0.318 semitones:\u003c/p\u003e\n    \u003cblockquote\u003e\n      \u003cpre\u003esoundstretch original.wav output.wav -pitch=-0.318\u003c/pre\u003e\n    \u003c/blockquote\u003e\n    \u003chr\u003e\n    \u003ch2\u003e5. Change History\u003c/h2\u003e\n    \u003ch3\u003e5.1. SoundTouch library Change History \u003c/h3\u003e\n    \u003cp\u003e\u003cb\u003e2.2:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eImproved source codes so that compiler can autovectorize them more effectively.\n        This brings remarkable improvement e.g. ARM cpus equipped with NEON vfpu: Bencmarked\n        2.4x improvement in execution speed in ARMv7l vs the previous SoundTouch version\n        for both integer and floating point sample types.\n      \u003c/li\u003e\n      \u003cli\u003eBugfix: Resolved bad sound quality when using integer sample types in non-x86 CPU\u003c/li\u003e\n      \u003cli\u003eBugfix: Fixed possible reading past end of array in BPM peak detection algorithm\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e2.1.2:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eBump version to 2.1.2 also in configure.ac. The earlier release had old version info for GNU autotools.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e2.1.1:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eBugfixes: Fixed potential buffer overwrite bugs in WavFile routines. Replaced asserts with runtime exceptions.\n      \u003c/li\u003e\n      \u003cli\u003eAndroid: Migrated the SoundTouch Android example to new Android Studio\u003c/li\u003e\n      \u003cli\u003eAutomake: unset ACLOCAL in bootstrap script in case earlier build script has set it\u003c/li\u003e\n\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e2.1:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eRefactored C# interface example\u003c/li\u003e\n      \u003cli\u003eDisable anti-alias filter when switch\n        SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER defined because anti-alias\n        filter cause slight click if the rate change crosses zero during\n        processing\u003c/li\u003e\n      \u003cli\u003eAdded script for building SoundTouchDll dynamic-link-library for GNU platforms\u003c/li\u003e\n      \u003cli\u003eRewrote Beats-per-Minute analysis algorithm for more reliable BPM detection\u003c/li\u003e\n      \u003cli\u003eAdded BPM functions to SoundTouchDll API\u003c/li\u003e\n      \u003cli\u003eMigrated Visual Studio project files to MSVC 201x format\u003c/li\u003e\n      \u003cli\u003eReplaced function parameter value asserts with runtime exceptions\u003c/li\u003e\n      \u003cli\u003eCode maintenance \u0026 style cleanup\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e2.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eAdded functions to get initial processing latency, duration ratio between the original input and processed\n        output tracks, and clarified reporting of input/output batch sizes\u003c/li\u003e\n      \u003cli\u003eFixed issue that added brief sequence of silence to beginning of output audio\u003c/li\u003e\n      \u003cli\u003eAdjusted algorithm parameters to reduce reverberating effect at tempo slowdown\u003c/li\u003e\n      \u003cli\u003eBugfix: Fixed a glitch that could cause negative array indexing in quick seek algorithm\u003c/li\u003e\n      \u003cli\u003eBugfix: flush() didn't properly flush final samples from the pipeline on 2nd time in case that soundtouch\n        object instance was recycled and used for processing a second audio stream.\u003c/li\u003e\n      \u003cli\u003eBugfix: Pi value had incorrect 9th/10th decimals\u003c/li\u003e\n      \u003cli\u003eAdded C# example application that uses SoundTouch dll library for processing MP3 files\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.9.2:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eFix in GNU package configuration\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.9.1:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eImproved SoundTouch::flush() function so that it returns precisely the desired amount of samples for exact\n        output duration control\u003c/li\u003e\n      \u003cli\u003eRedesigned quickseek algorithm for improved sound quality when using the quickseek mode. The new quickseek\n        algorithm can find 99% as good results as the\n        default full-scan mode, while the quickseek algorithm is remarkable less\n        CPU intensive.\u003c/li\u003e\n      \u003cli\u003eAdded adaptive integer divider scaling for improved sound quality when using integer processing algorithm\n      \u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.9:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eAdded support for parallel computation support via OpenMP primitives for better performance in multicore\n        systems.\n        Benchmarks show that achieved parallel processing speedup improvement\n        typically range from +30% (x86 dual-core) to +180% (ARM quad-core). The\n        OpenMP optimizations are disabled by default, see OpenMP notes above in this\n        readme file how to enabled these optimizations.\u003c/li\u003e\n      \u003cli\u003eAndroid: Added support for Android devices featuring X86 and MIPS CPUs,\n        in addition to ARM CPUs.\u003c/li\u003e\n      \u003cli\u003eAndroid: More versatile Android example application that processes WAV\n        audio files with SoundTouch library\u003c/li\u003e\n      \u003cli\u003eReplaced Windows-like 'BOOL' types with native 'bool'\u003c/li\u003e\n      \u003cli\u003eChanged documentation token to \"dist_doc_DATA\" in Makefile.am file\u003c/li\u003e\n      \u003cli\u003eMiscellaneous small fixes and improvements\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.8.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eAdded support for multi-channel audio processing\u003c/li\u003e\n      \u003cli\u003eAdded support for \u003cb\u003ecubic\u003c/b\u003e and \u003cb\u003eshannon\u003c/b\u003e interpolation for rate and pitch shift effects besides\n        the original \u003cb\u003elinear\u003c/b\u003e interpolation, to reduce aliasing at high frequencies due to interpolation.\n        Cubic interpolation is used as default for floating point processing, and linear interpolation for integer\n        processing.\u003c/li\u003e\n      \u003cli\u003eFixed bug in anti-alias filtering that limited stop-band attenuation to -10 dB instead of \u003c-50dB, and\n          increased filter length from 32 to 64 taps to further reduce aliasing due to frequency folding.\u003c/li\u003e\n      \u003cli\u003ePerformance improvements in cross-correlation algorithm\u003c/li\u003e\n      \u003cli\u003eOther bug and compatibility fixes\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.7.1:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eAdded files for Android compilation\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.7.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eSound quality improvements/li\u003e\n      \u003cli\u003eImproved flush() to adjust output sound stream duration to match better with\n        ideal duration\u003c/li\u003e\n      \u003cli\u003eRewrote x86 cpu feature check to resolve compatibility problems\u003c/li\u003e\n      \u003cli\u003eConfigure script automatically checks if CPU supports mmx \u0026 sse compatibility for GNU platform, and\n        the script support now \"--enable-x86-optimizations\" switch to allow disabling x86-specific optimizations.\u003c/li\u003e\n      \u003cli\u003eRevised #define conditions for 32bit/64bit compatibility\u003c/li\u003e\n      \u003cli\u003egnu autoconf/automake script compatibility fixes\u003c/li\u003e\n      \u003cli\u003eTuned beat-per-minute detection algorithm\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.6.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added automatic cutoff threshold adaptation to beat detection\n        routine to better adapt BPM calculation to different types of music\u003c/li\u003e\n      \u003cli\u003e Retired 3DNow! optimization support as 3DNow! is nowadays\n        obsoleted and assembler code is nuisance to maintain\u003c/li\u003e\n      \u003cli\u003eRetired \"configure\" file from source code package due to\n        autoconf/automake versio conflicts, so that it is from now on to be\n        generated by invoking \"boostrap\" script that uses locally available\n        toolchain version for generating the \"configure\" file\u003c/li\u003e\n      \u003cli\u003eResolved namespace/label naming conflicts with other libraries by\n        replacing global labels such as INTEGER_SAMPLES with more specific\n        SOUNDTOUCH_INTEGER_SAMPLES etc.\u003cbr\u003e\n      \u003c/li\u003e\n      \u003cli\u003eUpdated windows build scripts \u0026amp; project files for Visual\n        Studio 2008 support\u003c/li\u003e\n      \u003cli\u003e Updated SoundTouch.dll API for .NET compatibility\u003c/li\u003e\n      \u003cli\u003e Added API for querying nominal processing input \u0026amp; output\n        sample batch sizes\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.5.0:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added normalization to correlation calculation and improvement\n        automatic seek/sequence parameter calculation to improve sound quality\u003c/li\u003e\n      \u003cli\u003e Bugfixes:\n        \u003cul\u003e\n          \u003cli\u003e Fixed negative array indexing in quick seek algorithm\u003c/li\u003e\n          \u003cli\u003e FIR autoalias filter running too far in processing buffer\u003c/li\u003e\n          \u003cli\u003e Check against zero sample count in rate transposing\u003c/li\u003e\n          \u003cli\u003e Fix for x86-64 support: Removed pop/push instructions from\n            the cpu detection algorithm.\u003c/li\u003e\n          \u003cli\u003e Check against empty buffers in FIFOSampleBuffer\u003c/li\u003e\n          \u003cli\u003e Other minor fixes \u0026amp; code cleanup\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/li\u003e\n      \u003cli\u003e Fixes in compilation scripts for non-Intel platforms\u003c/li\u003e\n      \u003cli\u003e Added Dynamic-Link-Library (DLL) version of SoundTouch library\n        build, provided with Delphi/Pascal wrapper for calling the dll routines\n      \u003c/li\u003e\n      \u003cli\u003e Added #define PREVENT_CLICK_AT_RATE_CROSSOVER that prevents a\n        click artifact when crossing the nominal pitch from either positive to\n        negative side or vice versa\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.4.1:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Fixed a buffer overflow bug in BPM detect algorithm routines if\n        processing more than 2048 samples at one call\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.4.0:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Improved sound quality by automatic calculation of time stretch\n        algorithm processing parameters according to tempo setting\u003c/li\u003e\n      \u003cli\u003e Moved BPM detection routines from SoundStretch application into\n        SoundTouch library\u003c/li\u003e\n      \u003cli\u003e Bugfixes: Usage of uninitialied variables, GNU build scripts,\n        compiler errors due to 'const' keyword mismatch.\u003c/li\u003e\n      \u003cli\u003e Source code cleanup\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.3.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Changed static class declaration to GCC 4.x compiler compatible\n        syntax.\u003c/li\u003e\n      \u003cli\u003e Enabled MMX/SSE-optimized routines also for GCC compilers.\n        Earlier the MMX/SSE-optimized routines were written in\n        compiler-specific inline assembler, now these routines are migrated to\n        use compiler intrinsic syntax which allows compiling the same\n        MMX/SSE-optimized source code with both Visual C++ and GCC compilers.\u003c/li\u003e\n      \u003cli\u003e Set floating point as the default sample format and added switch\n        to the GNU configure script for selecting the other sample format.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.3.0: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Fixed tempo routine output duration inaccuracy due to rounding\n        error\u003c/li\u003e\n      \u003cli\u003e Implemented separate processing routines for integer and\n        floating arithmetic to allow improvements to floating point routines\n        (earlier used algorithms mostly optimized for integer arithmetic also\n        for floating point samples)\u003c/li\u003e\n      \u003cli\u003e Fixed a bug that distorts sound if sample rate changes during\n        the sound stream\u003c/li\u003e\n      \u003cli\u003e Fixed a memory leak that appeared in MMX/SSE/3DNow! optimized\n        routines\u003c/li\u003e\n      \u003cli\u003e Reduced redundant code pieces in MMX/SSE/3DNow! optimized\n        routines vs. the standard C routines.\u003c/li\u003e\n      \u003cli\u003e MMX routine incompatibility with new gcc compiler versions\u003c/li\u003e\n      \u003cli\u003e Other miscellaneous bug fixes\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.2.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added automake/autoconf scripts for GNU platforms (in courtesy\n        of David Durham)\u003c/li\u003e\n      \u003cli\u003e Fixed SCALE overflow bug in rate transposer routine.\u003c/li\u003e\n      \u003cli\u003e Fixed 64bit address space bugs.\u003c/li\u003e\n      \u003cli\u003e Created a 'soundtouch' namespace for SAMPLETYPE definitions.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.2.0: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added support for 32bit floating point sample data type with\n        SSE/3DNow! optimizations for Win32 platform (SSE/3DNow! optimizations\n        currently not supported in GCC environment)\u003c/li\u003e\n      \u003cli\u003e Replaced 'make-gcc' script for GNU environment by master\n        Makefile\u003c/li\u003e\n      \u003cli\u003e Added time-stretch routine configurability to SoundTouch main\n        class\u003c/li\u003e\n      \u003cli\u003e Bugfixes\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.1.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Moved SoundTouch under lesser GPL license (LGPL). This allows\n        using SoundTouch library in programs that aren't released under GPL\n        license.\u003c/li\u003e\n      \u003cli\u003e Changed MMX routine organiation so that MMX optimized routines\n        are now implemented in classes that are derived from the basic classes\n        having the standard non-mmx routines.\u003c/li\u003e\n      \u003cli\u003e MMX routines to support gcc version 3.\u003c/li\u003e\n      \u003cli\u003e Replaced windows makefiles by script using the .dsw files\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.0.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e \"mmx_gcc.cpp\": Added \"using namespace std\" and removed \"return\n        0\" from a function with void return value to fix compiler errors when\n        compiling the library in Solaris environment.\u003c/li\u003e\n      \u003cli\u003e Moved file \"FIFOSampleBuffer.h\" to \"include\" directory to allow\n        accessing the FIFOSampleBuffer class from external files.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.0: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Initial release\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003ch3\u003e5.2. SoundStretch application Change History \u003c/h3\u003e\n    \u003cp\u003e\u003cb\u003e1.9:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eAdded support for WAV file 'fact' information chunk.\u003c/li\u003e\n    \u003c/ul\u003e\n\n    \u003cp\u003e\u003cb\u003e1.7.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003eBugfixes in Wavfile: exception string formatting, avoid getLengthMs() integer\n        precision overflow, support WAV files using 24/32bit sample format.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cb\u003e1.5.0:\u003c/b\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added \"-speech\" switch to activate algorithm parameters more\n        suitable for speech processing than the default parameters tuned for\n        music processing.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.4.0:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Moved BPM detection routines from SoundStretch application into\n        SoundTouch library\u003c/li\u003e\n      \u003cli\u003e Allow using standard input/output pipes as audio processing\n        input/output streams\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.3.0:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Simplified accessing WAV files with floating point sample\n        format.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.2.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Fixed 64bit address space bugs.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.2.0: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Added support for 32bit floating point sample data type\u003c/li\u003e\n      \u003cli\u003e Restructured the BPM routines into separate library\u003c/li\u003e\n      \u003cli\u003e Fixed big-endian conversion bugs in WAV file routines (hopefully\n        :)\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.1.1: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Fixed bugs in WAV file reading \u0026amp; added byte-order conversion\n        for big-endian processors.\u003c/li\u003e\n      \u003cli\u003e Moved SoundStretch source code under 'example' directory to\n        highlight difference from SoundTouch stuff.\u003c/li\u003e\n      \u003cli\u003e Replaced windows makefiles by script using the .dsw files\u003c/li\u003e\n      \u003cli\u003e Output file name isn't required if output isn't desired (e.g. if\n        using the switch '-bpm' in plain format only)\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.1:\u003c/strong\u003e\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Fixed \"Release\" settings in Microsoft Visual C++ project file\n        (.dsp)\u003c/li\u003e\n      \u003cli\u003e Added beats-per-minute (BPM) detection routine and command-line\n        switch \"-bpm\"\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e\u003cstrong\u003e1.01: \u003c/strong\u003e \u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Initial release\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003chr\u003e\n    \u003ch2\u003e6. Acknowledgements \u003c/h2\u003e\n    \u003cp\u003eKudos for these people who have contributed to development or\n      submitted bugfixes:\u003c/p\u003e\n    \u003cul\u003e\n      \u003cli\u003e Arthur A\u003c/li\u003e\n      \u003cli\u003e Paul Adenot\u003c/li\u003e\n      \u003cli\u003e Richard Ash\u003c/li\u003e\n      \u003cli\u003e Stanislav Brabec\u003c/li\u003e\n      \u003cli\u003e Christian Budde\u003c/li\u003e\n      \u003cli\u003e Jamie Bullock\u003c/li\u003e\n      \u003cli\u003e Chris Bryan\u003c/li\u003e\n      \u003cli\u003e Jacek Caban\u003c/li\u003e\n      \u003cli\u003e Marketa Calabkova\u003c/li\u003e\n      \u003cli\u003e Brian Cameron\u003c/li\u003e\n      \u003cli\u003e Jason Champion\u003c/li\u003e\n      \u003cli\u003e Giuseppe Cigala\u003c/li\u003e\n      \u003cli\u003e David Clark\u003c/li\u003e\n      \u003cli\u003e Patrick Colis\u003c/li\u003e\n      \u003cli\u003e Miquel Colon\u003c/li\u003e\n      \u003cli\u003e Jim Credland\u003c/li\u003e\n      \u003cli\u003e Sandro Cumerlato\u003c/li\u003e\n      \u003cli\u003e Gerry Fan\u003c/li\u003e\n      \u003cli\u003e Justin Frankel\u003c/li\u003e\n      \u003cli\u003e Masa H.\u003c/li\u003e\n      \u003cli\u003e Jason Garland\u003c/li\u003e\n      \u003cli\u003e Takashi Iwai\u003c/li\u003e\n      \u003cli\u003e Thomas Klausner\u003c/li\u003e\n      \u003cli\u003e Lu Zhihe\u003c/li\u003e\n      \u003cli\u003e Luzpaz\u003c/li\u003e\n      \u003cli\u003e Tony Mechelynck \u003c/li\u003e\n      \u003cli\u003e Mathias M\u0026ouml;hl\u003c/li\u003e\n      \u003cli\u003e Yuval Naveh\u003c/li\u003e\n      \u003cli\u003e Mats Palmgren \u003c/li\u003e\n      \u003cli\u003e Chandni Patel\u003c/li\u003e\n      \u003cli\u003e Paulo Pizarro\u003c/li\u003e\n      \u003cli\u003e Andrey Ponomarenko\u003c/li\u003e\n      \u003cli\u003e Blaise Potard\u003c/li\u003e\n      \u003cli\u003e Michael Pruett\u003c/li\u003e\n      \u003cli\u003e Rajeev Puran\u003c/li\u003e\n      \u003cli\u003e RJ Ryan\u003c/li\u003e\n      \u003cli\u003e John Sheehy\u003c/li\u003e\n      \u003cli\u003e Tim Shuttleworth\u003c/li\u003e\n      \u003cli\u003e Albert Sirvent\u003c/li\u003e\n      \u003cli\u003e Tyson Smith\u003c/li\u003e\n      \u003cli\u003e John Stumpo\u003c/li\u003e\n      \u003cli\u003e Mario di Vece\u003c/li\u003e\n      \u003cli\u003e Rémi Verschelde\u003c/li\u003e\n      \u003cli\u003e Katja Vetter\u003c/li\u003e\n      \u003cli\u003e Wu Q.\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003eMoral greetings to all other contributors and users also!\u003c/p\u003e\n    \u003chr\u003e\n    \u003ch2\u003e7. LICENSE \u003c/h2\u003e\n    \u003cp\u003eSoundTouch audio processing library\u003cbr\u003e\n      Copyright (c) Olli Parviainen\u003c/p\u003e\n    \u003cp\u003eThis library is free software; you can redistribute it and/or modify\n      it under the terms of the GNU Lesser General Public License version 2.1\n      as published by the Free Software Foundation.\u003c/p\u003e\n    \u003cp\u003eThis library is distributed in the hope that it will be useful, but\n      WITHOUT ANY WARRANTY; without even the implied warranty of\n      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser\n      General Public License for more details.\u003c/p\u003e\n    \u003cp\u003eYou should have received a copy of the GNU Lesser General Public\n      License along with this library; if not, write to the Free Software\n      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\u003c/p\u003e\n    \u003cp\u003e---\u003c/p\u003e\n    \u003cp\u003ecommercial license alternative also available, contact author for details.\u003c/p\u003e\n    \u003chr\u003e\n\u003c/body\u003e\n\n\u003c/html\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftencent-rtc%2Fsoundtouch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftencent-rtc%2Fsoundtouch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftencent-rtc%2Fsoundtouch/lists"}