package com.pheelicks.visualizer;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import it.angelic.soulissclient.Constants;
public class RecordingSampler {
private static final int RECORDING_SAMPLE_RATE = 22050;
private AudioTrack audioPlayer;
private AudioRecord mAudioRecord;
private int mBufSize;
private boolean mIsRecording;
private int mSamplingInterval = 100;
private Timer mTimer;
private List<VisualizerView> mVisualizerViews = new ArrayList();
private boolean mulicat;
public RecordingSampler() {
this.initAudioRecord();
}
private int calculateDecibel(byte[] buf) {
int sum = 0;
for (int i = 0; i < this.mBufSize; ++i) {
sum += Math.abs(buf[i]);
}
return sum / this.mBufSize;
}
private void initAudioRecord() {
int bufferSize = AudioRecord.getMinBufferSize(RECORDING_SAMPLE_RATE, 16, AudioFormat.ENCODING_PCM_16BIT);
this.mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, RECORDING_SAMPLE_RATE, 16, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
if (this.mAudioRecord.getState() == 1) {
this.mBufSize = bufferSize;
Log.i(Constants.TAG, "Buffer size:" + bufferSize);
}
this.mTimer = new Timer();
audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, RECORDING_SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, mBufSize, AudioTrack.MODE_STREAM);
}
public boolean isRecording() {
return this.mIsRecording;
}
public void link(VisualizerView visualizerView, final boolean multicast) {
this.mVisualizerViews.add(visualizerView);
this.mulicat = multicast;
visualizerView.setEnabled(true);
}
public void release() {
this.stopRecording();
this.mAudioRecord.release();
this.mAudioRecord = null;
this.mTimer = null;
audioPlayer.release();
}
private void runRecording() {
final byte[] buf = new byte[this.mBufSize];
this.mTimer.schedule(new TimerTask() {
public void run() {
if (!RecordingSampler.this.mIsRecording) {
RecordingSampler.this.mAudioRecord.stop();
} else {
int readBytes = RecordingSampler.this.mAudioRecord.read(buf, 0, RecordingSampler.this.mBufSize);
final int decibel = RecordingSampler.this.calculateDecibel(buf);
if (readBytes > 0) {
Log.i(Constants.TAG, "decibel " + decibel + "size:" + readBytes);
// audioPlayer.write(buf, 0, readBytes);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (RecordingSampler.this.mVisualizerViews != null && !RecordingSampler.this.mVisualizerViews.isEmpty()) {
for (int i = 0; i < RecordingSampler.this.mVisualizerViews.size(); ++i) {
RecordingSampler.this.mVisualizerViews.get(i).updateVisualizerFFT(buf);
// ((VisualizerView) RecordingSampler.this.mVisualizerViews.get(i)).updateVisualizer(buf);
RecordingSampler.this.mVisualizerViews.get(i).sendSoulissPlinio(buf, mulicat);
}
}
}
});
/* if (RecordingSampler.this.mVolumeListener != null) {
RecordingSampler.this.mVolumeListener.onCalculateVolume(decibel);
}*/
//TODO feedback
// audioPlayer.play();
}
}
}
}, 0L, (long) this.mSamplingInterval);
}
public void setSamplingInterval(int samplingInterval) {
this.mSamplingInterval = samplingInterval;
}
public void startRecording() {
this.mTimer = new Timer();
this.mAudioRecord.startRecording();
this.mIsRecording = true;
this.runRecording();
}
public void stopRecording() {
this.mIsRecording = false;
//this.mAudioRecord.stop();
this.mTimer.cancel();
/* if (this.mVisualizerViews != null && !this.mVisualizerViews.isEmpty()) {
for (int i = 0; i < this.mVisualizerViews.size(); ++i) {
((VisualizerView) this.mVisualizerViews.get(i)).clearRenderers();
}
}*/
}
public interface CalculateVolumeListener {
void onCalculateVolume(int var1);
}
}