Advertisement
saurabhmesh17

AudioRecord/AudioTrack-UsingBuffer - 27th Aug 2014

Aug 27th, 2014
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.34 KB | None | 0 0
  1. package com.example.audiorecplayusingbuffer;
  2.  
  3. /* This Program is used to Record and Play back Some audio
  4.  * The Recorded Audio is written to a BUFFER, and same BUFFER is used for Play back
  5.  * */
  6.  
  7. import java.util.Arrays;
  8. import android.support.v7.app.ActionBarActivity;
  9. import android.support.v4.app.Fragment;
  10. import android.media.AudioFormat;
  11. import android.media.AudioManager;
  12. import android.media.AudioRecord;
  13. import android.media.AudioTrack;
  14. import android.media.MediaRecorder;
  15. import android.media.MediaRecorder.AudioSource;
  16. import android.os.Bundle;
  17. import android.util.Log;
  18. import android.view.LayoutInflater;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.view.View;
  22. import android.view.ViewGroup;
  23. import android.widget.Button;
  24.  
  25. public class BufferMain extends ActionBarActivity
  26. {
  27.     private String TAG = "AUDIO_RECORD_PLAYBACK_SAURABH_BUFFER";
  28.     private boolean isRunning = true;
  29.  
  30.     private Thread m_thread;
  31.  
  32.     private AudioRecord recorder = null;
  33.     private AudioTrack track = null;
  34.  
  35.     int bufferSize = 320;
  36.     byte buffer[] = new byte[bufferSize];
  37.  
  38.  
  39.     @Override
  40.     protected void onCreate(Bundle savedInstanceState) {
  41.         super.onCreate(savedInstanceState);
  42.         setContentView(R.layout.activity_buffer_main);
  43.  
  44.         enableButton(R.id.StartButton,true);
  45.         enableButton(R.id.StopButton,false);
  46.  
  47.         /* Assign Button Click Handlers */
  48.         ((Button)findViewById(R.id.StartButton)).setOnClickListener(btnClick);
  49.         ((Button)findViewById(R.id.StopButton)).setOnClickListener(btnClick);
  50.  
  51.         /*if (savedInstanceState == null) {
  52.             getSupportFragmentManager().beginTransaction()
  53.                     .add(R.id.container, new PlaceholderFragment()).commit();
  54.         }*/
  55.         Log.d(TAG, "\n\n\n\n\n\n============================= Starting Application.. =====================================");
  56.         findAudioRecord(recorder);
  57.     }
  58.  
  59.     private View.OnClickListener btnClick = new View.OnClickListener() {
  60.         @Override
  61.         public void onClick(View v) {
  62.             switch(v.getId()){
  63.             case R.id.StartButton:
  64.             {
  65.                 Log.d(TAG, "======== Start Button Pressed ==========");
  66.                 isRunning = true;
  67.                 Log.d(TAG, "========== isRunning = true =============");
  68.                 do_loopback(isRunning);
  69.                 enableButton(R.id.StartButton,false);
  70.                 enableButton(R.id.StopButton,true);
  71.                 break;
  72.             }
  73.             case R.id.StopButton:
  74.             {
  75.                 Log.d(TAG, "======== Stop Button Pressed ==========");
  76.                 isRunning = false;
  77.                 Log.d(TAG, "========== isRunning = false =============");
  78.                 do_loopback(isRunning);
  79.                 enableButton(R.id.StopButton,false);
  80.                 enableButton(R.id.StartButton,true);
  81.                 break;
  82.             }
  83.             }
  84.         }
  85.     };
  86.  
  87.  
  88.     public void run_loop (boolean isRunning)
  89.     {
  90.         /** ============================ If Stop Button is pressed ============================ **/
  91.         if (isRunning == false) {
  92.             Log.d(TAG, "===== Entering run Loop with isRunning == false ===== ");
  93.            
  94.             if (AudioRecord.STATE_INITIALIZED == recorder.getState()){
  95.                 recorder.stop();
  96.                 recorder.release();
  97.             }
  98.             if (AudioTrack.STATE_INITIALIZED == track.getState()){
  99.                 track.stop();
  100.                 track.release();
  101.             }
  102.             return;
  103.         }
  104.         /** ==================================================================================== **/
  105.        
  106.         int readbytes, writebytes;
  107.         Log.d(TAG, "===== Entering run Loop ===== ");
  108.  
  109.         recorder = findAudioRecord(recorder);
  110.         if (recorder == null) {
  111.             Log.e(TAG, "========= findAudioRecord : Returned Error! ============ ");
  112.             return;
  113.         }
  114.  
  115.         track = findAudioTrack(track);
  116.         if (track == null) {
  117.             Log.e(TAG, "========= findAudioTrack : Returned Error! ============ ");
  118.             return;
  119.         }
  120.  
  121.         if ((AudioRecord.STATE_INITIALIZED == recorder.getState()) && (AudioTrack.STATE_INITIALIZED == track.getState()))
  122.         {
  123.             recorder.startRecording();
  124.             Log.d(TAG, "========= Recorder Started... =========");
  125.             track.play();
  126.             Log.d(TAG, "========= Track Started... =========");
  127.         } else {
  128.             Log.d(TAG, "========= Initilazation failed for AudioRecord or AudioTrack =========");
  129.             return;
  130.         }
  131.  
  132.         while (isRunning == true) {
  133.             readbytes = 0;                                              /* Reset read bytes for next Iteration */
  134.             writebytes = 0;                                             /* Reset write bytes for next Iteration */
  135.  
  136.             /* Recording and Playing in chunks of 320 bytes */
  137.             bufferSize = 320;
  138.            
  139.             readbytes = recorder.read(buffer, 0, bufferSize);
  140.             if(-1 == checkAudioRecordforError(readbytes))               /* Error Checking Code for AudioRecord */
  141.             {
  142.                 Log.d(TAG, "========= Read Error =========");
  143.                 return;
  144.             }
  145.  
  146.             writebytes = track.write(buffer, 0, bufferSize);
  147.             if (-1 == checkAudioTrackforError(writebytes))              /* Error Checking Code for AudioRecord */
  148.             {
  149.                 Log.d(TAG, "========= Write Error =========");
  150.                 return;
  151.             }
  152.         }
  153.         Log.i(TAG, "loopback exit");
  154.         return;
  155.     }
  156.  
  157.  
  158.     public int checkAudioRecordforError(int readbytes)
  159.     {
  160.         if (readbytes ==  recorder.ERROR_INVALID_OPERATION || readbytes ==  recorder.ERROR_BAD_VALUE)
  161.         {
  162.             if(readbytes == AudioRecord.ERROR_INVALID_OPERATION)
  163.                 Log.d(TAG, "========= read Error : ERROR_INVALID_OPERATION ===========");
  164.             else if (readbytes == AudioRecord.ERROR_BAD_VALUE)
  165.                 Log.d(TAG, "========= read Error : ERROR_BAD_VALUE ===========");
  166.             else if (readbytes == AudioRecord.ERROR)
  167.                 Log.d(TAG, "========= read Error : ERROR Unknown ===========");
  168.             return -1;
  169.         }
  170.         return readbytes;
  171.     }
  172.  
  173.  
  174.     public int checkAudioTrackforError(int writebytes)
  175.     {
  176.         if (writebytes ==  track.ERROR_INVALID_OPERATION || writebytes ==  track.ERROR_BAD_VALUE)
  177.         {
  178.             if(writebytes == track.ERROR_INVALID_OPERATION)
  179.                 Log.d(TAG, "========= read Error : ERROR_INVALID_OPERATION ===========");
  180.             else if (writebytes == track.ERROR_BAD_VALUE)
  181.                 Log.d(TAG, "========= read Error : ERROR_BAD_VALUE ===========");
  182.             else if (writebytes == track.ERROR)
  183.                 Log.d(TAG, "========= read Error : ERROR Unknown ===========");
  184.             return -1;
  185.         }
  186.         return writebytes;
  187.     }
  188.  
  189.  
  190.     public AudioTrack findAudioTrack (AudioTrack track)
  191.     {
  192.         Log.d(TAG, "=============================== Initialising Playing API ===============================");
  193.         int m_bufferSize;
  194.         m_bufferSize = AudioTrack.getMinBufferSize(8000,
  195.                 AudioFormat.CHANNEL_OUT_MONO,
  196.                 AudioFormat.ENCODING_PCM_16BIT);        /* Return 640 */
  197.  
  198.         /** Overriding bufferSize value of 640 with 320**/
  199.         Log.d(TAG, "========= BEFORE AudioTrack ==> bufferSize : "+m_bufferSize+"=========");
  200.         Log.d(TAG, "========= AudioTrack ==> bufferSize : "+m_bufferSize+"=========");
  201.  
  202.         if (m_bufferSize != AudioTrack.ERROR_BAD_VALUE)
  203.         {
  204.             track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
  205.                     AudioFormat.CHANNEL_OUT_MONO,
  206.                     AudioFormat.ENCODING_PCM_16BIT, m_bufferSize,
  207.                     AudioTrack.MODE_STREAM);
  208.  
  209.             int type = track.getStreamType();
  210.             Log.d(TAG, "========= AudioTrack ==> getStreamType : "+type+"====");
  211.  
  212.             if (track.getState() == AudioTrack.STATE_UNINITIALIZED) {
  213.                 Log.e(TAG, "=============================== AudioTrack UnInitilaised =============================== ");
  214.                 return null;
  215.             }
  216.         }
  217.         return track;
  218.     }
  219.  
  220.  
  221.     public AudioRecord findAudioRecord (AudioRecord recorder)
  222.     {
  223.         int m_bufferSize;
  224.         Log.d(TAG, "=============================== Initialising Record API ===============================");
  225.         m_bufferSize = AudioRecord.getMinBufferSize(8000,
  226.                 AudioFormat.CHANNEL_IN_MONO,
  227.                 AudioFormat.ENCODING_PCM_16BIT);
  228.  
  229.         /** Overriding bufferSize value of 640 with 320**/
  230.         Log.d(TAG, "========= BEFORE AudioRecord ==> bufferSize : "+m_bufferSize+"=========");
  231.         Log.d(TAG, "========= AudioRecord ==> bufferSize : "+m_bufferSize+"=========");
  232.  
  233.         if (m_bufferSize != AudioRecord.ERROR_BAD_VALUE)
  234.         {
  235.             recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,
  236.                     AudioFormat.CHANNEL_IN_MONO,
  237.                     AudioFormat.ENCODING_PCM_16BIT, m_bufferSize);
  238.  
  239.             if (recorder.getState() == AudioRecord.STATE_UNINITIALIZED) {
  240.                 Log.e(TAG, "=============================== AudioRecord UnInitilaised =============================== ");
  241.                 return null;
  242.             }
  243.         }
  244.         Log.d(TAG, "=============================== Initialising Record Completed ===============================");
  245.         return recorder;
  246.     }
  247.  
  248.     private void do_loopback(final boolean flag) {
  249.         Log.d(TAG, "========== within do_loopback ============");
  250.         m_thread = new Thread(new Runnable() {
  251.             public void run() {
  252.                 run_loop(flag);
  253.             }
  254.         });
  255.         m_thread.start();
  256.     }
  257.  
  258.  
  259.  
  260.     /* Function to Enable/Disable Buttons */
  261.     private void enableButton(int id,boolean isEnable){
  262.         ((Button)findViewById(id)).setEnabled(isEnable);
  263.     }
  264.  
  265.     @Override
  266.     public boolean onCreateOptionsMenu(Menu menu) {
  267.         // Inflate the menu; this adds items to the action bar if it is present.
  268.         getMenuInflater().inflate(R.menu.buffer_main, menu);
  269.         return true;
  270.     }
  271.  
  272.     @Override
  273.     public boolean onOptionsItemSelected(MenuItem item) {
  274.         // Handle action bar item clicks here. The action bar will
  275.         // automatically handle clicks on the Home/Up button, so long
  276.         // as you specify a parent activity in AndroidManifest.xml.
  277.         int id = item.getItemId();
  278.         if (id == R.id.action_settings) {
  279.             return true;
  280.         }
  281.         return super.onOptionsItemSelected(item);
  282.     }
  283.  
  284.     public static class PlaceholderFragment extends Fragment {
  285.  
  286.         public PlaceholderFragment() {
  287.         }
  288.  
  289.         @Override
  290.         public View onCreateView(LayoutInflater inflater, ViewGroup container,
  291.                 Bundle savedInstanceState) {
  292.             View rootView = inflater.inflate(R.layout.fragment_buffer_main,
  293.                     container, false);
  294.             return rootView;
  295.         }
  296.     }
  297.  
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement