00 Votes

Android Getting Sound Levels

Question by Guest | 2013-12-01 at 10:17

Hello there!

I'm a newbie in programming and I wanna build a sound recording application.

I have this code which is recording sound and puts a timestamp:

package com.tsop.tsp_recorder;

import android.R.layout;
import android.app.Activity;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import java.io.IOException;
import java.util.Calendar;


public class MainActivity extends Activity { 
  private static final String LOG_TAG = "AudioRecordTest";
  private static String mFileName = null;
  private RecordButton mRecordButton = null;
  private MediaRecorder mRecorder = null;
  private PlayButton mPlayButton = null;
  private MediaPlayer mPlayer = null;

private void onRecord(boolean start) {
  if (start) {
    startRecording(); 
  } else {
    stopRecording();
  }
}

private void onPlay(boolean start) {
  if (start) {
    startPlaying();
  } else {
    stopPlaying();
  }
}

private void startPlaying() {
  mPlayer = new MediaPlayer();
  try {
    mPlayer.setDataSource(mFileName);
    mPlayer.prepare();
    mPlayer.start();
  } catch (IOException e) {
    Log.e(LOG_TAG, "prepare() failed");
  }
}

private void stopPlaying() {
  mPlayer.release();
  mPlayer = null;
}

private void startRecording() {
  mRecorder = new MediaRecorder();
  mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  mRecorder.setOutputFile(mFileName);
  mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

  try {
    mRecorder.prepare();
  } catch (IOException e) {
    Log.e(LOG_TAG, "prepare() failed");
  }

  mRecorder.start();
}

private void stopRecording() {
  mRecorder.stop();
  mRecorder.release();
  mRecorder = null;
}

class RecordButton extends Button {
  boolean mStartRecording = true;

  OnClickListener clicker = new OnClickListener() {
    public void onClick(View v) {
      onRecord(mStartRecording);
      if (mStartRecording) {
        setText("Stop recording");
      } else {
        setText("Start recording");
      }
      mStartRecording = !mStartRecording;
    }
  };

  public RecordButton(Context ctx) {
    super(ctx);
    setText("Start recording");
    setOnClickListener(clicker);
  }
}

class PlayButton extends Button {
  boolean mStartPlaying = true;

  OnClickListener clicker = new OnClickListener() {
    public void onClick(View v) {
      onPlay(mStartPlaying);
      if (mStartPlaying) {
        setText("Stop playing");
      } else {
        setText("Start playing");
      }
      mStartPlaying = !mStartPlaying;
    }
  };

  public PlayButton(Context ctx) {
    super(ctx);
    setText("Start playing");
    setOnClickListener(clicker);
  }
}

public MainActivity() {
  theDate date = new theDate();
  String sDate = date.curDate();
  String sTime = date.curTime();
  mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
  mFileName += "/TSP_Recordings/Date_"+sDate+"_Time_"+sTime+".3gp";
}

@Override
public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  LinearLayout ll = new LinearLayout(this);
  mRecordButton = new RecordButton(this);
  ll.addView(mRecordButton,
  new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    0));
  mPlayButton = new PlayButton(this);
  ll.addView(mPlayButton,
    new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    0));
  setContentView(ll);
}

@Override
public void onPause() {
  super.onPause();
  if (mRecorder != null) {
    mRecorder.release();
    mRecorder = null;
  }
  if (mPlayer != null) {
    mPlayer.release();
    mPlayer = null;
  }
} 
}


package com.tsop.tsp_recorder;

import java.util.Calendar;

public class theDate {
  static Calendar c = Calendar.getInstance();

  public static String curDate() {
    int month = c.get(Calendar.MONTH) + 1;
    String sDate = c.get(Calendar.DAY_OF_MONTH) + "-" 
    + month
    + "-" + c.get(Calendar.YEAR);
    return sDate;
  }

  public static String curTime() {
    String sTime = c.get(Calendar.HOUR_OF_DAY) 
    + "-" + c.get(Calendar.MINUTE) + "-"
    + c.get(Calendar.SECOND);
    return sTime;
  }

  public static long duration() {
    long dur = c.getTimeInMillis();
    return dur;
  }
}

I need to change it and make it messure the sound levels. I'll use the getMaxAmplitude method, but this method returns only the last result, before it was called. I think I should use a loop, but the start method is capturing and encoding condinuously.

How can I get the current amplitude, for example in a period of 1 second, on my recording?

Thanks

ReplyPositiveNegative
11 Vote

Just use a Timer, set its period to 1 second and use your method in the timer loop. Than you have one value for each second.
2013-12-02 at 13:43

ReplyPositive Negative
Reply

Related Topics

Android Splash Screen Tutorial

Tutorial | 0 Comments

Delphi: Play System-Sounds

Tutorial | 0 Comments

Important Note

Please note: The contributions published on askingbox.com are contributions of users and should not substitute professional advice. They are not verified by independents and do not necessarily reflect the opinion of askingbox.com. Learn more.

Participate

Ask your own question or write your own article on askingbox.com. That’s how it’s done.