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/DiscoverActivity.java b/src/protect/babymonitor/DiscoverActivity.java index 3abfff3..f75565c 100644 --- a/src/protect/babymonitor/DiscoverActivity.java +++ b/src/protect/babymonitor/DiscoverActivity.java @@ -82,9 +82,9 @@ public class DiscoverActivity extends Activity public void onItemClick(AdapterView parent, View view, int position, long id) { - ServiceInfoWrapper info = (ServiceInfoWrapper) parent.getItemAtPosition(position); - Intent i = new Intent(getApplicationContext(), ListenActivity.class); - Bundle b = new Bundle(); + final ServiceInfoWrapper info = (ServiceInfoWrapper) parent.getItemAtPosition(position); + final Intent i = new Intent(getApplicationContext(), ListenActivity.class); + final Bundle b = new Bundle(); b.putString("address", info.getAddress()); b.putInt("port", info.getPort()); b.putString("name", info.getName()); @@ -206,8 +206,13 @@ class ServiceInfoWrapper // If there is more than one service on the network, it will // have a number at the end, but will appear as the following: // "ProtectBabyMonitor\\032(number) - // Replace \\032 with a "" - return _info.getServiceName().replace("\\\\032", " "); + // or + // "ProtectBabyMonitor\032(number) + // Replace \\032 and \032 with a " " + String serviceName = _info.getServiceName(); + serviceName = serviceName.replace("\\\\032", " "); + serviceName = serviceName.replace("\\032", " "); + return serviceName; } @Override diff --git a/src/protect/babymonitor/ListenActivity.java b/src/protect/babymonitor/ListenActivity.java index d0f1795..bc2539e 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; @@ -42,14 +39,15 @@ public class ListenActivity extends Activity String _name; Thread _listenThread; - private void streamAudio(Socket socket) throws IllegalArgumentException, IllegalStateException, IOException + private void streamAudio(final Socket socket) throws IllegalArgumentException, IllegalStateException, IOException { Log.i(TAG, "Setting up stream"); - int frequency = 11025; - int channelConfiguration = AudioFormat.CHANNEL_OUT_MONO; - int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; - int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); + final int frequency = 11025; + final int channelConfiguration = AudioFormat.CHANNEL_OUT_MONO; + final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; + final int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); + final int byteBufferSize = bufferSize*2; final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, @@ -58,42 +56,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(); + final 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); + final byte [] buffer = new byte[byteBufferSize]; - 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 @@ -101,7 +89,7 @@ public class ListenActivity extends Activity { super.onCreate(savedInstanceState); - Bundle b = getIntent().getExtras(); + final Bundle b = getIntent().getExtras(); _address = b.getString("address"); _port = b.getInt("port"); _name = b.getString("name"); @@ -128,7 +116,7 @@ public class ListenActivity extends Activity { try { - Socket socket = new Socket(_address, _port); + final Socket socket = new Socket(_address, _port); streamAudio(socket); } catch (UnknownHostException e) diff --git a/src/protect/babymonitor/MonitorActivity.java b/src/protect/babymonitor/MonitorActivity.java index 52895bb..7d3774c 100644 --- a/src/protect/babymonitor/MonitorActivity.java +++ b/src/protect/babymonitor/MonitorActivity.java @@ -56,29 +56,30 @@ public class MonitorActivity extends Activity } }); - int frequency = 11025; - int channelConfiguration = AudioFormat.CHANNEL_IN_MONO; - int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; + final int frequency = 11025; + final int channelConfiguration = AudioFormat.CHANNEL_IN_MONO; + final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; - int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); - AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, + final int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); + final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize); - byte[] buffer = new byte[bufferSize*2]; + final int byteBufferSize = bufferSize*2; + final byte[] buffer = new byte[byteBufferSize]; try { audioRecord.startRecording(); - OutputStream out = socket.getOutputStream(); + final OutputStream out = socket.getOutputStream(); - socket.setSendBufferSize(bufferSize); + socket.setSendBufferSize(byteBufferSize); Log.d(TAG, "Socket send buffer size: " + socket.getSendBufferSize()); while (socket.isConnected() && Thread.currentThread().isInterrupted() == false) { - int read = audioRecord.read(buffer, 0, bufferSize); + final int read = audioRecord.read(buffer, 0, bufferSize); out.write(buffer, 0, read); } } @@ -113,7 +114,7 @@ public class MonitorActivity extends Activity serverSocket = new ServerSocket(0); // Store the chosen port. - int localPort = serverSocket.getLocalPort(); + final int localPort = serverSocket.getLocalPort(); // Register the service so that parent devices can // locate the child device @@ -201,9 +202,9 @@ public class MonitorActivity extends Activity return super.onOptionsItemSelected(item); } - private void registerService(int port) + private void registerService(final int port) { - NsdServiceInfo serviceInfo = new NsdServiceInfo(); + final NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setServiceName("ProtectBabyMonitor"); serviceInfo.setServiceType("_babymonitor._tcp."); serviceInfo.setPort(port);