Skip to content

Commit

Permalink
Update UI thread with audio power
Browse files Browse the repository at this point in the history
  • Loading branch information
klangner committed May 10, 2015
1 parent 44147ce commit 917028b
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 28 deletions.
21 changes: 15 additions & 6 deletions app/src/main/java/com/klangner/speechlab/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
package com.klangner.speechlab;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

private static final String TAG = "MainActivity";
private static final int MESSAGE_POWER = 1;

private AudioRecord recorder = null;
private Handler handler;
private SignalPublisher signalPublisher = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "onCreate");
final TextView powerView = (TextView)findViewById(R.id.powerView);
handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
powerView.setText(msg.obj.toString());
}
};
}

@Override
Expand Down Expand Up @@ -56,7 +64,8 @@ private void startRecording() {
signalPublisher = new SignalPublisher();
signalPublisher.addPowerSubscriber(new SignalPublisher.PowerSubscriber() {
public void onChanged(double power) {
Log.v(TAG, "Power: " + power);
Message msg = handler.obtainMessage(MESSAGE_POWER, power);
msg.sendToTarget();
}
});
Thread thread = new Thread(signalPublisher);
Expand Down
88 changes: 88 additions & 0 deletions app/src/main/java/com/klangner/speechlab/SignalPublisher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.klangner.speechlab;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

/**
* Signal processing publisher.
* Connects to audio and process incoming data.
* Allow subscribing to different audio features.
* This class works in it own thread. You can't update UI in callback from this class.
*/
public class SignalPublisher implements Runnable{

private static final String TAG = "SignalPublisher";
private static final int SAMPLE_SIZE = 2048;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

public interface PowerSubscriber{
void onChanged(double power);
}

private final AudioRecord recorder;
private boolean isRunning = false;
private PowerSubscriber powerSubscriber = null;


public SignalPublisher(){
recorder = initAudioCapture();
}

@Override
public void run() {
short[] sample = new short[SAMPLE_SIZE];
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
isRunning = true;
recorder.startRecording();
while (isRunning) {
recorder.read(sample, 0, SAMPLE_SIZE);
if(powerSubscriber != null){
double power = SignalPublisher.logPower(sample);
powerSubscriber.onChanged(power);
}
}
releaseAudioCapture();
}

public void stop(){
isRunning = false;
}

public void addPowerSubscriber(PowerSubscriber subscriber){
powerSubscriber = subscriber;
}

private AudioRecord initAudioCapture() {
Log.v(TAG, "Init audio");
int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
return new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE,
RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);
}

private void releaseAudioCapture() {
Log.v(TAG, "Destroy audio");
if(recorder != null) {
recorder.release();
}
}

/** Signal power for the whole sample */
private static double power(short[] data){
double sum = 0;
for(short x: data) {
sum += Math.pow(x, 2);
}
return sum/(2*(data.length+1));
}


/** Signal power int logarithmic scale. */
private static double logPower(short[] data){
return Math.log10(power(data));
}

}

This file was deleted.

0 comments on commit 917028b

Please sign in to comment.