0 0 Votes

Android Getting Sound Levels

Question by Guest | 01/12/2013 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

Computer Expert

Show Profile | Message
Avatar
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.
02/12/2013 at 13:43

ReplyPositive Negative
Reply

Related Topics

Android Audio Recorder
Open Question | 5 Answers
What is actually Android?
Question | 1 Answer
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 articles on askingbox.com. How to do.