diff options
author | Andrew Comminos <andrew@morlunk.com> | 2015-01-21 01:47:55 +0300 |
---|---|---|
committer | Andrew Comminos <andrew@morlunk.com> | 2015-01-21 01:47:55 +0300 |
commit | 4f10d4eebdeb82c33e54b3e4936f872cc2de8ae3 (patch) | |
tree | 47a1209fbdbc067daba13170581a724bd46cc035 | |
parent | c20a60ae3eb96c6aa97901702058d7953ebbe16c (diff) |
Fix issue with sample rates not divisible into 10ms frames.
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; |