Проблемы с синхронизацией звуков на разных устройствах iOS - PullRequest
0 голосов
/ 22 апреля 2011

Я создал музыкальное приложение, которое воспроизводит один из 9 звуков, когда объект сталкивается с краем сетки. Это работает абсолютно безупречно на симуляторе, но не совсем синхронизируется на устройствах 4-го поколения и полностью не синхронизировано на iPhone 3g.

Под несинхронизацией я подразумеваю, что реверберация происходит каждые 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 не точны и не должны использоваться для этого, но я не могу найти какую-либо альтернативу.

1 Ответ

0 голосов
/ 07 сентября 2011

Используйте CADisplayLink для установки частоты кадров; это гораздо точнее, чем использование NSTimer.

Вы также можете попробовать кэшировать свои звуки с помощью AVAudioPlayer - во время загрузки приложения или экрана вызывайте prepareToPlay для каждого кэшированного звука, затем при последующем вызове воспроизведения воспроизведение должно начаться немедленно без задержки. AVAudioPlayer позволяет кэшировать звуки или передавать их из хранилища и т. Д.

...