Skip to content

Instantly share code, notes, and snippets.

@jherico
Created December 12, 2018 19:02
Show Gist options
  • Save jherico/99ca7bd52af802319ea6070c14528fbc to your computer and use it in GitHub Desktop.
Save jherico/99ca7bd52af802319ea6070c14528fbc to your computer and use it in GitHub Desktop.
package org.saintandreas.audiotest;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.media.MediaRecorder;
import android.opengl.GLES32;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class MainActivity extends Activity implements GLSurfaceView.Renderer {
private final String TAG = MainActivity.class.getName();
private boolean permissionToRecordAccepted = false;
private String [] permissions = {Manifest.permission.RECORD_AUDIO};
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
private float maxAudio = 1.0f;
private float lastAudio = 0.0f;
private GLSurfaceView mGLView;
private MediaRecorder mRecorder = null;
//private native void nativeOnCreate();
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
}
@Override
public void onDrawFrame(GL10 unused) {
float audioLevel = lastAudio / maxAudio;
GLES32.glClearColor(audioLevel, audioLevel > 0.2f ? 1.0f :0.0f, 0.0f, 1.0f);
GLES32.glClear(GLES32.GL_COLOR_BUFFER_BIT);
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES32.glViewport(0, 0, width, height);
}
@Override
public void onCreate(Bundle savedInstanceState) {
System.loadLibrary("audioTest");
super.onCreate(savedInstanceState);
requestPermissions(permissions, REQUEST_RECORD_AUDIO_PERMISSION);
mGLView = new GLSurfaceView(this);
mGLView.setEGLContextClientVersion(3);
mGLView.setRenderer(MainActivity.this);
setContentView(mGLView);
//nativeOnCreate();
}
public void monitorAudio() {
if (mRecorder != null) {
lastAudio = mRecorder.getMaxAmplitude();
maxAudio = Math.max(lastAudio, maxAudio);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_RECORD_AUDIO_PERMISSION:
permissionToRecordAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
break;
}
if (!permissionToRecordAccepted ) {
finish();
} else {
new Timer().schedule(new TimerTask() { @Override public void run() { startRecording(); }}, 1000);
}
}
Timer mMonitorTimer = null;
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(TAG, "prepare() failed");
}
mRecorder.start();
mMonitorTimer = new Timer();
mMonitorTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run(){ monitorAudio(); } }, 100, 100);
}
@Override
public void onStop() {
super.onStop();
if (mRecorder != null) {
mMonitorTimer.cancel();
mMonitorTimer = null;
mRecorder.release();
mRecorder = null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment