2011-04-22 4 views
0

오브젝트가 그리드의 가장자리와 충돌 할 때 9 가지 소리 중 하나를 재생하는 음악 앱을 만들었습니다. 이것은 시뮬레이터에서 절대적으로 완벽하게 작동하지만 4th gen 디바이스와 완전히 동기화되지 않으며 iPhone 3g에서 완전히 동기화되지 않습니다.다른 iOS 기기에서 소리를 동기화 할 때의 문제

동기가 맞지 않으면, 그리드 움직임의 속도와 일치시키기 위해 0.2 초마다 리버브가 발생한다는 것과 리버브가 장치에서 동시에 발생하지 않기 때문에 사운드가 올바르게 들리지 않는다는 것을 의미합니다. 또한 iPhone 3G를 보면 그리드가 0.2 초마다 다시 그려지지 않는다는 것을 알 수 있습니다. 훨씬 느립니다. 여기

는 기본 코드입니다 : 사람이 나는 매우 감사 할 것입니다이 문제에 전혀 도움이 될 수 있다면 여기
- (void)startTime { 
    [musicTimer setFireDate:[NSDate distantFuture]]; 
    musicTimer = [NSTimer scheduledTimerWithTimeInterval: 0.01 
               target: self 
               selector: @selector(checkTime) 
               userInfo: nil 
               repeats: YES]; 
} 

- (void)checkTime { 
    float timeSince = [[NSDate date] timeIntervalSinceDate:lastPlayed]; 
    if(timeSince >= 0.2){ 
     [self repositionBlocks]; 
    } 
} 

- (void)repositionBlocks { 
    //Check which sounds need to play and call the play function on each of them 
    //The following line would play the sound if a collision occurred 

    Sound *sound = [[Sound alloc] init]; 
[sound play:@"01.wav"]; 
[sound release]; 

    [self redrawGrid]; //Redraws the grid with the new positions 
    [lastPlayed release]; 
    lastPlayed = [[NSDate date] retain]; 
} 

내 사운드 클래스

- (void)play:(NSString *)soundFile { 
    NSString *path; 
    NSString *fileName = [NSString stringWithFormat:@"/%@", soundFile]; 
    path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], fileName]; 
    SystemSoundID soundID; 
    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; 
    AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); 
    AudioServicesPlaySystemSound(soundID); 
    [filePath release]; 
} 

내부의 재생 기능입니다

감사합니다.

편집 : 나는 몇 가지 테스트를 수행하고 NSTimer로 문제를 좁혔다. 시뮬레이터에서 0.2 초마다 트리거되지만 디바이스에서는 0.4 - 0.6 초마다 트리거된다. 인터넷에서 검색 한 결과 NSTimers가 정확하지 않고 이에 사용되어서는 안되는 방법에 대한 많은 정보가 있지만 어떤 대안도 찾을 수 없습니다.

+0

NSTimer를 0.01로 설정하고 checkTime에서 0.2를 확인하는 이유는 무엇입니까? NSTimer는 필요한 것보다 더 자주 발사되지 않습니까? – onnoweb

+0

원래 0.2 초 동안 해봤지만 같은 문제가 있었는데, 더 자주 발사해야하고 0.2 초가 지나지 않았는지 확인했습니다. 어떤 방법 으로든 문제가 같은 것처럼 보입니다. – treeba

답변

0

CADisplayLink를 사용하여 프레임 속도를 설정하십시오. 그것은 NSTimer를 사용하는 것보다 훨씬 정확합니다.

AVAudioPlayer를 사용하여 사운드를 캐싱 할 수도 있습니다. 앱 또는 화면을로드하는 동안 각 캐시 된 사운드에 대해 prepareToPlay를 호출 한 다음 나중에 재생을 호출하면 지연없이 즉각 재생해야합니다. AVAudioPlayer는 소리를 캐싱하거나 저장소 등에서 스트리밍을 처리합니다.

관련 문제