Guest User

Untitled

a guest
Feb 23rd, 2012
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. package com.test.CaseTest1;
  2.  
  3. import android.media.AudioFormat;
  4. import android.media.AudioRecord;
  5. import android.media.MediaRecorder;
  6.  
  7. public class SoundSwitch implements Runnable {
  8.  
  9. // 傾聽器
  10. private OnReachedVolumeListener mListener;
  11. // 錄音中旗標
  12. private boolean isRecoding = true;
  13. // 取樣率
  14. private static final int SAMPLE_RATE = 8000;
  15. // 邊界音量
  16. private short mBorderVolume = 3000;
  17.  
  18.  
  19. //自己亂移動的(測試用)
  20. short max = 0;
  21. public int frequency;
  22.  
  23.  
  24. // 設定臨界音量
  25. public void setBorderVolume(short volume) {
  26. mBorderVolume = volume;
  27. }
  28.  
  29. // 取得臨界音量
  30. public short getBorderVolume() {
  31. return mBorderVolume;
  32. }
  33.  
  34. //我自己寫的回傳max函式
  35. public short Max(short max){
  36. return max;
  37. }
  38.  
  39.  
  40. // 停止錄音
  41. public void stop() {
  42. isRecoding = false;
  43. }
  44.  
  45. // 設定OnReachedVolumeListener
  46. public void setOnVolumeReachedListener(
  47. OnReachedVolumeListener listener) {
  48. mListener = listener;
  49. }
  50.  
  51. // 感應到臨界音量時 的傾聽器
  52. public interface OnReachedVolumeListener {
  53. // 當感應到超過臨界音量的聲音時
  54. // 會被呼叫的方法
  55. void onReachedVolume(short volume);
  56. }
  57.  
  58. // 開始執行緒(開始錄音)
  59. public void run() {
  60. int numCrossing,numSamples;
  61.  
  62. android.os.Process.setThreadPriority(
  63. android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
  64. int bufferSize = AudioRecord.getMinBufferSize(
  65. SAMPLE_RATE,
  66. AudioFormat.CHANNEL_CONFIGURATION_MONO,
  67. AudioFormat.ENCODING_PCM_16BIT);
  68. AudioRecord audioRecord = new AudioRecord(
  69. MediaRecorder.AudioSource.MIC,
  70. SAMPLE_RATE,
  71. AudioFormat.CHANNEL_CONFIGURATION_MONO,
  72. AudioFormat.ENCODING_PCM_16BIT,
  73. bufferSize);
  74. short[] buffer = new short[bufferSize];
  75. audioRecord.startRecording();
  76. while(isRecoding) {
  77.  
  78. audioRecord.read(buffer, 0, bufferSize);
  79.  
  80. max=0;
  81.  
  82. numCrossing=0; //initialize your number of zero crossings to 0
  83. numSamples=0;
  84. int mod=(int)(bufferSize/4)*4;
  85.  
  86. for (int p=0;p<mod;p+=4)
  87. {
  88. if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
  89. if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
  90. if (buffer[p+1]>0 && buffer[p+2]<=0) numCrossing++;
  91. if (buffer[p+1]<0 && buffer[p+2]>=0) numCrossing++;
  92. if (buffer[p+2]>0 && buffer[p+3]<=0) numCrossing++;
  93. if (buffer[p+2]<0 && buffer[p+3]>=0) numCrossing++;
  94. if (buffer[p+3]>0 && buffer[p+4]<=0) numCrossing++;
  95. if (buffer[p+3]<0 && buffer[p+4]>=0) numCrossing++;
  96. numSamples+=4;
  97. }//for p
  98.  
  99. for (int p=(bufferSize/4)*4;p<bufferSize-1;p++)
  100. {
  101. if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
  102. if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
  103. numSamples++;
  104. }
  105.  
  106.  
  107. //frequency=numCrossing/2;
  108. //frequency=(8000/bufferSize)*(numCrossing/2);
  109. 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.
  110.  
  111.  
  112.  
  113. for (int i=0; i<bufferSize; i++) {
  114.  
  115.  
  116. // 計算最大音量
  117. max = (short)Math.max(max, buffer[i]);
  118. // 當最大音量超過臨界音量
  119. if (max > mBorderVolume) {
  120. if (mListener != null) {
  121. // 執行傾聽器
  122. mListener.onReachedVolume(max);
  123. break;
  124. }
  125. }
  126.  
  127. }
  128.  
  129. }
  130. audioRecord.stop();
  131. audioRecord.release();
  132. }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment