diff --git a/Makefile.in b/Makefile.in index 39d7c26..41fd513 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,6 +1,6 @@ CXX := @CXX@ -CXXFLAGS := -DHAVE_FFTW3 -DFFTW_DOUBLE_ONLY -DNO_THREAD_CHECKS @CXXFLAGS@ @SRC_CFLAGS@ @SNDFILE_CFLAGS@ @FFTW_CFLAGS@ @Vamp_CFLAGS@ -Irubberband -Isrc $(OPTFLAGS) +CXXFLAGS := -DHAVE_FFTW3 -DFFTW_DOUBLE_ONLY -DNO_THREAD_CHECKS -DNO_TIMING -DNDEBUG @CXXFLAGS@ @SRC_CFLAGS@ @SNDFILE_CFLAGS@ @FFTW_CFLAGS@ @Vamp_CFLAGS@ -Irubberband -I. -Isrc $(OPTFLAGS) CFLAGS := @CFLAGS@ $(OPTFLAGS) LDFLAGS := @LDFLAGS@ -lpthread $(LDFLAGS) @@ -17,8 +17,8 @@ DYNAMIC_FULL_VERSION := .2.1.0 DYNAMIC_ABI_VERSION := .2 DYNAMIC_LIBNAME := librubberband$(DYNAMIC_EXTENSION) DYNAMIC_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-soname=$(DYNAMIC_LIBNAME)$(DYNAMIC_ABI_VERSION) -VAMP_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=src/vamp/vamp-plugin.map -LADSPA_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=src/ladspa/ladspa-plugin.map +VAMP_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=vamp/vamp-plugin.map +LADSPA_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=ladspa/ladspa-plugin.map PROGRAM_TARGET := bin/rubberband STATIC_TARGET := lib/librubberband.a @@ -48,60 +48,63 @@ PUBLIC_INCLUDES := \ rubberband/RubberBandStretcher.h LIBRARY_INCLUDES := \ - src/AudioCurve.h \ - src/ConstantAudioCurve.h \ - src/FFT.h \ - src/HighFrequencyAudioCurve.h \ - src/PercussiveAudioCurve.h \ - src/Profiler.h \ - src/Resampler.h \ - src/RingBuffer.h \ - src/Scavenger.h \ - src/SilentAudioCurve.h \ - src/SpectralDifferenceAudioCurve.h \ - src/StretchCalculator.h \ - src/StretcherImpl.h \ src/StretcherChannelData.h \ - src/Thread.h \ - src/Window.h \ - src/sysutils.h + src/float_cast/float_cast.h \ + src/StretcherImpl.h \ + src/StretchCalculator.h \ + src/base/Profiler.h \ + src/base/RingBuffer.h \ + src/base/Scavenger.h \ + src/dsp/AudioCurveCalculator.h \ + src/dsp/SpectralDifferenceAudioCurve.h \ + src/dsp/Resampler.h \ + src/dsp/HighFrequencyAudioCurve.h \ + src/dsp/SilentAudioCurve.h \ + src/dsp/FFT.h \ + src/dsp/PercussiveAudioCurve.h \ + src/dsp/ConstantAudioCurve.h \ + src/dsp/Window.h \ + src/system/Allocators.h \ + src/system/Thread.h \ + src/system/VectorOps.h \ + src/system/sysutils.h LIBRARY_SOURCES := \ - src/AudioCurve.cpp \ - src/ConstantAudioCurve.cpp \ - src/FFT.cpp \ - src/HighFrequencyAudioCurve.cpp \ - src/PercussiveAudioCurve.cpp \ - src/Profiler.cpp \ - src/Resampler.cpp \ src/rubberband-c.cpp \ src/RubberBandStretcher.cpp \ - src/SilentAudioCurve.cpp \ - src/SpectralDifferenceAudioCurve.cpp \ - src/StretchCalculator.cpp \ - src/StretcherImpl.cpp \ src/StretcherProcess.cpp \ + src/StretchCalculator.cpp \ + src/base/Profiler.cpp \ + src/dsp/AudioCurveCalculator.cpp \ + src/dsp/SpectralDifferenceAudioCurve.cpp \ + src/dsp/HighFrequencyAudioCurve.cpp \ + src/dsp/SilentAudioCurve.cpp \ + src/dsp/ConstantAudioCurve.cpp \ + src/dsp/PercussiveAudioCurve.cpp \ + src/dsp/Resampler.cpp \ + src/dsp/FFT.cpp \ + src/system/Allocators.cpp \ + src/system/sysutils.cpp \ + src/system/Thread.cpp \ src/StretcherChannelData.cpp \ - src/Thread.cpp \ - src/Window.cpp \ - src/sysutils.cpp + src/StretcherImpl.cpp PROGRAM_SOURCES := \ - src/main.cpp + main/main.cpp VAMP_HEADERS := \ - src/vamp/RubberBandVampPlugin.h + vamp/RubberBandVampPlugin.h VAMP_SOURCES := \ - src/vamp/RubberBandVampPlugin.cpp \ - src/vamp/libmain.cpp + vamp/RubberBandVampPlugin.cpp \ + vamp/libmain.cpp LADSPA_HEADERS := \ - src/ladspa/RubberBandPitchShifter.h + ladspa/RubberBandPitchShifter.h LADSPA_SOURCES := \ - src/ladspa/RubberBandPitchShifter.cpp \ - src/ladspa/libmain.cpp + ladspa/RubberBandPitchShifter.cpp \ + ladspa/libmain.cpp LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o) LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o) @@ -160,97 +163,79 @@ clean: distclean: clean rm -f $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) +depend: + makedepend -Y $(LIBRARY_SOURCES) $(PROGRAM_SOURCES) + + # DO NOT DELETE -src/AudioCurve.o: src/AudioCurve.h src/sysutils.h -src/ConstantAudioCurve.o: src/ConstantAudioCurve.h src/AudioCurve.h -src/ConstantAudioCurve.o: src/sysutils.h -src/FFT.o: src/FFT.h src/sysutils.h src/Thread.h src/Profiler.h -src/HighFrequencyAudioCurve.o: src/HighFrequencyAudioCurve.h src/AudioCurve.h -src/HighFrequencyAudioCurve.o: src/sysutils.h src/Window.h -src/main.o: rubberband/RubberBandStretcher.h rubberband/rubberband-c.h -src/main.o: src/sysutils.h src/Profiler.h -src/PercussiveAudioCurve.o: src/PercussiveAudioCurve.h src/AudioCurve.h -src/PercussiveAudioCurve.o: src/sysutils.h -src/Profiler.o: src/Profiler.h src/sysutils.h -src/Resampler.o: src/Resampler.h src/sysutils.h src/Profiler.h -src/RingBuffer.o: src/RingBuffer.h src/Scavenger.h src/Thread.h -src/RingBuffer.o: src/sysutils.h src/Profiler.h +src/rubberband-c.o: rubberband/rubberband-c.h +src/rubberband-c.o: rubberband/RubberBandStretcher.h src/RubberBandStretcher.o: src/StretcherImpl.h -src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h -src/RubberBandStretcher.o: rubberband/rubberband-c.h src/Window.h -src/RubberBandStretcher.o: src/sysutils.h src/Thread.h src/RingBuffer.h -src/RubberBandStretcher.o: src/Scavenger.h src/Profiler.h src/FFT.h -src/SpectralDifferenceAudioCurve.o: src/SpectralDifferenceAudioCurve.h -src/SpectralDifferenceAudioCurve.o: src/AudioCurve.h src/sysutils.h -src/SpectralDifferenceAudioCurve.o: src/Window.h -src/StretchCalculator.o: src/StretchCalculator.h src/sysutils.h -src/StretcherChannelData.o: src/StretcherChannelData.h src/StretcherImpl.h -src/StretcherChannelData.o: rubberband/RubberBandStretcher.h -src/StretcherChannelData.o: rubberband/rubberband-c.h src/Window.h -src/StretcherChannelData.o: src/sysutils.h src/Thread.h src/RingBuffer.h -src/StretcherChannelData.o: src/Scavenger.h src/Profiler.h src/FFT.h -src/StretcherChannelData.o: src/Resampler.h -src/StretcherImpl.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h -src/StretcherImpl.o: rubberband/rubberband-c.h src/Window.h src/sysutils.h -src/StretcherImpl.o: src/Thread.h src/RingBuffer.h src/Scavenger.h -src/StretcherImpl.o: src/Profiler.h src/FFT.h src/PercussiveAudioCurve.h -src/StretcherImpl.o: src/AudioCurve.h src/HighFrequencyAudioCurve.h -src/StretcherImpl.o: src/SpectralDifferenceAudioCurve.h -src/StretcherImpl.o: src/ConstantAudioCurve.h src/StretchCalculator.h -src/StretcherImpl.o: src/StretcherChannelData.h src/Resampler.h +src/RubberBandStretcher.o: rubberband/RubberBandStretcher.h src/dsp/Window.h +src/RubberBandStretcher.o: src/dsp/FFT.h src/base/RingBuffer.h +src/RubberBandStretcher.o: src/base/Scavenger.h src/system/Thread.h +src/RubberBandStretcher.o: src/system/Thread.h src/system/sysutils.h src/StretcherProcess.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h -src/StretcherProcess.o: rubberband/rubberband-c.h src/Window.h -src/StretcherProcess.o: src/sysutils.h src/Thread.h src/RingBuffer.h -src/StretcherProcess.o: src/Scavenger.h src/Profiler.h src/FFT.h -src/StretcherProcess.o: src/PercussiveAudioCurve.h src/AudioCurve.h -src/StretcherProcess.o: src/HighFrequencyAudioCurve.h -src/StretcherProcess.o: src/ConstantAudioCurve.h src/StretchCalculator.h -src/StretcherProcess.o: src/StretcherChannelData.h src/Resampler.h -src/sysutils.o: src/sysutils.h -src/Thread.o: src/Thread.h -src/Window.o: src/Window.h src/sysutils.h -rubberband/RubberBandStretcher.o: rubberband/rubberband-c.h -src/AudioCurve.o: src/sysutils.h -src/ConstantAudioCurve.o: src/AudioCurve.h src/sysutils.h -src/FFT.o: src/sysutils.h -src/HighFrequencyAudioCurve.o: src/AudioCurve.h src/sysutils.h src/Window.h -src/PercussiveAudioCurve.o: src/AudioCurve.h src/sysutils.h -src/Profiler.o: src/sysutils.h -src/Resampler.o: src/sysutils.h -src/RingBuffer.o: src/Scavenger.h src/Thread.h src/sysutils.h src/Profiler.h -src/Scavenger.o: src/Thread.h src/sysutils.h -src/SpectralDifferenceAudioCurve.o: src/AudioCurve.h src/sysutils.h -src/SpectralDifferenceAudioCurve.o: src/Window.h -src/StretcherChannelData.o: src/StretcherImpl.h -src/StretcherChannelData.o: rubberband/RubberBandStretcher.h -src/StretcherChannelData.o: rubberband/rubberband-c.h src/Window.h -src/StretcherChannelData.o: src/sysutils.h src/Thread.h src/RingBuffer.h -src/StretcherChannelData.o: src/Scavenger.h src/Profiler.h src/FFT.h -src/StretcherImpl.o: rubberband/RubberBandStretcher.h -src/StretcherImpl.o: rubberband/rubberband-c.h src/Window.h src/sysutils.h -src/StretcherImpl.o: src/Thread.h src/RingBuffer.h src/Scavenger.h -src/StretcherImpl.o: src/Profiler.h src/FFT.h -src/rubberband-c.o: rubberband/RubberBandStretcher.h rubberband/rubberband-c.h -src/Window.o: src/sysutils.h -src/ladspa/libmain.o: src/ladspa/RubberBandPitchShifter.h -src/ladspa/libmain.o: src/RingBuffer.h src/Scavenger.h src/Thread.h -src/ladspa/libmain.o: src/sysutils.h src/Profiler.h -src/ladspa/RubberBandPitchShifter.o: src/ladspa/RubberBandPitchShifter.h -src/ladspa/RubberBandPitchShifter.o: src/RingBuffer.h -src/ladspa/RubberBandPitchShifter.o: src/Scavenger.h src/Thread.h -src/ladspa/RubberBandPitchShifter.o: src/sysutils.h src/Profiler.h -src/ladspa/RubberBandPitchShifter.o: rubberband/RubberBandStretcher.h -src/ladspa/RubberBandPitchShifter.o: rubberband/rubberband-c.h -src/vamp/libmain.o: src/vamp/RubberBandVampPlugin.h -src/vamp/libmain.o: rubberband/RubberBandStretcher.h -src/vamp/libmain.o: rubberband/rubberband-c.h -src/vamp/RubberBandVampPlugin.o: src/vamp/RubberBandVampPlugin.h -src/vamp/RubberBandVampPlugin.o: rubberband/RubberBandStretcher.h -src/vamp/RubberBandVampPlugin.o: rubberband/rubberband-c.h -src/vamp/RubberBandVampPlugin.o: src/StretchCalculator.h -src/ladspa/RubberBandPitchShifter.o: src/RingBuffer.h -src/ladspa/RubberBandPitchShifter.o: src/Scavenger.h src/Thread.h -src/ladspa/RubberBandPitchShifter.o: src/sysutils.h src/Profiler.h -src/vamp/RubberBandVampPlugin.o: rubberband/RubberBandStretcher.h -src/vamp/RubberBandVampPlugin.o: rubberband/rubberband-c.h +src/StretcherProcess.o: src/dsp/Window.h src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherProcess.o: src/base/Scavenger.h src/system/Thread.h +src/StretcherProcess.o: src/system/Thread.h src/system/sysutils.h +src/StretcherProcess.o: src/dsp/PercussiveAudioCurve.h +src/StretcherProcess.o: src/dsp/AudioCurveCalculator.h +src/StretcherProcess.o: src/dsp/HighFrequencyAudioCurve.h +src/StretcherProcess.o: src/dsp/ConstantAudioCurve.h src/StretchCalculator.h +src/StretcherProcess.o: src/StretcherChannelData.h src/dsp/Resampler.h +src/StretcherProcess.o: src/base/Profiler.h src/system/VectorOps.h +src/StretcherProcess.o: src/system/sysutils.h +src/StretchCalculator.o: src/StretchCalculator.h src/system/sysutils.h +src/system/Thread.o: src/system/Thread.h +src/base/Profiler.o: src/base/Profiler.h src/system/sysutils.h +src/dsp/AudioCurveCalculator.o: src/dsp/AudioCurveCalculator.h +src/dsp/AudioCurveCalculator.o: src/system/sysutils.h +src/dsp/SpectralDifferenceAudioCurve.o: src/dsp/SpectralDifferenceAudioCurve.h +src/dsp/SpectralDifferenceAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/dsp/SpectralDifferenceAudioCurve.o: src/system/sysutils.h +src/dsp/SpectralDifferenceAudioCurve.o: src/dsp/Window.h +src/dsp/SpectralDifferenceAudioCurve.o: src/system/VectorOps.h +src/dsp/SpectralDifferenceAudioCurve.o: src/system/sysutils.h +src/dsp/HighFrequencyAudioCurve.o: src/dsp/HighFrequencyAudioCurve.h +src/dsp/HighFrequencyAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/dsp/HighFrequencyAudioCurve.o: src/system/sysutils.h +src/dsp/SilentAudioCurve.o: src/dsp/SilentAudioCurve.h +src/dsp/SilentAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/dsp/SilentAudioCurve.o: src/system/sysutils.h +src/dsp/ConstantAudioCurve.o: src/dsp/ConstantAudioCurve.h +src/dsp/ConstantAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/dsp/ConstantAudioCurve.o: src/system/sysutils.h +src/dsp/PercussiveAudioCurve.o: src/dsp/PercussiveAudioCurve.h +src/dsp/PercussiveAudioCurve.o: src/dsp/AudioCurveCalculator.h +src/dsp/PercussiveAudioCurve.o: src/system/sysutils.h src/system/VectorOps.h +src/dsp/PercussiveAudioCurve.o: src/system/sysutils.h +src/dsp/Resampler.o: src/dsp/Resampler.h src/system/sysutils.h +src/dsp/Resampler.o: src/base/Profiler.h +src/dsp/FFT.o: src/dsp/FFT.h src/system/sysutils.h src/system/Thread.h +src/dsp/FFT.o: src/base/Profiler.h src/system/VectorOps.h +src/dsp/FFT.o: src/system/sysutils.h +src/system/Allocators.o: src/system/Allocators.h src/system/VectorOps.h +src/system/Allocators.o: src/system/sysutils.h +src/system/sysutils.o: src/system/sysutils.h +src/StretcherChannelData.o: src/StretcherChannelData.h src/StretcherImpl.h +src/StretcherChannelData.o: rubberband/RubberBandStretcher.h src/dsp/Window.h +src/StretcherChannelData.o: src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherChannelData.o: src/base/Scavenger.h src/system/Thread.h +src/StretcherChannelData.o: src/system/Thread.h src/system/sysutils.h +src/StretcherChannelData.o: src/dsp/Resampler.h src/system/Allocators.h +src/StretcherChannelData.o: src/system/VectorOps.h src/system/sysutils.h +src/StretcherImpl.o: src/StretcherImpl.h rubberband/RubberBandStretcher.h +src/StretcherImpl.o: src/dsp/Window.h src/dsp/FFT.h src/base/RingBuffer.h +src/StretcherImpl.o: src/base/Scavenger.h src/system/Thread.h src/system/Thread.h +src/StretcherImpl.o: src/system/sysutils.h src/dsp/PercussiveAudioCurve.h +src/StretcherImpl.o: src/dsp/AudioCurveCalculator.h +src/StretcherImpl.o: src/dsp/HighFrequencyAudioCurve.h +src/StretcherImpl.o: src/dsp/SpectralDifferenceAudioCurve.h src/dsp/Window.h +src/StretcherImpl.o: src/system/VectorOps.h src/system/sysutils.h +src/StretcherImpl.o: src/dsp/SilentAudioCurve.h src/dsp/ConstantAudioCurve.h +src/StretcherImpl.o: src/dsp/Resampler.h src/StretchCalculator.h +src/StretcherImpl.o: src/StretcherChannelData.h src/base/Profiler.h +main/main.o: rubberband/RubberBandStretcher.h src/system/sysutils.h +main/main.o: src/base/Profiler.h diff --git a/README b/README.txt similarity index 97% rename from README rename to README.txt index 192b091..ba292d5 100644 --- a/README +++ b/README.txt @@ -1,165 +1,165 @@ - -Rubber Band -=========== - -An audio time-stretching and pitch-shifting library and utility program. - -Copyright 2008-2009 Chris Cannam, cannam@all-day-breakfast.com. - -Distributed under the GNU General Public License. - -Rubber Band is a library and utility program that permits you to -change the tempo and pitch of an audio recording independently of one -another. - - -Attractive features -~~~~~~~~~~~~~~~~~~~ - - * High quality results suitable for musical use - - Rubber Band is a phase-vocoder-based frequency domain time - stretcher with phase resynchronisation at noisy transients and a - phase lamination technique to reduce phasiness. It is suitable for - most musical uses with its default settings, and has a range of - options for fine tuning. - - * Real-time capable - - In addition to the offline mode (for use in situations where all - audio data is available beforehand), Rubber Band supports a true - real-time, lock-free streaming mode, in which the time and pitch - scaling ratios may be dynamically adjusted during use. - - * Sample-accurate duration adjustment - - In offline mode, Rubber Band ensures that the output has exactly - the right number of samples for the given stretch ratio. (In - real-time mode Rubber Band aims to keep as closely as possible to - the exact ratio, although this depends on the audio material - itself.) - - * Multiprocessor/multi-core support - - Rubber Band's offline mode can take advantage of more than one - processor core if available, when processing data with two or more - audio channels. - - * No job too big, or too small - - Rubber Band is tuned so as to work well with the default settings - for any stretch ratio, from tiny deviations from the original - speed to very extreme stretches. - - * Handy utilities included - - The Rubber Band code includes a useful command-line time-stretch - and pitch shift utility (called simply rubberband), two LADSPA - pitch shifter plugins (Rubber Band Mono Pitch Shifter and Rubber - Band Stereo Pitch Shifter), and a Vamp audio analysis plugin which - may be used to inspect the stretch profile decisions Rubber Band - is taking. - - * Free Software - - Rubber Band is Free Software published under the GNU General - Public License. - - -Limitations -~~~~~~~~~~~ - - * Not especially fast - - The algorithm used by Rubber Band is very processor intensive, and - Rubber Band is not the fastest implementation on earth. - - * Not especially state of the art - - Rubber Band employs well known algorithms which work well in many - situations, but it isn't "cutting edge" in any interesting sense. - - * Relatively complex - - While the fundamental algorithms in Rubber Band are not especially - complex, the implementation is complicated by the support for - multiple processing modes, exact sample precision, threading, and - other features that add to the flexibility of the API. - - -Compiling Rubber Band ---------------------- - -Rubber Band is supplied with build scripts that have been tested on -Linux platforms. It is also possible to build Rubber Band on other -platforms, including both POSIX platforms such as OS/X and non-POSIX -platforms such as Win32. There are some example Makefiles in the misc -directory, but if you're using a proprietary platform and you get -stuck I'm afraid you're on your own, unless you want to pay us... - -To build Rubber Band you will also need libsndfile, libsamplerate, -FFTW3, the Vamp plugin SDK, the LADSPA plugin header, the pthread -library (except on Win32), and a C++ compiler. The code has been -tested with GCC 4.x and with the Intel C++ compiler. - -Rubber Band comes with a simple autoconf script. Run - - $ ./configure - $ make - -to compile, and optionally - - # make install - -to install. - - -Using the Rubber Band utility ------------------------------ - -The Rubber Band command-line utility builds as bin/rubberband. The -basic incantation is - - $ rubberband -t -p - -For example, - - $ rubberband -t 1.5 -p 2.0 test.wav output.wav - -stretches the file test.wav to 50% longer than its original duration, -shifts it up in pitch by one octave, and writes the output to output.wav. - -Several further options are available: run "rubberband -h" for help. -In particular, different types of music may benefit from different -"crispness" options (-c where is from 0 to 5). - - -Using the Rubber Band library ------------------------------ - -The Rubber Band library has a public API that consists of one C++ -class, called RubberBandStretcher in the RubberBand namespace. You -should #include to use this class. -There is extensive documentation in the class header. - -A header with C language bindings is also provided in -. This is a wrapper around the C++ -implementation, and as the implementation is the same, it also -requires linkage against the C++ standard libraries. It is not yet -documented separately from the C++ header. You should include only -one of the two headers, not both. - -The source code for the command-line utility (src/main.cpp) provides a -good example of how to use Rubber Band in offline mode; the LADSPA -pitch shifter plugin (src/ladspa/RubberBandPitchShifter.cpp) may be -used as an example of Rubber Band in real-time mode. - -IMPORTANT: Please ensure you have read and understood the licensing -terms for Rubber Band before using it in another application. This -library is provided under the GNU General Public License, which means -that any application that uses it must also be published under the GPL -or a compatible license (i.e. with its full source code also available -for modification and redistribution). See the file COPYING for more -details. Alternative commercial and proprietary licensing terms are -available; please contact the author if you are interested. - + +Rubber Band +=========== + +An audio time-stretching and pitch-shifting library and utility program. + +Copyright 2008-2009 Chris Cannam, cannam@all-day-breakfast.com. + +Distributed under the GNU General Public License. + +Rubber Band is a library and utility program that permits you to +change the tempo and pitch of an audio recording independently of one +another. + + +Attractive features +~~~~~~~~~~~~~~~~~~~ + + * High quality results suitable for musical use + + Rubber Band is a phase-vocoder-based frequency domain time + stretcher with phase resynchronisation at noisy transients and a + phase lamination technique to reduce phasiness. It is suitable for + most musical uses with its default settings, and has a range of + options for fine tuning. + + * Real-time capable + + In addition to the offline mode (for use in situations where all + audio data is available beforehand), Rubber Band supports a true + real-time, lock-free streaming mode, in which the time and pitch + scaling ratios may be dynamically adjusted during use. + + * Sample-accurate duration adjustment + + In offline mode, Rubber Band ensures that the output has exactly + the right number of samples for the given stretch ratio. (In + real-time mode Rubber Band aims to keep as closely as possible to + the exact ratio, although this depends on the audio material + itself.) + + * Multiprocessor/multi-core support + + Rubber Band's offline mode can take advantage of more than one + processor core if available, when processing data with two or more + audio channels. + + * No job too big, or too small + + Rubber Band is tuned so as to work well with the default settings + for any stretch ratio, from tiny deviations from the original + speed to very extreme stretches. + + * Handy utilities included + + The Rubber Band code includes a useful command-line time-stretch + and pitch shift utility (called simply rubberband), two LADSPA + pitch shifter plugins (Rubber Band Mono Pitch Shifter and Rubber + Band Stereo Pitch Shifter), and a Vamp audio analysis plugin which + may be used to inspect the stretch profile decisions Rubber Band + is taking. + + * Free Software + + Rubber Band is Free Software published under the GNU General + Public License. + + +Limitations +~~~~~~~~~~~ + + * Not especially fast + + The algorithm used by Rubber Band is very processor intensive, and + Rubber Band is not the fastest implementation on earth. + + * Not especially state of the art + + Rubber Band employs well known algorithms which work well in many + situations, but it isn't "cutting edge" in any interesting sense. + + * Relatively complex + + While the fundamental algorithms in Rubber Band are not especially + complex, the implementation is complicated by the support for + multiple processing modes, exact sample precision, threading, and + other features that add to the flexibility of the API. + + +Compiling Rubber Band +--------------------- + +Rubber Band is supplied with build scripts that have been tested on +Linux platforms. It is also possible to build Rubber Band on other +platforms, including both POSIX platforms such as OS/X and non-POSIX +platforms such as Win32. There are some example Makefiles in the misc +directory, but if you're using a proprietary platform and you get +stuck I'm afraid you're on your own, unless you want to pay us... + +To build Rubber Band you will also need libsndfile, libsamplerate, +FFTW3, the Vamp plugin SDK, the LADSPA plugin header, the pthread +library (except on Win32), and a C++ compiler. The code has been +tested with GCC 4.x and with the Intel C++ compiler. + +Rubber Band comes with a simple autoconf script. Run + + $ ./configure + $ make + +to compile, and optionally + + # make install + +to install. + + +Using the Rubber Band utility +----------------------------- + +The Rubber Band command-line utility builds as bin/rubberband. The +basic incantation is + + $ rubberband -t -p + +For example, + + $ rubberband -t 1.5 -p 2.0 test.wav output.wav + +stretches the file test.wav to 50% longer than its original duration, +shifts it up in pitch by one octave, and writes the output to output.wav. + +Several further options are available: run "rubberband -h" for help. +In particular, different types of music may benefit from different +"crispness" options (-c where is from 0 to 5). + + +Using the Rubber Band library +----------------------------- + +The Rubber Band library has a public API that consists of one C++ +class, called RubberBandStretcher in the RubberBand namespace. You +should #include to use this class. +There is extensive documentation in the class header. + +A header with C language bindings is also provided in +. This is a wrapper around the C++ +implementation, and as the implementation is the same, it also +requires linkage against the C++ standard libraries. It is not yet +documented separately from the C++ header. You should include only +one of the two headers, not both. + +The source code for the command-line utility (src/main.cpp) provides a +good example of how to use Rubber Band in offline mode; the LADSPA +pitch shifter plugin (src/ladspa/RubberBandPitchShifter.cpp) may be +used as an example of Rubber Band in real-time mode. + +IMPORTANT: Please ensure you have read and understood the licensing +terms for Rubber Band before using it in another application. This +library is provided under the GNU General Public License, which means +that any application that uses it must also be published under the GPL +or a compatible license (i.e. with its full source code also available +for modification and redistribution). See the file COPYING for more +details. Alternative commercial and proprietary licensing terms are +available; please contact the author if you are interested. + diff --git a/src/ladspa/RubberBandPitchShifter.cpp b/ladspa/RubberBandPitchShifter.cpp similarity index 99% rename from src/ladspa/RubberBandPitchShifter.cpp rename to ladspa/RubberBandPitchShifter.cpp index 6839124..88a9a1e 100644 --- a/src/ladspa/RubberBandPitchShifter.cpp +++ b/ladspa/RubberBandPitchShifter.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/ladspa/RubberBandPitchShifter.h b/ladspa/RubberBandPitchShifter.h similarity index 97% rename from src/ladspa/RubberBandPitchShifter.h rename to ladspa/RubberBandPitchShifter.h index f2f351b..6cdc615 100644 --- a/src/ladspa/RubberBandPitchShifter.h +++ b/ladspa/RubberBandPitchShifter.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -17,7 +17,7 @@ #include -#include "RingBuffer.h" +#include "base/RingBuffer.h" namespace RubberBand { class RubberBandStretcher; diff --git a/src/ladspa/ladspa-plugin.map b/ladspa/ladspa-plugin.map similarity index 100% rename from src/ladspa/ladspa-plugin.map rename to ladspa/ladspa-plugin.map diff --git a/src/ladspa/ladspa-rubberband.cat b/ladspa/ladspa-rubberband.cat similarity index 100% rename from src/ladspa/ladspa-rubberband.cat rename to ladspa/ladspa-rubberband.cat diff --git a/src/ladspa/ladspa-rubberband.rdf b/ladspa/ladspa-rubberband.rdf similarity index 100% rename from src/ladspa/ladspa-rubberband.rdf rename to ladspa/ladspa-rubberband.rdf diff --git a/src/ladspa/libmain.cpp b/ladspa/libmain.cpp similarity index 94% rename from src/ladspa/libmain.cpp rename to ladspa/libmain.cpp index d949e81..59597d5 100644 --- a/src/ladspa/libmain.cpp +++ b/ladspa/libmain.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/main.cpp b/main/main.cpp similarity index 98% rename from src/main.cpp rename to main/main.cpp index ea55b77..0323bd6 100644 --- a/src/main.cpp +++ b/main/main.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -12,7 +12,7 @@ COPYING included with this distribution for more information. */ -#include "RubberBandStretcher.h" +#include "rubberband/RubberBandStretcher.h" #include #include @@ -20,16 +20,18 @@ #include #include #include -#include "sysutils.h" + +#include "system/sysutils.h" #ifdef __MSVC__ -#include "bsd-3rdparty/getopt/getopt.h" +#include "getopt/getopt.h" #else #include +#include #include #endif -#include "Profiler.h" +#include "base/Profiler.h" using namespace std; using namespace RubberBand; @@ -117,7 +119,7 @@ int main(int argc, char **argv) { "pitch-hq", 0, 0, '%' }, { "threads", 0, 0, '@' }, { "quiet", 0, 0, 'q' }, - { 0, 0, 0 } + { 0, 0, 0, 0 } }; c = getopt_long(argc, argv, "t:p:d:RPFc:f:T:D:qhV", longOpts, &optionIndex); @@ -158,7 +160,7 @@ int main(int argc, char **argv) cerr << endl; cerr << "Rubber Band" << endl; cerr << "An audio time-stretching and pitch-shifting library and utility program." << endl; - cerr << "Copyright 2008 Chris Cannam. Distributed under the GNU General Public License." << endl; + cerr << "Copyright 2009 Chris Cannam. Distributed under the GNU General Public License." << endl; cerr << endl; cerr << " Usage: " << argv[0] << " [options] " << endl; cerr << endl; @@ -521,7 +523,7 @@ int main(int argc, char **argv) cerr << "elapsed time: " << sec << " sec, in frames/sec: " << countIn/sec << ", out frames/sec: " << countOut/sec << endl; } - Profiler::dump(); + RubberBand::Profiler::dump(); return 0; } diff --git a/rubberband.pc.in b/rubberband.pc.in index 96a3cc3..bab4799 100644 --- a/rubberband.pc.in +++ b/rubberband.pc.in @@ -4,7 +4,7 @@ libdir=${exec_prefix}/lib includedir=${prefix}/include Name: rubberband -Version: 1.3 +Version: 1.4.0 Description: Libs: -L${libdir} -lrubberband Cflags: -I${includedir} diff --git a/rubberband/RubberBandStretcher.h b/rubberband/RubberBandStretcher.h index 1e676f2..fae5838 100644 --- a/rubberband/RubberBandStretcher.h +++ b/rubberband/RubberBandStretcher.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,9 +15,9 @@ #ifndef _RUBBERBANDSTRETCHER_H_ #define _RUBBERBANDSTRETCHER_H_ -#define RUBBERBAND_VERSION "1.3.0-gpl" +#define RUBBERBAND_VERSION "1.4.0-gpl" #define RUBBERBAND_API_MAJOR_VERSION 2 -#define RUBBERBAND_API_MINOR_VERSION 0 +#define RUBBERBAND_API_MINOR_VERSION 1 #include diff --git a/rubberband/rubberband-c.h b/rubberband/rubberband-c.h index a2cfe76..95db61d 100644 --- a/rubberband/rubberband-c.h +++ b/rubberband/rubberband-c.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -19,9 +19,9 @@ extern "C" { #endif -#define RUBBERBAND_VERSION "1.3.0-gpl" +#define RUBBERBAND_VERSION "1.4.0-gpl" #define RUBBERBAND_API_MAJOR_VERSION 2 -#define RUBBERBAND_API_MINOR_VERSION 0 +#define RUBBERBAND_API_MINOR_VERSION 1 /** * This is a C-linkage interface to the Rubber Band time stretcher. diff --git a/src/AudioCurve.cpp b/src/AudioCurve.cpp deleted file mode 100644 index 8cf247b..0000000 --- a/src/AudioCurve.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Rubber Band - An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -#include "AudioCurve.h" - -#include -using namespace std; - -namespace RubberBand -{ - -AudioCurve::AudioCurve(size_t sampleRate, size_t windowSize) : - m_sampleRate(sampleRate), - m_windowSize(windowSize) -{ -} - -AudioCurve::~AudioCurve() -{ -} - -float -AudioCurve::processDouble(const double *R__ mag, size_t increment) -{ - cerr << "AudioCurve::processDouble: WARNING: Using inefficient and lossy conversion for AudioCurve::process(float)" << endl; - float *tmp = new float[m_windowSize]; - for (int i = 0; i < int(m_windowSize); ++i) tmp[i] = float(mag[i]); - float df = process(tmp, increment); - delete[] tmp; - return df; -} - -} diff --git a/src/RubberBandStretcher.cpp b/src/RubberBandStretcher.cpp index 7e249c6..2e66259 100644 --- a/src/RubberBandStretcher.cpp +++ b/src/RubberBandStretcher.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/SpectralDifferenceAudioCurve.cpp b/src/SpectralDifferenceAudioCurve.cpp deleted file mode 100644 index e391e39..0000000 --- a/src/SpectralDifferenceAudioCurve.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Rubber Band - An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -#include "SpectralDifferenceAudioCurve.h" - -namespace RubberBand -{ - -SpectralDifferenceAudioCurve::SpectralDifferenceAudioCurve(size_t sampleRate, size_t windowSize) : - AudioCurve(sampleRate, windowSize) -{ - m_prevMag = new float[m_windowSize/2 + 1]; - - for (size_t i = 0; i <= m_windowSize/2; ++i) { - m_prevMag[i] = 0.f; - } -} - -SpectralDifferenceAudioCurve::~SpectralDifferenceAudioCurve() -{ - delete[] m_prevMag; -} - -void -SpectralDifferenceAudioCurve::reset() -{ - for (size_t i = 0; i <= m_windowSize/2; ++i) { - m_prevMag[i] = 0; - } -} - -void -SpectralDifferenceAudioCurve::setWindowSize(size_t newSize) -{ - delete[] m_prevMag; - m_windowSize = newSize; - - m_prevMag = new float[m_windowSize/2 + 1]; - - reset(); -} - -float -SpectralDifferenceAudioCurve::process(const float *R__ mag, size_t increment) -{ - float result = 0.0; - - for (size_t n = 0; n <= m_windowSize / 2; ++n) { - result += sqrtf(fabsf((mag[n] * mag[n]) - - (m_prevMag[n] * m_prevMag[n]))); - m_prevMag[n] = mag[n]; - } - - return result; -} - -float -SpectralDifferenceAudioCurve::processDouble(const double *R__ mag, size_t increment) -{ - float result = 0.0; - - for (size_t n = 0; n <= m_windowSize / 2; ++n) { - result += sqrtf(fabsf((mag[n] * mag[n]) - - (m_prevMag[n] * m_prevMag[n]))); - m_prevMag[n] = (float)mag[n]; - } - - return result; -} - -} - diff --git a/src/StretchCalculator.cpp b/src/StretchCalculator.cpp index e5fc019..5ccb7bd 100644 --- a/src/StretchCalculator.cpp +++ b/src/StretchCalculator.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -21,7 +21,7 @@ #include #include -#include "sysutils.h" +#include "system/sysutils.h" namespace RubberBand { @@ -659,7 +659,12 @@ StretchCalculator::distributeRegion(const std::vector &dfIn, maxDf = 0; float adj = 0; - while (!acceptableSquashRange) { + const int acceptableIterations = 10; + int iteration = 0; + + while (!acceptableSquashRange && iteration < acceptableIterations) { + + ++iteration; acceptableSquashRange = true; calculateDisplacements(df, maxDf, totalDisplacement, maxDisplacement, @@ -682,21 +687,22 @@ StretchCalculator::distributeRegion(const std::vector &dfIn, int extremeIncrement = m_increment + lrint((toAllot * maxDisplacement) / totalDisplacement); if (ratio < 1.0) { if (extremeIncrement > lrint(ceil(m_increment * ratio))) { - std::cerr << "ERROR: extreme increment " << extremeIncrement << " > " << m_increment * ratio << " (this should not happen)" << std::endl; + std::cerr << "WARNING: extreme increment " << extremeIncrement << " > " << m_increment * ratio << std::endl; } else if (extremeIncrement < (m_increment * ratio) / 2) { if (m_debugLevel > 0) { - std::cerr << "WARNING: extreme increment " << extremeIncrement << " < " << (m_increment * ratio) / 2 << std::endl; + std::cerr << "NOTE: extreme increment " << extremeIncrement << " < " << (m_increment * ratio) / 2 << ", adjusting" << std::endl; } acceptableSquashRange = false; } } else { if (extremeIncrement > m_increment * ratio * 2) { if (m_debugLevel > 0) { - std::cerr << "WARNING: extreme increment " << extremeIncrement << " > " << m_increment * ratio * 2 << std::endl; + std::cerr << "NOTE: extreme increment " << extremeIncrement << " > " << m_increment * ratio * 2 << ", adjusting" << std::endl; + } acceptableSquashRange = false; } else if (extremeIncrement < lrint(floor(m_increment * ratio))) { - std::cerr << "ERROR: extreme increment " << extremeIncrement << " < " << m_increment * ratio << " (I thought this couldn't happen?)" << std::endl; + std::cerr << "WARNING: extreme increment " << extremeIncrement << " < " << m_increment * ratio << std::endl; } } @@ -708,6 +714,13 @@ StretchCalculator::distributeRegion(const std::vector &dfIn, } } + if (!acceptableSquashRange) { + std::cerr << "WARNING: No acceptable displacement adjustment found, using defaults:\nthis region will probably sound bad" << std::endl; + adj = 0; + calculateDisplacements(df, maxDf, totalDisplacement, maxDisplacement, + adj); + } + for (size_t i = 0; i < df.size(); ++i) { double displacement = maxDf - df[i]; diff --git a/src/StretchCalculator.h b/src/StretchCalculator.h index e79c8e3..f0a5c19 100644 --- a/src/StretchCalculator.h +++ b/src/StretchCalculator.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/StretcherChannelData.cpp b/src/StretcherChannelData.cpp index 240df23..6b66e58 100644 --- a/src/StretcherChannelData.cpp +++ b/src/StretcherChannelData.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -14,8 +14,9 @@ #include "StretcherChannelData.h" -#include "Resampler.h" +#include "dsp/Resampler.h" +#include "system/Allocators.h" namespace RubberBand { @@ -64,19 +65,19 @@ RubberBandStretcher::Impl::ChannelData::construct(const std::set &window inbuf = new RingBuffer(maxSize); outbuf = new RingBuffer(outbufSize); - mag = allocDouble(realSize); - phase = allocDouble(realSize); - prevPhase = allocDouble(realSize); - prevError = allocDouble(realSize); - unwrappedPhase = allocDouble(realSize); - envelope = allocDouble(realSize); + mag = allocate(realSize); + phase = allocate(realSize); + prevPhase = allocate(realSize); + prevError = allocate(realSize); + unwrappedPhase = allocate(realSize); + envelope = allocate(realSize); freqPeak = new size_t[realSize]; - fltbuf = allocFloat(maxSize); + fltbuf = allocate(maxSize); - accumulator = allocFloat(maxSize); - windowAccumulator = allocFloat(maxSize); + accumulator = allocate(maxSize); + windowAccumulator = allocate(maxSize); for (std::set::const_iterator i = windowSizes.begin(); i != windowSizes.end(); ++i) { @@ -122,7 +123,7 @@ RubberBandStretcher::Impl::ChannelData::setWindowSize(size_t windowSize) // std::cerr << "ChannelData::setWindowSize(" << windowSize << ") [from " << oldSize << "]" << std::endl; - if (oldSize >= windowSize) { + if (oldSize >= windowSize) { //!!! shurely >= realSize? // no need to reallocate buffers, just reselect fft @@ -170,32 +171,33 @@ RubberBandStretcher::Impl::ChannelData::setWindowSize(size_t windowSize) // We don't want to preserve data in these arrays - mag = allocDouble(mag, realSize); - phase = allocDouble(phase, realSize); - prevPhase = allocDouble(prevPhase, realSize); - prevError = allocDouble(prevError, realSize); - unwrappedPhase = allocDouble(unwrappedPhase, realSize); - envelope = allocDouble(envelope, realSize); + mag = reallocate(mag, oldSize, realSize); + phase = reallocate(phase, oldSize, realSize); + prevPhase = reallocate(prevPhase, oldSize, realSize); + prevError = reallocate(prevError, oldSize, realSize); + unwrappedPhase = reallocate(unwrappedPhase, oldSize, realSize); + envelope = reallocate(envelope, oldSize, realSize); delete[] freqPeak; freqPeak = new size_t[realSize]; - fltbuf = allocFloat(fltbuf, windowSize); + deallocate(fltbuf); + fltbuf = allocate(windowSize); // But we do want to preserve data in these - float *newAcc = allocFloat(windowSize); + float *newAcc = allocate(windowSize); - for (size_t i = 0; i < oldSize; ++i) newAcc[i] = accumulator[i]; + v_copy(newAcc, accumulator, oldSize); - freeFloat(accumulator); + deallocate(accumulator); accumulator = newAcc; - newAcc = allocFloat(windowSize); + newAcc = allocate(windowSize); - for (size_t i = 0; i < oldSize; ++i) newAcc[i] = windowAccumulator[i]; + v_copy(newAcc, windowAccumulator, oldSize); - freeFloat(windowAccumulator); + deallocate(windowAccumulator); windowAccumulator = newAcc; //!!! and resampler? @@ -243,7 +245,7 @@ RubberBandStretcher::Impl::ChannelData::setOutbufSize(size_t outbufSize) void RubberBandStretcher::Impl::ChannelData::setResampleBufSize(size_t sz) { - resamplebuf = allocFloat(resamplebuf, sz); + resamplebuf = reallocate(resamplebuf, resamplebufSize, sz); resamplebufSize = sz; } @@ -251,21 +253,21 @@ RubberBandStretcher::Impl::ChannelData::~ChannelData() { delete resampler; - freeFloat(resamplebuf); + deallocate(resamplebuf); delete inbuf; delete outbuf; - freeDouble(mag); - freeDouble(phase); - freeDouble(prevPhase); - freeDouble(prevError); - freeDouble(unwrappedPhase); - freeDouble(envelope); + deallocate(mag); + deallocate(phase); + deallocate(prevPhase); + deallocate(prevError); + deallocate(unwrappedPhase); + deallocate(envelope); delete[] freqPeak; - freeFloat(accumulator); - freeFloat(windowAccumulator); - freeFloat(fltbuf); + deallocate(accumulator); + deallocate(windowAccumulator); + deallocate(fltbuf); for (std::map::iterator i = ffts.begin(); i != ffts.end(); ++i) { diff --git a/src/StretcherChannelData.h b/src/StretcherChannelData.h index b56a6e0..594e893 100644 --- a/src/StretcherChannelData.h +++ b/src/StretcherChannelData.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -21,11 +21,11 @@ //#define EXPERIMENT 1 +namespace RubberBand { class Resampler; } + namespace RubberBand { -class Resampler; - class RubberBandStretcher::Impl::ChannelData { public: diff --git a/src/StretcherImpl.cpp b/src/StretcherImpl.cpp index 7ec7c16..a501318 100644 --- a/src/StretcherImpl.cpp +++ b/src/StretcherImpl.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -13,21 +13,30 @@ */ #include "StretcherImpl.h" -#include "PercussiveAudioCurve.h" -#include "HighFrequencyAudioCurve.h" -#include "SpectralDifferenceAudioCurve.h" -#include "SilentAudioCurve.h" -#include "ConstantAudioCurve.h" + +#include "dsp/PercussiveAudioCurve.h" +#include "dsp/HighFrequencyAudioCurve.h" +#include "dsp/SpectralDifferenceAudioCurve.h" +#include "dsp/SilentAudioCurve.h" +#include "dsp/ConstantAudioCurve.h" +#include "dsp/Resampler.h" + #include "StretchCalculator.h" #include "StretcherChannelData.h" -#include "Resampler.h" -#include "Profiler.h" + +#include "base/Profiler.h" + +#ifndef _WIN32 +#include +#endif #include #include #include #include +using namespace RubberBand; + using std::cerr; using std::endl; using std::vector; @@ -36,7 +45,6 @@ using std::set; using std::max; using std::min; - namespace RubberBand { const size_t @@ -48,7 +56,7 @@ RubberBandStretcher::Impl::m_defaultWindowSize = 2048; int RubberBandStretcher::Impl::m_defaultDebugLevel = 0; - +static bool _initialised = false; RubberBandStretcher::Impl::Impl(size_t sampleRate, size_t channels, @@ -85,6 +93,10 @@ RubberBandStretcher::Impl::Impl(size_t sampleRate, m_freq2(12000), m_baseWindowSize(m_defaultWindowSize) { + if (!_initialised) { + system_specific_initialise(); + _initialised = true; + } if (m_debugLevel > 0) { cerr << "RubberBandStretcher::Impl::Impl: rate = " << m_sampleRate << ", options = " << options << endl; @@ -844,15 +856,15 @@ RubberBandStretcher::Impl::study(const float *const *input, size_t samples, bool m_studyFFT->forwardMagnitude(cd.accumulator, cd.fltbuf); - float df = m_phaseResetAudioCurve->process(cd.fltbuf, m_increment); + float df = m_phaseResetAudioCurve->processFloat(cd.fltbuf, m_increment); m_phaseResetDf.push_back(df); // cout << m_phaseResetDf.size() << " [" << final << "] -> " << df << " \t: "; - df = m_stretchAudioCurve->process(cd.fltbuf, m_increment); + df = m_stretchAudioCurve->processFloat(cd.fltbuf, m_increment); m_stretchDf.push_back(df); - df = m_silentAudioCurve->process(cd.fltbuf, m_increment); + df = m_silentAudioCurve->processFloat(cd.fltbuf, m_increment); bool silent = (df > 0.f); if (silent && m_debugLevel > 1) { cerr << "silence found at " << m_inputDuration << endl; @@ -1111,9 +1123,11 @@ RubberBandStretcher::Impl::process(const float *const *input, size_t samples, bo i != m_threadSet.end(); ++i) { (*i)->signalDataAvailable(); } + m_spaceAvailable.lock(); if (!allConsumed) { m_spaceAvailable.wait(500); } + m_spaceAvailable.unlock(); /* } else { if (!allConsumed) { diff --git a/src/StretcherImpl.h b/src/StretcherImpl.h index 996c61b..abaf8ab 100644 --- a/src/StretcherImpl.h +++ b/src/StretcherImpl.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,20 +15,24 @@ #ifndef _RUBBERBAND_STRETCHERIMPL_H_ #define _RUBBERBAND_STRETCHERIMPL_H_ -#include "RubberBandStretcher.h" +#include "rubberband/RubberBandStretcher.h" -#include "Window.h" -#include "Thread.h" -#include "RingBuffer.h" -#include "FFT.h" -#include "sysutils.h" +#include "dsp/Window.h" +#include "dsp/FFT.h" + +#include "base/RingBuffer.h" +#include "system/Thread.h" +#include "system/sysutils.h" #include +using namespace RubberBand; + +namespace RubberBand { class AudioCurveCalculator; } + namespace RubberBand { -class AudioCurve; class StretchCalculator; class RubberBandStretcher::Impl @@ -177,9 +181,9 @@ protected: mutable RingBuffer m_lastProcessOutputIncrements; mutable RingBuffer m_lastProcessPhaseResetDf; - AudioCurve *m_phaseResetAudioCurve; - AudioCurve *m_stretchAudioCurve; - AudioCurve *m_silentAudioCurve; + AudioCurveCalculator *m_phaseResetAudioCurve; + AudioCurveCalculator *m_stretchAudioCurve; + AudioCurveCalculator *m_silentAudioCurve; StretchCalculator *m_stretchCalculator; float m_freq0; diff --git a/src/StretcherProcess.cpp b/src/StretcherProcess.cpp index 5df48ac..1715baa 100644 --- a/src/StretcherProcess.cpp +++ b/src/StretcherProcess.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -13,13 +13,21 @@ */ #include "StretcherImpl.h" -#include "PercussiveAudioCurve.h" -#include "HighFrequencyAudioCurve.h" -#include "ConstantAudioCurve.h" + +#include "dsp/PercussiveAudioCurve.h" +#include "dsp/HighFrequencyAudioCurve.h" +#include "dsp/ConstantAudioCurve.h" + #include "StretchCalculator.h" #include "StretcherChannelData.h" -#include "Resampler.h" -#include "Profiler.h" + +#include "dsp/Resampler.h" +#include "base/Profiler.h" +#include "system/VectorOps.h" + +#ifndef _WIN32 +#include +#endif #include #include @@ -27,6 +35,7 @@ #include #include +using namespace RubberBand; using std::cerr; using std::endl; @@ -62,14 +71,17 @@ RubberBandStretcher::Impl::ProcessThread::run() if (last) break; - if (any) m_s->m_spaceAvailable.signal(); + if (any) { + m_s->m_spaceAvailable.lock(); + m_s->m_spaceAvailable.signal(); + m_s->m_spaceAvailable.unlock(); + } m_dataAvailable.lock(); if (!m_s->testInbufReadSpace(m_channel) && !m_abandoning) { m_dataAvailable.wait(50000); // bounded in case of abandonment - } else { - m_dataAvailable.unlock(); } + m_dataAvailable.unlock(); if (m_abandoning) { if (m_s->m_debugLevel > 1) { @@ -81,7 +93,9 @@ RubberBandStretcher::Impl::ProcessThread::run() bool any = false, last = false; m_s->processChunks(m_channel, any, last); + m_s->m_spaceAvailable.lock(); m_s->m_spaceAvailable.signal(); + m_s->m_spaceAvailable.unlock(); if (m_s->m_debugLevel > 1) { cerr << "thread " << m_channel << " done" << endl; @@ -91,7 +105,9 @@ RubberBandStretcher::Impl::ProcessThread::run() void RubberBandStretcher::Impl::ProcessThread::signalDataAvailable() { + m_dataAvailable.lock(); m_dataAvailable.signal(); + m_dataAvailable.unlock(); } void @@ -454,13 +470,9 @@ RubberBandStretcher::Impl::calculateIncrements(size_t &phaseIncrementRtn, double *tmp = (double *)alloca(hs * sizeof(double)); - for (int i = 0; i < hs; ++i) { - tmp[i] = 0.0; - } + v_zero(tmp, hs); for (size_t c = 0; c < m_channels; ++c) { - for (int i = 0; i < hs; ++i) { - tmp[i] += m_channelData[c]->mag[i]; - } + v_add(tmp, m_channelData[c]->mag, hs); } df = m_phaseResetAudioCurve->processDouble(tmp, m_increment); @@ -630,18 +642,13 @@ RubberBandStretcher::Impl::analyseChunk(size_t channel) dblbuf[i + bufsiz/2] = tmp; } } else { - for (i = 0; i < hs; ++i) { - dblbuf[i] = fltbuf[i + hs]; - dblbuf[i + hs] = fltbuf[i]; - } + v_convert(dblbuf, fltbuf + hs, hs); + v_convert(dblbuf + hs, fltbuf, hs); } cd.fft->forwardPolar(dblbuf, cd.mag, cd.phase); } -static inline double mod(double x, double y) { return x - (y * floor(x / y)); } -static inline double princarg(double a) { return mod(a + M_PI, -2.0 * M_PI) + M_PI; } - void RubberBandStretcher::Impl::modifyChunk(size_t channel, size_t outputIncrement, @@ -800,14 +807,11 @@ RubberBandStretcher::Impl::formantShiftChunk(size_t channel) const int sz = m_windowSize; const int hs = m_windowSize/2; - const double denom = sz; - + const double factor = 1.0 / sz; cd.fft->inverseCepstral(mag, dblbuf); - for (int i = 0; i < sz; ++i) { - dblbuf[i] /= denom; - } + v_scale(dblbuf, factor, sz); const int cutoff = m_sampleRate / 700; @@ -822,13 +826,8 @@ RubberBandStretcher::Impl::formantShiftChunk(size_t channel) cd.fft->forward(dblbuf, envelope, 0); - - for (int i = 0; i <= hs; ++i) { - envelope[i] = exp(envelope[i]); - } - for (int i = 0; i <= hs; ++i) { - mag[i] /= envelope[i]; - } + v_exp(envelope, hs + 1); + v_divide(mag, envelope, hs + 1); if (m_pitchScale > 1.0) { // scaling up, we want a new envelope that is lower by the pitch factor @@ -849,9 +848,7 @@ RubberBandStretcher::Impl::formantShiftChunk(size_t channel) } } - for (int i = 0; i <= hs; ++i) { - mag[i] *= envelope[i]; - } + v_multiply(mag, envelope, hs+1); cd.unchanged = false; } @@ -898,36 +895,23 @@ RubberBandStretcher::Impl::synthesiseChunk(size_t channel) fltbuf[i] = float(dblbuf[i + offset]); } } else { - for (i = 0; i < hs; ++i) { - fltbuf[i] = float(dblbuf[i + hs]); - } - for (i = 0; i < hs; ++i) { - fltbuf[i + hs] = float(dblbuf[i]); - } + v_convert(fltbuf, dblbuf + hs, hs); + v_convert(fltbuf + hs, dblbuf, hs); } - float denom = float(sz * cd.oversample); - // our ffts produced unscaled results - for (i = 0; i < sz; ++i) { - fltbuf[i] = fltbuf[i] / denom; - } + float factor = 1.f / float(sz * cd.oversample); + v_scale(fltbuf, factor, sz); } m_window->cut(fltbuf); - for (i = 0; i < sz; ++i) { - accumulator[i] += fltbuf[i]; - } + v_add(accumulator, fltbuf, sz); cd.accumulatorFill = m_windowSize; float fixed = m_window->getArea() * 1.5f; - - for (i = 0; i < sz; ++i) { - float val = m_window->getValue(i); - windowAccumulator[i] += val * fixed; - } + m_window->add(windowAccumulator, fixed); } void @@ -949,11 +933,7 @@ RubberBandStretcher::Impl::writeChunk(size_t channel, size_t shiftIncrement, boo cerr << "writeChunk(" << channel << ", " << shiftIncrement << ", " << last << ")" << endl; } - for (i = 0; i < si; ++i) { - if (windowAccumulator[i] > 0.f) { - accumulator[i] /= windowAccumulator[i]; - } - } + v_divide(accumulator, windowAccumulator, si); // for exact sample scaling (probably not meaningful if we // were running in RT mode) @@ -995,22 +975,12 @@ RubberBandStretcher::Impl::writeChunk(size_t channel, size_t shiftIncrement, boo writeOutput(*cd.outbuf, accumulator, si, cd.outCount, theoreticalOut); } + + v_move(accumulator, accumulator + si, sz - si); + v_zero(accumulator + sz - si, si); - for (i = 0; i < sz - si; ++i) { - accumulator[i] = accumulator[i + si]; - } - - for (i = sz - si; i < sz; ++i) { - accumulator[i] = 0.0f; - } - - for (i = 0; i < sz - si; ++i) { - windowAccumulator[i] = windowAccumulator[i + si]; - } - - for (i = sz - si; i < sz; ++i) { - windowAccumulator[i] = 0.0f; - } + v_move(windowAccumulator, windowAccumulator + si, sz - si); + v_zero(windowAccumulator + sz - si, si); if (int(cd.accumulatorFill) > si) { cd.accumulatorFill -= si; diff --git a/src/Profiler.cpp b/src/base/Profiler.cpp similarity index 95% rename from src/Profiler.cpp rename to src/base/Profiler.cpp index df148d4..216001b 100644 --- a/src/Profiler.cpp +++ b/src/base/Profiler.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -171,6 +171,17 @@ Profiler::end() m_ended = true; } +#else /* NO_TIMING */ + +#ifndef NO_TIMING_COMPLETE_NOOP + +Profiler::Profiler(const char *) { } +Profiler::~Profiler() { } +void Profiler::end() { } +void Profiler::dump() { } + +#endif + #endif } diff --git a/src/Profiler.h b/src/base/Profiler.h similarity index 78% rename from src/Profiler.h rename to src/base/Profiler.h index 616a553..d24153b 100644 --- a/src/Profiler.h +++ b/src/base/Profiler.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,7 +15,7 @@ #ifndef _PROFILER_H_ #define _PROFILER_H_ -#define NO_TIMING 1 +//#define NO_TIMING 1 //#define WANT_TIMING 1 //#define PROFILE_CLOCKS 1 @@ -30,7 +30,7 @@ #ifdef PROFILE_CLOCKS #include #else -#include "sysutils.h" +#include "system/sysutils.h" #ifndef _WIN32 #include #endif @@ -73,17 +73,35 @@ protected: #else +#ifdef NO_TIMING_COMPLETE_NOOP + +// Fastest for release builds, but annoying because it can't be linked +// with code built in debug mode (expecting non-inline functions), so +// not preferred during development + class Profiler { public: Profiler(const char *) { } ~Profiler() { } - void update() const { } void end() { } static void dump() { } }; +#else + +class Profiler +{ +public: + Profiler(const char *); + ~Profiler(); + + void end(); + static void dump(); +}; + +#endif #endif } diff --git a/src/RingBuffer.h b/src/base/RingBuffer.h similarity index 83% rename from src/RingBuffer.h rename to src/base/RingBuffer.h index ebc0952..330e3f7 100644 --- a/src/RingBuffer.h +++ b/src/base/RingBuffer.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -17,25 +17,12 @@ #include -#include - -#ifndef _WIN32 -#include -#endif - #include "Scavenger.h" -#include "Profiler.h" - //#define DEBUG_RINGBUFFER 1 -#ifdef _WIN32 -#define MLOCK(a,b) 1 -#define MUNLOCK(a,b) 1 -#else -#define MLOCK(a,b) ::mlock(a,b) -#define MUNLOCK(a,b) ::munlock(a,b) -#endif +#include "system/sysutils.h" +#include "system/Allocators.h" #ifdef DEBUG_RINGBUFFER #include @@ -61,7 +48,7 @@ public: * power of two, this means n should ideally be some power of two * minus one. */ - RingBuffer(int n); + RingBuffer(int n = 0); virtual ~RingBuffer(); @@ -117,7 +104,7 @@ public: * are available, the remainder will be zeroed out. Returns the * number of samples actually read. */ - int read(T *R__ destination, int n, int R = 0); + int read(T *const R__ destination, int n, int R = 0); /** * Read n samples from the buffer, for reader R, adding them to @@ -125,7 +112,7 @@ public: * will be left alone. Returns the number of samples actually * read. */ - int readAdding(T *R__ destination, int n, int R = 0); + int readAdding(T *const R__ destination, int n, int R = 0); /** * Read one sample from the buffer, for reader R. If no sample is @@ -143,7 +130,7 @@ public: * n are available, the remainder will be zeroed out. Returns the * number of samples actually read. */ - int peek(T *R__ destination, int n, int R = 0) const; + int peek(T *const R__ destination, int n, int R = 0) const; /** * Read one sample from the buffer, if available, without @@ -166,7 +153,7 @@ public: * available, not all samples may actually be written. Returns * the number of samples actually written. */ - int write(const T *source, int n); + int write(const T *const R__ source, int n); /** * Write n zero-value samples to the buffer. If insufficient @@ -176,7 +163,7 @@ public: int zero(int n); protected: - T *R__ m_buffer; + T *R__ m_buffer; volatile int m_writer; volatile int m_readers[N]; int m_size; @@ -194,11 +181,12 @@ Scavenger > RingBuffer::m_scavenger; template RingBuffer::RingBuffer(int n) : - m_buffer(new T[n + 1]), m_writer(0), m_size(n + 1), m_mlocked(false) { + m_buffer = allocate(n + 1); + #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::RingBuffer(" << n << ")" << std::endl; #endif @@ -218,7 +206,8 @@ RingBuffer::~RingBuffer() if (m_mlocked) { MUNLOCK((void *)m_buffer, m_size * sizeof(T)); } - delete[] m_buffer; + + deallocate(m_buffer); m_scavenger.scavenge(); } @@ -251,7 +240,7 @@ RingBuffer::resize(int newSize) m_scavenger.claim(new ScavengerArrayWrapper(m_buffer)); reset(); - m_buffer = new T[newSize + 1]; + m_buffer = allocate(newSize + 1); m_size = newSize + 1; if (m_mlocked) { @@ -353,10 +342,8 @@ RingBuffer::getWriteSpace() const template int -RingBuffer::read(T *R__ destination, int n, int R) +RingBuffer::read(T *const R__ destination, int n, int R) { - Profiler profiler("RingBuffer::read"); - #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::read(dest, " << n << ", " << R << ")" << std::endl; #endif @@ -379,18 +366,10 @@ RingBuffer::read(T *R__ destination, int n, int R) T *const R__ bufbase = m_buffer + reader; if (here >= n) { - for (int i = 0; i < n; ++i) { - destination[i] = bufbase[i]; - } + v_copy(destination, bufbase, n); } else { - for (int i = 0; i < here; ++i) { - destination[i] = bufbase[i]; - } - T *const R__ destbase = destination + here; - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - destbase[i] = m_buffer[i]; - } + v_copy(destination, bufbase, here); + v_copy(destination + here, m_buffer, n - here); } reader += n; @@ -406,10 +385,8 @@ RingBuffer::read(T *R__ destination, int n, int R) template int -RingBuffer::readAdding(T *R__ destination, int n, int R) +RingBuffer::readAdding(T *const R__ destination, int n, int R) { - Profiler profiler("RingBuffer::readAdding"); - #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::readAdding(dest, " << n << ", " << R << ")" << std::endl; #endif @@ -429,18 +406,10 @@ RingBuffer::readAdding(T *R__ destination, int n, int R) const T *const R__ bufbase = m_buffer + reader; if (here >= n) { - for (int i = 0; i < n; ++i) { - destination[i] += bufbase[i]; - } + v_add(destination, bufbase, n); } else { - for (int i = 0; i < here; ++i) { - destination[i] += bufbase[i]; - } - T *const R__ destbase = destination + here; - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - destbase[i] += m_buffer[i]; - } + v_add(destination, bufbase, here); + v_add(destination + here, m_buffer, n - here); } reader += n; @@ -473,10 +442,8 @@ RingBuffer::readOne(int R) template int -RingBuffer::peek(T *R__ destination, int n, int R) const +RingBuffer::peek(T *const R__ destination, int n, int R) const { - Profiler profiler("RingBuffer::peek"); - #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::peek(dest, " << n << ", " << R << ")" << std::endl; #endif @@ -497,18 +464,10 @@ RingBuffer::peek(T *R__ destination, int n, int R) const const T *const R__ bufbase = m_buffer + reader; if (here >= n) { - for (int i = 0; i < n; ++i) { - destination[i] = bufbase[i]; - } + v_copy(destination, bufbase, n); } else { - for (int i = 0; i < here; ++i) { - destination[i] = bufbase[i]; - } - T *const R__ destbase = destination + here; - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - destbase[i] = m_buffer[i]; - } + v_copy(destination, bufbase, here); + v_copy(destination + here, m_buffer, n - here); } #ifdef DEBUG_RINGBUFFER @@ -564,10 +523,8 @@ RingBuffer::skip(int n, int R) template int -RingBuffer::write(const T *source, int n) +RingBuffer::write(const T *const R__ source, int n) { - Profiler profiler("RingBuffer::write"); - #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::write(" << n << ")" << std::endl; #endif @@ -587,19 +544,10 @@ RingBuffer::write(const T *source, int n) T *const R__ bufbase = m_buffer + writer; if (here >= n) { - for (int i = 0; i < n; ++i) { - bufbase[i] = source[i]; - } + v_copy(bufbase, source, n); } else { - for (int i = 0; i < here; ++i) { - bufbase[i] = source[i]; - } - const int nh = n - here; - const T *const R__ srcbase = source + here; - T *const R__ buf = m_buffer; - for (int i = 0; i < nh; ++i) { - buf[i] = srcbase[i]; - } + v_copy(bufbase, source, here); + v_copy(m_buffer, source + here, n - here); } writer += n; @@ -617,8 +565,6 @@ template int RingBuffer::zero(int n) { - Profiler profiler("RingBuffer::zero"); - #ifdef DEBUG_RINGBUFFER std::cerr << "RingBuffer[" << this << "]::zero(" << n << ")" << std::endl; #endif @@ -638,17 +584,10 @@ RingBuffer::zero(int n) T *const R__ bufbase = m_buffer + writer; if (here >= n) { - for (int i = 0; i < n; ++i) { - bufbase[i] = 0; - } + v_zero(bufbase, n); } else { - for (int i = 0; i < here; ++i) { - bufbase[i] = 0; - } - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - m_buffer[i] = 0; - } + v_zero(bufbase, here); + v_zero(m_buffer, n - here); } writer += n; @@ -664,6 +603,4 @@ RingBuffer::zero(int n) } -//#include "RingBuffer.cpp" - #endif // _RINGBUFFER_H_ diff --git a/src/Scavenger.h b/src/base/Scavenger.h similarity index 76% rename from src/Scavenger.h rename to src/base/Scavenger.h index d1b6ca9..c0b0bbb 100644 --- a/src/Scavenger.h +++ b/src/base/Scavenger.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -23,8 +23,11 @@ #include #endif -#include "Thread.h" -#include "sysutils.h" +#include "system/Thread.h" +#include "system/sysutils.h" +#include "system/Allocators.h" + +//#define DEBUG_SCAVENGER 1 namespace RubberBand { @@ -73,10 +76,12 @@ protected: unsigned int m_claimed; unsigned int m_scavenged; + unsigned int m_asExcess; }; + /** - * A wrapper to permit arrays to be scavenged. + * A wrapper to permit arrays allocated with new[] to be scavenged. */ template @@ -91,12 +96,30 @@ private: }; +/** + * A wrapper to permit arrays allocated with the Allocators functions + * to be scavenged. + */ + +template +class ScavengerAllocArrayWrapper +{ +public: + ScavengerAllocArrayWrapper(T *array) : m_array(array) { } + ~ScavengerAllocArrayWrapper() { deallocate(m_array); } + +private: + T *m_array; +}; + + template Scavenger::Scavenger(int sec, int defaultObjectListSize) : m_objects(ObjectTimeList(defaultObjectListSize)), m_sec(sec), m_claimed(0), - m_scavenged(0) + m_scavenged(0), + m_asExcess(0) { } @@ -138,8 +161,10 @@ Scavenger::claim(T *t) } } - std::cerr << "WARNING: Scavenger::claim(" << t << "): run out of slots, " - << "using non-RT-safe method" << std::endl; +#ifdef DEBUG_SCAVENGER + std::cerr << "WARNING: Scavenger::claim(" << t << "): run out of slots (at " + << m_objects.size() << "), using non-RT-safe method" << std::endl; +#endif pushExcess(t); } @@ -147,26 +172,30 @@ template void Scavenger::scavenge(bool clearNow) { -// std::cerr << "Scavenger::scavenge: scavenged " << m_scavenged << ", claimed " << m_claimed << std::endl; +#ifdef DEBUG_SCAVENGER + std::cerr << "Scavenger::scavenge: claimed " << m_claimed << ", scavenged " << m_scavenged << ", cleared as excess " << m_asExcess << std::endl; +#endif if (m_scavenged >= m_claimed) return; struct timeval tv; (void)gettimeofday(&tv, 0); int sec = tv.tv_sec; + bool anything = false; for (size_t i = 0; i < m_objects.size(); ++i) { ObjectTimePair &pair = m_objects[i]; - if (clearNow || - (pair.first != 0 && pair.second + m_sec < sec)) { + if (!pair.first) continue; + if (clearNow || pair.second + m_sec < sec) { T *ot = pair.first; pair.first = 0; delete ot; ++m_scavenged; + anything = true; } } - if (sec > m_lastExcess + m_sec) { + if (clearNow || anything || (sec > m_lastExcess + m_sec)) { clearExcess(sec); } } @@ -187,10 +216,15 @@ template void Scavenger::clearExcess(int sec) { +#ifdef DEBUG_SCAVENGER + std::cerr << "Scavenger::clearExcess: Excess now " << m_excess.size() << std::endl; +#endif + m_excessMutex.lock(); for (typename ObjectList::iterator i = m_excess.begin(); i != m_excess.end(); ++i) { delete *i; + ++m_asExcess; } m_excess.clear(); m_lastExcess = sec; diff --git a/src/dsp/AudioCurveCalculator.cpp b/src/dsp/AudioCurveCalculator.cpp new file mode 100644 index 0000000..62c1dd0 --- /dev/null +++ b/src/dsp/AudioCurveCalculator.cpp @@ -0,0 +1,31 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Rubber Band + An audio time-stretching and pitch-shifting library. + Copyright 2007-2009 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "AudioCurveCalculator.h" + +namespace RubberBand +{ + +AudioCurveCalculator::AudioCurveCalculator(size_t sampleRate, size_t windowSize) : + m_sampleRate(sampleRate), + m_windowSize(windowSize) +{ +} + +AudioCurveCalculator::~AudioCurveCalculator() +{ +} + + +} diff --git a/src/AudioCurve.h b/src/dsp/AudioCurveCalculator.h similarity index 53% rename from src/AudioCurve.h rename to src/dsp/AudioCurveCalculator.h index a34a4aa..fd74d08 100644 --- a/src/AudioCurve.h +++ b/src/dsp/AudioCurveCalculator.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -12,26 +12,35 @@ COPYING included with this distribution for more information. */ -#ifndef _AUDIO_CURVE_H_ -#define _AUDIO_CURVE_H_ +#ifndef _AUDIO_CURVE_CALCULATOR_H_ +#define _AUDIO_CURVE_CALCULATOR_H_ #include -#include "sysutils.h" + +#include "system/sysutils.h" namespace RubberBand { -class AudioCurve +class AudioCurveCalculator { public: - AudioCurve(size_t sampleRate, size_t windowSize); - virtual ~AudioCurve(); + AudioCurveCalculator(size_t sampleRate, size_t windowSize); + virtual ~AudioCurveCalculator(); + + size_t getSampleRate() const { return m_sampleRate; } + size_t getWindowSize() const { return m_windowSize; } virtual void setWindowSize(size_t newSize) = 0; - - virtual float process(const float *R__ mag, size_t increment) = 0; - virtual float processDouble(const double *R__ mag, size_t increment); + + // You may not mix calls to the various process functions on a + // given instance + + + virtual float processFloat(const float *R__ mag, size_t increment) = 0; + virtual double processDouble(const double *R__ mag, size_t increment) = 0; + virtual void reset() = 0; protected: diff --git a/src/ConstantAudioCurve.cpp b/src/dsp/ConstantAudioCurve.cpp similarity index 84% rename from src/ConstantAudioCurve.cpp rename to src/dsp/ConstantAudioCurve.cpp index 87867f3..5058c28 100644 --- a/src/ConstantAudioCurve.cpp +++ b/src/dsp/ConstantAudioCurve.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -18,7 +18,7 @@ namespace RubberBand { ConstantAudioCurve::ConstantAudioCurve(size_t sampleRate, size_t windowSize) : - AudioCurve(sampleRate, windowSize) + AudioCurveCalculator(sampleRate, windowSize) { } @@ -38,15 +38,15 @@ ConstantAudioCurve::setWindowSize(size_t newSize) } float -ConstantAudioCurve::process(const float *R__, size_t) +ConstantAudioCurve::processFloat(const float *R__, size_t) { return 1.f; } -float +double ConstantAudioCurve::processDouble(const double *R__, size_t) { - return 1.f; + return 1.0; } } diff --git a/src/ConstantAudioCurve.h b/src/dsp/ConstantAudioCurve.h similarity index 74% rename from src/ConstantAudioCurve.h rename to src/dsp/ConstantAudioCurve.h index 41a2ea0..d710ff9 100644 --- a/src/ConstantAudioCurve.h +++ b/src/dsp/ConstantAudioCurve.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,12 +15,12 @@ #ifndef _CONSTANT_AUDIO_CURVE_H_ #define _CONSTANT_AUDIO_CURVE_H_ -#include "AudioCurve.h" +#include "AudioCurveCalculator.h" namespace RubberBand { -class ConstantAudioCurve : public AudioCurve +class ConstantAudioCurve : public AudioCurveCalculator { public: ConstantAudioCurve(size_t sampleRate, size_t windowSize); @@ -28,8 +28,8 @@ public: virtual void setWindowSize(size_t newSize); - virtual float process(const float *R__ mag, size_t increment); - virtual float processDouble(const double *R__ mag, size_t increment); + virtual float processFloat(const float *R__ mag, size_t increment); + virtual double processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/src/FFT.cpp b/src/dsp/FFT.cpp similarity index 96% rename from src/FFT.cpp rename to src/dsp/FFT.cpp index adc3746..b0ca34d 100644 --- a/src/FFT.cpp +++ b/src/dsp/FFT.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -13,8 +13,10 @@ */ #include "FFT.h" -#include "Thread.h" -#include "Profiler.h" +#include "system/Thread.h" +#include "base/Profiler.h" +#include "system/Allocators.h" +#include "system/VectorOps.h" //#define FFT_MEASUREMENT 1 @@ -23,8 +25,9 @@ #include #endif + #ifdef USE_KISSFFT -#include "bsd-3rdparty/kissfft/kiss_fftr.h" +#include "kissfft/kiss_fftr.h" #endif #ifndef HAVE_FFTW3 @@ -42,6 +45,7 @@ #include #include + namespace RubberBand { class FFTImpl @@ -75,6 +79,7 @@ public: namespace FFTs { + #ifdef HAVE_FFTW3 // Define FFTW_DOUBLE_ONLY to make all uses of FFTW functions be @@ -242,7 +247,7 @@ public: if (!home) return; char fn[256]; - snprintf(fn, 256, "%s/%s.%c", home, ".rubberband.wisdom", type); + snprintf(fn, 256, "%s/%s.%c", home, ".turbot.wisdom", type); FILE *f = fopen(fn, save ? "wb" : "rb"); if (!f) return; @@ -657,7 +662,15 @@ public: const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = re[i]; - m_fpacked[i].i = im[i]; + } + if (im) { + for (int i = 0; i <= hs; ++i) { + m_fpacked[i].i = im[i]; + } + } else { + for (int i = 0; i <= hs; ++i) { + m_fpacked[i].i = 0.f; + } } } @@ -665,7 +678,11 @@ public: const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = m_fpacked[i].r; - im[i] = m_fpacked[i].i; + } + if (im) { + for (int i = 0; i <= hs; ++i) { + im[i] = m_fpacked[i].i; + } } } @@ -673,7 +690,15 @@ public: const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { m_fpacked[i].r = float(re[i]); - m_fpacked[i].i = float(im[i]); + } + if (im) { + for (int i = 0; i <= hs; ++i) { + m_fpacked[i].i = float(im[i]); + } + } else { + for (int i = 0; i <= hs; ++i) { + m_fpacked[i].i = 0.f; + } } } @@ -681,7 +706,11 @@ public: const int hs = m_size/2; for (int i = 0; i <= hs; ++i) { re[i] = double(m_fpacked[i].r); - im[i] = double(m_fpacked[i].i); + } + if (im) { + for (int i = 0; i <= hs; ++i) { + im[i] = double(m_fpacked[i].i); + } } } @@ -1238,6 +1267,16 @@ FFT::FFT(int size, int debugLevel) std::cerr << "FFT::FFT(" << size << "): ERROR: Fallback implementation not available!" << std::endl; abort(); #endif +#endif + break; + + case 4: + std::cerr << "FFT::FFT(" << size << "): WARNING: Selected implemention not available" << std::endl; +#ifdef USE_BUILTIN_FFT + d = new FFTs::D_Cross(size); +#else + std::cerr << "FFT::FFT(" << size << "): ERROR: Fallback implementation not available!" << std::endl; + abort(); #endif break; @@ -1358,6 +1397,7 @@ FFT::getDoubleTimeBuffer() void FFT::tune() { + std::cerr << "FFT::tune: Measurement not enabled" << std::endl; } diff --git a/src/FFT.h b/src/dsp/FFT.h similarity index 91% rename from src/FFT.h rename to src/dsp/FFT.h index b31d925..4c89afc 100644 --- a/src/FFT.h +++ b/src/dsp/FFT.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,7 +15,7 @@ #ifndef _RUBBERBAND_FFT_H_ #define _RUBBERBAND_FFT_H_ -#include "sysutils.h" +#include "system/sysutils.h" namespace RubberBand { @@ -30,9 +30,11 @@ class FFTImpl; * complex conjugates half is omitted), so the "complex" arrays need * room for size/2+1 elements. * - * Not thread safe: use a separate instance per thread. + * Not thread safe: use a separate instance per thread, or use a mutex. */ +//!!! it would be nice if we could redefine forwardMagnitude as forwardPower (i.e. square of magnitude) + class FFT { public: diff --git a/src/HighFrequencyAudioCurve.cpp b/src/dsp/HighFrequencyAudioCurve.cpp similarity index 85% rename from src/HighFrequencyAudioCurve.cpp rename to src/dsp/HighFrequencyAudioCurve.cpp index 71108ad..caf4c62 100644 --- a/src/HighFrequencyAudioCurve.cpp +++ b/src/dsp/HighFrequencyAudioCurve.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -18,7 +18,7 @@ namespace RubberBand { HighFrequencyAudioCurve::HighFrequencyAudioCurve(size_t sampleRate, size_t windowSize) : - AudioCurve(sampleRate, windowSize) + AudioCurveCalculator(sampleRate, windowSize) { } @@ -38,7 +38,7 @@ HighFrequencyAudioCurve::setWindowSize(size_t newSize) } float -HighFrequencyAudioCurve::process(const float *R__ mag, size_t increment) +HighFrequencyAudioCurve::processFloat(const float *R__ mag, size_t increment) { float result = 0.0; @@ -51,7 +51,7 @@ HighFrequencyAudioCurve::process(const float *R__ mag, size_t increment) return result; } -float +double HighFrequencyAudioCurve::processDouble(const double *R__ mag, size_t increment) { float result = 0.0; @@ -59,7 +59,7 @@ HighFrequencyAudioCurve::processDouble(const double *R__ mag, size_t increment) const int sz = m_windowSize / 2; for (int n = 0; n <= sz; ++n) { - result = result + (float)mag[n] * n; + result = result + mag[n] * n; } return result; diff --git a/src/HighFrequencyAudioCurve.h b/src/dsp/HighFrequencyAudioCurve.h similarity index 74% rename from src/HighFrequencyAudioCurve.h rename to src/dsp/HighFrequencyAudioCurve.h index b0a3ec2..797e3c3 100644 --- a/src/HighFrequencyAudioCurve.h +++ b/src/dsp/HighFrequencyAudioCurve.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,13 +15,12 @@ #ifndef _HIGHFREQUENCY_AUDIO_CURVE_H_ #define _HIGHFREQUENCY_AUDIO_CURVE_H_ -#include "AudioCurve.h" -#include "Window.h" +#include "AudioCurveCalculator.h" namespace RubberBand { -class HighFrequencyAudioCurve : public AudioCurve +class HighFrequencyAudioCurve : public AudioCurveCalculator { public: HighFrequencyAudioCurve(size_t sampleRate, size_t windowSize); @@ -30,8 +29,8 @@ public: virtual void setWindowSize(size_t newSize); - virtual float process(const float *R__ mag, size_t increment); - virtual float processDouble(const double *R__ mag, size_t increment); + virtual float processFloat(const float *R__ mag, size_t increment); + virtual double processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/src/PercussiveAudioCurve.cpp b/src/dsp/PercussiveAudioCurve.cpp similarity index 67% rename from src/PercussiveAudioCurve.cpp rename to src/dsp/PercussiveAudioCurve.cpp index cb03afc..c4df212 100644 --- a/src/PercussiveAudioCurve.cpp +++ b/src/dsp/PercussiveAudioCurve.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -14,50 +14,41 @@ #include "PercussiveAudioCurve.h" -#include "Profiler.h" +#include "system/Allocators.h" +#include "system/VectorOps.h" #include - namespace RubberBand { PercussiveAudioCurve::PercussiveAudioCurve(size_t sampleRate, size_t windowSize) : - AudioCurve(sampleRate, windowSize) + AudioCurveCalculator(sampleRate, windowSize) { - m_prevMag = new float[m_windowSize/2 + 1]; - - for (size_t i = 0; i <= m_windowSize/2; ++i) { - m_prevMag[i] = 0.f; - } + m_prevMag = allocate_and_zero(m_windowSize/2 + 1); } PercussiveAudioCurve::~PercussiveAudioCurve() { - delete[] m_prevMag; + deallocate(m_prevMag); } void PercussiveAudioCurve::reset() { - for (size_t i = 0; i <= m_windowSize/2; ++i) { - m_prevMag[i] = 0; - } + v_zero(m_prevMag, m_windowSize/2 + 1); } void PercussiveAudioCurve::setWindowSize(size_t newSize) { + m_prevMag = reallocate(m_prevMag, m_windowSize, newSize); m_windowSize = newSize; - - delete[] m_prevMag; - m_prevMag = new float[m_windowSize/2 + 1]; - reset(); } float -PercussiveAudioCurve::process(const float *R__ mag, size_t increment) +PercussiveAudioCurve::processFloat(const float *R__ mag, size_t increment) { static float threshold = powf(10.f, 0.15f); // 3dB rise in square of magnitude static float zeroThresh = powf(10.f, -8); @@ -73,21 +64,17 @@ PercussiveAudioCurve::process(const float *R__ mag, size_t increment) if (mag[n] > zeroThresh) ++nonZeroCount; } - for (int n = 1; n <= sz; ++n) { - m_prevMag[n] = mag[n]; - } + v_convert(m_prevMag, mag, sz + 1); if (nonZeroCount == 0) return 0; else return float(count) / float(nonZeroCount); } -float +double PercussiveAudioCurve::processDouble(const double *R__ mag, size_t increment) { - Profiler profiler("PercussiveAudioCurve::process"); - - static double threshold = pow(10.0, 0.15); // 3dB rise in square of magnitude - static double zeroThresh = pow(10.0, -8); + static double threshold = powf(10., 0.15); // 3dB rise in square of magnitude + static double zeroThresh = powf(10., -8); size_t count = 0; size_t nonZeroCount = 0; @@ -100,13 +87,12 @@ PercussiveAudioCurve::processDouble(const double *R__ mag, size_t increment) if (mag[n] > zeroThresh) ++nonZeroCount; } - for (int n = 1; n <= sz; ++n) { - m_prevMag[n] = mag[n]; - } + v_copy(m_prevMag, mag, sz + 1); if (nonZeroCount == 0) return 0; - else return float(count) / float(nonZeroCount); + else return double(count) / double(nonZeroCount); } + } diff --git a/src/PercussiveAudioCurve.h b/src/dsp/PercussiveAudioCurve.h similarity index 72% rename from src/PercussiveAudioCurve.h rename to src/dsp/PercussiveAudioCurve.h index 9f08705..ec6c280 100644 --- a/src/PercussiveAudioCurve.h +++ b/src/dsp/PercussiveAudioCurve.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,12 +15,12 @@ #ifndef _PERCUSSIVE_AUDIO_CURVE_H_ #define _PERCUSSIVE_AUDIO_CURVE_H_ -#include "AudioCurve.h" +#include "AudioCurveCalculator.h" namespace RubberBand { -class PercussiveAudioCurve : public AudioCurve +class PercussiveAudioCurve : public AudioCurveCalculator { public: PercussiveAudioCurve(size_t sampleRate, size_t windowSize); @@ -29,12 +29,14 @@ public: virtual void setWindowSize(size_t newSize); - virtual float process(const float *R__ mag, size_t increment); - virtual float processDouble(const double *R__ mag, size_t increment); + virtual float processFloat(const float *R__ mag, size_t increment); + virtual double processDouble(const double *R__ mag, size_t increment); + + virtual void reset(); protected: - float *R__ m_prevMag; + double *R__ m_prevMag; }; } diff --git a/src/Resampler.cpp b/src/dsp/Resampler.cpp similarity index 90% rename from src/Resampler.cpp rename to src/dsp/Resampler.cpp index b94693b..de8bf90 100644 --- a/src/Resampler.cpp +++ b/src/dsp/Resampler.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -13,14 +13,15 @@ */ #include "Resampler.h" - -#include "Profiler.h" +#include "base/Profiler.h" #include #include #include +#include "system/Allocators.h" + #include @@ -39,6 +40,8 @@ public: float ratio, bool final) = 0; + virtual int getChannelCount() const = 0; + virtual void reset() = 0; }; @@ -59,6 +62,8 @@ public: float ratio, bool final); + int getChannelCount() const { return m_channels; } + void reset(); protected: @@ -103,8 +108,8 @@ D_SRC::D_SRC(Resampler::Quality quality, int channels, int maxBufferSize, if (maxBufferSize > 0 && m_channels > 1) { m_iinsize = maxBufferSize * m_channels; m_ioutsize = maxBufferSize * m_channels * 2; - m_iin = allocFloat(m_iinsize); - m_iout = allocFloat(m_ioutsize); + m_iin = allocate(m_iinsize); + m_iout = allocate(m_ioutsize); } reset(); @@ -113,12 +118,8 @@ D_SRC::D_SRC(Resampler::Quality quality, int channels, int maxBufferSize, D_SRC::~D_SRC() { src_delete(m_src); - if (m_iinsize > 0) { - free(m_iin); - } - if (m_ioutsize > 0) { - free(m_iout); - } + deallocate(m_iin); + deallocate(m_iout); } int @@ -137,12 +138,12 @@ D_SRC::resample(const float *const R__ *const R__ in, data.data_out = *out; } else { if (incount * m_channels > m_iinsize) { + m_iin = reallocate(m_iin, m_iinsize, incount * m_channels); m_iinsize = incount * m_channels; - m_iin = allocFloat(m_iin, m_iinsize); } if (outcount * m_channels > m_ioutsize) { + m_iout = reallocate(m_iout, m_ioutsize, outcount * m_channels); m_ioutsize = outcount * m_channels; - m_iout = allocFloat(m_iout, m_ioutsize); } for (int i = 0; i < incount; ++i) { for (int c = 0; c < m_channels; ++c) { @@ -251,6 +252,12 @@ Resampler::resample(const float *const R__ *const R__ in, return d->resample(in, out, incount, ratio, final); } +int +Resampler::getChannelCount() const +{ + return d->getChannelCount(); +} + void Resampler::reset() { diff --git a/src/Resampler.h b/src/dsp/Resampler.h similarity index 93% rename from src/Resampler.h rename to src/dsp/Resampler.h index 3c4af40..db3026a 100644 --- a/src/Resampler.h +++ b/src/dsp/Resampler.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,9 +15,7 @@ #ifndef _RUBBERBAND_RESAMPLER_H_ #define _RUBBERBAND_RESAMPLER_H_ -#include - -#include "sysutils.h" +#include "system/sysutils.h" namespace RubberBand { @@ -45,6 +43,8 @@ public: float ratio, bool final = false); + int getChannelCount() const; + void reset(); protected: diff --git a/src/SilentAudioCurve.cpp b/src/dsp/SilentAudioCurve.cpp similarity index 89% rename from src/SilentAudioCurve.cpp rename to src/dsp/SilentAudioCurve.cpp index 2bc8bdc..35f0d96 100644 --- a/src/SilentAudioCurve.cpp +++ b/src/dsp/SilentAudioCurve.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -20,7 +20,7 @@ namespace RubberBand { SilentAudioCurve::SilentAudioCurve(size_t sampleRate, size_t windowSize) : - AudioCurve(sampleRate, windowSize) + AudioCurveCalculator(sampleRate, windowSize) { } @@ -40,7 +40,7 @@ SilentAudioCurve::setWindowSize(size_t newSize) } float -SilentAudioCurve::process(const float *R__ mag, size_t) +SilentAudioCurve::processFloat(const float *R__ mag, size_t) { const int hs = m_windowSize / 2; static float threshold = powf(10.f, -6); @@ -52,7 +52,7 @@ SilentAudioCurve::process(const float *R__ mag, size_t) return 1.f; } -float +double SilentAudioCurve::processDouble(const double *R__ mag, size_t) { const int hs = m_windowSize / 2; diff --git a/src/SilentAudioCurve.h b/src/dsp/SilentAudioCurve.h similarity index 74% rename from src/SilentAudioCurve.h rename to src/dsp/SilentAudioCurve.h index 6309f9d..4732788 100644 --- a/src/SilentAudioCurve.h +++ b/src/dsp/SilentAudioCurve.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,12 +15,12 @@ #ifndef _SILENT_AUDIO_CURVE_H_ #define _SILENT_AUDIO_CURVE_H_ -#include "AudioCurve.h" +#include "AudioCurveCalculator.h" namespace RubberBand { -class SilentAudioCurve : public AudioCurve +class SilentAudioCurve : public AudioCurveCalculator { public: SilentAudioCurve(size_t sampleRate, size_t windowSize); @@ -28,8 +28,8 @@ public: virtual void setWindowSize(size_t newSize); - virtual float process(const float *R__ mag, size_t increment); - virtual float processDouble(const double *R__ mag, size_t increment); + virtual float processFloat(const float *R__ mag, size_t increment); + virtual double processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/src/dsp/SpectralDifferenceAudioCurve.cpp b/src/dsp/SpectralDifferenceAudioCurve.cpp new file mode 100644 index 0000000..9d59c7e --- /dev/null +++ b/src/dsp/SpectralDifferenceAudioCurve.cpp @@ -0,0 +1,97 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Rubber Band + An audio time-stretching and pitch-shifting library. + Copyright 2007-2009 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "SpectralDifferenceAudioCurve.h" + +#include "system/Allocators.h" +#include "system/VectorOps.h" + +namespace RubberBand +{ + +SpectralDifferenceAudioCurve::SpectralDifferenceAudioCurve(size_t sampleRate, size_t windowSize) : + AudioCurveCalculator(sampleRate, windowSize) +{ + m_mag = allocate(m_windowSize/2 + 1); + m_tmpbuf = allocate(m_windowSize/2 + 1); + v_zero(m_mag, m_windowSize/2 + 1); +} + +SpectralDifferenceAudioCurve::~SpectralDifferenceAudioCurve() +{ + deallocate(m_mag); + deallocate(m_tmpbuf); +} + +void +SpectralDifferenceAudioCurve::reset() +{ + v_zero(m_mag, m_windowSize/2 + 1); +} + +void +SpectralDifferenceAudioCurve::setWindowSize(size_t newSize) +{ + deallocate(m_tmpbuf); + deallocate(m_mag); + m_windowSize = newSize; + m_mag = allocate(m_windowSize/2 + 1); + m_tmpbuf = allocate(m_windowSize/2 + 1); + reset(); +} + +float +SpectralDifferenceAudioCurve::processFloat(const float *R__ mag, size_t increment) +{ + double result = 0.0; + + const int hs1 = m_windowSize/2 + 1; + + v_convert(m_tmpbuf, mag, hs1); + v_square(m_tmpbuf, hs1); + v_subtract(m_mag, m_tmpbuf, hs1); + v_abs(m_mag, hs1); + v_sqrt(m_mag, hs1); + + for (int i = 0; i < hs1; ++i) { + result += m_mag[i]; + } + + v_copy(m_mag, m_tmpbuf, hs1); + return result; +} + +double +SpectralDifferenceAudioCurve::processDouble(const double *R__ mag, size_t increment) +{ + double result = 0.0; + + const int hs1 = m_windowSize/2 + 1; + + v_convert(m_tmpbuf, mag, hs1); + v_square(m_tmpbuf, hs1); + v_subtract(m_mag, m_tmpbuf, hs1); + v_abs(m_mag, hs1); + v_sqrt(m_mag, hs1); + + for (int i = 0; i < hs1; ++i) { + result += m_mag[i]; + } + + v_copy(m_mag, m_tmpbuf, hs1); + return result; +} + +} + diff --git a/src/SpectralDifferenceAudioCurve.h b/src/dsp/SpectralDifferenceAudioCurve.h similarity index 72% rename from src/SpectralDifferenceAudioCurve.h rename to src/dsp/SpectralDifferenceAudioCurve.h index 4295653..b3956b2 100644 --- a/src/SpectralDifferenceAudioCurve.h +++ b/src/dsp/SpectralDifferenceAudioCurve.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,13 +15,13 @@ #ifndef _SPECTRALDIFFERENCE_AUDIO_CURVE_H_ #define _SPECTRALDIFFERENCE_AUDIO_CURVE_H_ -#include "AudioCurve.h" +#include "AudioCurveCalculator.h" #include "Window.h" namespace RubberBand { -class SpectralDifferenceAudioCurve : public AudioCurve +class SpectralDifferenceAudioCurve : public AudioCurveCalculator { public: SpectralDifferenceAudioCurve(size_t sampleRate, size_t windowSize); @@ -30,12 +30,13 @@ public: virtual void setWindowSize(size_t newSize); - virtual float process(const float *R__ mag, size_t increment); - virtual float processDouble(const double *R__ mag, size_t increment); + virtual float processFloat(const float *R__ mag, size_t increment); + virtual double processDouble(const double *R__ mag, size_t increment); virtual void reset(); protected: - float *R__ m_prevMag; + double *R__ m_mag; + double *R__ m_tmpbuf; }; } diff --git a/src/Window.cpp b/src/dsp/Window.cpp similarity index 100% rename from src/Window.cpp rename to src/dsp/Window.cpp diff --git a/src/Window.h b/src/dsp/Window.h similarity index 84% rename from src/Window.h rename to src/dsp/Window.h index 6e88083..385ce6a 100644 --- a/src/Window.h +++ b/src/dsp/Window.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -20,7 +20,8 @@ #include #include -#include "sysutils.h" +#include "system/sysutils.h" +#include "system/VectorOps.h" namespace RubberBand { @@ -54,29 +55,23 @@ public: } virtual ~Window() { delete[] m_cache; } - void cut(T *R__ src) const - { - const int sz = m_size; - for (int i = 0; i < sz; ++i) { - src[i] *= m_cache[i]; - } + inline void cut(T *const R__ block) const { + v_multiply(block, m_cache, m_size); } - void cut(T *R__ src, T *dst) const { - const int sz = m_size; - for (int i = 0; i < sz; ++i) { - dst[i] = src[i]; - } - for (int i = 0; i < sz; ++i) { - dst[i] *= m_cache[i]; - } + inline void cut(const T *const R__ src, T *const R__ dst) const { + v_multiply(dst, src, m_cache, m_size); } - T getArea() { return m_area; } - T getValue(int i) { return m_cache[i]; } + inline void add(T *const R__ dst, T scale) const { + v_add_with_gain(dst, m_cache, m_size, scale); + } - WindowType getType() const { return m_type; } - int getSize() const { return m_size; } + inline T getArea() const { return m_area; } + inline T getValue(int i) const { return m_cache[i]; } + + inline WindowType getType() const { return m_type; } + inline int getSize() const { return m_size; } protected: WindowType m_type; diff --git a/src/bsd-3rdparty/float_cast/float_cast.h b/src/float_cast/float_cast.h similarity index 100% rename from src/bsd-3rdparty/float_cast/float_cast.h rename to src/float_cast/float_cast.h diff --git a/src/bsd-3rdparty/getopt/getopt.c b/src/getopt/getopt.c similarity index 100% rename from src/bsd-3rdparty/getopt/getopt.c rename to src/getopt/getopt.c diff --git a/src/bsd-3rdparty/getopt/getopt.h b/src/getopt/getopt.h similarity index 100% rename from src/bsd-3rdparty/getopt/getopt.h rename to src/getopt/getopt.h diff --git a/src/bsd-3rdparty/getopt/getopt_long.c b/src/getopt/getopt_long.c similarity index 100% rename from src/bsd-3rdparty/getopt/getopt_long.c rename to src/getopt/getopt_long.c diff --git a/src/bsd-3rdparty/getopt/unistd.h b/src/getopt/unistd.h similarity index 100% rename from src/bsd-3rdparty/getopt/unistd.h rename to src/getopt/unistd.h diff --git a/src/rubberband-c.cpp b/src/rubberband-c.cpp index 7bdd701..8ffea54 100644 --- a/src/rubberband-c.cpp +++ b/src/rubberband-c.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -12,8 +12,8 @@ COPYING included with this distribution for more information. */ -#include "rubberband-c.h" -#include "RubberBandStretcher.h" +#include "rubberband/rubberband-c.h" +#include "rubberband/RubberBandStretcher.h" struct RubberBandState_ { diff --git a/src/Thread.cpp b/src/system/Thread.cpp similarity index 95% rename from src/Thread.cpp rename to src/system/Thread.cpp index 83857ea..df8f8bc 100644 --- a/src/Thread.cpp +++ b/src/system/Thread.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -213,12 +213,6 @@ Condition::~Condition() void Condition::lock() { - if (m_locked) { -#ifdef DEBUG_CONDITION - cerr << "CONDITION DEBUG: " << (void *)GetCurrentThreadId() << ": Already locked " << &m_condition << " \"" << m_name << "\"" << endl; -#endif - return; - } #ifdef DEBUG_CONDITION cerr << "CONDITION DEBUG: " << (void *)GetCurrentThreadId() << ": Want to lock " << &m_condition << " \"" << m_name << "\"" << endl; #endif @@ -248,8 +242,6 @@ Condition::unlock() void Condition::wait(int us) { - if (!m_locked) lock(); - if (us == 0) { #ifdef DEBUG_CONDITION @@ -270,12 +262,10 @@ Condition::wait(int us) WaitForSingleObject(m_mutex, INFINITE); } - ReleaseMutex(m_mutex); - #ifdef DEBUG_CONDITION cerr << "CONDITION DEBUG: " << (void *)GetCurrentThreadId() << ": Wait done on " << &m_condition << " \"" << m_name << "\"" << endl; #endif - m_locked = false; + m_locked = true; } void @@ -478,12 +468,6 @@ Condition::~Condition() void Condition::lock() { - if (m_locked) { -#ifdef DEBUG_CONDITION - cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Already locked " << &m_condition << " \"" << m_name << "\"" << endl; -#endif - return; - } #ifdef DEBUG_CONDITION cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Want to lock " << &m_condition << " \"" << m_name << "\"" << endl; #endif @@ -513,8 +497,6 @@ Condition::unlock() void Condition::wait(int us) { - if (!m_locked) lock(); - if (us == 0) { #ifdef DEBUG_CONDITION @@ -543,12 +525,10 @@ Condition::wait(int us) pthread_cond_timedwait(&m_condition, &m_mutex, &timeout); } - pthread_mutex_unlock(&m_mutex); - #ifdef DEBUG_CONDITION cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Wait done on " << &m_condition << " \"" << m_name << "\"" << endl; #endif - m_locked = false; + m_locked = true; } void diff --git a/src/Thread.h b/src/system/Thread.h similarity index 75% rename from src/Thread.h rename to src/system/Thread.h index 0614692..2bdcb59 100644 --- a/src/Thread.h +++ b/src/system/Thread.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -105,16 +105,20 @@ public: Condition(std::string name); ~Condition(); - // To wait on a condition, either simply call wait(), or call - // lock() and then wait() (perhaps testing some state in between). - // To signal a condition, call signal(). + // The Condition class bundles a condition variable and mutex. + + // To wait on a condition, call lock(), test the termination + // condition if desired, then wait(). The condition will be + // unlocked during the wait and re-locked when wait() returns + // (which will happen when the condition is signalled or the timer + // times out). + + // To signal a condition, call signal(). If the condition is + // signalled between lock() and wait(), the signal may be missed + // by the waiting thread. To avoid this, the signalling thread + // should also lock the condition before calling signal() and + // unlock it afterwards. - // Although any thread may signal on a given condition, only one - // thread should ever wait on any given condition object -- - // otherwise there will be a race conditions in the logic that - // avoids the thread code having to track whether the condition's - // mutex is locked or not. If that is your requirement, this - // Condition wrapper is not for you. void lock(); void unlock(); void wait(int us = 0); diff --git a/src/sysutils.cpp b/src/system/sysutils.cpp similarity index 56% rename from src/sysutils.cpp rename to src/system/sysutils.cpp index af482e9..8fb10c1 100644 --- a/src/sysutils.cpp +++ b/src/system/sysutils.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -16,7 +16,11 @@ #ifdef _WIN32 #include +#include +#include #else /* !_WIN32 */ +#include +#include #ifdef __APPLE__ #include #else /* !__APPLE__, !_WIN32 */ @@ -25,12 +29,44 @@ #endif /* !__APPLE__, !_WIN32 */ #endif /* !_WIN32 */ +#ifdef __sun +#include +#endif + #include #include + +#ifdef _WIN32 +#include +#endif + + namespace RubberBand { +const char * +system_get_platform_tag() +{ +#ifdef _WIN32 + return "win32"; +#else /* !_WIN32 */ +#ifdef __APPLE__ + return "osx"; +#else /* !__APPLE__ */ +#ifdef __LINUX__ + if (sizeof(long) == 8) { + return "linux64"; + } else { + return "linux"; + } +#else /* !__LINUX__ */ + return "posix"; +#endif /* !__LINUX__ */ +#endif /* !__APPLE__ */ +#endif /* !_WIN32 */ +} + bool system_is_multiprocessor() { @@ -50,13 +86,27 @@ system_is_multiprocessor() size_t sz = sizeof(count); if (sysctlbyname("hw.ncpu", &count, &sz, NULL, 0)) { + count = 0; mp = false; } else { mp = (count > 1); } #else /* !__APPLE__, !_WIN32 */ - +#ifdef __sun + + processorid_t i, n; + n = sysconf(_SC_CPUID_MAX); + for (i = 0; i <= n; ++i) { + int status = p_online(i, P_STATUS); + if (status == P_ONLINE) { + ++count; + } + if (count > 1) break; + } + +#else /* !__sun, !__APPLE__, !_WIN32 */ + //... FILE *cpuinfo = fopen("/proc/cpuinfo", "r"); @@ -64,7 +114,7 @@ system_is_multiprocessor() char buf[256]; while (!feof(cpuinfo)) { - fgets(buf, 256, cpuinfo); + if (!fgets(buf, 256, cpuinfo)) break; if (!strncmp(buf, "processor", 9)) { ++count; } @@ -73,6 +123,7 @@ system_is_multiprocessor() fclose(cpuinfo); +#endif /* !__sun, !__APPLE__, !_WIN32 */ #endif /* !__APPLE__, !_WIN32 */ #endif /* !_WIN32 */ @@ -83,7 +134,7 @@ system_is_multiprocessor() #ifdef _WIN32 -int gettimeofday(struct timeval *tv, void *tz) +void gettimeofday(struct timeval *tv, void *tz) { union { long long ns100; @@ -93,7 +144,6 @@ int gettimeofday(struct timeval *tv, void *tz) ::GetSystemTimeAsFileTime(&now.ft); tv->tv_usec = (long)((now.ns100 / 10LL) % 1000000LL); tv->tv_sec = (long)((now.ns100 - 116444736000000000LL) / 10000000LL); - return 0; } void usleep(unsigned long usec) @@ -103,55 +153,39 @@ void usleep(unsigned long usec) #endif - -float *allocFloat(float *ptr, int count) +void system_specific_initialise() { - if (ptr) free((void *)ptr); - void *allocated; -#ifndef _WIN32 -#ifndef __APPLE__ - if (posix_memalign(&allocated, 16, count * sizeof(float))) +} + +void system_specific_application_initialise() +{ +} + + +ProcessStatus +GetProcessStatus(int pid) +{ +#ifdef _WIN32 + HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (!handle) { + return ProcessNotRunning; + } else { + CloseHandle(handle); + return ProcessRunning; + } +#else + if (kill(getpid(), 0) == 0) { + if (kill(pid, 0) == 0) { + return ProcessRunning; + } else { + return ProcessNotRunning; + } + } else { + return UnknownProcessStatus; + } #endif -#endif - allocated = malloc(count * sizeof(float)); - for (int i = 0; i < count; ++i) ((float *)allocated)[i] = 0.f; - return (float *)allocated; } -float *allocFloat(int count) -{ - return allocFloat(0, count); -} - -void freeFloat(float *ptr) -{ - if (ptr) free(ptr); -} - -double *allocDouble(double *ptr, int count) -{ - if (ptr) free((void *)ptr); - void *allocated; -#ifndef _WIN32 -#ifndef __APPLE__ - if (posix_memalign(&allocated, 16, count * sizeof(double))) -#endif -#endif - allocated = malloc(count * sizeof(double)); - for (int i = 0; i < count; ++i) ((double *)allocated)[i] = 0.f; - return (double *)allocated; -} - -double *allocDouble(int count) -{ - return allocDouble(0, count); -} - -void freeDouble(double *ptr) -{ - if (ptr) free(ptr); -} - } diff --git a/src/system/sysutils.h b/src/system/sysutils.h new file mode 100644 index 0000000..e6eb96e --- /dev/null +++ b/src/system/sysutils.h @@ -0,0 +1,111 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Rubber Band + An audio time-stretching and pitch-shifting library. + Copyright 2007-2009 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef _RUBBERBAND_SYSUTILS_H_ +#define _RUBBERBAND_SYSUTILS_H_ + +#ifdef __MSVC__ +#include +#define R__ __restrict +#endif + +#ifdef __GNUC__ +#define R__ __restrict__ +#endif + +#ifndef R__ +#define R__ +#endif + +#ifdef __MINGW32__ +#include +#endif + +#ifdef __MSVC__ +#define alloca _alloca +#define getpid _getpid +#endif + +#ifdef __MSVC__ +#define uint8_t unsigned __int8 +#define uint16_t unsigned __int16 +#define uint32_t unsigned __int32 +#define ssize_t long +#else +#include +#endif + +#include + +namespace RubberBand { + +extern const char *system_get_platform_tag(); +extern bool system_is_multiprocessor(); +extern void system_specific_initialise(); +extern void system_specific_application_initialise(); + +#ifdef _WIN32 + +struct timeval { long tv_sec; long tv_usec; }; +void gettimeofday(struct timeval *p, void *tz); + +void usleep(unsigned long); + +#endif + +enum ProcessStatus { ProcessRunning, ProcessNotRunning, UnknownProcessStatus }; +extern ProcessStatus GetProcessStatus(int pid); + +inline double mod(double x, double y) { return x - (y * floor(x / y)); } +inline float modf(float x, float y) { return x - (y * float(floor(x / y))); } + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +inline double princarg(double a) { return mod(a + M_PI, -2.0 * M_PI) + M_PI; } +inline float princargf(float a) { return modf(a + (float)M_PI, -2.f * (float)M_PI) + (float)M_PI; } + +} // end namespace + +// The following should be functions in the RubberBand namespace, really + +#ifdef _WIN32 + +#define MLOCK(a,b) 1 +#define MUNLOCK(a,b) 1 +#define MUNLOCK_SAMPLEBLOCK(a) 1 + +#define DLOPEN(a,b) LoadLibrary((a).toStdWString().c_str()) +#define DLSYM(a,b) GetProcAddress((HINSTANCE)(a),(b)) +#define DLCLOSE(a) FreeLibrary((HINSTANCE)(a)) +#define DLERROR() "" + +#else + +#include +#include + +#define MLOCK(a,b) ::mlock((char *)(a),(b)) +#define MUNLOCK(a,b) (::munlock((char *)(a),(b)) ? (::perror("munlock failed"), 0) : 0) +#define MUNLOCK_SAMPLEBLOCK(a) do { if (!(a).empty()) { const float &b = *(a).begin(); MUNLOCK(&b, (a).capacity() * sizeof(float)); } } while(0); + +#define DLOPEN(a,b) dlopen((a).toStdString().c_str(),(b)) +#define DLSYM(a,b) dlsym((a),(b)) +#define DLCLOSE(a) dlclose((a)) +#define DLERROR() dlerror() + +#endif + +#endif diff --git a/src/sysutils.h b/src/sysutils.h deleted file mode 100644 index a529afd..0000000 --- a/src/sysutils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Rubber Band - An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -#ifndef _RUBBERBAND_SYSINFO_H_ -#define _RUBBERBAND_SYSINFO_H_ - -#ifdef __MSVC__ -#include "bsd-3rdparty/float_cast/float_cast.h" -#define R__ __restrict -#endif - -#ifdef __GNUC__ -#define R__ __restrict__ -#endif - -#ifndef R__ -#define R__ -#endif - -#ifdef __MINGW32__ -#include -#endif - -#ifdef __MSVC__ -#define alloca _alloca -#endif - -namespace RubberBand { - -extern bool system_is_multiprocessor(); - -#ifdef _WIN32 - -struct timeval { long tv_sec; long tv_usec; }; -int gettimeofday(struct timeval *p, void *tz); - -void usleep(unsigned long); - -#endif - -extern float *allocFloat(int); -extern float *allocFloat(float *, int); -extern void freeFloat(float *); - -extern double *allocDouble(int); -extern double *allocDouble(double *, int); -extern void freeDouble(double *); - -} - -#endif diff --git a/src/vamp/RubberBandVampPlugin.cpp b/vamp/RubberBandVampPlugin.cpp similarity index 99% rename from src/vamp/RubberBandVampPlugin.cpp rename to vamp/RubberBandVampPlugin.cpp index feb5bfa..c3ffa52 100644 --- a/src/vamp/RubberBandVampPlugin.cpp +++ b/vamp/RubberBandVampPlugin.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -15,7 +15,7 @@ #include "RubberBandVampPlugin.h" #include "StretchCalculator.h" -#include "sysutils.h" +#include "system/sysutils.h" #include diff --git a/src/vamp/RubberBandVampPlugin.h b/vamp/RubberBandVampPlugin.h similarity index 97% rename from src/vamp/RubberBandVampPlugin.h rename to vamp/RubberBandVampPlugin.h index f062e35..9033f76 100644 --- a/src/vamp/RubberBandVampPlugin.h +++ b/vamp/RubberBandVampPlugin.h @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/vamp/libmain.cpp b/vamp/libmain.cpp similarity index 96% rename from src/vamp/libmain.cpp rename to vamp/libmain.cpp index 1b41851..1a15b70 100644 --- a/src/vamp/libmain.cpp +++ b/vamp/libmain.cpp @@ -3,7 +3,7 @@ /* Rubber Band An audio time-stretching and pitch-shifting library. - Copyright 2007-2008 Chris Cannam. + Copyright 2007-2009 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/src/vamp/vamp-plugin.map b/vamp/vamp-plugin.map similarity index 100% rename from src/vamp/vamp-plugin.map rename to vamp/vamp-plugin.map diff --git a/src/vamp/vamp-rubberband.cat b/vamp/vamp-rubberband.cat similarity index 100% rename from src/vamp/vamp-rubberband.cat rename to vamp/vamp-rubberband.cat