From: Nathaniel Wesley Filardo Date: Mon, 13 Jun 2016 06:10:13 +0000 (-0400) Subject: Give renderers access to raw audio, too X-Git-Url: https://hydra-www.ietfng.org/gitweb/?a=commitdiff_plain;h=c6ce3d26977f52a7fc4eda52740a39f29890f5ca;p=acmetensortoys-watchviz Give renderers access to raw audio, too --- diff --git a/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java b/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java index 72ec657..4d5020d 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/MainActivity.java @@ -57,6 +57,9 @@ public class MainActivity extends WearableActivity private static final SimpleDateFormat AMBIENT_DATE_FORMAT = new SimpleDateFormat("HH:mm", Locale.US); + private static final int AUDIO_RECORDER_BUFFER_SIZE = 2048; + private static final int AUDIO_SAMPLES = 512; + private BoxInsetLayout mOuterContainer; private LinearLayout mInnerContainer; private TextView mTextView, mClockView, mDebugView; @@ -107,18 +110,24 @@ public class MainActivity extends WearableActivity final AudioRecord ar = new AudioRecord( MediaRecorder.AudioSource.MIC, - 11025, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_FLOAT, 2048); + 11025, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_FLOAT, + AUDIO_RECORDER_BUFFER_SIZE); Log.d("shc", "Audio session ID:" + ar.getAudioSessionId()); cycler = new Thread() { public void run() { - float[] samples = new float[512]; - FloatFFT_1D fft = new FloatFFT_1D(samples.length); + // Raw audio samples + float[] samples = new float[AUDIO_SAMPLES]; + + // FFT data and engine + float[] fft = new float[AUDIO_SAMPLES]; + FloatFFT_1D fftc = new FloatFFT_1D(AUDIO_SAMPLES); ar.startRecording(); while (!Thread.interrupted()) { final RenderCB rcb; ar.read(samples, 0, samples.length, AudioRecord.READ_BLOCKING); + System.arraycopy(samples,0,fft,0,AUDIO_SAMPLES); /* * Debug: triangle wave */ @@ -128,7 +137,8 @@ public class MainActivity extends WearableActivity if (i % 32 >= 16) { samples[i] *= -1; } } */ - fft.realForward(samples); + + fftc.realForward(fft); synchronized(this) { rcb = cyclercb; @@ -141,7 +151,7 @@ public class MainActivity extends WearableActivity break; } cv.drawColor(Color.BLACK); - rcb.render(cv,samples); + rcb.render(cv,samples,fft); h.unlockCanvasAndPost(cv); // try { Thread.sleep(100); } catch (InterruptedException e) { break; } diff --git a/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java b/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java index 8cae582..b61723a 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/RenderCB.java @@ -3,6 +3,6 @@ package com.acmetensortoys.watchviz; import android.graphics.Canvas; public abstract class RenderCB { - abstract public void render(Canvas c, float[] a); + abstract public void render(Canvas c, float[] audio, float[] fft); public void onClick() { } } \ No newline at end of file diff --git a/app/src/main/java/com/acmetensortoys/watchviz/render/Grid.java b/app/src/main/java/com/acmetensortoys/watchviz/render/Grid.java index 004ded8..ff9ad4b 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/render/Grid.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/render/Grid.java @@ -23,17 +23,19 @@ public final class Grid extends RenderCB { } @Override - public void render(Canvas cv, float[] samples) { + public void render(Canvas cv, float[] au, float[] fft) { int c = Color.HSVToColor(hsv); hsv[0] = hsv[0] >= 359 ? 0.0f : hsv[0] + 1.0f; p.setColor(c); + final float scale = 32; + int rxs = cv.getWidth() / 8; int rys = cv.getHeight() / 8; for (int rx = 0; rx < 8; rx++) { for (int ry = 0; ry < 8; ry++) { int ix = (rx * 8 + ry) * 4; - float x = (Math.abs(samples[ix]) + Math.abs(samples[ix+2])) * 32; + float x = (Math.abs(fft[ix]) + Math.abs(fft[ix+2])) * scale; int b = x > 255 ? 255 : (int)x; p.setAlpha(b > 223 ? 255 : b + 32); cv.drawRect(rx * rxs, ry * rys, (rx + 1) * rxs - 1, (ry + 1) * rys - 1, p); diff --git a/app/src/main/java/com/acmetensortoys/watchviz/render/WholeMax.java b/app/src/main/java/com/acmetensortoys/watchviz/render/WholeMax.java index f2af121..04e5bd9 100644 --- a/app/src/main/java/com/acmetensortoys/watchviz/render/WholeMax.java +++ b/app/src/main/java/com/acmetensortoys/watchviz/render/WholeMax.java @@ -25,13 +25,13 @@ public final class WholeMax extends RenderCB { } @Override - public void render(Canvas cv, float[] samples) { + public void render(Canvas cv, float[] audio, float[] fft) { float msamp = 0.0f; int mix = -1; /* Restrict search to lowest half in agreement with Grid */ - for (int i = 0; i < samples.length/2; i += 2) { - if (samples[i] > msamp) { - msamp = samples[i]; + for (int i = 0; i < fft.length/2; i += 2) { + if (fft[i] > msamp) { + msamp = fft[i]; mix = i; } }