This commit is contained in:
Chris Cannam
2014-05-16 16:55:10 +01:00
24 changed files with 262 additions and 88 deletions

View File

@@ -10,4 +10,6 @@ lib/*
*.log *.log
*.bak *.bak
config.status config.status
doc/html
*.rej

View File

@@ -5,3 +5,7 @@
61fe85a73bc32955feeb6fe17e668d9f522adde4 v1.7 61fe85a73bc32955feeb6fe17e668d9f522adde4 v1.7
61fe85a73bc32955feeb6fe17e668d9f522adde4 v1.7 61fe85a73bc32955feeb6fe17e668d9f522adde4 v1.7
efbc861f9b9460068c48a250232d343ffa7d5726 v1.7 efbc861f9b9460068c48a250232d343ffa7d5726 v1.7
551952b2e7a6bf5b1196778638c8cdc3c40b108f v1.8
77466ee7ffb5b07efda9b1dbed858379c987a9da v1.8.1
77466ee7ffb5b07efda9b1dbed858379c987a9da v1.8.1
d4911a276d96f6232a68c6b8448056d3946043b9 v1.8.1

View File

@@ -1,4 +1,21 @@
Changes in Rubber Band v1.8.1
* Fix a crash in formant-preserving pitch shift for some build targets
The API is unchanged and the library is binary compatible with
version 1.7.
Changes in Rubber Band v1.8
* Add build support for Win32/MSVC, Android, and various libraries
* Add Java JNI interface
The API is unchanged and the library is binary compatible with
version 1.7.
Changes in Rubber Band v1.7 Changes in Rubber Band v1.7
* Add the centre-focus option as an alternative processing mode for * Add the centre-focus option as an alternative processing mode for

View File

@@ -31,7 +31,7 @@ PROJECT_NAME = "Rubber Band Library"
# This could be handy for archiving the generated documentation or # This could be handy for archiving the generated documentation or
# if some version control system is used. # if some version control system is used.
PROJECT_NUMBER = 1.7 PROJECT_NUMBER = 1.8.1
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put. # base path where the generated documentation will be put.

View File

@@ -1,9 +1,15 @@
PREFIX := @prefix@
CXX := @CXX@ CXX := @CXX@
CXXFLAGS := -DHAVE_LIBSAMPLERATE -DHAVE_FFTW3 -DFFTW_DOUBLE_ONLY -DNO_THREAD_CHECKS -DUSE_PTHREADS -DNO_TIMING -DNDEBUG @CXXFLAGS@ @SRC_CFLAGS@ @SNDFILE_CFLAGS@ @FFTW_CFLAGS@ @Vamp_CFLAGS@ -Irubberband -I. -Isrc $(OPTFLAGS) CC := @CC@
CXXFLAGS := -DHAVE_LIBSAMPLERATE -DHAVE_FFTW3 -DFFTW_DOUBLE_ONLY -DNO_THREAD_CHECKS -DUSE_PTHREADS -DNO_TIMING -DNDEBUG -I. -Isrc -Irubberband @CXXFLAGS@ @SRC_CFLAGS@ @SNDFILE_CFLAGS@ @FFTW_CFLAGS@ @Vamp_CFLAGS@ $(OPTFLAGS)
CFLAGS := @CFLAGS@ $(OPTFLAGS) CFLAGS := @CFLAGS@ $(OPTFLAGS)
LDFLAGS := @LDFLAGS@ -lpthread $(LDFLAGS) LDFLAGS := @LDFLAGS@ -lpthread $(LDFLAGS)
JNI_CXXFLAGS := -I$(JAVA_HOME)/include
JAVAC := $(JAVA_HOME)/bin/javac
JAR := $(JAVA_HOME)/bin/jar
LIBRARY_LIBS := @SRC_LIBS@ @FFTW_LIBS@ LIBRARY_LIBS := @SRC_LIBS@ @FFTW_LIBS@
PROGRAM_LIBS := @SNDFILE_LIBS@ $(LIBRARY_LIBS) PROGRAM_LIBS := @SNDFILE_LIBS@ $(LIBRARY_LIBS)
VAMP_PLUGIN_LIBS := @Vamp_LIBS@ $(LIBRARY_LIBS) VAMP_PLUGIN_LIBS := @Vamp_LIBS@ $(LIBRARY_LIBS)
@@ -12,33 +18,39 @@ LADSPA_PLUGIN_LIBS := $(LIBRARY_LIBS)
MKDIR := mkdir MKDIR := mkdir
AR := ar AR := ar
INSTALL_BINDIR := $(PREFIX)/bin
INSTALL_INCDIR := $(PREFIX)/include/rubberband
INSTALL_LIBDIR := $(PREFIX)/lib
INSTALL_VAMPDIR := $(PREFIX)/lib/vamp
INSTALL_LADSPADIR := $(PREFIX)/lib/ladspa
INSTALL_LRDFDIR := $(PREFIX)/share/ladspa/rdf
INSTALL_PKGDIR := $(PREFIX)/lib/pkgconfig
LIBNAME := librubberband
JNINAME := librubberband-jni
JARNAME := rubberband.jar
DYNAMIC_EXTENSION := .so DYNAMIC_EXTENSION := .so
DYNAMIC_FULL_VERSION := .2.1.0 DYNAMIC_FULL_VERSION := 2.1.0
DYNAMIC_ABI_VERSION := .2 DYNAMIC_ABI_VERSION := 2
DYNAMIC_LIBNAME := librubberband$(DYNAMIC_EXTENSION) DYNAMIC_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-soname=$(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_ABI_VERSION)
DYNAMIC_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-soname=$(DYNAMIC_LIBNAME)$(DYNAMIC_ABI_VERSION)
VAMP_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=vamp/vamp-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 LADSPA_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,--version-script=ladspa/ladspa-plugin.map
PROGRAM_TARGET := bin/rubberband PROGRAM_TARGET := bin/rubberband
STATIC_TARGET := lib/librubberband.a STATIC_TARGET := lib/$(LIBNAME).a
DYNAMIC_TARGET := lib/$(DYNAMIC_LIBNAME) DYNAMIC_TARGET := lib/$(LIBNAME)$(DYNAMIC_EXTENSION)
JNI_TARGET := lib/$(JNINAME)$(DYNAMIC_EXTENSION)
JAR_TARGET := lib/$(JARNAME)
VAMP_TARGET := lib/vamp-rubberband$(DYNAMIC_EXTENSION) VAMP_TARGET := lib/vamp-rubberband$(DYNAMIC_EXTENSION)
LADSPA_TARGET := lib/ladspa-rubberband$(DYNAMIC_EXTENSION) LADSPA_TARGET := lib/ladspa-rubberband$(DYNAMIC_EXTENSION)
INSTALL_BINDIR := @prefix@/bin
INSTALL_INCDIR := @prefix@/include/rubberband
INSTALL_LIBDIR := @prefix@/lib
INSTALL_VAMPDIR := @prefix@/lib/vamp
INSTALL_LADSPADIR := @prefix@/lib/ladspa
INSTALL_LRDFDIR := @prefix@/share/ladspa/rdf
INSTALL_PKGDIR := @prefix@/lib/pkgconfig
all: bin lib $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) all: bin lib $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET)
static: $(STATIC_TARGET) static: $(STATIC_TARGET)
dynamic: $(DYNAMIC_TARGET) dynamic: $(DYNAMIC_TARGET)
library: $(STATIC_TARGET) $(DYNAMIC_TARGET) library: $(STATIC_TARGET) $(DYNAMIC_TARGET)
jni: $(JNI_TARGET) $(JAR_TARGET)
program: $(PROGRAM_TARGET) program: $(PROGRAM_TARGET)
vamp: $(VAMP_TARGET) vamp: $(VAMP_TARGET)
ladspa: $(LADSPA_TARGET) ladspa: $(LADSPA_TARGET)
@@ -93,6 +105,12 @@ LIBRARY_SOURCES := \
src/StretcherChannelData.cpp \ src/StretcherChannelData.cpp \
src/StretcherImpl.cpp src/StretcherImpl.cpp
JNI_SOURCE := \
src/jni/RubberBandStretcherJNI.cpp
JAVA_SOURCE := \
com/breakfastquay/rubberband/RubberBandStretcher.java
PROGRAM_SOURCES := \ PROGRAM_SOURCES := \
main/main.cpp main/main.cpp
@@ -112,7 +130,8 @@ LADSPA_SOURCES := \
LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o) LIBRARY_OBJECTS := $(LIBRARY_SOURCES:.cpp=.o)
LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o) LIBRARY_OBJECTS := $(LIBRARY_OBJECTS:.c=.o)
JNI_OBJECT := $(JNI_SOURCE:.cpp=.o)
JAVA_OBJECT := $(JAVA_SOURCE:.java=.class)
PROGRAM_OBJECTS := $(PROGRAM_SOURCES:.cpp=.o) PROGRAM_OBJECTS := $(PROGRAM_SOURCES:.cpp=.o)
VAMP_OBJECTS := $(VAMP_SOURCES:.cpp=.o) VAMP_OBJECTS := $(VAMP_SOURCES:.cpp=.o)
LADSPA_OBJECTS := $(LADSPA_SOURCES:.cpp=.o) LADSPA_OBJECTS := $(LADSPA_SOURCES:.cpp=.o)
@@ -126,6 +145,16 @@ $(STATIC_TARGET): $(LIBRARY_OBJECTS)
$(DYNAMIC_TARGET): $(LIBRARY_OBJECTS) $(DYNAMIC_TARGET): $(LIBRARY_OBJECTS)
$(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS) $(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS)
$(JNI_OBJECT): $(JNI_SOURCE)
$(CXX) -c $(JNI_CXXFLAGS) $(CXXFLAGS) $^ -o $@
$(JNI_TARGET): $(LIBRARY_OBJECTS) $(JNI_OBJECT)
$(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS)
$(JAR_TARGET): $(JAVA_SOURCE)
$(JAVAC) $^
$(JAR) cvf $@ $(JAVA_OBJECT)
$(VAMP_TARGET): $(LIBRARY_OBJECTS) $(VAMP_OBJECTS) $(VAMP_TARGET): $(LIBRARY_OBJECTS) $(VAMP_OBJECTS)
$(CXX) $(VAMP_LDFLAGS) -o $@ $^ $(VAMP_PLUGIN_LIBS) $(LDFLAGS) $(CXX) $(VAMP_LDFLAGS) -o $@ $^ $(VAMP_PLUGIN_LIBS) $(LDFLAGS)
@@ -148,24 +177,26 @@ install: all
cp $(PROGRAM_TARGET) $(DESTDIR)$(INSTALL_BINDIR) cp $(PROGRAM_TARGET) $(DESTDIR)$(INSTALL_BINDIR)
cp $(PUBLIC_INCLUDES) $(DESTDIR)$(INSTALL_INCDIR) cp $(PUBLIC_INCLUDES) $(DESTDIR)$(INSTALL_INCDIR)
cp $(STATIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR) cp $(STATIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)
rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(DYNAMIC_LIBNAME)$(DYNAMIC_ABI_VERSION) rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_ABI_VERSION)
rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(DYNAMIC_LIBNAME) rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION)
cp $(DYNAMIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)/$(DYNAMIC_LIBNAME)$(DYNAMIC_FULL_VERSION) rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(JNINAME)$(DYNAMIC_EXTENSION)
test -n "$(DYNAMIC_FULL_VERSION)" && ln -s $(DYNAMIC_LIBNAME)$(DYNAMIC_FULL_VERSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(DYNAMIC_LIBNAME)$(DYNAMIC_ABI_VERSION) cp $(DYNAMIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_FULL_VERSION)
test -n "$(DYNAMIC_FULL_VERSION)" && ln -s $(DYNAMIC_LIBNAME)$(DYNAMIC_FULL_VERSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(DYNAMIC_LIBNAME) ln -s $(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_FULL_VERSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_ABI_VERSION)
ln -s $(LIBNAME)$(DYNAMIC_EXTENSION).$(DYNAMIC_FULL_VERSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION)
cp $(JNI_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)/$(JNINAME)$(DYNAMIC_EXTENSION)
cp $(VAMP_TARGET) $(DESTDIR)$(INSTALL_VAMPDIR) cp $(VAMP_TARGET) $(DESTDIR)$(INSTALL_VAMPDIR)
cp vamp/vamp-rubberband.cat $(DESTDIR)$(INSTALL_VAMPDIR) cp vamp/vamp-rubberband.cat $(DESTDIR)$(INSTALL_VAMPDIR)
cp $(LADSPA_TARGET) $(DESTDIR)$(INSTALL_LADSPADIR) cp $(LADSPA_TARGET) $(DESTDIR)$(INSTALL_LADSPADIR)
cp ladspa/ladspa-rubberband.cat $(DESTDIR)$(INSTALL_LADSPADIR) cp ladspa/ladspa-rubberband.cat $(DESTDIR)$(INSTALL_LADSPADIR)
cp ladspa/ladspa-rubberband.rdf $(DESTDIR)$(INSTALL_LRDFDIR) cp ladspa/ladspa-rubberband.rdf $(DESTDIR)$(INSTALL_LRDFDIR)
sed "s,%PREFIX%,@prefix@," rubberband.pc.in \ sed "s,%PREFIX%,$(PREFIX)," rubberband.pc.in \
> $(DESTDIR)$(INSTALL_PKGDIR)/rubberband.pc > $(DESTDIR)$(INSTALL_PKGDIR)/rubberband.pc
clean: clean:
rm -f $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) $(LADSPA_OBJECTS) $(VAMP_OBJECTS) rm -f $(LIBRARY_OBJECTS) $(JNI_OBJECT) $(JAVA_OBJECT) $(PROGRAM_OBJECTS) $(LADSPA_OBJECTS) $(VAMP_OBJECTS)
distclean: clean distclean: clean
rm -f $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) rm -f $(PROGRAM_TARGET) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(JNI_TARGET) $(JAR_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET)
depend: depend:
makedepend -Y $(LIBRARY_SOURCES) $(PROGRAM_SOURCES) makedepend -Y $(LIBRARY_SOURCES) $(PROGRAM_SOURCES)

View File

@@ -1,35 +1,47 @@
PREFIX := /usr/local
CXX := g++ CXX := g++
CC := gcc CC := gcc
ARCHFLAGS := ARCHFLAGS :=
OPTFLAGS := -DNDEBUG -ffast-math -mfpmath=sse -msse -msse2 -O3 -ftree-vectorize OPTFLAGS := -DNDEBUG -ffast-math -mfpmath=sse -msse -msse2 -O3 -ftree-vectorize
CXXFLAGS := $(ARCHFLAGS) $(OPTFLAGS) -I/usr/local/include -DUSE_PTHREADS -DMALLOC_IS_ALIGNED -DHAVE_VDSP -DUSE_SPEEX -DNO_THREAD_CHECKS -DNO_TIMING -Irubberband -I. -Isrc CXXFLAGS := $(ARCHFLAGS) $(OPTFLAGS) -I. -Isrc -Irubberband -I/usr/local/include -DUSE_PTHREADS -DMALLOC_IS_ALIGNED -DHAVE_VDSP -DUSE_SPEEX -DNO_THREAD_CHECKS -DNO_TIMING
LIBRARY_LIBS := -framework Accelerate
CFLAGS := $(ARCHFLAGS) $(OPTFLAGS) CFLAGS := $(ARCHFLAGS) $(OPTFLAGS)
LDFLAGS := $(ARCHFLAGS) -lpthread $(LDFLAGS) LDFLAGS := $(ARCHFLAGS) -lpthread $(LDFLAGS)
PROGRAM_LIBS := -L/usr/local/lib -lsndfile $(LIBRARY_LIBS) LIBRARY_LIBS := -framework Accelerate
VAMP_PLUGIN_LIBS := -L/usr/local/lib -lvamp-sdk $(LIBRARY_LIBS) PROGRAM_LIBS := -L$(PREFIX)/lib -lsndfile $(LIBRARY_LIBS)
VAMP_PLUGIN_LIBS := -L$(PREFIX)/lib -lvamp-sdk $(LIBRARY_LIBS)
LADSPA_PLUGIN_LIBS := $(LIBRARY_LIBS) LADSPA_PLUGIN_LIBS := $(LIBRARY_LIBS)
MKDIR := mkdir MKDIR := mkdir
AR := ar AR := ar
DYNAMIC_LDFLAGS := -dynamiclib INSTALL_BINDIR := $(PREFIX)/bin
INSTALL_INCDIR := $(PREFIX)/include/rubberband
INSTALL_LIBDIR := $(PREFIX)/lib
INSTALL_VAMPDIR := $(PREFIX)/lib/vamp
INSTALL_LADSPADIR := $(PREFIX)/lib/ladspa
INSTALL_LRDFDIR := $(PREFIX)/share/ladspa/rdf
INSTALL_PKGDIR := $(PREFIX)/lib/pkgconfig
LIBNAME := librubberband
DYNAMIC_EXTENSION := .dylib DYNAMIC_EXTENSION := .dylib
DYNAMIC_FULL_VERSION := 2.1.0
DYNAMIC_ABI_VERSION := 2
DYNAMIC_LDFLAGS := -dynamiclib -install_name $(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION) -current_version $(DYNAMIC_FULL_VERSION) -compatibility_version $(DYNAMIC_ABI_VERSION)
PROGRAM_TARGET := bin/rubberband PROGRAM_TARGET := bin/rubberband
STATIC_TARGET := lib/librubberband.a STATIC_TARGET := lib/$(LIBNAME).a
DYNAMIC_TARGET := lib/librubberband$(DYNAMIC_EXTENSION) DYNAMIC_TARGET := lib/$(LIBNAME)$(DYNAMIC_EXTENSION)
VAMP_TARGET := lib/vamp-rubberband$(DYNAMIC_EXTENSION) VAMP_TARGET := lib/vamp-rubberband$(DYNAMIC_EXTENSION)
LADSPA_TARGET := lib/ladspa-rubberband$(DYNAMIC_EXTENSION) LADSPA_TARGET := lib/ladspa-rubberband$(DYNAMIC_EXTENSION)
default: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET) default: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET)
all: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET) all: bin lib $(STATIC_TARGET) $(DYNAMIC_TARGET) $(PROGRAM_TARGET) $(VAMP_TARGET) $(LADSPA_TARGET)
static: $(STATIC_TARGET) static: $(STATIC_TARGET)
dynamic: $(DYNAMIC_TARGET) dynamic: $(DYNAMIC_TARGET)
@@ -121,10 +133,10 @@ VAMP_OBJECTS := $(VAMP_SOURCES:.cpp=.o)
LADSPA_OBJECTS := $(LADSPA_SOURCES:.cpp=.o) LADSPA_OBJECTS := $(LADSPA_SOURCES:.cpp=.o)
$(PROGRAM_TARGET): $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) $(PROGRAM_TARGET): $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS)
$(CXX) -o $@ $^ $(PROGRAM_LIBS) $(PROGRAM_LIBS) $(LDFLAGS) $(CXX) -o $@ $^ $(PROGRAM_LIBS) $(LDFLAGS)
$(STATIC_TARGET): $(LIBRARY_OBJECTS) $(STATIC_TARGET): $(LIBRARY_OBJECTS)
$(AR) rc $@ $^ $(AR) rsc $@ $^
$(DYNAMIC_TARGET): $(LIBRARY_OBJECTS) $(DYNAMIC_TARGET): $(LIBRARY_OBJECTS)
$(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS) $(CXX) $(DYNAMIC_LDFLAGS) $^ -o $@ $(LIBRARY_LIBS) $(LDFLAGS)
@@ -140,6 +152,30 @@ bin:
lib: lib:
$(MKDIR) $@ $(MKDIR) $@
install: default
$(MKDIR) -p $(DESTDIR)$(INSTALL_BINDIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_INCDIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_LIBDIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_VAMPDIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_LADSPADIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_LRDFDIR)
$(MKDIR) -p $(DESTDIR)$(INSTALL_PKGDIR)
cp $(PROGRAM_TARGET) $(DESTDIR)$(INSTALL_BINDIR)
cp $(PUBLIC_INCLUDES) $(DESTDIR)$(INSTALL_INCDIR)
cp $(STATIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)
rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION)
rm -f $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION)
cp $(DYNAMIC_TARGET) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION)
ln -s $(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME).$(DYNAMIC_ABI_VERSION)$(DYNAMIC_EXTENSION)
ln -s $(LIBNAME).$(DYNAMIC_FULL_VERSION)$(DYNAMIC_EXTENSION) $(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)$(DYNAMIC_EXTENSION)
cp $(VAMP_TARGET) $(DESTDIR)$(INSTALL_VAMPDIR)
cp vamp/vamp-rubberband.cat $(DESTDIR)$(INSTALL_VAMPDIR)
cp $(LADSPA_TARGET) $(DESTDIR)$(INSTALL_LADSPADIR)
cp ladspa/ladspa-rubberband.cat $(DESTDIR)$(INSTALL_LADSPADIR)
cp ladspa/ladspa-rubberband.rdf $(DESTDIR)$(INSTALL_LRDFDIR)
sed "s,%PREFIX%,$(PREFIX)," rubberband.pc.in \
> $(DESTDIR)$(INSTALL_PKGDIR)/rubberband.pc
clean: clean:
rm -f $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) $(LADSPA_OBJECTS) $(VAMP_OBJECTS) rm -f $(LIBRARY_OBJECTS) $(PROGRAM_OBJECTS) $(LADSPA_OBJECTS) $(VAMP_OBJECTS)

View File

@@ -5,7 +5,7 @@ Rubber Band
An audio time-stretching and pitch-shifting library and utility program. An audio time-stretching and pitch-shifting library and utility program.
Written by Chris Cannam, chris.cannam@breakfastquay.com. Written by Chris Cannam, chris.cannam@breakfastquay.com.
Copyright 2007-2012 Particular Programs Ltd. Copyright 2007-2014 Particular Programs Ltd.
Rubber Band is a library and utility program that permits changing the Rubber Band is a library and utility program that permits changing the
tempo and pitch of an audio recording independently of one another. tempo and pitch of an audio recording independently of one another.

View File

@@ -103,7 +103,7 @@ public class RubberBandStretcher
public static final int PercussiveOptions = 0x00102000; public static final int PercussiveOptions = 0x00102000;
static { static {
System.loadLibrary("rubberband"); System.loadLibrary("rubberband-jni");
} }
}; };

18
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for RubberBand 1.7. # Generated by GNU Autoconf 2.69 for RubberBand 1.8.1.
# #
# Report bugs to <chris.cannam@breakfastquay.com>. # Report bugs to <chris.cannam@breakfastquay.com>.
# #
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='RubberBand' PACKAGE_NAME='RubberBand'
PACKAGE_TARNAME='rubberband' PACKAGE_TARNAME='rubberband'
PACKAGE_VERSION='1.7' PACKAGE_VERSION='1.8.1'
PACKAGE_STRING='RubberBand 1.7' PACKAGE_STRING='RubberBand 1.8.1'
PACKAGE_BUGREPORT='chris.cannam@breakfastquay.com' PACKAGE_BUGREPORT='chris.cannam@breakfastquay.com'
PACKAGE_URL='' PACKAGE_URL=''
@@ -1253,7 +1253,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures RubberBand 1.7 to adapt to many kinds of systems. \`configure' configures RubberBand 1.8.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1314,7 +1314,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of RubberBand 1.7:";; short | recursive ) echo "Configuration of RubberBand 1.8.1:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1411,7 +1411,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
RubberBand configure 1.7 RubberBand configure 1.8.1
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1705,7 +1705,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by RubberBand $as_me 1.7, which was It was created by RubberBand $as_me 1.8.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -4801,7 +4801,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by RubberBand $as_me 1.7, which was This file was extended by RubberBand $as_me 1.8.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -4854,7 +4854,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
RubberBand config.status 1.7 RubberBand config.status 1.8.1
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,8 +1,9 @@
AC_INIT(RubberBand, 1.7, chris.cannam@breakfastquay.com) AC_INIT(RubberBand, 1.8.1, chris.cannam@breakfastquay.com)
AC_CONFIG_SRCDIR(src/StretcherImpl.h) AC_CONFIG_SRCDIR(src/StretcherImpl.h)
AC_PROG_CXX AC_PROG_CXX
AC_PROG_CC
AC_HEADER_STDC AC_HEADER_STDC
AC_C_BIGENDIAN AC_C_BIGENDIAN

View File

@@ -4,7 +4,7 @@ libdir=${exec_prefix}/lib
includedir=${prefix}/include includedir=${prefix}/include
Name: rubberband Name: rubberband
Version: 1.4.0 Version: 1.8.1
Description: Description:
Libs: -L${libdir} -lrubberband Libs: -L${libdir} -lrubberband
Cflags: -I${includedir} Cflags: -I${includedir}

View File

@@ -24,7 +24,7 @@
#ifndef _RUBBERBANDSTRETCHER_H_ #ifndef _RUBBERBANDSTRETCHER_H_
#define _RUBBERBANDSTRETCHER_H_ #define _RUBBERBANDSTRETCHER_H_
#define RUBBERBAND_VERSION "1.7" #define RUBBERBAND_VERSION "1.8.1"
#define RUBBERBAND_API_MAJOR_VERSION 2 #define RUBBERBAND_API_MAJOR_VERSION 2
#define RUBBERBAND_API_MINOR_VERSION 5 #define RUBBERBAND_API_MINOR_VERSION 5

View File

@@ -28,7 +28,7 @@
extern "C" { extern "C" {
#endif #endif
#define RUBBERBAND_VERSION "1.7" #define RUBBERBAND_VERSION "1.8.1"
#define RUBBERBAND_API_MAJOR_VERSION 2 #define RUBBERBAND_API_MAJOR_VERSION 2
#define RUBBERBAND_API_MINOR_VERSION 5 #define RUBBERBAND_API_MINOR_VERSION 5

View File

@@ -86,6 +86,7 @@ RubberBandStretcher::Impl::ChannelData::construct(const std::set<size_t> &sizes,
accumulator = allocate_and_zero<float>(maxSize); accumulator = allocate_and_zero<float>(maxSize);
windowAccumulator = allocate_and_zero<float>(maxSize); windowAccumulator = allocate_and_zero<float>(maxSize);
ms = allocate_and_zero<float>(maxSize);
interpolator = allocate_and_zero<float>(maxSize); interpolator = allocate_and_zero<float>(maxSize);
interpolatorScale = 0; interpolatorScale = 0;
@@ -176,8 +177,8 @@ RubberBandStretcher::Impl::ChannelData::setSizes(size_t windowSize,
envelope = reallocate_and_zero(envelope, oldReal, realSize); envelope = reallocate_and_zero(envelope, oldReal, realSize);
fltbuf = reallocate_and_zero(fltbuf, oldMax, maxSize); fltbuf = reallocate_and_zero(fltbuf, oldMax, maxSize);
dblbuf = reallocate_and_zero(dblbuf, oldMax, maxSize); dblbuf = reallocate_and_zero(dblbuf, oldMax, maxSize);
ms = reallocate_and_zero(ms, oldMax, maxSize);
interpolator = reallocate_and_zero<float>(interpolator, oldMax, maxSize); interpolator = reallocate_and_zero(interpolator, oldMax, maxSize);
// But we do want to preserve data in these // But we do want to preserve data in these
@@ -243,6 +244,8 @@ RubberBandStretcher::Impl::ChannelData::~ChannelData()
deallocate(prevError); deallocate(prevError);
deallocate(unwrappedPhase); deallocate(unwrappedPhase);
deallocate(envelope); deallocate(envelope);
deallocate(interpolator);
deallocate(ms);
deallocate(accumulator); deallocate(accumulator);
deallocate(windowAccumulator); deallocate(windowAccumulator);
deallocate(fltbuf); deallocate(fltbuf);

View File

@@ -111,6 +111,7 @@ public:
float *accumulator; float *accumulator;
size_t accumulatorFill; size_t accumulatorFill;
float *windowAccumulator; float *windowAccumulator;
float *ms; // only used when mid-side processing
float *interpolator; // only used when time-domain smoothing is on float *interpolator; // only used when time-domain smoothing is on
int interpolatorScale; int interpolatorScale;

View File

@@ -537,7 +537,7 @@ RubberBandStretcher::Impl::calculateSizes()
// ratio) for any chunk. // ratio) for any chunk.
if (m_debugLevel > 0) { if (m_debugLevel > 0) {
cerr << "configure: effective ratio = " << getEffectiveRatio() << endl; cerr << "configure: time ratio = " << m_timeRatio << ", pitch scale = " << m_pitchScale << ", effective ratio = " << getEffectiveRatio() << endl;
cerr << "configure: analysis window size = " << m_aWindowSize << ", synthesis window size = " << m_sWindowSize << ", fft size = " << m_fftSize << ", increment = " << m_increment << " (approx output increment = " << int(lrint(m_increment * getEffectiveRatio())) << ")" << endl; cerr << "configure: analysis window size = " << m_aWindowSize << ", synthesis window size = " << m_sWindowSize << ", fft size = " << m_fftSize << ", increment = " << m_increment << " (approx output increment = " << int(lrint(m_increment * getEffectiveRatio())) << ")" << endl;
} }

View File

@@ -183,7 +183,6 @@ RubberBandStretcher::Impl::consumeChannel(size_t c,
bool resampling = resampleBeforeStretching(); bool resampling = resampleBeforeStretching();
float *ms = 0;
const float *input = 0; const float *input = 0;
bool useMidSide = ((m_options & OptionChannelsTogether) && bool useMidSide = ((m_options & OptionChannelsTogether) &&
@@ -214,9 +213,8 @@ RubberBandStretcher::Impl::consumeChannel(size_t c,
#endif #endif
if (useMidSide) { if (useMidSide) {
ms = (float *)alloca(samples * sizeof(float)); prepareChannelMS(c, inputs, offset, samples, cd.ms);
prepareChannelMS(c, inputs, offset, samples, ms); input = cd.ms;
input = ms;
} else { } else {
input = inputs[c] + offset; input = inputs[c] + offset;
} }
@@ -252,9 +250,8 @@ RubberBandStretcher::Impl::consumeChannel(size_t c,
} else { } else {
if (useMidSide) { if (useMidSide) {
ms = (float *)alloca(toWrite * sizeof(float)); prepareChannelMS(c, inputs, offset, toWrite, cd.ms);
prepareChannelMS(c, inputs, offset, toWrite, ms); input = cd.ms;
input = ms;
} else { } else {
input = inputs[c] + offset; input = inputs[c] + offset;
} }
@@ -281,6 +278,8 @@ RubberBandStretcher::Impl::processChunks(size_t c, bool &any, bool &last)
last = false; last = false;
any = false; any = false;
float *tmp = 0;
while (!last) { while (!last) {
if (!testInbufReadSpace(c)) { if (!testInbufReadSpace(c)) {
@@ -312,8 +311,8 @@ RubberBandStretcher::Impl::processChunks(size_t c, bool &any, bool &last)
if (m_debugLevel > 1) { if (m_debugLevel > 1) {
cerr << "channel " << c << " breaking down overlong increment " << shiftIncrement << " into " << bit << "-size bits" << endl; cerr << "channel " << c << " breaking down overlong increment " << shiftIncrement << " into " << bit << "-size bits" << endl;
} }
if (!tmp) tmp = allocate<float>(m_aWindowSize);
analyseChunk(c); analyseChunk(c);
float *tmp = (float *)alloca(m_aWindowSize * sizeof(float));
v_copy(tmp, cd.fltbuf, m_aWindowSize); v_copy(tmp, cd.fltbuf, m_aWindowSize);
for (size_t i = 0; i < shiftIncrement; i += bit) { for (size_t i = 0; i < shiftIncrement; i += bit) {
v_copy(cd.fltbuf, tmp, m_aWindowSize); v_copy(cd.fltbuf, tmp, m_aWindowSize);
@@ -332,6 +331,8 @@ RubberBandStretcher::Impl::processChunks(size_t c, bool &any, bool &last)
cerr << "channel " << c << ": last = " << last << ", chunkCount = " << cd.chunkCount << endl; cerr << "channel " << c << ": last = " << last << ", chunkCount = " << cd.chunkCount << endl;
} }
} }
if (tmp) deallocate(tmp);
} }
bool bool
@@ -930,7 +931,8 @@ RubberBandStretcher::Impl::formantShiftChunk(size_t channel)
v_scale(dblbuf, factor, cutoff); v_scale(dblbuf, factor, cutoff);
cd.fft->forward(dblbuf, envelope, 0); process_t *spare = (process_t *)alloca((hs + 1) * sizeof(process_t));
cd.fft->forward(dblbuf, envelope, spare);
v_exp(envelope, hs + 1); v_exp(envelope, hs + 1);
v_divide(mag, envelope, hs + 1); v_divide(mag, envelope, hs + 1);

View File

@@ -3187,99 +3187,154 @@ FFT::~FFT()
delete d; delete d;
} }
#ifndef NO_EXCEPTIONS
#define CHECK_NOT_NULL(x) \
if (!(x)) { \
std::cerr << "FFT: ERROR: Null argument " #x << std::endl; \
throw NullArgument; \
}
#else
#define CHECK_NOT_NULL(x) \
if (!(x)) { \
std::cerr << "FFT: ERROR: Null argument " #x << std::endl; \
std::cerr << "FFT: Would be throwing NullArgument here, if exceptions were not disabled" << std::endl; \
return; \
}
#endif
void void
FFT::forward(const double *R__ realIn, double *R__ realOut, double *R__ imagOut) FFT::forward(const double *R__ realIn, double *R__ realOut, double *R__ imagOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(realOut);
CHECK_NOT_NULL(imagOut);
d->forward(realIn, realOut, imagOut); d->forward(realIn, realOut, imagOut);
} }
void void
FFT::forwardInterleaved(const double *R__ realIn, double *R__ complexOut) FFT::forwardInterleaved(const double *R__ realIn, double *R__ complexOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(complexOut);
d->forwardInterleaved(realIn, complexOut); d->forwardInterleaved(realIn, complexOut);
} }
void void
FFT::forwardPolar(const double *R__ realIn, double *R__ magOut, double *R__ phaseOut) FFT::forwardPolar(const double *R__ realIn, double *R__ magOut, double *R__ phaseOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(magOut);
CHECK_NOT_NULL(phaseOut);
d->forwardPolar(realIn, magOut, phaseOut); d->forwardPolar(realIn, magOut, phaseOut);
} }
void void
FFT::forwardMagnitude(const double *R__ realIn, double *R__ magOut) FFT::forwardMagnitude(const double *R__ realIn, double *R__ magOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(magOut);
d->forwardMagnitude(realIn, magOut); d->forwardMagnitude(realIn, magOut);
} }
void void
FFT::forward(const float *R__ realIn, float *R__ realOut, float *R__ imagOut) FFT::forward(const float *R__ realIn, float *R__ realOut, float *R__ imagOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(realOut);
CHECK_NOT_NULL(imagOut);
d->forward(realIn, realOut, imagOut); d->forward(realIn, realOut, imagOut);
} }
void void
FFT::forwardInterleaved(const float *R__ realIn, float *R__ complexOut) FFT::forwardInterleaved(const float *R__ realIn, float *R__ complexOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(complexOut);
d->forwardInterleaved(realIn, complexOut); d->forwardInterleaved(realIn, complexOut);
} }
void void
FFT::forwardPolar(const float *R__ realIn, float *R__ magOut, float *R__ phaseOut) FFT::forwardPolar(const float *R__ realIn, float *R__ magOut, float *R__ phaseOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(magOut);
CHECK_NOT_NULL(phaseOut);
d->forwardPolar(realIn, magOut, phaseOut); d->forwardPolar(realIn, magOut, phaseOut);
} }
void void
FFT::forwardMagnitude(const float *R__ realIn, float *R__ magOut) FFT::forwardMagnitude(const float *R__ realIn, float *R__ magOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(magOut);
d->forwardMagnitude(realIn, magOut); d->forwardMagnitude(realIn, magOut);
} }
void void
FFT::inverse(const double *R__ realIn, const double *R__ imagIn, double *R__ realOut) FFT::inverse(const double *R__ realIn, const double *R__ imagIn, double *R__ realOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(imagIn);
CHECK_NOT_NULL(realOut);
d->inverse(realIn, imagIn, realOut); d->inverse(realIn, imagIn, realOut);
} }
void void
FFT::inverseInterleaved(const double *R__ complexIn, double *R__ realOut) FFT::inverseInterleaved(const double *R__ complexIn, double *R__ realOut)
{ {
CHECK_NOT_NULL(complexIn);
CHECK_NOT_NULL(realOut);
d->inverseInterleaved(complexIn, realOut); d->inverseInterleaved(complexIn, realOut);
} }
void void
FFT::inversePolar(const double *R__ magIn, const double *R__ phaseIn, double *R__ realOut) FFT::inversePolar(const double *R__ magIn, const double *R__ phaseIn, double *R__ realOut)
{ {
CHECK_NOT_NULL(magIn);
CHECK_NOT_NULL(phaseIn);
CHECK_NOT_NULL(realOut);
d->inversePolar(magIn, phaseIn, realOut); d->inversePolar(magIn, phaseIn, realOut);
} }
void void
FFT::inverseCepstral(const double *R__ magIn, double *R__ cepOut) FFT::inverseCepstral(const double *R__ magIn, double *R__ cepOut)
{ {
CHECK_NOT_NULL(magIn);
CHECK_NOT_NULL(cepOut);
d->inverseCepstral(magIn, cepOut); d->inverseCepstral(magIn, cepOut);
} }
void void
FFT::inverse(const float *R__ realIn, const float *R__ imagIn, float *R__ realOut) FFT::inverse(const float *R__ realIn, const float *R__ imagIn, float *R__ realOut)
{ {
CHECK_NOT_NULL(realIn);
CHECK_NOT_NULL(imagIn);
CHECK_NOT_NULL(realOut);
d->inverse(realIn, imagIn, realOut); d->inverse(realIn, imagIn, realOut);
} }
void void
FFT::inverseInterleaved(const float *R__ complexIn, float *R__ realOut) FFT::inverseInterleaved(const float *R__ complexIn, float *R__ realOut)
{ {
CHECK_NOT_NULL(complexIn);
CHECK_NOT_NULL(realOut);
d->inverseInterleaved(complexIn, realOut); d->inverseInterleaved(complexIn, realOut);
} }
void void
FFT::inversePolar(const float *R__ magIn, const float *R__ phaseIn, float *R__ realOut) FFT::inversePolar(const float *R__ magIn, const float *R__ phaseIn, float *R__ realOut)
{ {
CHECK_NOT_NULL(magIn);
CHECK_NOT_NULL(phaseIn);
CHECK_NOT_NULL(realOut);
d->inversePolar(magIn, phaseIn, realOut); d->inversePolar(magIn, phaseIn, realOut);
} }
void void
FFT::inverseCepstral(const float *R__ magIn, float *R__ cepOut) FFT::inverseCepstral(const float *R__ magIn, float *R__ cepOut)
{ {
CHECK_NOT_NULL(magIn);
CHECK_NOT_NULL(cepOut);
d->inverseCepstral(magIn, cepOut); d->inverseCepstral(magIn, cepOut);
} }

View File

@@ -46,14 +46,20 @@ class FFTImpl;
* size/2+1 real+imaginary pairs. So, the array elements at indices 1 * size/2+1 real+imaginary pairs. So, the array elements at indices 1
* and size+1 will always be zero (since the signal is real). * and size+1 will always be zero (since the signal is real).
* *
* All pointer arguments must point to valid data. A NullArgument
* exception is thrown if any argument is NULL.
*
* Neither forward nor inverse transform is scaled.
*
* This class is reentrant but not thread safe: use a separate * This class is reentrant but not thread safe: use a separate
* instance per thread, or use a mutex. * instance per thread, or use a mutex.
*/ */
class FFT class FFT
{ {
public: public:
enum Exception { InvalidSize, InvalidImplementation, InternalError }; enum Exception {
NullArgument, InvalidSize, InvalidImplementation, InternalError
};
FFT(int size, int debugLevel = 0); // may throw InvalidSize FFT(int size, int debugLevel = 0); // may throw InvalidSize
~FFT(); ~FFT();

View File

@@ -993,6 +993,7 @@ D_Speex::resample(const float *const R__ *const R__ in,
//!!! check err, respond appropriately //!!! check err, respond appropriately
if (m_channels > 1) { if (m_channels > 1) {
v_deinterleave(out, m_iout, m_channels, outcount); v_deinterleave(out, m_iout, m_channels, outcount);
} }
@@ -1023,6 +1024,8 @@ D_Speex::resampleInterleaved(const float *const R__ in,
data_out, data_out,
&outcount); &outcount);
// std::cerr << "D_SPEEX: incount " << incount << " ratio " << ratio << " req " << lrintf(ceilf(incount * ratio)) << " final " << final << " output_frames_gen " << outcount << std::endl;
return outcount; return outcount;
} }

