diff --git a/com/breakfastquay/rubberband/RubberBandStretcher.java b/com/breakfastquay/rubberband/RubberBandStretcher.java index aa7e613..036516d 100644 --- a/com/breakfastquay/rubberband/RubberBandStretcher.java +++ b/com/breakfastquay/rubberband/RubberBandStretcher.java @@ -23,6 +23,9 @@ package com.breakfastquay.rubberband; +import java.util.Map; +import java.util.Set; + public class RubberBandStretcher { public RubberBandStretcher(int sampleRate, int channels, @@ -62,6 +65,19 @@ public class RubberBandStretcher public native int getSamplesRequired(); public native void setKeyFrameMap(long[] from, long[] to); + public void setKeyFrameMap(Map m) { + Set keys = m.keySet(); + int n = keys.size(); + long[] from = new long[n]; + long[] to = new long[n]; + int i = 0; + for (Long k : keys) { + from[i] = k.longValue(); + to[i] = m.get(k).longValue(); + ++i; + } + setKeyFrameMap(from, to); + } public native void study(float[][] input, int offset, int n, boolean finalBlock); public void study(float[][] input, boolean finalBlock) { diff --git a/com/breakfastquay/rubberband/test/RubberBandTest.java b/com/breakfastquay/rubberband/test/RubberBandTest.java index d0e4637..578f5ec 100644 --- a/com/breakfastquay/rubberband/test/RubberBandTest.java +++ b/com/breakfastquay/rubberband/test/RubberBandTest.java @@ -3,6 +3,8 @@ package com.breakfastquay.rubberband.test; import com.breakfastquay.rubberband.RubberBandStretcher; +import java.util.TreeMap; + public class RubberBandTest { @@ -15,7 +17,7 @@ public class RubberBandTest (rate, channels, RubberBandStretcher.OptionEngineFiner + - RubberBandStretcher.OptionProcessRealTime, + RubberBandStretcher.OptionProcessOffline, 1.0, 1.0); @@ -38,11 +40,16 @@ public class RubberBandTest )); int blocksize = 1024; - int blocks = 200; + int blocks = 400; double freq = 440.0; stretcher.setMaxProcessSize(blocksize); + TreeMap keyFrameMap = new TreeMap(); + keyFrameMap.put((long)(3 * rate), (long)(4 * rate)); + keyFrameMap.put((long)(5 * rate), (long)(5 * rate)); + stretcher.setKeyFrameMap(keyFrameMap); + float[][] buffer = new float[channels][blocksize]; int i0 = 0; @@ -53,6 +60,27 @@ public class RubberBandTest for (int i = 0; i < blocksize; ++i) { buffer[c][i] = (float)Math.sin ((double)i0 * freq * Math.PI * 2.0 / (double)rate); + if (i0 % rate == 0) { + buffer[c][i] = 1.f; + } + ++i0; + } + } + + stretcher.study(buffer, block + 1 == blocks); + } + + i0 = 0; + + for (int block = 0; block < blocks; ++block) { + + for (int c = 0; c < channels; ++c) { + for (int i = 0; i < blocksize; ++i) { + buffer[c][i] = (float)Math.sin + ((double)i0 * freq * Math.PI * 2.0 / (double)rate); + if (i0 % rate == 0) { + buffer[c][i] = 1.f; + } ++i0; } } diff --git a/src/jni/RubberBandStretcherJNI.cpp b/src/jni/RubberBandStretcherJNI.cpp index df04a26..9cac5fb 100644 --- a/src/jni/RubberBandStretcherJNI.cpp +++ b/src/jni/RubberBandStretcherJNI.cpp @@ -183,6 +183,14 @@ JNIEXPORT jint JNICALL Java_com_breakfastquay_rubberband_RubberBandStretcher_get JNIEXPORT jint JNICALL Java_com_breakfastquay_rubberband_RubberBandStretcher_getSamplesRequired (JNIEnv *, jobject); +/* + * Class: com_breakfastquay_rubberband_RubberBandStretcher + * Method: setKeyFrameMap + * Signature: ([J[J)V + */ +JNIEXPORT void JNICALL Java_com_breakfastquay_rubberband_RubberBandStretcher_setKeyFrameMap + (JNIEnv *, jobject, jlongArray, jlongArray); + /* * Class: com_breakfastquay_rubberband_RubberBandStretcher * Method: study @@ -365,6 +373,22 @@ Java_com_breakfastquay_rubberband_RubberBandStretcher_getSamplesRequired(JNIEnv return getStretcher(env, obj)->getSamplesRequired(); } +JNIEXPORT void JNICALL +Java_com_breakfastquay_rubberband_RubberBandStretcher_setKeyFrameMap(JNIEnv *env, jobject obj, jlongArray from, jlongArray to) +{ + std::map m; + int flen = env->GetArrayLength(from); + int tlen = env->GetArrayLength(to); + jlong *farr = env->GetLongArrayElements(from, 0); + jlong *tarr = env->GetLongArrayElements(to, 0); + for (int i = 0; i < flen && i < tlen; ++i) { + m[farr[i]] = tarr[i]; + } + env->ReleaseLongArrayElements(from, farr, 0); + env->ReleaseLongArrayElements(to, tarr, 0); + getStretcher(env, obj)->setKeyFrameMap(m); +} + JNIEXPORT void JNICALL Java_com_breakfastquay_rubberband_RubberBandStretcher_study(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jint n, jboolean final) {