diff options
author | Martin Fietz <Martin.Fietz@gmail.com> | 2016-01-01 20:46:58 +0100 |
---|---|---|
committer | Martin Fietz <Martin.Fietz@gmail.com> | 2016-01-01 20:46:58 +0100 |
commit | b115ad357e44d83f483f666f8e5717132626f567 (patch) | |
tree | bc9f35f9ec2e76b72d6b7b7f716062d8269cdfe7 | |
parent | b94e3ab4b2662b63e6ac9f8227a9e299d74a82a9 (diff) | |
download | AudioPlayer-b115ad357e44d83f483f666f8e5717132626f567.tar.gz |
Sonic: Improve creation of AudioTrack buffer
-rw-r--r-- | library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java b/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java index 5aa616b..df07f8a 100644 --- a/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java +++ b/library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java @@ -546,15 +546,46 @@ public class SonicAudioPlayer extends AbstractAudioPlayer { private void initDevice(int sampleRate, int numChannels) { mLock.lock(); final int format = findFormatFromChannels(numChannels); - final int minSize = AudioTrack.getMinBufferSize(sampleRate, format, - AudioFormat.ENCODING_PCM_16BIT); - mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, format, - AudioFormat.ENCODING_PCM_16BIT, minSize * 4, - AudioTrack.MODE_STREAM); + int oldBufferSize = mBufferSize; + mBufferSize = AudioTrack.getMinBufferSize(sampleRate, format, AudioFormat.ENCODING_PCM_16BIT); + if(mBufferSize != oldBufferSize) { + if (mTrack != null) { + mTrack.release(); + } + mTrack = createAudioTrack(sampleRate, format, mBufferSize); + } mSonic = new Sonic(sampleRate, numChannels); mLock.unlock(); } + private AudioTrack createAudioTrack(int sampleRate, + int channelConfig, + int minBufferSize) { + for (int i = 4; i >= 1; i--) { + int bufferSize = minBufferSize * i; + + AudioTrack audioTrack = null; + try { + audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, + channelConfig, AudioFormat.ENCODING_PCM_16BIT, bufferSize, + AudioTrack.MODE_STREAM); + if (audioTrack.getState() == AudioTrack.STATE_INITIALIZED) { + mBufferSize = bufferSize; + return audioTrack; + } else { + audioTrack.release(); + } + } catch (IllegalArgumentException e) { + Log.e(TAG, Log.getStackTraceString(e)); + if (audioTrack != null) { + audioTrack.release(); + } + } + } + throw new IllegalStateException("Could not create buffer for AudioTrack"); + } + + @SuppressWarnings("deprecation") public void decode() { mDecoderThread = new Thread(new Runnable() { |