2011-04-22 92 views
0

我創建了一個音樂應用程序,當對象與網格邊緣碰撞時播放9種聲音之一。這在模擬器上絕對完美無瑕,但在第四代設備上並不完全同步,並且在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]; 
} 

這裏是我的Sound類

- (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 2011-04-22 19:30:13

+0

本來我試過它開火0.2秒,但我有同樣的問題,我讀了一些地方,我應該更頻繁地開火,並檢查是否0.2秒過去了。無論哪種方式,問題似乎都是一樣的 – treeba 2011-04-22 19:59:00

回答

0

使用CADisplayLink設置幀率;它比使用NSTimer準確得多。

您也可以嘗試使用AVAudioPlayer緩存您的聲音 - 在加載應用程序或屏幕時,在每個緩存聲音上調用prepareToPlay,然後當您稍後調用播放時,它應該立即播放而不會延遲。 AVAudioPlayer處理緩存聲音或從存儲等流媒體。