2011-02-15 4 views
5

J'essaie de trouver la meilleure façon de jouer une boucle audio parfaite, que l'utilisateur peut changer pour un autre dans les plus brefs délais, avec un nombre décent (30-150) de très courtes boucles étant disponibles. OpenAL sera-t-il suffisant pour cela, ou dois-je creuser dans des unités audio? La documentation Apple indique que pour les retours en temps réel comme un instrument, Audio Units est le bon choix. Je veux juste obtenir l'opinion de la communauté à ce sujet, et tous les liens et exemples de projets seraient grandement appréciés.Commutation de boucle audio en temps réel pour l'iPhone

Répondre

3

Vous pouvez utiliser AVAudioPlayer pour boucler de façon transparente un fichier audio compressé (numberOfLoops = -1). Je suggère d'utiliser des fichiers CAF encodés en IMA4, car ceux-ci sont supposés bénéficier de la décompression du matériel (en économisant des cycles CPU pour d'autres choses).

Pour réduire la taille du fichier, vous pouvez réduire le débit binaire (essayez 96 kbps) et/ou utiliser le mode mono.

Notez que AVAudioPlayer ne vous permet pas de changer le tempo ou la fréquence de lecture.

+0

Plus d'infos sur OpenAL vs. Unités Audio: http://stackoverflow.com/questions/1002838/audio-on-the-iphone –

+0

J'étais d'abord sceptique quant à savoir si cela me permettrait de coudre ensemble différents échantillons, mais en utilisant son diverses commandes NSTimeInterval (heure actuelle, durée totale) Je devrais être capable de comprendre ce que j'ai besoin de savoir. Merci beaucoup, et bonne chance! – DanF

+0

Bonne chance. C'est ainsi que je gère une boucle/commutation de boucle transparente dans Hexaphone - j'utilise un NSTimer (scheduledTimerWithTimeInterval) pour "masquer" l'AVAudioPlayer (également utile pour mettre à jour un indicateur de rythme visible), car les événements AVAudioPlayerDelegate n'étaient pas assez rapides pour mes besoins. –

2

cela ne répond sans doute pas vraiment à votre question, mais avez-vous déjà regardé Finch? Juste en regardant la source pourrait fournir des pointeurs.

  • Johannes
+0

C'est une application sonore très excitante à mettre en œuvre, mais malheureusement, je ne vois rien sur la détection de la fin d'un échantillon, ou toute autre chose qui rendrait la boucle facile. – DanF

1

Si vous devez pouvoir passer à un autre échantillon audio sans délai de lecture, vous devez utiliser OpenAL. AVAudioPlayer a un délai avant de commencer à jouer.

Vous pouvez minimiser ce délai en appelant prepareToPlay, mais il n'éliminera pas toujours complètement le délai. De même, si vous avez 30 à 150 échantillons que l'utilisateur sélectionne pour la lecture, vous ne saurez pas à l'avance quels échantillons doivent être préchargés.

Voici un aperçu des avantages et des inconvénients entre OpenAL et AVAudioPlayer: http://kstenerud.github.com/ObjectAL-for-iPhone/documentation/index.html#choosing_sec

+0

Si les échantillons sont assez petits, je pensais que je pouvais simplement les précharger tous. Connaissez-vous la taille du cache? – DanF

+0

Les échantillons dans OpenAL doivent être PCM non compressé, 16 bits (techniquement 8 bits est autorisé mais je n'ai jamais réussi à le faire fonctionner sur iPhone). Donc, s'ils ne sont pas dans ce format, vous devrez soit les stocker non compressé ou décompresser sur le chargement. Tant que vous avez suffisamment de RAM libre pour tout charger, tout va bien. La limite totale de RAM sur les applications pour les anciens appareils iOS basés sur arm6 (comme l'iPhone 3g) est d'environ 24 Mo. Après cela, vous courez le risque d'être arrêté par le système d'exploitation. Avec les appareils plus récents, vous avez beaucoup plus de RAM à jouer avec. – Karl

+0

Une autre chose si vous pensez à AVAudioPlayer: Je ne pense pas que vous pouvez avoir 30-150 AVAudioPlayers avec l'audio préchargé. Je n'ai pas vraiment essayé de le faire, mais ce n'est pas ce à quoi AVAudioPlayer a été conçu. – Karl

0

J'ai fini à l'aide de la bibliothèque audio Cocos2D pour cela, et il était beaucoup plus performant que je ne l'avais prévu. AVAudioPlayer a fini par être un peu plus bas que ce dont j'avais besoin.