iPhone에서 간단한 메트로놈을 만드는 중입니다. 앱이 현재 수행하는 작업은 타이머를 실행하고 타이머 기능을
1/1000th
초마다 입력하는 것입니다. 그런 다음 현재 시간과 앱 시작 시간을 비교합니다 (저는 CACurrentMediaTime()
함수를 사용하고 있습니다). 오디오를 재생할 수있는 좋은 순간이있을 경우iPhone에서 정확한 순간에 사운드를 재생하는 방법은 무엇입니까?
CFTimeInterval currentTime = CACurrentMediaTime();
if (self.beatingStartTime == 0) {
self.beatingStartTime = currentTime;
}
if ((currentTime - self.beatingStartTime) >= self.timeIntevalBetweenTicks * self.internalTimerCounter) {
self.internalTimerCounter ++;
// ...
}
는 재생할를 OpenAL을 사용하여 코드 트리거됩니다.
기본적으로 그게 전부입니다. 나는 시뮬레이터와 2 개의 장치 (iPad 및 jailbroken iPhone 3GS) 모두에서 실행될 때 재생 된 사운드를 확인했는데 문제가 있습니다. Reaper
소프트웨어에서 사운드를 녹음하고 파형을 검토했을 때 약간의 사운드가 너무 늦게 재생되었지만, 그 중 일부는 너무 일찍 시작합니다. (심지어 "너무 늦은"부분을 이해할 수도 있습니다. 이전에 재생할 수있는 방법을 실제로 얻지 못합니다. 앱이 매 초마다 수를 확인하기 때문에 기본적으로 ' t는 더 정교하고 그 다음에 지정된 시간이됩니다. - 아직 그것은 제 추기경에 의하면입니다.)
타이밍과 관련하여 "견고한"것으로 알려진 일부 메트로놈 앱이 있으므로 방법이 있습니다. 난 그냥 ...보고 싶어 궁금해
편집 : 도움이되지 않습니다 1/100 예를 들어, 1/1000 초에서 타이머 호출을 변경.
편집 2 : 타이머에서 스레드로 전환했을 때 (그리고 스레드를 지정된 시간 동안 절전 모드로 전환했을 때) 여전히 이상한 동작이 발생합니다. 템포가 움직이고 약간의 지연을 이해하고 너무 늦은 소리를 들려주는 동안 문제는 그들 중 일부가 을 너무 일찍 재생하는 것입니다. 너무 빠르면 2 박자 사이의 시간 거리가 지나야합니다.
diffrence는 약 10 %에서 15 밀리 초로 변환되는 약 3 %이며, 이것은 상당히 많은 양입니다. 누구나 사운드가 더 일찍 재생 될 수있는 이유는 누구나 알 수 있습니까? 나는 iPhone 시뮬레이터와 iPad 실제 장치에서 모두 시도해 보았고 나의 유일한 추측은 타이머에 문제가있는 것입니다 - CACurrentMediaTime()
더 많은 초를 돌려 주어야합니다. 심지어 가능할까요?
왜 단순한 AVAudioPlayer가 아닌 OpenAL을 사용하고 있습니까? (메트로놈은 위치적인 오디오가 필요합니까?) –
Nope. 하지만 이전에 AVAudioPlayer를 사용했을 때 비슷한 문제 (또는 심지어 더 심한 문제)가있었습니다. 그리고 OpenAL을 사용하라는 조언을 찾았습니다. 특정 순간 (사운드와 같은 파티클 게임 프레임과 동기화 됨)에서 사운드를 재생하는 것이 가장 좋습니다. -이 블로그 항목 http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/ "소리를보다 잘 제어하려면 openAL 또는 audioUnits 또는 audioQueue가 필요합니다."). – kender
@kender 또한 1 초에 1000 번 타이머를 호출 할 수없고 응답하도록 요청할 수 없습니다. 많은 어려움을 겪고있는 중입니다. 그것이 절대로 안타깝게 느껴지는 이유입니다. 메트로놈을 240 템포로 16 분 음표로 설정하더라도 0.015625 초의 해상도의 타이머 만 있으면됩니다. 자신의 c- 라이브러리를 실행하지 않고도 iphone에서 밀리 초 정밀도를 얻지 못할 수도 있습니다. –