2009-07-10 12 views
0

Wie würde man eine Beat-Box-Sound-Engine erstellen, in der eine Reihe von Sounds vor und während der Wiedergabe in die Warteschlange gestellt werden kann. Diese Klänge müssen jedoch ohne Lücken oder Schluckauf abgespielt werden.iPhone SDK - OpenAL, 'Beat Box'-Sound-Engine

Ich habe in OpenAL untersucht und habe versucht, die alSourceQueueBuffers() zu verwenden, um eine Quelle mit einer Reihe von pre-buffered Clips zu erstellen, aber nicht das, was ich suchte.

Ich lade meine Audio-Dateien mit AudioFileOpenURL, und lade es dann in ein Char-Array mit AudioFileReadBytes, einen Puffer mit alGenBuffers erstellen und dann mit alBufferData puffern.

Ich erstelle dann eine Quelle mit alGenSources, und halte einen Verweis auf diese Quelle. Ich rufe alSourceQueueBuffers (sourceId, 1, & bufferId) einige Male auf, wobei bufferId ein Parameter ist, der an meine Methode 'queueClip' übergeben wird und eine Handvoll verschiedener Clips referenziert.

Nachdem ich dies getan habe, und alSourcePlay aufrufen, höre ich, was zwei meiner Clips zu sein scheinen, back-to-back ... aber dann nichts (ich habe es mit 3 Audiodateien geladen, und zufügen sie zufällig Quelle mit alSourceQueueBuffers ein paar Mal).

Ich brauche auch den besten Weg, zu wissen, meine Quelle zu aktualisieren, neue Sounds, um es hinzuzufügen und bereits gespielt Töne von ihm zu entfernen, um Speicherplatz zu bereinigen usw.

+0

Warum können Sie dies nicht auf AVAudioPlayer schreiben? Latenz? – zoul

+0

Latenz ist ein ernstes Problem, mit AVAudioPlayer gab es einen 0,151 Offset in der Wiedergabe von Elementen. Wenn Sie ein Element auf "loop" setzen, hat es tatsächlich eine nahtlose Schleife durchlaufen, jedoch beabsichtige ich, Objekte in der Warteschlange anzuordnen und verschiedene Objekte abzuspielen. Wenn das Callback-Setup "audioDidFinishPlaying" aufgerufen und das nächste Element in der Liste abgespielt wurde, ergab sich bei der Wiedergabe ein konsistenter 0,151-Offset. Ich dachte darüber nach, einen Timer zu schreiben und ihn basierend auf der aktuellen Sample-Zeit zu setzen, abzüglich dieses bekannten konsistenten Offsets ... aber das klingt "doof" und ist nicht "exakt" oder "genau". –

+0

Ich habe seitdem begonnen, die FMOD-Bibliothek zu verwenden, die ein "Echtzeit-Stitching" -Beispiel bereitgestellt hatte, das einen Doppelpuffermechanismus für die Wiedergabe verwendete. Sie erzeugen zwei Sub-Sounds, und während einer spielt, schalten Sie den anderen aus ... und es spielt die beiden Samples nahtlos und ohne hörbare Lücke ab. Das habe ich mir vorgenommen, obwohl ... FMOD einen Preispaket hat, wäre eine OpenAL-Lösung zu bevorzugen. –

Antwort

3

Sie Polling ist die Quelle zu sehen, wenn es hat einen Puffer verbraucht?

Sie müssen diese Abfrage durchführen, um nach verbrauchten Puffern zu suchen ... Ich habe einen einfachen NSTimer verwendet.

0

Ich habe eine einfachere Option übersehen. Legen Sie die AL_LOOPING-Eigenschaft für Ihre Quelle fest:

alSourcei (myALSource, AL_LOOPING, AL_TRUE); 
+0

das würde nur einen einzigen Sound loopen, oder? –