2014년 9월 18일 목요일

Kinect for Windows v2 AudioCaptureRaw-Console Example에서 Buffer Duration을 늘리는 문제

AudioCaptureRaw-Console 예제를 수정하여
실시간으로 소리를 모니터링 할 수 있도록 WASAPI의 render 기능을 추가하였다.
default buffer duration 은 20ms 이고, 20ms 에서는 소리가 잘 나온다.

하지만
잘 재생하다가 가끔식 처리 속도가 20ms보다 달리는지 처리를 못해서 빈 음이 재생되는 경우가 있다.

그래서 buffer duration을 늘리면 처리 속도에 대한 문제를 해결할 수 있을 거라 생각했고, 40, 100ms 등 여러 duration으로 늘려보았다.

하지만
자꾸 음이 끊기는 소리가 들리고, duration이 길어질 수록 그 현상은 심해져 갔다.

코드를 분석하여 이유를 찾아보았다.

이유는 capture client가 허용하는 number of available frames 가 자꾸 160으로 나온다는 것이다.

20ms 일 때 입력, 출력 버퍼의 길이는 아래와 같다.
맨 아래쪽 출력된 것을 보면 된다.


40ms 일 때는 아래와 같았다.


number of framesAvailable이 buffer의 길이에 상관 없이 항상 160으로 맞추어져 있는 것이다! 이 문제에 대해서 MSDN forum의 답변을 기다리고 있다.

http://social.msdn.microsoft.com/Forums/en-US/ef5f15e6-061f-4911-8a37-073c3689aa47/the-k4w2-audio-enginelatency-of-microphone-array-is-constant?forum=kinectv2sdk#6517d449-dfc6-464c-b90e-6c9456b8e7fb