2009-07-10 5 views
0

Comment créer un moteur de son de style «boîte à rythme», où une série de sons peut être mise en attente à l'avance et pendant la lecture. Ces sons doivent être rejoués sans aucune lacune ni hoquet. J'ai regardé dans OpenAL et j'ai essayé d'utiliser alSourceQueueBuffers() pour créer une source avec une série de clips pré-buffered, mais n'a pas atteint ce que je cherchais.iPhone SDK - OpenAL, moteur de son de style «Beat Box»

Je charge mes fichiers audio avec AudioFileOpenURL, puis charge dans un tableau char avec AudioFileReadBytes, créant un tampon avec alGenBuffers, puis mise en mémoire tampon avec alBufferData. Je crée ensuite une source avec alGenSources et conserve une référence à cette source. J'appelle ensuite alSourceQueueBuffers (sourceId, 1, & bufferId) une poignée de fois où bufferId est un paramètre passé dans ma méthode 'queueClip' et référence une poignée de clips différents. Après avoir fait cela, et en appelant alSourcePlay, j'entends ce qui semble être deux de mes clips en train de jouer, dos à dos ... mais ensuite rien (je l'ai chargé avec 3 fichiers audio, et les ai ajoutés aléatoirement au source avec alSourceQueueBuffers plusieurs fois).

Je dois aussi connaître la meilleure façon de mettre à jour ma source, d'ajouter de nouveaux sons et supprimer des sons déjà joué de lui pour nettoyer la mémoire, etc.

+0

Pourquoi ne pas écrire cela sur AVAudioPlayer? Latence? – zoul

+0

La latence est un problème sérieux, avec AVAudioPlayer, il y avait un décalage de 0,151 dans la lecture des éléments. Le fait de placer un élément sur 'loop' l'a effectivement fait boucler de façon transparente, cependant j'ai l'intention de mettre en file d'attente des éléments et de jouer divers éléments différents. L'obtention de la configuration de rappel 'audioDidFinishPlaying' et la lecture de l'élément suivant dans la liste ... ont entraîné un décalage constant de 0,151 en lecture. J'ai envisagé d'écrire une minuterie et de la faire cocher en fonction du temps d'échantillonnage actuel, moins ce décalage cohérent connu ... mais cela sonne "goofy" et n'est pas "exact" ou "précis". –

+0

Depuis, j'ai commencé à utiliser la bibliothèque FMOD, qui avait un exemple d'assemblage en temps réel, qui utilisait un mécanisme de double tampon pour la lecture. Vous créez deux sous-sons, et pendant que l'un joue, vous éteignez l'autre ... et il joue les deux échantillons de façon transparente, sans aucun écart audible. C'est ce que je cherchais à faire, bien que ... FMOD ait un pricetag, une solution OpenAL à cela serait préférable. –

Répondre

3

Êtes-vous polling la source pour voir quand il a utilisé un tampon? Vous devrez continuer à faire cette interrogation pour vérifier les tampons usés ... J'ai utilisé un simple NSTimer.

0

J'ai négligé une option plus facile. Définissez la propriété AL_LOOPING sur votre source:

alSourcei (myALSource, AL_LOOPING, AL_TRUE); 
+0

qui serait juste en boucle un seul son, non? –