Dear Amit,
please help me out. can you post your running code. I am in search since
many days. Plese help me out. Thanks.
On Monday, February 27, 2012 12:57:02 PM UTC+5:30, amit wrote:
>
> I have written following code in which I am trying to record and play the
> audio... But all I get is just the noise... Please help ...... I also want
> to know why my UI thread hangs when I have a separate thread for
> recording.....Thanks in advance..
>
> /**
> * @author amit
> *
> */
> public class AudioRecorder extends Activity {
> private String LOG_TAG = null;
>
> /* variables which are required to generate and manage the UI of the App */
> // private RecordButton mRecordButton = null;
> private Button recordBtn, stopBtn, playBtn;
>
> /*
> * variables which are required for the actual functioning of the recording
> * and playing
> */
> private AudioRecord recorder = null;
> private AudioTrack player = null;
> private int recorderBufSize, recordingSampleRate;
> private int trackBufSize;
> private byte[] audioData;
> private boolean isRecording = false, isPlaying = false;
> private Thread startRecThread;
> private AudioRecord.OnRecordPositionUpdateListener posUpdateListener;
>
> /**
> * constructor method for initializing the variables
> */
> public AudioRecorder() {
> super();
> LOG_TAG = "Constructor";
> recorderBufSize = recordingSampleRate = trackBufSize = 0;
> // init function will initialize all the necessary variables ...
> init();
> if (recorder != null && player != null) {
> Log.e(LOG_TAG, "recorder and player initialized");
> audioData = new byte[recorderBufSize];
>
> } else {
> Log.e(LOG_TAG, "Problem inside init function ");
> }
> posUpdateListener = new AudioRecord.OnRecordPositionUpdateListener() {
> int bytesRead = 0;
> @Override
> public void onPeriodicNotification(AudioRecord recorder) {
> // TODO Auto-generated method stub
> // Log.e(LOG_TAG, "inside position listener");
> bytesRead = recorder.read(audioData, 0, audioData.length);
> player.write(audioData, 0, bytesRead);
> }
>
> @Override
> public void onMarkerReached(AudioRecord recorder) {
> // TODO Auto-generated method stub
> Log.e(LOG_TAG, "Marker Reached");
> }
> };
> // listener will be called every time 160 frames are reached
> recorder.setPositionNotificationPeriod(160);
> recorder.setRecordPositionUpdateListener(posUpdateListener);
> startRecThread = new Thread() {
> @Override
> public void run() {
> // TODO Auto-generated method stub
> recorder.startRecording();
> // Log.e(LOG_TAG, "running");
> // while (recorder.getRecordingState() ==
> AudioRecord.RECORDSTATE_RECORDING) {
> recorder.read(audioData, 0, recorderBufSize);
> // }
> }
> };
> Log.e(LOG_TAG, "inside constructor");
> }
>
> private void init() {
> LOG_TAG = "initFunc";
> int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
> short audioFormat = AudioFormat.ENCODING_PCM_16BIT;
> for (int rate : mSampleRates) {
> try {
> Log.d(LOG_TAG, "Attempting rate " + rate + "Hz, bits: "
> + audioFormat);
> int bufrSize = AudioRecord.getMinBufferSize(rate,
> AudioFormat.CHANNEL_IN_MONO, audioFormat);
>
> if (bufrSize != AudioRecord.ERROR_BAD_VALUE
> && bufrSize != AudioRecord.ERROR) {
> // check if we can instantiate and have a success
> AudioRecord rec = new AudioRecord(
> MediaRecorder.AudioSource.MIC, rate,
> AudioFormat.CHANNEL_IN_MONO, audioFormat, bufrSize);
>
> if (rec != null
> && rec.getState() == AudioRecord.STATE_INITIALIZED) {
>
> // storing variables for future use . . .
> this.recordingSampleRate = rate;
> this.recorderBufSize = bufrSize;
>
> Log.e(LOG_TAG,
> "Returning..(rate:channelConfig:audioFormat:bufferSize)"
> + rate + ":"
> + AudioFormat.CHANNEL_IN_MONO + ":"
> + audioFormat + ":" + bufrSize);
>
> // Now create an instance of the AudioTrack
> int audioTrackBufSize = AudioTrack
> .getMinBufferSize(rate,
> AudioFormat.CHANNEL_OUT_MONO,
> audioFormat);
>
> Log.e(LOG_TAG, "AudioTrack buf size :"
> + audioTrackBufSize);
> this.trackBufSize = audioTrackBufSize;
>
> this.player = new AudioTrack(AudioManager.STREAM_MUSIC,
> rate, AudioFormat.CHANNEL_OUT_MONO,
> audioFormat, audioTrackBufSize,
> AudioTrack.MODE_STREAM);
>
> this.recorder = rec;
> return;
> }
> }
> } catch (IllegalArgumentException e) {
> Log.d(LOG_TAG, rate + "Exception, keep trying.", e);
> } catch (Exception e) {
> Log.e(LOG_TAG, rate + "Some Exception!!", e);
> }
> // for loop for channel config ended here. . . .
> // for loop for audioFormat ended here. . .
> }
> return;
> }
>
> private void startPlaying() {
> LOG_TAG = "startPlaying";
>
> Log.e(LOG_TAG, "start Playing");
> }
>
> private void stopPlaying() {
> LOG_TAG = "stopPlaying";
>
> Log.e(LOG_TAG, "stop Playing");
> }
>
> private void startRecording() {
> LOG_TAG = "startRecording";
> player.play();
> /* start a separate recording thread from here . . . */
> startRecThread.start();
> // recorder.read(audioData, 0, recorderBufSize);
> Log.e(LOG_TAG, "start Recording");
> }
>
> private void stopRecording() {
> LOG_TAG = "stopRecording";
> if(startRecThread.isAlive())
> startRecThread.stop();
> recorder.stop();
> player.stop();
> Log.e(LOG_TAG, "stop Recording");
> }
>
> private void stop() {
> if (isRecording) {
> isRecording = false;
> stopRecording();
> }
> if (isPlaying) {
> isPlaying = false;
> stopPlaying();
> }
> recordBtn.setEnabled(true);
> playBtn.setEnabled(true);
> }
>
> @Override
> public void onCreate(Bundle icicle) {
> super.onCreate(icicle);
>
> LinearLayout ll = new LinearLayout(this);
>
> // creating Buttons one by one . . . .
> // button to start the recording process
> recordBtn = new Button(this);
> recordBtn.setText("Record");
> recordBtn.setOnClickListener(new OnClickListener() {
> @Override
> public void onClick(View v) {
> // TODO Auto-generated method stub
> recordBtn.setEnabled(false);
> playBtn.setEnabled(false);
> isRecording = true;
> startRecording();
> }
> });
> // single button to stop recording and playing as applicable
> stopBtn = new Button(this);
> stopBtn.setText("Stop");
> stopBtn.setOnClickListener(new OnClickListener() {
> @Override
> public void onClick(View v) {
> // TODO Auto-generated method stub
> stop();
> }
> });
> // button to play the recorded sound
> playBtn = new Button(this);
> playBtn.setText("Play");
> playBtn.setOnClickListener(new OnClickListener() {
>
> @Override
> public void onClick(View v) {
> // TODO Auto-generated method stub
> // reverse the isPlaying
> isPlaying = true;
> recordBtn.setEnabled(false);
> playBtn.setEnabled(false);
> startPlaying();
> }
> });
>
> ll.addView(recordBtn, new LinearLayout.LayoutParams(
> ViewGroup.LayoutParams.WRAP_CONTENT,
> ViewGroup.LayoutParams.WRAP_CONTENT, 1));
>
> ll.addView(playBtn, new LinearLayout.LayoutParams(
> ViewGroup.LayoutParams.WRAP_CONTENT,
> ViewGroup.LayoutParams.WRAP_CONTENT, 1));
>
> ll.addView(stopBtn, new LinearLayout.LayoutParams(
> ViewGroup.LayoutParams.WRAP_CONTENT,
> ViewGroup.LayoutParams.WRAP_CONTENT, 1));
>
> setContentView(ll);
> }
>
> @Override
> protected void onDestroy() {
> // Clean up code . ..
> super.onDestroy();
> if(startRecThread.isAlive())
> startRecThread.destroy();
> if (recorder != null)
> recorder.release();
> if (player != null)
> player.release();
> startRecThread = null;
> recorder = null;
> player = null;
> recordBtn = null;
> stopBtn = null;
> playBtn = null;
> audioData = null;
> System.gc();
> }
>
> }
>
>
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en