diff --git a/README.html b/README.html index 71ef801..d5d9903 100644 --- a/README.html +++ b/README.html @@ -1,767 +1,797 @@ -
- - - - - - -SoundTouch library Copyright © Olli -Parviainen 2001-2009
-SoundTouch is an open-source audio -processing library that allows changing the sound tempo, pitch -and playback rate parameters independently from each other, i.e.:
-Author email: oparviai 'at' iki.fi
-SoundTouch WWW page: http://www.surina.net/soundtouch
-Before compiling, notice that you can choose the sample data format -if it's desirable to use floating point sample -data instead of 16bit integers. See section "sample data format" -for more information.
-Project files for Microsoft Visual C++ 6.0 and Visual C++ .NET are -supplied with the source code package.
-Please notice that SoundTouch -library uses processor-specific optimizations for Pentium III and AMD -processors. Visual Studio .NET and later versions supports the required -instructions by default, but Visual Studio 6.0 requires a processor pack upgrade -to be installed in order to support these optimizations. The processor pack upgrade can be downloaded from -Microsoft site at this URL:
-http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx
-If the above URL is unavailable or removed, go -to http://msdn.microsoft.com -and perform a search with keywords "processor pack".
-To build the binaries with Visual C++ -compiler, either run "make-win.bat" script, or open the -appropriate project files in source code directories with Visual -Studio. The final executable will appear under the "SoundTouch\bin" -directory. If using the Visual Studio IDE instead of the make-win.bat script, directories bin and -lib may need to be created manually to the SoundTouch -package root for the final executables. The make-win.bat script -creates these directories automatically. -
-The SoundTouch library can be compiled in -practically any platform supporting GNU compiler (GCC) tools. -SoundTouch have been tested with gcc version 3.3.4., but it -shouldn't be very specific about the gcc version. Assembler-level -performance optimizations for GNU platform are currently available in -x86 platforms only, they are automatically disabled and replaced with -standard C routines in other processor platforms.
-To build and install the binaries, run the -following commands in the SoundTouch/ directory:
-
- ./configure -- |
-
- Configures the SoundTouch package for the local -environment. - |
-
- make -- |
-
- Builds the SoundTouch library & -SoundStretch utility. - |
-
- make install -- |
-
- Installs the SoundTouch & BPM libraries -to /usr/local/lib and SoundStretch utility to /usr/local/bin. -Please notice that 'root' privileges may be required to install the -binaries to the destination locations. - |
-
Bash shell, GNU C++ compiler, libtool, autoconf and automake tools are required -for compiling -the SoundTouch library. These are usually included with the GNU/Linux distribution, but if -not, install these packages first. For example, in Ubuntu Linux these can be acquired and -installed with the following command:
-sudo apt-get install automake autoconf libtool build-essential-
At the release time the SoundTouch package has been tested to compile in -GNU/Linux platform. However, in past it's happened that new gcc versions aren't -necessarily compatible with the assembler settings used in the optimized -routines. If you have problems getting the -SoundTouch library compiled, try the workaround of disabling the optimizations -by editing the file "include/STTypes.h" and removing the following -definition there:
---#define ALLOW_OPTIMIZATIONS 1-
Incompatibilities between various GNU toolchain versions may cause errors when running the "configure" script or building the source -codes, if your GNU tool versions are not compatible with the versions used for -preparing the SoundTouch kit.
-To resolve the issue, regenerate the configure scripts with your local tool -set by running -the "./bootstrap" script included in the SoundTouch source code -kit. After that, run the configure script and make as usually.
-SoundTouch library works also on non-x86 processors.
-However, in case that you get compiler errors when trying to compile for non-Intel processor, edit the file -"source\SoundTouch\Makefile.am" and remove the "-msse2" -flag on the AM_CXXFLAGS line:
-AM_CXXFLAGS=-O3 -fcheck-new -I../../include # Note: -msse2 flag removed!-
After that, run "./bootstrap" script, and then run configure -and make again.
-The sample data format can be chosen -between 16bit signed integer and 32bit floating point values, the -default is 32bit floating point.
- --In Windows environment, the sample data format is chosen -in file "STTypes.h" by choosing one of the following -defines:
--In GNU environment, the floating sample format is used by default, but -integer sample format can be chosen by giving the -following switch to the configure script: -
-- -./configure --enable-integer-samples-
The sample data can have either single (mono) -or double (stereo) audio channel. Stereo data is interleaved so -that every other data value is for left channel and every second -for right channel. Notice that while it'd be possible in theory -to process stereo sound as two separate mono channels, this isn't -recommended because processing the channels separately would -result in losing the phase coherency between the channels, which -consequently would ruin the stereo effect.
-Sample rates between 8000-48000H are -supported.
-The processing and latency constraints of -the SoundTouch library are:
-SoundTouch provides three seemingly -independent effects: tempo, pitch and playback rate control. -These three controls are implemented as combination of two primary -effects, sample rate transposing and time-stretching.
-Sample rate transposing affects -both the audio stream duration and pitch. It's implemented simply -by converting the original audio sample stream to the desired -duration by interpolating from the original audio samples. In SoundTouch, linear interpolation with anti-alias filtering is -used. Theoretically a higher-order interpolation provide better -result than 1st order linear interpolation, but in audio -application linear interpolation together with anti-alias -filtering performs subjectively about as well as higher-order -filtering would.
-Time-stretching means changing -the audio stream duration without affecting it's pitch. SoundTouch -uses WSOLA-like time-stretching routines that operate in the time -domain. Compared to sample rate transposing, time-stretching is a -much heavier operation and also requires a longer processing -"window" of sound samples used by the -processing algorithm, thus increasing the algorithm input/output -latency. Typical i/o latency for the SoundTouch -time-stretch algorithm is around 100 ms.
-Sample rate transposing and time-stretching -are then used together to produce the tempo, pitch and rate -controls:
-The time-stretch algorithm has few -parameters that can be tuned to optimize sound quality for -certain application. The current default parameters have been -chosen by iterative if-then analysis (read: "trial and error") -to obtain best subjective sound quality in pop/rock music -processing, but in applications processing different kind of -sound the default parameter set may result into a sub-optimal -result.
-The time-stretch algorithm default -parameter values are set by the following #defines in file "TDStretch.h":
--#define DEFAULT_SEQUENCE_MS AUTOMATIC + +SoundTouch library README + + + + + + + + + +
+SoundTouch audio processing library v1.5.1pre +
+SoundTouch library Copyright © Olli Parviainen 2001-2009 +
+
+1. Introduction +
+SoundTouch is an open-source audio processing library that allows changing the + sound tempo, pitch and playback rate parameters independently from each other, + i.e.:
++
+- + Sound tempo can be increased or decreased while maintaining the original pitch +
- + Sound pitch can be increased or decreased while maintaining the original tempo +
- + Change playback rate that affects both tempo and pitch at the same time +
- + Choose any combination of tempo/pitch/rate
+1.1 Contact information +
+Author email: oparviai 'at' iki.fi +
+SoundTouch WWW page: http://www.surina.net/soundtouch
+
+2. Compiling SoundTouch
+Before compiling, notice that you can choose the sample data format if it's + desirable to use floating point sample data instead of 16bit integers. See + section "sample data format" for more information.
+2.1. Building in Microsoft Windows
+Project files for Microsoft Visual C++ 6.0 and Visual C++ .NET are supplied with + the source code package.
++ Please notice that SoundTouch library uses processor-specific optimizations for + Pentium III and AMD processors. Visual Studio .NET and later versions supports + the required instructions by default, but Visual Studio 6.0 requires a + processor pack upgrade to be installed in order to support these optimizations. + The processor pack upgrade can be downloaded from Microsoft site at this URL:
+http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx
+If the above URL is unavailable or removed, go to + http://msdn.microsoft.com and perform a search with keywords "processor + pack". +
+To build the binaries with Visual C++ compiler, either run "make-win.bat" + script, or open the appropriate project files in source code directories with + Visual Studio. The final executable will appear under the "SoundTouch\bin" + directory. If using the Visual Studio IDE instead of the make-win.bat script, + directories bin and lib may need to be created manually to the SoundTouch + package root for the final executables. The make-win.bat script creates these + directories automatically. +
+2.2. Building in Gnu platforms
+The SoundTouch library can be compiled in practically any platform supporting + GNU compiler (GCC) tools. SoundTouch have been tested with gcc version 3.3.4., + but it shouldn't be very specific about the gcc version. Assembler-level + performance optimizations for GNU platform are currently available in x86 + platforms only, they are automatically disabled and replaced with standard C + routines in other processor platforms.
+To build and install the binaries, run the following commands in the SoundTouch/ + directory:
++ +
++ ++ +./configure -++ +Configures the SoundTouch package for the local environment.
++ ++ +make -++ +Builds the SoundTouch library & SoundStretch utility.
++ + ++ +make install -++ +Installs the SoundTouch & BPM libraries to /usr/local/lib and + SoundStretch utility to /usr/local/bin. Please notice that 'root' + privileges may be required to install the binaries to the destination + locations.
+2.2.1 Required GNU tools
++ Bash shell, GNU C++ compiler, libtool, autoconf and automake tools are required + for compiling the SoundTouch library. These are usually included with the + GNU/Linux distribution, but if not, install these packages first. For example, + in Ubuntu Linux these can be acquired and installed with the following command:
+sudo apt-get install automake autoconf libtool build-essential+2.2.2 Problems with GCC compiler compatibility
+At the release time the SoundTouch package has been tested to compile in + GNU/Linux platform. However, in past it's happened that new gcc versions aren't + necessarily compatible with the assembler settings used in the optimized + routines. If you have problems getting the SoundTouch library compiled, try the + workaround of disabling the optimizations by editing the file + "include/STTypes.h" and removing the following definition there:
+++#define ALLOW_OPTIMIZATIONS 1+2.2.3 Problems with configure script or build process
+Incompatibilities between various GNU toolchain versions may cause errors when + running the "configure" script or building the source codes, if your GNU tool + versions are not compatible with the versions used for preparing the SoundTouch + kit.
+To resolve the issue, regenerate the configure scripts with your local tool set + by running the "./bootstrap" script included in the SoundTouch source + code kit. After that, run the configure script and make as + usually.
+2.2.4 Compiler issues with non-x86 processors
+SoundTouch library works also on non-x86 processors.
+However, in case that you get compiler errors when trying to compile for + non-Intel processor, edit the file "source\SoundTouch\Makefile.am" and + remove the "-msse2" flag on the AM_CXXFLAGS line:
+AM_CXXFLAGS=-O3 -fcheck-new -I../../include # Note: -msse2 flag removed!+After that, run "./bootstrap" script, and then run configure and make + again.
+
+3. About implementation & Usage tips
+3.1. Supported sample data formats
+The sample data format can be chosen between 16bit signed integer and 32bit + floating point values, the default is 32bit floating point. +
++ In Windows environment, the sample data format is chosen in file "STTypes.h" by + choosing one of the following defines:
++
+- + #define INTEGER_SAMPLES + for 16bit signed integer +
- + #define FLOAT_SAMPLES + for 32bit floating point
++ In GNU environment, the floating sample format is used by default, but integer + sample format can be chosen by giving the following switch to the configure + script:
++./configure --enable-integer-samples+The sample data can have either single (mono) or double (stereo) audio channel. + Stereo data is interleaved so that every other data value is for left channel + and every second for right channel. Notice that while it'd be possible in + theory to process stereo sound as two separate mono channels, this isn't + recommended because processing the channels separately would result in losing + the phase coherency between the channels, which consequently would ruin the + stereo effect.
+Sample rates between 8000-48000H are supported.
+3.2. Processing latency
+The processing and latency constraints of the SoundTouch library are:
++
+- + Input/output processing latency for the SoundTouch processor is around 100 ms. + This is when time-stretching is used. If the rate transposing effect alone is + used, the latency requirement is much shorter, see section 'About algorithms'. +
- + Processing CD-quality sound (16bit stereo sound with 44100H sample rate) in + real-time or faster is possible starting from processors equivalent to Intel + Pentium 133Mh or better, if using the "quick" processing algorithm. If not + using the "quick" mode or if floating point sample data are being used, several + times more CPU power is typically required.
+3.3. About algorithms
+SoundTouch provides three seemingly independent effects: tempo, pitch and + playback rate control. These three controls are implemented as combination of + two primary effects, sample rate transposing and time-stretching.
+Sample rate transposing affects both the audio stream duration and + pitch. It's implemented simply by converting the original audio sample stream + to the desired duration by interpolating from the original audio samples. + In SoundTouch, linear interpolation with anti-alias filtering is used. + Theoretically a higher-order interpolation provide better result than 1st order + linear interpolation, but in audio application linear interpolation together + with anti-alias filtering performs subjectively about as well as higher-order + filtering would.
+Time-stretching means changing the audio stream duration without + affecting it's pitch. SoundTouch uses WSOLA-like time-stretching routines that + operate in the time domain. Compared to sample rate transposing, + time-stretching is a much heavier operation and also requires a longer + processing "window" of sound samples used by the processing algorithm, thus + increasing the algorithm input/output latency. Typical i/o latency for the + SoundTouch time-stretch algorithm is around 100 ms.
+Sample rate transposing and time-stretching are then used together to produce + the tempo, pitch and rate controls:
++
+- + 'Tempo' + control is implemented purely by time-stretching. +
- + 'Rate' control is implemented purely by sample rate + transposing. +
- + 'Pitch' control is implemented as a combination of + time-stretching and sample rate transposing. For example, to increase pitch the + audio stream is first time-stretched to longer duration (without affecting + pitch) and then transposed back to original duration by sample rate + transposing, which simultaneously reduces duration and increases pitch. The + result is original duration but increased pitch.
+3.4 Tuning the algorithm parameters
+The time-stretch algorithm has few parameters that can be tuned to optimize + sound quality for certain application. The current default parameters have been + chosen by iterative if-then analysis (read: "trial and error") to obtain best + subjective sound quality in pop/rock music processing, but in applications + processing different kind of sound the default parameter set may result into a + sub-optimal result.
+The time-stretch algorithm default parameter values are set by the following + #defines in file "TDStretch.h":
++-#define DEFAULT_SEQUENCE_MS AUTOMATIC #define DEFAULT_SEEKWINDOW_MS AUTOMATIC #define DEFAULT_OVERLAP_MS 8-These parameters affect to the time-stretch -algorithm as follows:
--
-- DEFAULT_SEQUENCE_MS: This is -the default length of a single processing sequence in milliseconds -which determines the how the original sound is chopped in -the time-stretch algorithm. Larger values mean fewer sequences -are used in processing. In principle a larger value sounds better when -slowing down the tempo, but worse when increasing the tempo and vice -versa.
-
-
- By default, this setting value is calculated automatically according to - tempo value.
-- DEFAULT_SEEKWINDOW_MS: The seeking window -default length in milliseconds is for the algorithm that seeks the best -possible overlapping location. This determines from how -wide a sample "window" the algorithm can use to find an optimal mixing -location when the sound sequences are to be linked back together.
-
-
-The bigger this window setting is, the higher the possibility to find a -better mixing position becomes, but at the same time large values may -cause a "drifting" sound artifact because neighboring sequences can be -chosen at more uneven intervals. If there's a disturbing artifact that -sounds as if a constant frequency was drifting around, try reducing -this setting.
-
- By default, this setting value is calculated automatically according to - tempo value.
-- DEFAULT_OVERLAP_MS: Overlap -length in milliseconds. When the sound sequences are mixed back -together to form again a continuous sound stream, this parameter -defines how much the ends of the consecutive sequences will overlap with each other.
-
-
- This shouldn't be that critical parameter. If you reduce the -DEFAULT_SEQUENCE_MS setting by a large amount, you might wish to try a -smaller value on this.Notice that these parameters can also be -set during execution time with functions "TDStretch::setParameters()" -and "SoundTouch::setSetting()".
-The table below summaries how the -parameters can be adjusted for different applications:
-- -
-- -Parameter name -Default value -magnitude -Larger value -affects... -Smaller value -affects... -Effect to CPU burden -- -- -SEQUENCE_MS-Default value is relatively -large, chosen for slowing down music tempo -Larger value is usually -better for slowing down tempo. Growing the value decelerates the -"echoing" artifact when slowing down the tempo. -Smaller value might be better -for speeding up tempo. Reducing the value accelerates the "echoing" -artifact when slowing down the tempo -Increasing the parameter -value reduces computation burden -- -- -SEEKWINDOW_MS-Default value is relatively -large, chosen for slowing down music tempo -Larger value eases finding a -good mixing position, but may cause a "drifting" artifact -Smaller reduce possibility to -find a good mixing position, but reduce the "drifting" artifact. -Increasing the parameter -value increases computation burden -- - -- -OVERLAP_MS-Default value is relatively -large, chosen to suit with above parameters. -- If you reduce the "sequence -ms" setting, you might wish to try a smaller value. -Increasing the parameter -value increases computation burden -3.5 Performance Optimizations
-General optimizations:
-The time-stretch routine has a 'quick' mode -that substantially speeds up the algorithm but may degrade the -sound quality by a small amount. This mode is activated by -calling SoundTouch::setSetting() function with parameter id -of SETTING_USE_QUICKSEEK and value "1", i.e.
---setSetting(SETTING_USE_QUICKSEEK, 1);
-CPU-specific optimizations:
--
-- Intel MMX optimized routines are used with -compatible CPUs when 16bit integer sample type is used. MMX optimizations are available both in Win32 and Gnu/x86 platforms. -Compatible processors are Intel PentiumMMX and later; AMD K6-2, Athlon -and later.
-- Intel SSE optimized routines are used with -compatible CPUs when floating point sample type is used. SSE optimizations are currently implemented for Win32 platform only. -Processors compatible with SSE extension are Intel processors starting -from Pentium-III, and AMD processors starting from Athlon XP.
-- AMD 3DNow! optimized routines are used with -compatible CPUs when floating point sample type is used, but SSE -extension isn't supported . 3DNow! optimizations are currently -implemented for Win32 platform only. These optimizations are used in -AMD K6-2 and Athlon (classic) CPU's; better performing SSE routines are -used with AMD processor starting from Athlon XP.
-
-4. SoundStretch audio processing utility -
-SoundStretch audio processing utility
-
-Copyright (c) Olli Parviainen 2002-2009SoundStretch is a simple command-line -application that can change tempo, pitch and playback rates of -WAV sound files. This program is intended primarily to -demonstrate how the "SoundTouch" library can be used to -process sound in your own program, but it can as well be used for -processing sound files.
-4.1. SoundStretch Usage Instructions
-SoundStretch Usage syntax:
---soundstretch infilename outfilename [switches]-Where:
-- -
-- -- -"infilename"-Name of the input sound -data file (in .WAV audio file format). Give "stdin" as filename to use - standard input pipe. -- -- -"outfilename"-Name of the output sound -file where the resulting sound is saved (in .WAV audio file format). -This parameter may be omitted if you don't want to save the -output -(e.g. when only calculating BPM rate with '-bpm' switch). Give "stdout" - as filename to use standard output pipe. -- - -- -[switches]-Are one or more control -switches. -Available control switches are:
-- -
-- -- --tempo=n-Change the sound tempo by n -percents (n = -95.0 .. +5000.0 %) -- -- --pitch=n-Change the sound pitch by n -semitones (n = -60.0 .. + 60.0 semitones) -- -- --rate=n-Change the sound playback rate by -n percents (n = -95.0 .. +5000.0 %) -- -- --bpm=n-Detect the Beats-Per-Minute (BPM) rate of the sound and adjust the tempo to meet 'n' - BPMs. When this switch is - applied, the "-tempo" switch is ignored. If "=n" is -omitted, i.e. switch "-bpm" is used alone, then the BPM rate is - estimated and displayed, but tempo not adjusted according to the BPM -value. -- -- --quick-Use quicker tempo change -algorithm. Gains speed but loses sound quality. -- -- --naa-Don't use anti-alias -filtering in sample rate transposing. Gains speed but loses sound -quality. -- - -- --license-Displays the program license -text (LGPL) -Notes:
--
-- To use standard input/output pipes for processing, give "stdin" - and "stdout" as input/output filenames correspondingly. The - standard input/output pipes will still carry the audio data in .wav audio - file format.
-- The numerical switches allow both integer (e.g. "-tempo=123") and decimal (e.g. -"-tempo=123.45") numbers.
-- The "-naa" and/or "-quick" switches can be -used to reduce CPU usage while compromising some sound quality
-- The BPM detection algorithm works by detecting -repeating bass or drum patterns at low frequencies of <250Hz. A - lower-than-expected BPM figure may be reported for music with uneven or - complex bass patterns.
-4.2. SoundStretch usage examples
-Example 1
-The following command increases tempo of -the sound file "originalfile.wav" by 12.5% and stores result to file "destinationfile.wav":
---soundstretch originalfile.wav destinationfile.wav -tempo=12.5-Example 2
-The following command decreases the sound -pitch (key) of the sound file "orig.wav" by two -semitones and stores the result to file "dest.wav":
---soundstretch orig.wav dest.wav -pitch=-2-Example 3
-The following command processes the file "orig.wav" by decreasing the sound tempo by 25.3% and -increasing the sound pitch (key) by 1.5 semitones. Resulting .wav audio data is -directed to standard output pipe:
---soundstretch orig.wav stdout -tempo=-25.3 -pitch=1.5-Example 4
-The following command detects the BPM rate -of the file "orig.wav" and adjusts the tempo to match -100 beats per minute. Result is stored to file "dest.wav":
---soundstretch orig.wav dest.wav -bpm=100-Example 5
-The following command reads .wav sound data from standard input pipe and -estimates the BPM rate:
---soundstretch stdin -bpm-
-5. Change History
-5.1. SoundTouch library Change History
- -1.5.1pre:
--
- -- Added automatic cutoff threshold adaptation to beat detection routine to - better adapt BPM calculation to different types of music
- -1.5.0:
--
- -- Added normalization to correlation calculation and improvement automatic seek/sequence parameter calculation to improve sound quality
- -- Bugfixes: -
- --
-- Fixed negative array indexing in quick seek algorithm
-- FIR autoalias filter running too far in processing buffer
-- Check against zero sample count in rate transposing
-- Fix for x86-64 support: Removed pop/push instructions from the cpu detection algorithm.
-- Check against empty buffers in FIFOSampleBuffer
-- Other minor fixes & code cleanup
-- Fixes in compilation scripts for non-Intel platforms
-- Added Dynamic-Link-Library (DLL) version of SoundTouch library build, - provided with Delphi/Pascal wrapper for calling the dll routines
-- Added #define PREVENT_CLICK_AT_RATE_CROSSOVER that prevents a click artifact - when crossing the nominal pitch from either positive to negative side or vice - versa
- -1.4.1:
--
- -- Fixed a buffer overflow bug in BPM detect algorithm routines if processing - more than 2048 samples at one call
- -1.4.0:
--
- -- Improved sound quality by automatic calculation of time stretch algorithm - processing parameters according to tempo setting
-- Moved BPM detection routines from SoundStretch application into SoundTouch - library
-- Bugfixes: Usage of uninitialied variables, GNU build scripts, compiler errors - due to 'const' keyword mismatch.
-- Source code cleanup
- -v1.3.1: -
--
- -- Changed static class declaration to GCC 4.x compiler compatible syntax.
-- Enabled MMX/SSE-optimized routines also for GCC compilers. Earlier -the MMX/SSE-optimized routines were written in compiler-specific inline -assembler, now these routines are migrated to use compiler intrinsic -syntax which allows compiling the same MMX/SSE-optimized source code with -both Visual C++ and GCC compilers.
-- Set floating point as the default sample format and added switch to -the GNU configure script for selecting the other sample format.
- -v1.3.0: -
--
-- Fixed tempo routine output duration inaccuracy due to rounding -error
-- Implemented separate processing routines for integer and -floating arithmetic to allow improvements to floating point routines -(earlier used algorithms mostly optimized for integer arithmetic also -for floating point samples)
-- Fixed a bug that distorts sound if sample rate changes during the -sound stream
-- Fixed a memory leak that appeared in MMX/SSE/3DNow! optimized -routines
-- Reduced redundant code pieces in MMX/SSE/3DNow! optimized -routines vs. the standard C routines.
-- MMX routine incompatibility with new gcc compiler versions
-- Other miscellaneous bug fixes
-v1.2.1:
--
-- Added automake/autoconf scripts for GNU -platforms (in courtesy of David Durham)
-- Fixed SCALE overflow bug in rate transposer -routine.
-- Fixed 64bit address space bugs.
-- Created a 'soundtouch' namespace for -SAMPLETYPE definitions.
-v1.2.0:
--
-- Added support for 32bit floating point sample -data type with SSE/3DNow! optimizations for Win32 platform (SSE/3DNow! optimizations currently not supported in GCC environment)
-- Replaced 'make-gcc' script for GNU environment -by master Makefile
-- Added time-stretch routine configurability to -SoundTouch main class
-- Bugfixes
-v1.1.1:
--
-- Moved SoundTouch under lesser GPL license (LGPL). This allows using SoundTouch library in programs that aren't -released under GPL license.
-- Changed MMX routine organiation so that MMX optimized routines are now implemented in classes that are derived from -the basic classes having the standard non-mmx routines.
-- MMX routines to support gcc version 3.
-- Replaced windows makefiles by script using the .dsw files
-v1.01:
--
-- "mmx_gcc.cpp": Added "using namespace std" and -removed "return 0" from a function with void return value to fix -compiler errors when compiling the library in Solaris environment.
-- Moved file "FIFOSampleBuffer.h" to "include" -directory to allow accessing the FIFOSampleBuffer class from external -files.
-v1.0:
--
-- Initial release
--
5.2. SoundStretch application Change -History
- -v1.5.0:
--
- -- Added "-speech" switch to activate algorithm parameters more - suitable for speech processing than the default parameters tuned for music - processing.
- -v1.4.0:
--
- -- Moved BPM detection routines from SoundStretch application into SoundTouch - library
-- Allow using standard input/output pipes as audio processing input/output - streams
- -v1.3.0:
--
-- Simplified accessing WAV files with floating -point sample format. -
-v1.2.1:
--
-- Fixed 64bit address space bugs.
-v1.2.0:
--
-- Added support for 32bit floating point sample -data type
-- Restructured the BPM routines into separate -library
-- Fixed big-endian conversion bugs in WAV file -routines (hopefully :)
-v1.1.1:
--
-- Fixed bugs in WAV file reading & added -byte-order conversion for big-endian processors.
-- Moved SoundStretch source code under 'example' -directory to highlight difference from SoundTouch stuff.
-- Replaced windows makefiles by script using the .dsw files
-- Output file name isn't required if output -isn't desired (e.g. if using the switch '-bpm' in plain format only)
-v1.1:
--
-- Fixed "Release" settings in Microsoft Visual -C++ project file (.dsp)
-- Added beats-per-minute (BPM) detection routine -and command-line switch "-bpm"
-v1.01:
--
-- Initial release
-
-6. Acknowledgements
-Kudos for these people who have contributed to development or submitted -bugfixes since -SoundTouch v1.3.1:
--
-- Arthur A
-- Richard Ash
-- Stanislav Brabec
-- Christian Budde
-- Brian Cameron
-- Jason Champion
-- Patrick Colis
-- Justin Frankel
-- Jason Garland
-- Takashi Iwai
-- Paulo Pizarro
-- RJ Ryan
-- John Sheehy
-Moral greetings to all other contributors and users also!
-
-7. LICENSE
-SoundTouch audio processing library
-
-Copyright (c) Olli ParviainenThis library is free software; you can -redistribute it and/or modify it under the terms of the GNU -Lesser General Public License version 2.1 as published by the Free Software -Foundation.
-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
-
- - + diff --git a/include/STTypes.h b/include/STTypes.h index 48c36a6..8aa5b19 100644 --- a/include/STTypes.h +++ b/include/STTypes.h @@ -128,11 +128,7 @@ namespace soundtouch typedef double LONG_SAMPLETYPE; #ifdef ALLOW_X86_OPTIMIZATIONS - // Allow 3DNow! and SSE optimizations - #if WIN32 - #define ALLOW_3DNOW 1 - #endif - + // Allow SSE optimizations #define ALLOW_SSE 1 #endif diff --git a/source/SoundTouch/3dnow_win.cpp b/source/SoundTouch/3dnow_win.cpp deleted file mode 100644 index 1fbbdab..0000000 --- a/source/SoundTouch/3dnow_win.cpp +++ /dev/null @@ -1,349 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// -/// Win32 version of the AMD 3DNow! optimized routines for AMD K6-2/Athlon -/// processors. All 3DNow! optimized functions have been gathered into this -/// single source code file, regardless to their class or original source code -/// file, in order to ease porting the library to other compiler and processor -/// platforms. -/// -/// By the way; the performance gain depends heavily on the CPU generation: On -/// K6-2 these routines provided speed-up of even 2.4 times, while on Athlon the -/// difference to the original routines stayed at unremarkable 8%! Such a small -/// improvement on Athlon is due to 3DNow can perform only two operations in -/// parallel, and obviously also the Athlon FPU is doing a very good job with -/// the standard C floating point routines! Here these routines are anyway, -/// although it might not be worth the effort to convert these to GCC platform, -/// for Athlon CPU at least. The situation is different regarding the SSE -/// optimizations though, thanks to the four parallel operations of SSE that -/// already make a difference. -/// -/// This file is to be compiled in Windows platform with Microsoft Visual C++ -/// Compiler. Please see '3dnow_gcc.cpp' for the gcc compiler version for all -/// GNU platforms (if file supplied). -/// -/// NOTICE: If using Visual Studio 6.0, you'll need to install the "Visual C++ -/// 6.0 processor pack" update to support 3DNow! instruction set. The update is -/// available for download at Microsoft Developers Network, see here: -/// http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx -/// -/// If the above URL is expired or removed, go to "http://msdn.microsoft.com" and -/// perform a search with keywords "processor pack". -/// -/// Author : Copyright (c) Olli Parviainen -/// Author e-mail : oparviai 'at' iki.fi -/// SoundTouch WWW: http://www.surina.net/soundtouch -/// -//////////////////////////////////////////////////////////////////////////////// -// -// Last changed : $Date$ -// File revision : $Revision: 4 $ -// -// $Id$ -// -//////////////////////////////////////////////////////////////////////////////// -// -// 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 "cpu_detect.h" -#include "STTypes.h" - -#ifndef WIN32 -#error "wrong platform - this source code file is exclusively for Win32 platform" -#endif - -using namespace soundtouch; - -#ifdef ALLOW_3DNOW -// 3DNow! routines available only with float sample type - -////////////////////////////////////////////////////////////////////////////// -// -// implementation of 3DNow! optimized functions of class 'TDStretch3DNow' -// -////////////////////////////////////////////////////////////////////////////// - -#include "TDStretch.h" - - -// Calculates cross correlation of two buffers -double TDStretch3DNow::calcCrossCorrStereo(const float *pV1, const float *pV2) const -{ - int overlapLengthLocal = overlapLength; - float corr = 0; - - // Calculates the cross-correlation value between 'pV1' and 'pV2' vectors - /* - c-pseudocode: - - corr = 0; - for (i = 0; i < overlapLength / 4; i ++) - { - corr += pV1[0] * pV2[0]; - pV1[1] * pV2[1]; - pV1[2] * pV2[2]; - pV1[3] * pV2[3]; - pV1[4] * pV2[4]; - pV1[5] * pV2[5]; - pV1[6] * pV2[6]; - pV1[7] * pV2[7]; - - pV1 += 8; - pV2 += 8; - } - */ - - _asm - { - // give prefetch hints to CPU of what data are to be needed soonish. - // give more aggressive hints on pV1 as that changes more between different calls - // while pV2 stays the same. - prefetch [pV1] - prefetch [pV2] - prefetch [pV1 + 32] - - mov eax, dword ptr pV2 - mov ebx, dword ptr pV1 - - pxor mm0, mm0 - - mov ecx, overlapLengthLocal - shr ecx, 2 // div by four - - loop1: - movq mm1, [eax] - prefetch [eax + 32] // give a prefetch hint to CPU what data are to be needed soonish - pfmul mm1, [ebx] - prefetch [ebx + 64] // give a prefetch hint to CPU what data are to be needed soonish - - movq mm2, [eax + 8] - pfadd mm0, mm1 - pfmul mm2, [ebx + 8] - - movq mm3, [eax + 16] - pfadd mm0, mm2 - pfmul mm3, [ebx + 16] - - movq mm4, [eax + 24] - pfadd mm0, mm3 - pfmul mm4, [ebx + 24] - - add eax, 32 - pfadd mm0, mm4 - add ebx, 32 - - dec ecx - jnz loop1 - - // add halfs of mm0 together and return the result. - // note: mm1 is used as a dummy parameter only, we actually don't care about it's value - pfacc mm0, mm1 - movd corr, mm0 - femms - } - - return corr; -} - - - - -////////////////////////////////////////////////////////////////////////////// -// -// implementation of 3DNow! optimized functions of class 'FIRFilter' -// -////////////////////////////////////////////////////////////////////////////// - -#include "FIRFilter.h" - -FIRFilter3DNow::FIRFilter3DNow() : FIRFilter() -{ - filterCoeffsUnalign = NULL; - filterCoeffsAlign = NULL; -} - - -FIRFilter3DNow::~FIRFilter3DNow() -{ - delete[] filterCoeffsUnalign; - filterCoeffsUnalign = NULL; - filterCoeffsAlign = NULL; -} - - -// (overloaded) Calculates filter coefficients for 3DNow! routine -void FIRFilter3DNow::setCoefficients(const float *coeffs, uint newLength, uint uResultDivFactor) -{ - uint i; - float fDivider; - - FIRFilter::setCoefficients(coeffs, newLength, uResultDivFactor); - - // Scale the filter coefficients so that it won't be necessary to scale the filtering result - // also rearrange coefficients suitably for 3DNow! - // Ensure that filter coeffs array is aligned to 16-byte boundary - delete[] filterCoeffsUnalign; - filterCoeffsUnalign = new float[2 * newLength + 4]; - filterCoeffsAlign = (float *)(((uint)filterCoeffsUnalign + 15) & (uint)-16); - - fDivider = (float)resultDivider; - - // rearrange the filter coefficients for mmx routines - for (i = 0; i < newLength; i ++) - { - filterCoeffsAlign[2 * i + 0] = - filterCoeffsAlign[2 * i + 1] = coeffs[i + 0] / fDivider; - } -} - - -// 3DNow!-optimized version of the filter routine for stereo sound -uint FIRFilter3DNow::evaluateFilterStereo(float *dest, const float *src, uint numSamples) const -{ - float *filterCoeffsLocal = filterCoeffsAlign; - uint count = (numSamples - length) & (uint)-2; - uint lengthLocal = length / 4; - - assert(length != 0); - assert(count % 2 == 0); - - /* original code: - - double suml1, suml2; - double sumr1, sumr2; - uint i, j; - - for (j = 0; j < count; j += 2) - { - const float *ptr; - - suml1 = sumr1 = 0.0; - suml2 = sumr2 = 0.0; - ptr = src; - filterCoeffsLocal = filterCoeffs; - for (i = 0; i < lengthLocal; i ++) - { - // unroll loop for efficiency. - - suml1 += ptr[0] * filterCoeffsLocal[0] + - ptr[2] * filterCoeffsLocal[2] + - ptr[4] * filterCoeffsLocal[4] + - ptr[6] * filterCoeffsLocal[6]; - - sumr1 += ptr[1] * filterCoeffsLocal[1] + - ptr[3] * filterCoeffsLocal[3] + - ptr[5] * filterCoeffsLocal[5] + - ptr[7] * filterCoeffsLocal[7]; - - suml2 += ptr[8] * filterCoeffsLocal[0] + - ptr[10] * filterCoeffsLocal[2] + - ptr[12] * filterCoeffsLocal[4] + - ptr[14] * filterCoeffsLocal[6]; - - sumr2 += ptr[9] * filterCoeffsLocal[1] + - ptr[11] * filterCoeffsLocal[3] + - ptr[13] * filterCoeffsLocal[5] + - ptr[15] * filterCoeffsLocal[7]; - - ptr += 16; - filterCoeffsLocal += 8; - } - dest[0] = (float)suml1; - dest[1] = (float)sumr1; - dest[2] = (float)suml2; - dest[3] = (float)sumr2; - - src += 4; - dest += 4; - } - - */ - _asm - { - mov eax, dword ptr dest - mov ebx, dword ptr src - mov edx, count - shr edx, 1 - - loop1: - // "outer loop" : during each round 2*2 output samples are calculated - prefetch [ebx] // give a prefetch hint to CPU what data are to be needed soonish - prefetch [filterCoeffsLocal] // give a prefetch hint to CPU what data are to be needed soonish - - mov esi, ebx - mov edi, filterCoeffsLocal - pxor mm0, mm0 - pxor mm1, mm1 - mov ecx, lengthLocal - - loop2: - // "inner loop" : during each round four FIR filter taps are evaluated for 2*2 output samples - movq mm2, [edi] - movq mm3, mm2 - prefetch [edi + 32] // give a prefetch hint to CPU what data are to be needed soonish - pfmul mm2, [esi] - prefetch [esi + 32] // give a prefetch hint to CPU what data are to be needed soonish - pfmul mm3, [esi + 8] - - movq mm4, [edi + 8] - movq mm5, mm4 - pfadd mm0, mm2 - pfmul mm4, [esi + 8] - pfadd mm1, mm3 - pfmul mm5, [esi + 16] - - movq mm2, [edi + 16] - movq mm6, mm2 - pfadd mm0, mm4 - pfmul mm2, [esi + 16] - pfadd mm1, mm5 - pfmul mm6, [esi + 24] - - movq mm3, [edi + 24] - movq mm7, mm3 - pfadd mm0, mm2 - pfmul mm3, [esi + 24] - pfadd mm1, mm6 - pfmul mm7, [esi + 32] - add esi, 32 - pfadd mm0, mm3 - add edi, 32 - pfadd mm1, mm7 - - dec ecx - jnz loop2 - - movq [eax], mm0 - add ebx, 16 - movq [eax + 8], mm1 - add eax, 16 - - dec edx - jnz loop1 - - femms - } - - return count; -} - - -#endif // ALLOW_3DNOW diff --git a/source/SoundTouch/FIRFilter.cpp b/source/SoundTouch/FIRFilter.cpp index 72607bd..001f70f 100644 --- a/source/SoundTouch/FIRFilter.cpp +++ b/source/SoundTouch/FIRFilter.cpp @@ -233,7 +233,7 @@ FIRFilter * FIRFilter::newInstance() uExtensions = detectCPUextensions(); - // Check if MMX/SSE/3DNow! instruction set extensions supported by CPU + // Check if MMX/SSE instruction set extensions supported by CPU #ifdef ALLOW_MMX // MMX routines available only with integer sample types @@ -253,15 +253,6 @@ FIRFilter * FIRFilter::newInstance() else #endif // ALLOW_SSE -#ifdef ALLOW_3DNOW - if (uExtensions & SUPPORT_3DNOW) - { - // 3DNow! support - return ::new FIRFilter3DNow; - } - else -#endif // ALLOW_3DNOW - { // ISA optimizations not supported, use plain C version return ::new FIRFilter; diff --git a/source/SoundTouch/FIRFilter.h b/source/SoundTouch/FIRFilter.h index 71e88bd..5de98df 100644 --- a/source/SoundTouch/FIRFilter.h +++ b/source/SoundTouch/FIRFilter.h @@ -122,25 +122,6 @@ public: #endif // ALLOW_MMX -#ifdef ALLOW_3DNOW - - /// Class that implements 3DNow! optimized functions exclusive for floating point samples type. - class FIRFilter3DNow : public FIRFilter - { - protected: - float *filterCoeffsUnalign; - float *filterCoeffsAlign; - - virtual uint evaluateFilterStereo(float *dest, const float *src, uint numSamples) const; - public: - FIRFilter3DNow(); - ~FIRFilter3DNow(); - virtual void setCoefficients(const float *coeffs, uint newLength, uint uResultDivFactor); - }; - -#endif // ALLOW_3DNOW - - #ifdef ALLOW_SSE /// Class that implements SSE optimized functions exclusive for floating point samples type. class FIRFilterSSE : public FIRFilter diff --git a/source/SoundTouch/SoundTouch.vcproj b/source/SoundTouch/SoundTouch.vcproj index 62a3d55..a9b3ffe 100644 --- a/source/SoundTouch/SoundTouch.vcproj +++ b/source/SoundTouch/SoundTouch.vcproj @@ -125,27 +125,6 @@- - - -- - --