package com.example.android.recipe063;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
public class SoundSwitch implements Runnable {
// リスナー
private OnReachedVolumeListener mListener;
// 録音中フラグ
private boolean isRecoding = true;
// サンプリングレート
private static final int SAMPLE_RATE = 8000;
// ボーダー音量
private short mBorderVolume = 10000;
// ボーダー音量をセット
public void setBorderVolume(short volume) {
mBorderVolume = volume;
}
// ボーダー音量を取得
public short getBorderVolume() {
return mBorderVolume;
}
// 録音を停止
public void stop() {
isRecoding = false;
}
// OnReachedVolumeListenerをセット
public void setOnVolumeReachedListener(
OnReachedVolumeListener listener) {
mListener = listener;
}
// ボーダー音量を検知した時のためのリスナー
public interface OnReachedVolumeListener {
// ボーダー音量を超える音量を検知した時に
// 呼び出されるメソッドです。
void onReachedVolume(short volume);
}
// スレッド開始(録音を開始)
public void run() {
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int bufferSize = AudioRecord.getMinBufferSize(
SAMPLE_RATE,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLE_RATE,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
short[] buffer = new short[bufferSize];
audioRecord.startRecording();
while(isRecoding) {
audioRecord.read(buffer, 0, bufferSize);
short max = 0;
for (int i=0; i<bufferSize; i++) {
// 最大音量を計算
max = (short)Math.max(max, buffer[i]);
// 最大音量がボーダーを超えていたら
if (max > mBorderVolume) {
if (mListener != null) {
// リスナーを実行
mListener.onReachedVolume(max);
break;
}
}
}
}
audioRecord.stop();
audioRecord.release();
}
}