diff --git a/app/src/main/java/protect/babymonitor/AudioListener.java b/app/src/main/java/protect/babymonitor/AudioListener.java
new file mode 100644
index 0000000..24f6abf
--- /dev/null
+++ b/app/src/main/java/protect/babymonitor/AudioListener.java
@@ -0,0 +1,5 @@
+package protect.babymonitor;
+
+public interface AudioListener {
+ void onAudio(byte[] audioBytes);
+}
diff --git a/app/src/main/java/protect/babymonitor/ListenActivity.java b/app/src/main/java/protect/babymonitor/ListenActivity.java
index ba59ac3..cbfdf74 100644
--- a/app/src/main/java/protect/babymonitor/ListenActivity.java
+++ b/app/src/main/java/protect/babymonitor/ListenActivity.java
@@ -22,7 +22,6 @@ import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
-import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
@@ -45,16 +44,16 @@ public class ListenActivity extends Activity
NotificationManagerCompat _mNotifyMgr;
Thread _listenThread;
- private void streamAudio(final Socket socket) throws IllegalArgumentException, IllegalStateException, IOException
+ private final int frequency = 11025;
+ private final int channelConfiguration = AudioFormat.CHANNEL_OUT_MONO;
+ private final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
+ private final int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
+ private final int byteBufferSize = bufferSize*2;
+
+ private void streamAudio(final Socket socket, AudioListener listener) throws IllegalArgumentException, IllegalStateException, IOException
{
Log.i(TAG, "Setting up stream");
- 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,
channelConfiguration,
@@ -80,6 +79,9 @@ public class ListenActivity extends Activity
if(read > 0)
{
audioTrack.write(buffer, 0, read);
+ byte[] readBytes = new byte[read];
+ System.arraycopy(buffer, 0, readBytes, 0, read);
+ listener.onAudio(readBytes);
}
}
}
@@ -120,6 +122,20 @@ public class ListenActivity extends Activity
final TextView statusText = (TextView) findViewById(R.id.textStatus);
statusText.setText(R.string.listening);
+ final VolumeView volumeView = (VolumeView) findViewById(R.id.volume);
+
+ final AudioListener listener = new AudioListener() {
+ @Override
+ public void onAudio(final byte[] audioData) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ volumeView.onAudioData(audioData);
+ }
+ });
+ }
+ };
+
_listenThread = new Thread(new Runnable()
{
@@ -129,7 +145,7 @@ public class ListenActivity extends Activity
try
{
final Socket socket = new Socket(_address, _port);
- streamAudio(socket);
+ streamAudio(socket, listener);
}
catch (UnknownHostException e)
{
diff --git a/app/src/main/java/protect/babymonitor/VolumeView.java b/app/src/main/java/protect/babymonitor/VolumeView.java
new file mode 100644
index 0000000..648b993
--- /dev/null
+++ b/app/src/main/java/protect/babymonitor/VolumeView.java
@@ -0,0 +1,58 @@
+package protect.babymonitor;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.View;
+
+public class VolumeView extends View {
+ private double volume = 0;
+ private double maxVolume = 0;
+
+ public VolumeView(Context context) {
+ super(context);
+ }
+
+ public VolumeView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public VolumeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public void onAudioData(byte[] data) {
+ double sum = 0;
+ for (int i = 0; i < data.length; i++) {
+ double rel = Math.abs(data[i]) / (double)32767f;
+ sum+=rel;
+ }
+ volume = sum/data.length;
+ if (volume > maxVolume) {
+ maxVolume = volume;
+ }
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ double relativeBrightness = 0;
+ if (maxVolume > 0) {
+ relativeBrightness = volume / (float) maxVolume;
+ relativeBrightness = Math.max(0.2, relativeBrightness );
+ }
+ int blue;
+ int rest;
+ if (relativeBrightness > 0.5) {
+ blue = 255;
+ rest = (int) (2 * 255 * (relativeBrightness - 0.5));
+ } else {
+ blue = (int) (2 * 255 * relativeBrightness);
+ rest = 0;
+ }
+ int rgb = Color.rgb(rest, rest, blue);
+ canvas.drawColor(rgb);
+ }
+}
diff --git a/app/src/main/res/layout/activity_listen.xml b/app/src/main/res/layout/activity_listen.xml
index a16e2db..4b988fc 100644
--- a/app/src/main/res/layout/activity_listen.xml
+++ b/app/src/main/res/layout/activity_listen.xml
@@ -5,11 +5,11 @@
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="protect.babymonitor.MonitorActivity" >
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context="protect.babymonitor.MonitorActivity">
+ android:layout_width="match_parent"
+ android:layout_height="15dip" />
+ android:layout_width="match_parent"
+ android:layout_height="15dip" />
+
+
+
+
\ No newline at end of file