Semplice loop effetti audio utilizzando AudioToolKit
-
26-09-2019 - |
Domanda
Ho creato un paio di suoni per l'uso nel mio gioco. Posso giocare a certi eventi senza alcun problema:
// create sounds
CFBundleRef mainBundle;
mainBundle = CFBundleGetMainBundle();
_soundFileShake = CFBundleCopyResourceURL(mainBundle, CFSTR("shake"), CFSTR("wav"), NULL);
AudioServicesCreateSystemSoundID(_soundFileShake, &_soundIdShake);
// later...
AudioServicesPlaySystemSound(_soundIdShake);
Il gioco ha un meccanismo che consente di scuotere il dispositivo per attivare alcune funzionalità. Ho il codice di agitazione fatto vengo ricevo un messaggio e "scuotere iniziato" "scuotere finito" per il mio gioco. Quello che ho bisogno di avere accadere è iniziare a giocare "shave.wav" quando agitano inizia e loop fino all'arresto. C'è un modo per fare questo con AudioToolbox / AudioServices? Come potrei fare questo se non?
Soluzione
tenere traccia dello stato "sta scuotendo" e registrare un callback per il completamento del sistema audio con AudioServicesAddSystemSoundCompletion
. Poi basta avviare di nuovo il suono di sistema ogni volta che si completa e il dispositivo è ancora in fase di scossa. Se il suono è abbastanza breve, questo creerà l'effetto desiderato. Se è necessario per garantire il suono si arresta immediatamente quando la si ferma agitazione, è necessario utilizzare una delle API sonore che fornisce un controllo più granulare sulla riproduzione (ad esempio, audio coda Services o AVAudioPlayer
).