2015-01-28 3 views
2

Я пытаюсь настроить звукозаписывающее устройство, и я продолжаю получать определенную ошибку, и я не могу понять, почему. в моем коде я проверил, в каком состоянии находится аудиомагнитофон с журналом до и после метода startrecording().Состояние ошибки AudioRecord start() -38

ar = new AudioRecord(audiosource, sampleRate, channelConfiguration, 
       audioEncoding, buffersizebytes); 
Log.d("info", "ar.getState() before = " + String.valueOf(ar.getState())); 
ar.startRecording(); 
Log.d("info", "ar.getState() after = " +String.valueOf(ar.getState())); 

Когда я запускаю приложение, я получаю эти сообщения в logcat.

D/info﹕ ar.getState() before = 1 
E/AudioRecord﹕ start() status -38 
D/info﹕ ar.getState() after = 1 

от того, что я прочитал в документации состояние 1 может либо соответствовать аудио рекордера, находящемуся в RECORDSTATE_STOPPED или STATE_INITIALIZED состояний ни один из этих двух должен вызвать проблемы при вызове startRecording().

Состояние -38 Я считаю, что это код errno.h для/* Функция не реализована */это относится к методу startRecording() или как она указывает в ошибке функцию start(), которая не является методом для класса AudioRecorder.

Я пробовал несколько методов, чтобы убедиться, что функция release() была вызвана, поэтому я не думаю, что здесь проблема.

Любая помощь с благодарностью.

+0

https://github.com/audioBoom/audioboo-android/blob/master/src/fm/audioboo/application/BooRecorder.java проверить надежный регистратор Android –

ответ

0

хорошо, так это то, что я думаю, что мне нужно сделать, это должно быть действительно говорили в документации AudioRecorder, но это похоже questioin привело меня к ответу AudioRecord object not initializing в основном то, что вы хотите сделать, это перебрать все конфигурации и попробовать каждый против проверки AudioRecord.ERROR_BAD_VALUE также, так как я планировал на использование FFT, в котором длина должна быть степенью 2 я добавил немного, если еще, если часть, если кто-то работает в подобную ситуацию

public AudioRecord findAudioRecord() { 
    for (int rate : mSampleRates) { 
     for (short audioFormat : new short[]{AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT}) { 
      for (short channelConfig : new short[]{AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO}) { 
       try { 
        //Log.d("audioSetup", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); 
        int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
        if (bufferSize > 0 && bufferSize <= 256){ 
         bufferSize = 256; 
        }else if (bufferSize > 256 && bufferSize <= 512){ 
         bufferSize = 512; 
        }else if (bufferSize > 512 && bufferSize <= 1024){ 
         bufferSize = 1024; 
        }else if (bufferSize > 1024 && bufferSize <= 2048){ 
         bufferSize = 2048; 
        }else if (bufferSize > 2048 && bufferSize <= 4096){ 
         bufferSize = 4096; 
        }else if (bufferSize > 4096 && bufferSize <= 8192){ 
         bufferSize = 8192; 
        }else if (bufferSize > 8192 && bufferSize <= 16384){ 
         bufferSize = 16384; 
        }else{ 
         bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
        } 

        if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { 
         // check if we can instantiate and have a success 
         AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); 

         if (recorder.getState() == AudioRecord.STATE_INITIALIZED) { 
          Log.d("found", "rate: " + rate + " channelConfig: " + channelConfig + " bufferSize: " + bufferSize + " audioFormat: " + audioFormat); 
          sampleRate = rate; 
          channelConfiguration = channelConfig; 
          audioEncoding = audioFormat; 
          buffersizebytes = bufferSize; 
          return recorder; 
         } 
        } 
       } catch (Exception e) { 
        Log.d("audioSetup", rate + "Exception, keep trying.", e); 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
    return null; 
} 

кажется работать красиво. Спасибо за помощь.