Using java Syntax Highlighting
- package com.mixer01;
- import java.io.BufferedOutputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- import android.media.AudioFormat;
- import android.media.AudioRecord;
- import android.media.MediaRecorder;
- import android.media.AudioRecord.OnRecordPositionUpdateListener;
- import android.util.Log;
- public class Recorder implements OnRecordPositionUpdateListener
- {
- private static final int encoding = AudioFormat.ENCODING_PCM_16BIT;
- public static final int frequencies[] = {44100,22050,11025,8000};
- public int frequency = Recorder.frequencies[0];
- public int channels = AudioFormat.CHANNEL_CONFIGURATION_MONO;
- private int buffer_size;
- public boolean isProcessing;
- private String filename;
- private OutputStream os;
- private BufferedOutputStream bos;
- private DataOutputStream dos;
- private byte[] buffer;
- private AudioRecord recorder;
- public Object record_finished = new Object();
- public Recorder( String filename )
- {
- try
- {
- this.filename = filename;
- }
- catch (Exception e)
- {
- Log.e("com.mixer01.Recorder", e.toString());
- }
- }
- public void start()
- {
- isProcessing = true;
- super.start();
- }
- /**
- * Create AudioRecord object with specified frequency
- * @return
- */
- private AudioRecord createRecorder()
- {
- AudioRecord res = null;
- try
- {
- // Create a new AudioRecord object to record the audio.
- buffer_size = AudioRecord.getMinBufferSize(frequency,
- channels, encoding);
- res = new AudioRecord(
- MediaRecorder.AudioSource.MIC,
- frequency, channels,
- encoding, buffer_size);
- }
- catch (Exception e)
- {
- Log.e("com.mixer01.Recorder:createRecorder", e.toString());
- }
- return res;
- }
- private void initOutputFile() throws Exception
- {
- File file = new File(filename);
- // Delete any previous recording.
- if (file.exists())
- file.delete();
- // Create the new file.
- file.createNewFile();
- // Create a DataOuputStream to write the audio data into the saved file.
- os = new FileOutputStream(file);
- bos = new BufferedOutputStream(os);
- dos = new DataOutputStream(bos);
- }
- private void closeOutputFile() throws Exception
- {
- dos.close();
- bos.close();
- os.close();
- }
- public void startRecord()
- {
- try
- {
- isProcessing = true;
- initOutputFile();
- int pos = 0;
- recorder = null;
- while (recorder == null)
- {
- frequency = frequencies[pos];
- recorder = createRecorder();
- pos++;
- if ( pos >= frequencies.length )
- {
- // that's end, no more variants <img src="http://www.anddev.org/images/smilies/sad.png" alt=":(" title="Sad" />
- break;
- }
- }
- if (recorder == null)
- {
- throw new Exception("Can't create AudioRecord object");
- }
- buffer = new byte[buffer_size];
- recorder.setRecordPositionUpdateListener(this);
- recorder.setPositionNotificationPeriod(buffer_size/2);
- recorder.startRecording();
- int readed = recorder.read(buffer, 0, buffer_size);
- dos.write(buffer, 0, readed);
- }
- catch (Exception e)
- {
- Log.e("com.mixer01.Recorder:startRecord", e.toString());
- }
- }
- public void stopRecorder()
- {
- try
- {
- isProcessing = false;
- if ( recorder != null )
- {
- recorder.stop();
- recorder.release();
- recorder = null;
- }
- //this.start();
- }
- catch (Exception e)
- {
- Log.e("com.mixer01.Recorder:stopRecorder", e.toString());
- }
- }
- //-------------------------------------------------------------------------------------------------------
- // OnRecordPositionUpdateListener routines
- //-------------------------------------------------------------------------------------------------------
- public void onMarkerReached(AudioRecord arg0) {}
- public void onPeriodicNotification(AudioRecord arg0)
- {
- try
- {
- int readed = recorder.read(buffer, 0, buffer_size);
- dos.write(buffer, 0, readed);
- Log.i("OnPeridoc", "buf[0]="+buffer[0]);
- if (!isProcessing)
- {
- closeOutputFile();
- synchronized (record_finished)
- {
- record_finished.notify();
- }
- }
- }
- catch (Exception e)
- {
- Log.e("com.mixer01.Recorder:onPeriodicNotification", e.toString());
- }
- }
- }
Parsed in 0.047 seconds, using GeSHi 1.0.8.4
This code works on Samsung i5700, but in log i see huge number of errors:
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
W/AudioFlinger( 1816): write blocked for 51 msecs
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
I/writeFrames(10104): End encoding 439
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
I/OnPeridoc(10104): buf[0]=0
E/ALSALib ( 1816): external/alsa-lib/src/pcm/pcm.c:7231:(snd_pcm_recover) overrun occured
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: buffer overflow
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
I/OnPeridoc(10104): buf[0]=0
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: buffer overflow
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
I/OnPeridoc(10104): buf[0]=-1
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: buffer overflow
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
I/OnPeridoc(10104): buf[0]=-46
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: buffer overflow
I/OnPeridoc(10104): buf[0]=-41
I/writeFrames(10104): enter encoding 786
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: buffer overflow
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
W/AudioFlinger( 1816): write blocked for 49 msecs
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
E/AudioFlinger( 1816): AudioRecordThread: Frame has some error!!
What does they mean?
Also with the same code on another phone (Motorola droid) my test application halts and in log i get:
[quote]
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
W/AudioRecord( 2228): obtainBuffer timed out (is the CPU pegged?) user=00000000, server=00000000
[quote]
What's going wrong?


