AudioRecord나 AudioTrack의 OnXXXXXXXPositionUpdateListener를 통해서 매번 callback이 되는것은 확인했습니다.

하지만 이 주기가 너무 들쭉 날쭉해서 고생입니다.

 

 

------------------------------------------------------------------------------

 

frequency 16000, frameSize 320, 이면 주기는 20ms이겠죠?

 

 

 

AudioRecord로 예를 들자면

 

ar = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelConfiguration,audioEncoding,recordSize*10);
ar.setPositionNotificationPeriod(frame_Size);
ar.setRecordPositionUpdateListener(mRecordListener);

 

이런식으로 상단에 작성하였고.

 

하단에

ar.startRecording();
ar.read(firstTempBuffer, 0, frame_Size); 

 

이런식 문장을 줘서 Listener를 실행시키고.

 

Listener에서는

 

private OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener()
 {
  public void onPeriodicNotification(AudioRecord recorder)
  {    
    int mSamplesRead = recorder.read(sendAudioAr, pos, frame_Size);
    }
  } 

 };  

 

recorder.read를 통해 다시 Listener가 불러와지는 Callback 방식으로 구현하였습니다.

이 방법이 어쩔때는 20ms 씩 잘 불러오다가도 0ms 마다 불러오는 경우가 생깁니다.

 

어떻게 하면 20ms의 정확한 시간마다 불러올 수 있을까요.

 

 

제가 생각하기엔

ar.setPositionNotificationPeriod(frame_Size);
이 문장을 통하면 frame_size만큼 recorder.read()를 하게 되면 listener가 불러와지고

휴대폰 os측에서도 설정한 샘플링레이트만큼 설정한 audioRecord에서는 frame_size만큼 읽을려면 20ms이 걸린다고 생각됬는데

아닌가 보네요....

 

 

 

 

결론. AudioRecord나 AudioTrack을 사용하여 정확한 주기마다 특정 함수를 실행시키는 방법이 없나요?