2011-01-13 2 views
3

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() 더 많은 초를 돌려 주어야합니다. 심지어 가능할까요?

+0

왜 단순한 AVAudioPlayer가 아닌 OpenAL을 사용하고 있습니까? (메트로놈은 위치적인 오디오가 필요합니까?) –

+0

Nope. 하지만 이전에 AVAudioPlayer를 사용했을 때 비슷한 문제 (또는 심지어 더 심한 문제)가있었습니다. 그리고 OpenAL을 사용하라는 조언을 찾았습니다. 특정 순간 (사운드와 같은 파티클 게임 프레임과 동기화 됨)에서 사운드를 재생하는 것이 가장 좋습니다. -이 블로그 항목 http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/ "소리를보다 잘 제어하려면 openAL 또는 audioUnits 또는 audioQueue가 필요합니다."). – kender

+1

@kender 또한 1 초에 1000 번 타이머를 호출 할 수없고 응답하도록 요청할 수 없습니다. 많은 어려움을 겪고있는 중입니다. 그것이 절대로 안타깝게 느껴지는 이유입니다. 메트로놈을 240 템포로 16 분 음표로 설정하더라도 0.015625 초의 해상도의 타이머 만 있으면됩니다. 자신의 c- 라이브러리를 실행하지 않고도 iphone에서 밀리 초 정밀도를 얻지 못할 수도 있습니다. –

답변

5

NSSound를 사용하여 인스턴스 변수로로드하고 메트로놈이 실행되고 있지 않으면 릴리스하지 마십시오. 루프에서 파일을 메모리에로드하면 지연이 발생할 수 있습니다. 고려해야 할 또 다른 사항은 메트로놈이 1/1000th 초마다 폴링 할 필요가 없다는 것입니다. 자주 사용하지 않는 경우 CPU를 포화시키지 않으므로보다 일관된 결과를 얻을 수 있습니다.

마지막으로, 애플의 데모가 어떻게 작동하는지 체크 아웃 : http://developer.apple.com/library/ios/#samplecode/Metronome/Introduction/Intro.html

어떻게 당신이 할 :)

+0

지금은 OpenAL을 사용하고 있으며 메트로놈 시작시 내 사운드가 인스턴스 변수로 읽혀 지므로, 각 반복마다 파일에서 읽어야합니다. – kender

2

은 당신이 원하는 것은 코코스 DENSHION입니다 하려는지 달성하기 위해 당신에게 더 나은 아이디어를 줄 수 있음 우리가 발견 한 모든 믿음의 문제를 해결할 수있는 간단하고 신뢰할 수있는 사운드 라이브러리입니다.

(개인적으로) "Cocos2D"가 마음에 들지 않지만 CocosDenshion 만 사용하면됩니다.

두 번째로 - 초는 타이머에 대해 우스꽝 스럽습니다. 그냥 완전히 잊어 버려.

세 번째로 - AVAudioPlayer는 가치가 있습니다.

주 - "이며 대상은"CocosDenshion에

대안, 아마도 더 나은, 새로운이다. 확인 해봐.

관련 문제