Simple efecto de sonido de bucle utilizando AudioToolKit
-
26-09-2019 - |
Pregunta
He creado unos sonidos para su uso en mi juego. Puedo jugar con ellos en ciertos eventos sin ningún problema:
// create sounds
CFBundleRef mainBundle;
mainBundle = CFBundleGetMainBundle();
_soundFileShake = CFBundleCopyResourceURL(mainBundle, CFSTR("shake"), CFSTR("wav"), NULL);
AudioServicesCreateSystemSoundID(_soundFileShake, &_soundIdShake);
// later...
AudioServicesPlaySystemSound(_soundIdShake);
El juego tiene un mecanismo que le permite agitar el dispositivo para activar algunas funciones. Tengo el código sacudiendo hecho así que llegar llegar un mensaje y "temblor comenzado" "sacudiendo terminado" a mi juego. Lo que necesita tener suceda es empezar a jugar "shave.wav" cuando se inicia y agitando bucle hasta que se detenga. ¿Hay una manera de hacer esto con AudioToolbox / AudioServices? ¿Cómo podría hacerlo si no?
Solución
Realizar un seguimiento del estado "está sacudiendo" y registrar una devolución de llamada para la finalización de sonido sistema con AudioServicesAddSystemSoundCompletion
. A continuación, sólo iniciar el sistema de sonido de nuevo cada vez que se completa y el dispositivo sigue siendo sacudido. Si el sonido es lo suficientemente corto, esto va a crear el efecto deseado. Si es necesario asegurarse de que el sonido se detiene inmediatamente cuando pase el temblor, tendrá que utilizar una de las API de sonido que proporciona un control más granular sobre la reproducción (por ejemplo, audio o cola de Servicios AVAudioPlayer
).