I have been messing around with the AudioRecord feature of the Android API and found some strange behaviors with it.
Background info: My phone is a HTC Incredible I
I might be able to help a tiny bit. However, I am in the same situation as you so I can only tell you about my experiences.
I believe you can get your device's preferred sampleRate like so:
int sampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
The 16Bit encoding mode is the only one that works with AudioRecord. I am unsure why you are getting 8Bit like output (right?). Maybe someone knows.
I am also unsure how you pull the amplitude from the retrieved bytes, did you do this?
Finally, I believe you need to use the periodic listener functions, like so:
int sampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
int channelMode = AudioFormat.CHANNEL_IN_MONO;
int encodingMode = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelMode, encodingMode);
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelMode, encodingMode, bufferSize);
recorder.setPositionNotificationPeriod(intervalFrames);
recorder.setRecordPositionUpdateListener(recordListener);
recorder.startRecording();
private RecordListener recordListener = new RecordListener();
private class RecordListener implements AudioRecord.OnRecordPositionUpdateListener {
public void onMarkerReached(AudioRecord recorder) {
Log.v("MicInfoService", "onMarkedReached CALL");
}
public void onPeriodicNotification(AudioRecord recorder) {
Log.v("MicInfoService", "onPeriodicNotification CALL");
}
}
There are two big questions here which I cannot answer and want to know the answer of myself as well:
I wish I could help more.