Воспроизведение звуков в последовательности с SimpleAudioEngine

Я создаю приложение для iOS с cocos2d 2 и использую SimpleAudioEngine для воспроизведения некоторых эффектов.

Есть ли способ упорядочить несколько звуков для воспроизведения после завершения предыдущего звука?

Например в моем коде:

[[SimpleAudioEngine sharedEngine] playEffect:@"yay.wav"];
[[SimpleAudioEngine sharedEngine] playEffect:@"youDidIt.wav"];

Когда этот код запускается, yay.wav а также youDidIt.wav играть в одно и то же время, друг над другом.

я хочу yay.wav играть и однажды завершить, youDidIt.wav играть.

Если не с SimpleAudioEngine, есть ли способ с AudioToolbox или что-то еще?

Спасибо!

== ОБНОВЛЕНИЕ ==

Я думаю, что я собираюсь пойти с этим методом, используя AVFoundation:

AVPlayerItem *sound1 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"yay" ofType:@"wav"]]];
AVPlayerItem *sound2 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YouDidIt" ofType:@"wav"]]];    
AVQueuePlayer *player = [[AVQueuePlayer alloc] initWithItems: [NSArray arrayWithObjects:sound1, sound2,  nil]];
[player play];

2 ответа

Самый простой способ - получить длительность трека, используя -[CDSoundSource durationInSeconds] и затем запланируйте воспроизведение второго эффекта после надлежащей задержки:

[[SimpleAudioEngine sharedEngine] performSelector:@selector(playEffect:) withObject:@"youDidIt.wav" afterDelay:duration];

Более простой способ получить длительность аудио - это установить исправление SimpleAudioManager и добавить метод, который запрашивает его CDSoundEngine (статический глобальный) для продолжительности аудио:

- (float)soundDuration {
    return [_engine bufferDurationInSeconds:_soundId];
}

Вторым подходом будет опрос статуса звукового движка и ожидание его остановки.

    alGetSourcei(sourceId, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING) {
      ...

sourceId это ALuint вернулся playEffect,

Все просто, протестировано с Cocos2D 2.1:

  1. Создает свойство durationInSeconds для SimpleAudioEngine.h:

    @property (readonly) float durationInSeconds;
    
  2. Синтезируйте их:

    @synthesize durationInSeconds;
    
  3. Измените playEffect следующим образом:

    -(ALuint) playEffect:(NSString*) filePath pitch:(Float32) pitch pan:(Float32) pan gain:(Float32) gain {
        int soundId = [bufferManager bufferForFile:filePath create:YES];
        if (soundId != kCDNoBuffer) {
            durationInSeconds = [soundEngine bufferDurationInSeconds:soundId];
            return [soundEngine playSound:soundId sourceGroupId:0 pitch:pitch pan:pan gain:gain loop:false];
        } else {
            return CD_MUTE;
        }
    }
    
  4. Как вы можете видеть, я вставил значение durationInSeconds непосредственно из soundEngine bufferDurationInSeconds из результата bufferManager.

  5. Теперь спросите только значение [SimpleAudioEngine sharedEngine].durationInSeconds, и вы получите длительность плавания в секундах этого звука.

  6. Установите таймер на эти секунды и после этого проиграйте следующую итерацию вашего звука или установите флажок OFF или что-то в этом роде.

Другие вопросы по тегам