aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fietz <Martin.Fietz@gmail.com>2016-01-01 20:46:58 +0100
committerMartin Fietz <Martin.Fietz@gmail.com>2016-01-01 20:46:58 +0100
commitb115ad357e44d83f483f666f8e5717132626f567 (patch)
treebc9f35f9ec2e76b72d6b7b7f716062d8269cdfe7
parentb94e3ab4b2662b63e6ac9f8227a9e299d74a82a9 (diff)
downloadAudioPlayer-b115ad357e44d83f483f666f8e5717132626f567.tar.gz
Sonic: Improve creation of AudioTrack buffer
-rw-r--r--library/src/main/java/org/antennapod/audio/SonicAudioPlayer.java41
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() {