Android: проблема Класса AudioRecord: Обратный вызов никогда не называют

Мое 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);

  }
}
21
задан slezadav 26 October 2012 в 15:53
поделиться