Hello Android Developers!
My Android Java Application needs to record audio data into the RAM
and process it. This is why I use the class "AudioRecord" and not the
"MediaRecorder" (records only to file).
Till now, I used a busy loop polling with "read()" for the audio data.
this has been working so far, but it peggs the CPU too much. Between
two polls, I put the thread to sleep to avoid 100% CPU usage. However,
this is not really a clean solution, since the time of the sleep is
not guaranteed and you must subtract a security time in order not to
loose audio snippets. This is not CPU optimal. I need as many free CPU
cycles as possible for a parallel running thread.
Now I implemented the recording using the
"OnRecordPositionUpdateListener". This looks very promising and the
right way to do it according the SDK Docs. Everything seems to work
(opening the audio device, read()ing the data etc.) but the Listner is
never called.
Does anybody know why?
Info: I am working with a real Device, not under the Emulator. The
Recording using a Busy Loop basically works (however not satifiying).
Only the Callback Listener is never called.
Here is a snippet from my Sourcecode:
______________________________________________ snip!
public class myApplication extends Activity {
/* audio recording */
private static final int AUDIO_SAMPLE_FREQ = 16000;
private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ *
2 * 3; // = 3000ms
private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE =
AUDIO_SAMPLE_FREQ / 10 * 2; // = 200ms
private short[] mAudioBuffer = null; // audio buffer
private int mSamplesRead; // how many samples are recently read
private AudioRecord mAudioRecorder; // Audio Recorder
...
private OnRecordPositionUpdateListener mRecordListener = new
OnRecordPositionUpdateListener() {
public void onPeriodicNotification(AudioRecord recorder) {
mSamplesRead = recorder.read(mAudioBuffer, 0,
AUDIO_BUFFER_SAMPLEREAD_SIZE);
if (mSamplesRead > 0) {
// do something here...
}
}
public void onMarkerReached(AudioRecord recorder) {
Error("What? Hu!? Where am I?");
}
};
...
public void onCreate(Bundle savedInstanceState) {
try {
mAudioRecorder = new AudioRecord(
android.media.MediaRecorder.AudioSource.MIC,
AUDIO_SAMPLE_FREQ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
AUDIO_BUFFER_BYTESIZE);
} catch (Exception e) {
Error("Unable to init audio recording!");
}
mAudioBuffer = new short[AUDIO_BUFFER_SAMPLEREAD_SIZE];
mAudioRecorder.setPositionNotificationPeriod(AUDIO_BUFFER_SAMPLEREAD_SIZE);
mAudioRecorder.setRecordPositionUpdateListener(mRecordListener);
mAudioRecorder.startRecording();
/* test if I can read anything at all... (and yes, this here
works!) */
mSamplesRead = mAudioRecorder.read(mAudioBuffer, 0,
AUDIO_BUFFER_SAMPLEREAD_SIZE);
}
}
______________________________________________ snip!
--
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