2013-10-18 2 views
0

사운드를 똑딱 거리는 시계를 표시해야하는 iOS7 전용 앱에서 작업하고 있습니다. 저는 1 초의 NSTimer를 사용했고 매초마다 틱 사운드를 재생하기 위해 AVAudioPlayer를 사용합니다.iOS 7의 사운드 스케줄링 정확성

불행히도, 약간의 타이밍이 있습니다. 나는 타이머가 2 ~ 22 천분의 1 초 사이에 떨어져 있다는 것을 측정했는데, 그다지 중요하지 않다고 생각 하겠지만 지연은 긴장을 씹는 손톱을 만듭니다. 심장 박동과 같은 종류의 :-)

조금 둘러 봤지만 오디오 대기열 서비스를 사용하는 것이 유일한 방법이라고 생각합니다. 그리고 나는 그 특정 프레임 워크의 깊이를 다시 깊이 생각하지 않습니다.

내 질문 : iOS 7에서 정확하게 예정된 사운드 이벤트를 얻는 다른 방법이 있습니까? 어딘가에서 사용할 수있는 오디오 대기열 서비스에 알맞은 래퍼 프레임 워크가 있습니까? 아니면 NSTimers를보다 정확하게 스케줄링 할 수있는 방법이 있습니까?

+0

'dispatch_after'와 동일한 문제가 있습니까? –

답변

0

NSTimer, libdispatch 중 하나를 사용하거나 틱 지속 시간 동안 잠자기 상태가되는 스레드를 생성하는 것은 기본 스레드가 예정된 시간에 따라 달라집니다. 커널은이를 보장하지 않으며, 타이밍 지터를 관찰하는 것은 놀라운 일이 아닙니다. 당신이 관찰 한 잠복기는 적당 해 보입니다.

NSTimer 주 스레드에서 실행되는 경우 다른 스레드와 경쟁하기 때문에 가장 나쁜 성능을 발휘할 가능성이 큽니다.

여기에 오디오 큐 서비스, AVAudioPlayer를 사용하여 이벤트를 예약하는 실시간 스레드 또는 직접 오디오를 remoteIO 유닛으로 렌더링하는 옵션이 있습니다.

나는 AVPlayer가 타이밍에 대한 어떤 특별한 보증도 제공하지 않는다고 생각합니다.

+0

"실시간 스레드"= 별도의 스레드입니까? –

+0

AVAudioPlayer도 스레드로부터 안전합니까? –

+0

또 다른 "솔루션"은 틱 사이의 시간을 보장하는 틱의 반복 60 초 세그먼트를 재생하는 것이지만 시계를 변경하는 초와 동기화하지는 마십시오. " –