Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. import android.media.AudioFormat;
  2. import android.media.AudioRecord;
  3. import android.media.MediaRecorder.AudioSource;
  4. import android.os.Process;
  5.  
  6. public class AudioMeter extends Thread {
  7. /////////////////////////////////////////////////////////////////
  8. // PUBLIC CONSTANTS
  9.  
  10. // Convenience constants
  11. public static final int AMP_SILENCE = 0;
  12. public static final int AMP_NORMAL_BREATHING = 10;
  13. public static final int AMP_MOSQUITO = 20;
  14. public static final int AMP_WHISPER = 30;
  15. public static final int AMP_STREAM = 40;
  16. public static final int AMP_QUIET_OFFICE = 50;
  17. public static final int AMP_NORMAL_CONVERSATION = 60;
  18. public static final int AMP_HAIR_DRYER = 70;
  19. public static final int AMP_GARBAGE_DISPOSAL = 80;
  20.  
  21. /////////////////////////////////////////////////////////////////
  22. // PRIVATE CONSTANTS
  23.  
  24. private static final float MAX_REPORTABLE_AMP = 32767f;
  25. private static final float MAX_REPORTABLE_DB = 90.3087f;
  26.  
  27. /////////////////////////////////////////////////////////////////
  28. // PRIVATE MEMBERS
  29.  
  30. private AudioRecord mAudioRecord;
  31. private int mSampleRate;
  32. private short mAudioFormat;
  33. private short mChannelConfig;
  34.  
  35. private short[] mBuffer;
  36. private int mBufferSize = AudioRecord.ERROR_BAD_VALUE;
  37.  
  38. private int mLocks = 0;
  39.  
  40. /////////////////////////////////////////////////////////////////
  41. // CONSTRUCTOR
  42.  
  43. private AudioMeter() {
  44. Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
  45. createAudioRecord();
  46. }
  47.  
  48. /////////////////////////////////////////////////////////////////
  49. // PUBLIC METHODS
  50.  
  51. public static AudioMeter getInstance() {
  52. return InstanceHolder.INSTANCE;
  53. }
  54.  
  55. public float getAmplitude() {
  56. return (float) (MAX_REPORTABLE_DB + (20 * Math.log10(getRawAmplitude() / MAX_REPORTABLE_AMP)));
  57. }
  58.  
  59. public synchronized void startRecording() {
  60. if (mAudioRecord == null || mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
  61. throw new IllegalStateException("startRecording() called on an uninitialized AudioRecord.");
  62. }
  63.  
  64. if (mLocks == 0) {
  65. mAudioRecord.startRecording();
  66. }
  67.  
  68. mLocks++;
  69. }
  70.  
  71. public synchronized void stopRecording() {
  72. mLocks--;
  73.  
  74. if (mLocks == 0) {
  75. if (mAudioRecord != null) {
  76. mAudioRecord.stop();
  77. mAudioRecord.release();
  78. mAudioRecord = null;
  79. }
  80. }
  81. }
  82.  
  83. /////////////////////////////////////////////////////////////////
  84. // PRIVATE METHODS
  85.  
  86. private void createAudioRecord() {
  87. if (mSampleRate > 0 && mAudioFormat > 0 && mChannelConfig > 0) {
  88. mAudioRecord = new AudioRecord(AudioSource.MIC, mSampleRate, mChannelConfig, mAudioFormat, mBufferSize);
  89.  
  90. return;
  91. }
  92.  
  93. // Find best/compatible AudioRecord
  94. for (int sampleRate : new int[] { 8000, 11025, 16000, 22050, 32000, 44100, 47250, 48000 }) {
  95. for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT }) {
  96. for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO,
  97. AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.CHANNEL_CONFIGURATION_STEREO }) {
  98.  
  99. // Try to initialize
  100. try {
  101. mBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
  102.  
  103. if (mBufferSize < 0) {
  104. continue;
  105. }
  106.  
  107. mBuffer = new short[mBufferSize];
  108. mAudioRecord = new AudioRecord(AudioSource.MIC, sampleRate, channelConfig, audioFormat,
  109. mBufferSize);
  110.  
  111. if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
  112. mSampleRate = sampleRate;
  113. mAudioFormat = audioFormat;
  114. mChannelConfig = channelConfig;
  115.  
  116. return;
  117. }
  118.  
  119. mAudioRecord.release();
  120. mAudioRecord = null;
  121. }
  122. catch (Exception e) {
  123. // Do nothing
  124. }
  125. }
  126. }
  127. }
  128. }
  129.  
  130. private int getRawAmplitude() {
  131. if (mAudioRecord == null) {
  132. createAudioRecord();
  133. }
  134.  
  135. final int bufferReadSize = mAudioRecord.read(mBuffer, 0, mBufferSize);
  136.  
  137. if (bufferReadSize < 0) {
  138. return 0;
  139. }
  140.  
  141. int sum = 0;
  142. for (int i = 0; i < bufferReadSize; i++) {
  143. sum += Math.abs(mBuffer[i]);
  144. }
  145.  
  146. if (bufferReadSize > 0) {
  147. return sum / bufferReadSize;
  148. }
  149.  
  150. return 0;
  151. }
  152.  
  153. /////////////////////////////////////////////////////////////////
  154. // PRIVATE CLASSES
  155.  
  156. private static class InstanceHolder {
  157. private static final AudioMeter INSTANCE = new AudioMeter();
  158. }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement