Мое JAVA-приложение Android должно записать аудиоданные в RAM и обработать его. Поэтому я использую класс "AudioRecord", а не "MediaRecorder" (записывает только в файл).
До настоящего времени я использовал занятый опрос цикла с "чтением ()" для аудиоданных. это работало до сих пор, но это peggs ЦП слишком много. Между двумя опросами я поместил поток для сна для предотвращения 100%-го использования ЦП. Однако это не действительно чистое решение, так как время сна не гарантируется, и необходимо вычесть время безопасности для не выпуска аудио отрывков. Это не оптимальный ЦП. Мне нужно как можно больше бесплатных циклов ЦП для параллельного рабочего потока.
Теперь я реализовал запись с помощью "OnRecordPositionUpdateListener". Это выглядит очень перспективным и правильный способ сделать это согласно Документам SDK. Все, кажется, работает (открытие аудиоустройства, считайте () луг данные и т.д.), но Listner никогда не называют.
Кто-либо знает почему?
Информация: Я работаю с физическим устройством, не под Эмулятором. Запись с помощью Занятого Цикла в основном работает (однако не satifiying). Только Слушателя Обратного вызова никогда не звонят.
Вот отрывок из моего Исходного кода:
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);
}
}