Click here to Skip to main content
15,885,546 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
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 :
Java
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 [I]getMaxAmplitude [/I]method,but this method returns only the last result,before it was called.I think I should use a loop,but the [I]start[/I] method is capturing and encoding continuously.
How can I get the current amplitude,for example in a period of 1 second,on my recording?

Thanks
Posted
Updated 30-Nov-13 23:10pm
v2

1 solution

C#
public class SoundMeter {

    private MediaRecorder mRecorder = null;

    public void start() {
            if (mRecorder == null) {
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    mRecorder.setOutputFile("/dev/null");
                    mRecorder.prepare();
                    mRecorder.start();
            }
    }

    public void stop() {
            if (mRecorder != null) {
                    mRecorder.stop();
                    mRecorder.release();
                    mRecorder = null;
            }
    }

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

    }
}
 
Share this answer
 
Comments
[no name] 3-Dec-13 10:07am    
I've tried this,but when I put these 3 methods on a loop (for getting multiple records and their amplitude),the recording lasts for less than a second and then there isn't any new recordings,it crashes.
[no name] 3-Dec-13 14:08pm    
you might be calling it to fast. Try creating another thread and calling it like every 300ms or even 400ms
Vivek kumar Shaw 26-Feb-17 8:12am    
sir vales are not correct. when i compared with other sound meter its value ware totally different .how to convert the amplitude into desibl(dB)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900