Экземпляр аудиозаписи Android не работает - PullRequest
3 голосов
/ 23 ноября 2011

Я создаю приложение, которое определяет частоты звука, воспроизводимого через микрофон.Анализ выполняется в 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 «полон ошибок».

Любая помощь будет высоко оценена.

Спасибо, Бен

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

Ответ заключался в следующем:

while (recordingLoops < 4 || recorded) 

Я изменил его на:

while (!recorded) 

И установил рекордер на true, только когда массив аудиоданных был достаточно заполнен.Это означало, что оно будет повторяться до совершенства.спасибо за помощь Дэйв!

2 голосов
/ 23 ноября 2011

Вы могли бы посмотреть на этот ответ, похоже, что некоторые мысли занялись обработкой потоков, связанных с AudioRecord:

Класс Android AudioRecord - быстрая обработка звука с живого микрофона, настройка функции обратного вызова

...