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