How can I write a program to get the sound levels of a recording in Android?

Xchris X December 1, 2013
Pinterest Stumbleupon Whatsapp
Ads by Google

Hello there,

I’m a newbie in programming and I want to 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’d 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

  1. Xchris X
    December 3, 2013 at 3:23 pm

    I tried,but I don't know how to put it on GitHub.I've upload the whole project here,if you import this to eclipse,it will work

    http://www.fileswap.com/dl/q5ltEt5jm8/TSP_Recorder_-_Delta.rar.html

  2. Xchris X
    December 2, 2013 at 9:48 pm

    I don't know what's wrong,I didn't post it like that and I can't edit my post

    • Kannon Y
      December 3, 2013 at 3:24 am

      Can you link to your GitHub? I'm sorry for the display issues. Raw code comes out super crazy in WordPress.

  3. Xchris X
    December 2, 2013 at 9:46 pm

    Sorry for the messy code,I don't know why it's displayed like that

    package com.tsop.tsp_recorder;

    import android.R.layout;
    import android.app.Activity;
    import android.widget.HorizontalScrollView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    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;

    public int currentAmplitude;

    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();
    getAmplitude();
    }

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

    public double getAmplitude() {
    if (mRecorder != null) {
    currentAmplitude = mRecorder.getMaxAmplitude();
    return currentAmplitude;
    }
    else
    return 0;
    }

    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));
    TextView tv = new TextView(this);
    ll.addView(tv,
    new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    0));
    tv.setText(Integer.toString(currentAmplitude));
    setContentView(ll);
    }

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

    if (mPlayer != null) {
    mPlayer.release();
    mPlayer = null;
    }
    }
    }

  4. Xchris X
    December 2, 2013 at 9:43 pm

    I've edited my code into this :

    -----------------------------------------------------------------
    package com.tsop.tsp_recorder;

    import android.R.layout;
    import android.app.Activity;
    import android.widget.HorizontalScrollView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    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;

    public int currentAmplitude;

    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();
    getAmplitude();
    }

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

    public double getAmplitude() {
    if (mRecorder != null) {
    currentAmplitude = mRecorder.getMaxAmplitude();
    return currentAmplitude;
    }
    else
    return 0;
    }

    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));
    TextView tv = new TextView(this);
    ll.addView(tv,
    new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT,
    0));
    tv.setText(Integer.toString(currentAmplitude));
    setContentView(ll);
    }

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

    if (mPlayer != null) {
    mPlayer.release();
    mPlayer = null;
    }
    }
    }
    -------------------------------------------------------------------------

    But it returns 0 everytime.Any ideas?