First prototype for volume visualization

This commit is contained in:
edr
2020-04-15 19:51:20 +02:00
parent 816f4554bb
commit 3991687565
4 changed files with 104 additions and 16 deletions

View File

@@ -0,0 +1,5 @@
package protect.babymonitor;
public interface AudioListener {
void onAudio(byte[] audioBytes);
}

View File

@@ -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)
{

View File

@@ -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);
}
}

View File

@@ -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">
<TextView
android:id="@id/parentDeviceTitle"
@@ -20,8 +20,8 @@
android:textSize="25sp" />
<Space
android:layout_width="match_parent"
android:layout_height="15dip" />
android:layout_width="match_parent"
android:layout_height="15dip" />
<TextView
android:id="@+id/connectedToTitle"
@@ -38,8 +38,8 @@
android:textSize="20sp" />
<Space
android:layout_width="match_parent"
android:layout_height="15dip" />
android:layout_width="match_parent"
android:layout_height="15dip" />
<TextView
android:id="@+id/status"
@@ -55,4 +55,13 @@
android:text=""
android:textSize="20sp" />
<Space
android:layout_width="match_parent"
android:layout_height="15dip" />
<protect.babymonitor.VolumeView
android:id="@+id/volume"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>