Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to record audio but getting message "mediarecorder went away with unhandled events" and "Fatal signal 11 (SIGSEGV)...."

Tags:

I am trying to record audio in android but I am facing a problem.

I have start and stop buttons, "start" for starting recording and "stop" for stopping recording.

The problem is, when I press the stop button then my application logs a message "W/MediaRecorder(635): mediarecorder went away with unhandled events". (Start function is saving the audio file properly.)

Then, if I again press start or stop button then I get error message " A/libc(743): Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 743 (xample.recorder)"

Code of recording class is below:

  /**    * Creates a new audio recording at the given path (relative to root of SD card).    */   public AudioRecorder(String path) {     this.path = sanitizePath(path);   }   private String sanitizePath(String path) {         if (!path.startsWith("/")) {           path = "/" + path;         }         if (!path.contains(".")) {           path += ".3gp";         }         return Environment.getExternalStorageDirectory().getAbsolutePath() + path;       }    public void start() throws IOException {     String state = android.os.Environment.getExternalStorageState();     if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {         throw new IOException("SD Card is not mounted.  It is " + state + ".");     }      // make sure the directory we plan to store the recording in exists     File directory = new File(path).getParentFile();     if (!directory.exists() && !directory.mkdirs()) {       throw new IOException("Path to file could not be created.");     }      recorder.setAudioSource(MediaRecorder.AudioSource.MIC);     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);     recorder.setOutputFile(path);     try{     recorder.prepare();     }     catch(IOException e){         Log.e("Recorder","Recording failed");     }     recorder.start();   }   /**    * Stops a recording that has been previously started.    */   public void stop() throws IOException {     recorder.stop();     recorder.release();   } 

Code of main activity is below:

  /*  * */   public class Recorder extends Activity implements OnClickListener     { private static final String TAG="Recorder"; AudioRecorder ar=new AudioRecorder("/TestAudio.3gp"); @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_recorder);      final Button start = (Button) this.findViewById(R.id.btn_start);     start.setOnClickListener(this);       final Button stop = (Button) this.findViewById(R.id.btn_stop);     stop.setOnClickListener(this);  }  @Override public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.activity_recorder, menu);     return true; }  public void onClick(View v) {     // TODO Auto-generated method stub     try{          switch (v.getId()) {             case R.id.btn_start:                 ar.start();                 Log.d("Recorder","Recorded");                 Toast.makeText(this, "Controll returned from start function", Toast.LENGTH_LONG).show();                               break;             case R.id.btn_stop:                 ar.stop();                 Toast.makeText(this, "Recording stopped; Starting MediaPlayer", Toast.LENGTH_SHORT).show();                 //Toast.makeText(this, "Starting media player", Toast.LENGTH_LONG).show();                 ar.startPlaying();                 //Toast.makeText(this, "Recording stopped", Toast.LENGTH_LONG).show();                break;             }         }         catch(Exception e){             Log.e("Recorder", e.getMessage(), e);                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();         }  } 

}

like image 851
blackfyre Avatar asked Aug 08 '12 19:08

blackfyre


1 Answers

I solved this problem by reseting recorder before releasing it.

recorder.stop();     // stop recording recorder.reset();    // set state to idle recorder.release();  // release resources back to the system recorder = null; 
like image 138
blackfyre Avatar answered Oct 16 '22 22:10

blackfyre