Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Morlunk/Jumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Comminos <andrew@morlunk.com>2015-01-21 01:47:55 +0300
committerAndrew Comminos <andrew@morlunk.com>2015-01-21 01:47:55 +0300
commit4f10d4eebdeb82c33e54b3e4936f872cc2de8ae3 (patch)
tree47a1209fbdbc067daba13170581a724bd46cc035
parentc20a60ae3eb96c6aa97901702058d7953ebbe16c (diff)
Fix issue with sample rates not divisible into 10ms frames.
-rw-r--r--src/main/java/com/morlunk/jumble/audio/AudioInput.java3
-rw-r--r--src/main/java/com/morlunk/jumble/audio/encoder/ResamplingEncoder.java10
-rw-r--r--src/main/java/com/morlunk/jumble/protocol/AudioHandler.java2
3 files changed, 10 insertions, 5 deletions
diff --git a/src/main/java/com/morlunk/jumble/audio/AudioInput.java b/src/main/java/com/morlunk/jumble/audio/AudioInput.java
index 5c16647..5247bbf 100644
--- a/src/main/java/com/morlunk/jumble/audio/AudioInput.java
+++ b/src/main/java/com/morlunk/jumble/audio/AudioInput.java
@@ -41,7 +41,7 @@ import com.morlunk.jumble.protocol.AudioHandler;
* Created by andrew on 23/08/13.
*/
public class AudioInput implements Runnable {
- public static final int[] SAMPLE_RATES = { 48000, 44100, 22050, 16000, 11025, 8000 };
+ public static final int[] SAMPLE_RATES = { 48000, 44100, 16000, 8000 };
private static final int SPEECH_DETECT_THRESHOLD = (int) (0.25 * Math.pow(10, 9)); // Continue speech for 250ms to prevent dropping
// AudioRecord state
@@ -84,6 +84,7 @@ public class AudioInput implements Runnable {
}
int sampleRate = getSampleRate();
+ // FIXME: does not work properly if 10ms frames cannot be represented as integers
mFrameSize = (sampleRate * AudioHandler.FRAME_SIZE) / AudioHandler.SAMPLE_RATE;
}
diff --git a/src/main/java/com/morlunk/jumble/audio/encoder/ResamplingEncoder.java b/src/main/java/com/morlunk/jumble/audio/encoder/ResamplingEncoder.java
index 82b9687..6b8b3c9 100644
--- a/src/main/java/com/morlunk/jumble/audio/encoder/ResamplingEncoder.java
+++ b/src/main/java/com/morlunk/jumble/audio/encoder/ResamplingEncoder.java
@@ -34,18 +34,22 @@ public class ResamplingEncoder implements IEncoder {
private Speex.SpeexResampler mResampler;
private final int mInputSampleRate;
private final int mTargetSampleRate;
+ private final int mTargetFrameSize;
+ private final short[] mResampleBuffer;
- public ResamplingEncoder(IEncoder encoder, int channels, int inputSampleRate, int targetSampleRate) {
+ public ResamplingEncoder(IEncoder encoder, int channels, int inputSampleRate, int targetFrameSize, int targetSampleRate) {
mEncoder = encoder;
mInputSampleRate = inputSampleRate;
mTargetSampleRate = targetSampleRate;
+ mTargetFrameSize = targetFrameSize;
+ mResampleBuffer = new short[mTargetFrameSize];
mResampler = new Speex.SpeexResampler(channels, inputSampleRate, targetSampleRate, SPEEX_RESAMPLE_QUALITY);
}
@Override
public int encode(short[] input, int inputSize) throws NativeAudioException {
- mResampler.resample(input, input);
- return mEncoder.encode(input, inputSize * (mTargetSampleRate / mInputSampleRate));
+ mResampler.resample(input, mResampleBuffer);
+ return mEncoder.encode(mResampleBuffer, mTargetFrameSize);
}
@Override
diff --git a/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java b/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java
index b8997d4..68e8cbf 100644
--- a/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java
+++ b/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java
@@ -255,7 +255,7 @@ public class AudioHandler extends JumbleNetworkListener implements AudioInput.Au
}
if (mInput.getSampleRate() != SAMPLE_RATE) {
- encoder = new ResamplingEncoder(encoder, 1, mInput.getSampleRate(), SAMPLE_RATE);
+ encoder = new ResamplingEncoder(encoder, 1, mInput.getSampleRate(), FRAME_SIZE, SAMPLE_RATE);
}
mEncoder = encoder;