Я создаю приложение, которое определяет частоты звука, воспроизводимого через микрофон.Анализ выполняется в AsyncTask.Это работает, когда я пробую одну заметку.
Однако, когда я пытаюсь проанализировать 6 нот, скажем, из разных гитарных струн, одну за другой (с задержкой в одну секунду или около того между ними), он захватывает только одну, может быть, еще одну.* Вот некоторые из выводов LogCat, которые я получаю:
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=-1
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [SKW]do_route_audio_rpc(0, 1, 0)
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): msm72xx_enable_audpp: 0x0000
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=0
11-22 19:50:30.523: ERROR/AudioHardwareMSM72XX(1296): Cannot open /dev/msm_pcm_in errno: 16
11-22 19:50:30.533: ERROR/AudioRecord(23241): Could not get audio input for record source 1
11-22 19:50:30.533: ERROR/AudioRecord-JNI(23241): Error creating AudioRecord instance: initialization check failed.
11-22 19:50:30.533: ERROR/AudioRecord-Java(23241): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.
Я удалил все повторения для всех вас.
Вот список моего класса:
static AudioRecord recorder;
static short[] audioData;
static int bufferSize;
static int samplerate = 8000;
static boolean recorded = false;
@Override
protected Integer doInBackground(params) {
bufferSize= AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT)*2;
recorder = new AudioRecord (AudioSource.MIC,samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,bufferSize);
audioData = new short [bufferSize]; //short array that pcm data is put into.
int recordingLoops = 0;
while (recordingLoops < 4 || recorded) { //loop until recording is running
if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)
if(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)
recorder.startRecording();
else {
recorder.read(audioData,0,bufferSize);
getFrequencyFromAudiodata(audioData);
recorded = true;
}
recordingLoops++;
}
if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING)
{
killRecorder();
}
return 1;
}
Ребята, вы понимаете, что происходит?Я немного осмотрелся, но мне кажется, что я сталкиваюсь с людьми, которые говорят, что Android «полон ошибок».
Любая помощь будет высоко оценена.
Спасибо, Бен