android android-asynctask fft logcat audiorecord

La instancia de audiorecord de Android falla



android-asynctask fft (2)

Estoy creando una aplicación que detecta frecuencias de sonido que se reproducen a través del micrófono. El análisis se realiza en una AsyncTask. Funciona cuando intento una nota.

Sin embargo, cuando intento analizar 6 notas, digamos de diferentes cuerdas de guitarra, una después de otra (con un retraso de un segundo entre ellas) solo capta una más.

Esta es parte de la salida de LogCat que obtengo:

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.

Eliminé cualquier repetición para todos ustedes.

Aquí está la frase de mi clase:

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; }

¿Tienen alguna idea de lo que está pasando? He hecho algunas búsquedas, pero parece que me estoy cruzando con personas que dicen que Android está "lleno de errores".

Cualquier ayuda sería apreciada masivamente.

Gracias, Ben


La respuesta está en esto:

while (recordingLoops < 4 || recorded)

Lo cambié a:

while (!recorded)

Y solo configure la grabadora como verdadera cuando la matriz de datos de audio esté suficientemente poblada. Esto significaba que funcionaría hasta que fuera perfecto. gracias por tu ayuda Dave!