Reproducción de sonidos en secuencia con SimpleAudioEngine

Estoy construyendo una aplicación para iOS con cocos2d 2, y estoy usando SimpleAudioEngine para reproducir algunos efectos.

¿Hay alguna forma de secuenciar varios sonidos para que se reproduzcan después de que se haya completado el sonido anterior?

Por ejemplo, en mi código:

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

Cuando se ejecuta este código, yay.wav y youDidIt.wav reproducen al mismo time, uno sobre el otro.

Quiero que yay.wav reproduzca y una vez que termine, youDidIt.wav reproducirá.

Si no es con SimpleAudioEngine, ¿hay alguna manera con AudioToolbox o alguna otra cosa?

¡Gracias!

== ACTUALIZACIÓN ==

Creo que voy a utilizar este método con 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]; 

La forma más fácil sería get la duración de la pista usando -[CDSoundSource durationInSeconds] y luego progtwigr el segundo efecto que se reproduce después de una demora adecuada:

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

Una manera más fácil de get la duración del audio sería parchar SimpleAudioManager y agregar un método que consulta su CDSoundEngine (un global estático) para la duración del audio:

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

El segundo enfoque sería hacer una encuesta sobre el estado del motor de audio y esperar a que deje de reproducirse.

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

El sourceId es el ALuint devuelto por playEffect .

Es simple, probado con Cocos2D 2.1:

  1. Crea una propiedad durationInSeconds en SimpleAudioEngine.h:

     @property (readonly) float durationInSeconds; 
  2. Sintetizarlos:

     @synthesize durationInSeconds; 
  3. Modifica playEffect así:

     -(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. Como puede ver, inserté el valor durationInSeconds directamente desde soundEngine bufferDurationInSeconds del resultado de bufferManager.

  5. Ahora, solo pide el valor [SimpleAudioEngine shanetworkingEngine] .durationInSeconds y tienes la duración del flotador en segundos de este sonido.

  6. Ponga un timer en segundos y después de esto, reproduzca la siguiente iteración de su sonido o apague la bandera o algo así.