Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.test.CaseTest1;
- 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 = 3000;
- //自己亂移動的(測試用)
- short max = 0;
- public int frequency;
- // 設定臨界音量
- public void setBorderVolume(short volume) {
- mBorderVolume = volume;
- }
- // 取得臨界音量
- public short getBorderVolume() {
- return mBorderVolume;
- }
- //我自己寫的回傳max函式
- public short Max(short max){
- return max;
- }
- // 停止錄音
- public void stop() {
- isRecoding = false;
- }
- // 設定OnReachedVolumeListener
- public void setOnVolumeReachedListener(
- OnReachedVolumeListener listener) {
- mListener = listener;
- }
- // 感應到臨界音量時 的傾聽器
- public interface OnReachedVolumeListener {
- // 當感應到超過臨界音量的聲音時
- // 會被呼叫的方法
- void onReachedVolume(short volume);
- }
- // 開始執行緒(開始錄音)
- public void run() {
- int numCrossing,numSamples;
- 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);
- max=0;
- numCrossing=0; //initialize your number of zero crossings to 0
- numSamples=0;
- int mod=(int)(bufferSize/4)*4;
- for (int p=0;p<mod;p+=4)
- {
- if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
- if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
- if (buffer[p+1]>0 && buffer[p+2]<=0) numCrossing++;
- if (buffer[p+1]<0 && buffer[p+2]>=0) numCrossing++;
- if (buffer[p+2]>0 && buffer[p+3]<=0) numCrossing++;
- if (buffer[p+2]<0 && buffer[p+3]>=0) numCrossing++;
- if (buffer[p+3]>0 && buffer[p+4]<=0) numCrossing++;
- if (buffer[p+3]<0 && buffer[p+4]>=0) numCrossing++;
- numSamples+=4;
- }//for p
- for (int p=(bufferSize/4)*4;p<bufferSize-1;p++)
- {
- if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
- if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
- numSamples++;
- }
- //frequency=numCrossing/2;
- //frequency=(8000/bufferSize)*(numCrossing/2);
- frequency=(8000/numSamples)*(numCrossing/2); // Set the audio Frequency to half the number of zero crossings, times the number of samples our buffersize is per second.
- 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();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment