From e690c6aecfbcb017f5b4cf08895ef30fe7dca371 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Fri, 12 Apr 2024 23:30:01 +0200 Subject: [PATCH] added simple scope for experimentation --- .../java/xdsopl/robot36/MainActivity.java | 31 ++++++++++++++++++- app/src/main/res/layout/activity_main.xml | 13 ++++++-- app/src/main/res/values-night/colors.xml | 6 ++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/values-night/colors.xml diff --git a/app/src/main/java/xdsopl/robot36/MainActivity.java b/app/src/main/java/xdsopl/robot36/MainActivity.java index 60c6169..ac6698d 100644 --- a/app/src/main/java/xdsopl/robot36/MainActivity.java +++ b/app/src/main/java/xdsopl/robot36/MainActivity.java @@ -7,11 +7,13 @@ Copyright 2024 Ahmet Inan package xdsopl.robot36; import android.content.pm.PackageManager; +import android.graphics.Bitmap; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.Manifest; +import android.widget.ImageView; import android.widget.TextView; import androidx.activity.EdgeToEdge; @@ -28,9 +30,15 @@ import java.util.List; public class MainActivity extends AppCompatActivity { + private final int scopeWidth = 256, scopeHeight = 256; + private Bitmap scopeBitmap; + private int[] scopePixels; + private ImageView scopeView; private float[] recordBuffer; private AudioRecord audioRecord; private TextView status; + private int tint; + private int curLine; private void setStatus(int id) { status.setText(id); @@ -44,9 +52,25 @@ public class MainActivity extends AppCompatActivity { @Override public void onPeriodicNotification(AudioRecord audioRecord) { audioRecord.read(recordBuffer, 0, recordBuffer.length, AudioRecord.READ_BLOCKING); + processSamples(); } }; + private void processSamples() { + for (float v : recordBuffer) { + int x = Math.min((int) (scopeWidth * v * v), scopeWidth); + for (int i = 0; i < x; ++i) + scopePixels[scopeWidth * curLine + i] = tint; + for (int i = x; i < scopeWidth; ++i) + scopePixels[scopeWidth * curLine + i] = 0; + for (int i = 0; i < scopeWidth; ++i) + scopePixels[scopeWidth * (curLine + scopeHeight) + i] = scopePixels[scopeWidth * curLine + i]; + curLine = (curLine + 1) % scopeHeight; + } + scopeBitmap.setPixels(scopePixels, scopeWidth * curLine, scopeWidth, 0, 0, scopeWidth, scopeHeight); + scopeView.invalidate(); + } + private void initAudioRecord() { int audioSource = MediaRecorder.AudioSource.UNPROCESSED; int channelConfig = AudioFormat.CHANNEL_IN_MONO; @@ -113,7 +137,12 @@ public class MainActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); - status = (TextView) findViewById(R.id.status); + tint = getColor(R.color.tint); + status = findViewById(R.id.status); + scopeView = findViewById(R.id.scope); + scopeBitmap = Bitmap.createBitmap(scopeWidth, scopeHeight, Bitmap.Config.ARGB_8888); + scopeView.setImageBitmap(scopeBitmap); + scopePixels = new int[2 * scopeWidth * scopeHeight]; List permissions = new ArrayList<>(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.RECORD_AUDIO); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8040d19..33621ff 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,6 +8,16 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + + + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..9e8f90f --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,6 @@ + + + #FF000000 + #FFFFFFFF + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index fa5fc6f..94a849e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,5 @@ #FF000000 #FFFFFFFF + #FF000000 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72f8c6f..ccceb42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,5 @@ audio setup failed audio permission denied audio recording error + visualization of audio signal