View File

@@ -1,3 +1,6 @@
#ifndef ERIKD_FLOATCAST_H
#define ERIKD_FLOATCAST_H
/* /*
** Copyright (C) 2001 Erik de Castro Lopo <erikd AT mega-nerd DOT com> ** Copyright (C) 2001 Erik de Castro Lopo <erikd AT mega-nerd DOT com>
** **
@@ -69,5 +72,4 @@
#endif #endif
#endif

View File

@@ -199,105 +199,111 @@ setStretcher(JNIEnv *env, jobject obj, RubberBandStretcher *stretcher)
env->SetLongField(obj, fid, handle); env->SetLongField(obj, fid, handle);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_initialise(JNIEnv *env, jobject obj, jint sampleRate, jint channels, jint options, jdouble initialTimeRatio, jdouble initialPitchScale) Java_com_breakfastquay_rubberband_RubberBandStretcher_initialise(JNIEnv *env, jobject obj, jint sampleRate, jint channels, jint options, jdouble initialTimeRatio, jdouble initialPitchScale)
{ {
setStretcher(env, obj, new RubberBandStretcher setStretcher(env, obj, new RubberBandStretcher
(sampleRate, channels, options, initialTimeRatio, initialPitchScale)); (sampleRate, channels, options, initialTimeRatio, initialPitchScale));
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_dispose(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_dispose(JNIEnv *env, jobject obj)
{ {
delete getStretcher(env, obj); delete getStretcher(env, obj);
setStretcher(env, obj, 0); setStretcher(env, obj, 0);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_reset(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_reset(JNIEnv *env, jobject obj)
{ {
getStretcher(env, obj)->reset(); getStretcher(env, obj)->reset();
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setTimeRatio(JNIEnv *env, jobject obj, jdouble ratio) Java_com_breakfastquay_rubberband_RubberBandStretcher_setTimeRatio(JNIEnv *env, jobject obj, jdouble ratio)
{ {
getStretcher(env, obj)->setTimeRatio(ratio); getStretcher(env, obj)->setTimeRatio(ratio);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setPitchScale(JNIEnv *env, jobject obj, jdouble scale) Java_com_breakfastquay_rubberband_RubberBandStretcher_setPitchScale(JNIEnv *env, jobject obj, jdouble scale)
{ {
getStretcher(env, obj)->setPitchScale(scale); getStretcher(env, obj)->setPitchScale(scale);
} }
jint JNIEXPORT jint JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_getChannelCount(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_getChannelCount(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->getChannelCount(); return getStretcher(env, obj)->getChannelCount();
} }
jdouble JNIEXPORT jdouble JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_getTimeRatio(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_getTimeRatio(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->getTimeRatio(); return getStretcher(env, obj)->getTimeRatio();
} }
jdouble JNIEXPORT jdouble JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_getPitchScale(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_getPitchScale(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->getPitchScale(); return getStretcher(env, obj)->getPitchScale();
} }
jint JNIEXPORT jint JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_getLatency(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_getLatency(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->getLatency(); return getStretcher(env, obj)->getLatency();
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setTransientsOption(JNIEnv *env, jobject obj, jint options) Java_com_breakfastquay_rubberband_RubberBandStretcher_setTransientsOption(JNIEnv *env, jobject obj, jint options)
{ {
getStretcher(env, obj)->setTransientsOption(options); getStretcher(env, obj)->setTransientsOption(options);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setDetectorOption(JNIEnv *env, jobject obj, jint options) Java_com_breakfastquay_rubberband_RubberBandStretcher_setDetectorOption(JNIEnv *env, jobject obj, jint options)
{ {
getStretcher(env, obj)->setDetectorOption(options); getStretcher(env, obj)->setDetectorOption(options);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setPhaseOption(JNIEnv *env, jobject obj, jint options) Java_com_breakfastquay_rubberband_RubberBandStretcher_setPhaseOption(JNIEnv *env, jobject obj, jint options)
{ {
getStretcher(env, obj)->setPhaseOption(options); getStretcher(env, obj)->setPhaseOption(options);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setFormantOption(JNIEnv *env, jobject obj, jint options) Java_com_breakfastquay_rubberband_RubberBandStretcher_setFormantOption(JNIEnv *env, jobject obj, jint options)
{ {
getStretcher(env, obj)->setFormantOption(options); getStretcher(env, obj)->setFormantOption(options);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setPitchOption(JNIEnv *env, jobject obj, jint options) Java_com_breakfastquay_rubberband_RubberBandStretcher_setPitchOption(JNIEnv *env, jobject obj, jint options)
{ {
getStretcher(env, obj)->setPitchOption(options); getStretcher(env, obj)->setPitchOption(options);
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setExpectedInputDuration(JNIEnv *env, jobject obj, jlong duration) Java_com_breakfastquay_rubberband_RubberBandStretcher_setExpectedInputDuration(JNIEnv *env, jobject obj, jlong duration)
{ {
getStretcher(env, obj)->setExpectedInputDuration(duration); getStretcher(env, obj)->setExpectedInputDuration(duration);
} }
jint JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_setMaxProcessSize(JNIEnv *env, jobject obj, jint size)
{
getStretcher(env, obj)->setMaxProcessSize(size);
}
JNIEXPORT jint JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_getSamplesRequired(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_getSamplesRequired(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->getSamplesRequired(); return getStretcher(env, obj)->getSamplesRequired();
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jint n, jboolean final) Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jint n, jboolean final)
{ {
int channels = env->GetArrayLength(data); int channels = env->GetArrayLength(data);
@@ -318,7 +324,7 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject
} }
} }
void JNIEXPORT void JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_process(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jint n, jboolean final) Java_com_breakfastquay_rubberband_RubberBandStretcher_process(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jint n, jboolean final)
{ {
int channels = env->GetArrayLength(data); int channels = env->GetArrayLength(data);
@@ -342,13 +348,13 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_process(JNIEnv *env, jobje
deallocate(arr); deallocate(arr);
} }
jint JNIEXPORT jint JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_available(JNIEnv *env, jobject obj) Java_com_breakfastquay_rubberband_RubberBandStretcher_available(JNIEnv *env, jobject obj)
{ {
return getStretcher(env, obj)->available(); return getStretcher(env, obj)->available();
} }
jint JNIEXPORT jint JNICALL
Java_com_breakfastquay_rubberband_RubberBandStretcher_retrieve(JNIEnv *env, jobject obj, jobjectArray output, jint offset, jint n) Java_com_breakfastquay_rubberband_RubberBandStretcher_retrieve(JNIEnv *env, jobject obj, jobjectArray output, jint offset, jint n)
{ {
RubberBandStretcher *stretcher = getStretcher(env, obj); RubberBandStretcher *stretcher = getStretcher(env, obj);

View File

@@ -674,7 +674,11 @@ inline void v_abs(float *const R__ dst,
const int count) const int count)
{ {
float tmp[count]; float tmp[count];
#if (MACOSX_DEPLOYMENT_TARGET <= 1070 && MAC_OS_X_VERSION_MIN_REQUIRED <= 1070)
vvfabf(tmp, dst, &count);
#else
vvfabsf(tmp, dst, &count); vvfabsf(tmp, dst, &count);
#endif
v_copy(dst, tmp, count); v_copy(dst, tmp, count);
} }
#endif #endif

View File

@@ -52,10 +52,11 @@
#define getpid _getpid #define getpid _getpid
#endif #endif
#ifdef __MSVC__ #if defined(__MSVC__) && _MSC_VER < 1700
#define uint8_t unsigned __int8 #define uint8_t unsigned __int8
#define uint16_t unsigned __int16 #define uint16_t unsigned __int16
#define uint32_t unsigned __int32 #define uint32_t unsigned __int32
#elif defined(__MSVC__)
#define ssize_t long #define ssize_t long
#else #else
#include <stdint.h> #include <stdint.h>