From bd2726370fd8c11d172dd4e2ed90cf5eac73749a Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Fri, 1 Jan 2016 01:09:31 -0500 Subject: [PATCH] simplify playback of audio without AudioPlayer The additional thread to feed the AudioTrack was unnecessary. Because the AudioTrack API is blocking when data is written, and internally it buffers data, writing the data as soon as it is received from the network leads to better playback performance. It is also much simpler. --- src/protect/babymonitor/AudioPlayer.java | 67 --------------------- src/protect/babymonitor/ListenActivity.java | 37 ++++-------- 2 files changed, 12 insertions(+), 92 deletions(-) delete mode 100644 src/protect/babymonitor/AudioPlayer.java diff --git a/src/protect/babymonitor/AudioPlayer.java b/src/protect/babymonitor/AudioPlayer.java deleted file mode 100644 index c272f22..0000000 --- a/src/protect/babymonitor/AudioPlayer.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * This file is part of the Protect Baby Monitor. - * - * Protect Baby Monitor is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Protect Baby Monitor is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Protect Baby Monitor. If not, see . - */ -package protect.babymonitor; - -import java.util.concurrent.BlockingQueue; - -import android.media.AudioTrack; -import android.util.Log; - -public class AudioPlayer implements Runnable -{ - final String TAG = "BabyMonitor"; - - private final AudioTrack _audioTrack; - private final BlockingQueue _queue; - - public AudioPlayer(AudioTrack audioTrack, BlockingQueue queue) - { - _audioTrack = audioTrack; - _queue = queue; - } - - @Override - public void run() - { - Log.i(TAG, "Audio player thread started"); - - android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); - - _audioTrack.play(); - - try - { - while(Thread.currentThread().isInterrupted() == false) - { - byte [] data = _queue.take(); - int written = _audioTrack.write(data, 0, data.length); - - if(written != data.length) - { - Log.i(TAG, "Did not write bytes: " + (data.length - written)); - } - } - } - catch (InterruptedException e) - { - - } - - Log.i(TAG, "Audio player thread stopping"); - _audioTrack.stop(); - } -} diff --git a/src/protect/babymonitor/ListenActivity.java b/src/protect/babymonitor/ListenActivity.java index d0f1795..7e45868 100644 --- a/src/protect/babymonitor/ListenActivity.java +++ b/src/protect/babymonitor/ListenActivity.java @@ -20,9 +20,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; import android.app.Activity; import android.media.AudioFormat; @@ -58,42 +55,32 @@ public class ListenActivity extends Activity bufferSize, AudioTrack.MODE_STREAM); - final BlockingQueue queue = new LinkedBlockingQueue(1 /*max samples queued*/); - - AudioPlayer audioPlayer = new AudioPlayer(audioTrack, queue); - Thread playThread = new Thread(audioPlayer); - playThread.start(); - setVolumeControlStream(AudioManager.STREAM_MUSIC); InputStream is = socket.getInputStream(); int read = 0; - while(socket.isConnected() && read != -1 && Thread.currentThread().isInterrupted() == false) + audioTrack.play(); + + try { byte [] buffer = new byte[bufferSize*2]; - read = is.read(buffer); - if(read > 0) + while(socket.isConnected() && read != -1 && Thread.currentThread().isInterrupted() == false) { - if(read < buffer.length) - { - buffer = Arrays.copyOf(buffer, read); - } + read = is.read(buffer); - try + if(read > 0) { - queue.add(buffer); - } - catch(IllegalStateException e) - { - Log.i(TAG, "Buffer full, dropping data"); + audioTrack.write(buffer, 0, read); } } } - - playThread.interrupt(); - socket.close(); + finally + { + audioTrack.stop(); + socket.close(); + } } @Override