2009-07-10 11 views
0

どのようにして、一連のサウンドを前もってキューに入れることができる「ビートボックス」スタイルのサウンドエンジンを作成するには?これらのサウンドは、ギャップや乱れを伴わずに再生する必要があります。iPhone SDK - OpenAL、 'Beat Box'スタイルのサウンドエンジン

OpenALを見て、alSourceQueueBuffers()を使用して一連のプリバッファリングされたクリップでソースを作成しようとしましたが、私が探していたものを達成できませんでした。

AudioFileOpenURLでオーディオファイルをロードしてから、AudioFileReadBytesを使用してchar配列にロードし、alGenBuffersでバッファを作成してから、alBufferDataでバッファします。

次に、alGenSourcesでソースを作成し、そのソースへの参照を保持します。次に、alieSourceQueueBuffers(sourceId、1、& bufferId)を呼び出します。ここで、bufferIdは、私の 'queueClip'メソッドに渡されるパラメータであり、いくつかの異なるクリップを参照します。

これを実行してから、alSourcePlayを呼び出すと、私のクリップがバックツーバックで再生されているように見えますが、何もしません(3つのオーディオファイルをロードして、ランダムにalSourceQueueBuffersを使用して数回)。

私もなど、メモリをクリーンアップするためにそれに新しい音を追加し、それから、すでに演奏音を削除するには、私のソースを更新するための最良の方法を知っておく必要があり

+0

なぜこれをAVAudioPlayerの上に書くことができませんか?レイテンシ? – zoul

+0

待ち時間は深刻な問題です。AVAudioPlayerでは、項目の再生に0.151のオフセットがありました。アイテムを 'loop'に設定すると、実際にはループがシームレスに実行されましたが、アイテムをキューに入れてさまざまなアイテムを再生するつもりです。 'audioDidFinishPlaying'コールバック設定を取得し、リスト内の次の項目を再生すると、再生時に一貫した0.151オフセットが発生しました。私はタイマーを書くことを検討し、現在のサンプル時間に基づいて、この既知の一貫性のあるオフセットをマイナスして刻々と変化させることを考えました...しかし、これは「グーフィー」と発音し、「正確」または「正確」ではありません。 –

+0

私はFMODライブラリを使い始めました。これは、再生のためにダブルバッファ機構を使用した「リアルタイムステッチング」の例を提供していました。 2つのサブサウンドを作成し、再生中にもう一方のサウンドを切り替えると、2つのサンプルがシームレスに再生され、可聴ギャップは発生しません。これは私がやっていたことでしたが、FMODには値札があり、これに対するOpenALのソリューションが好まれるでしょう。 –

答えて

3

あなたはそれを参照するには、ソースポーリングですバッファを使い果たしましたか?

ALuint freeBuffer; 
ALint processed; 
alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed); 
while (processed > 0) { 
    // remove spent buffer 
    alSourceUnqueueBuffers(myALSource, 1, &freeBuffer); 
    // refill buffer with samples, if they're going to be different this time 
    // ... 
    // re-queue buffer on source 
    alSourceQueueBuffers(myALSource, 1, &freeBuffer); 
    // check again for more processed buffers 
    alGetSourcei (myALSource, AL_BUFFERS_PROCESSED, &processed); 
} 

私は単純なNSTimerを使用して、使用済みバッファをチェックするためにこのポーリングを続ける必要があります。

0

私は簡単なオプションを見落としました。あなたのソースにAL_LOOPINGプロパティを設定してください:

alSourcei (myALSource, AL_LOOPING, AL_TRUE); 
+0

それはただ一つの音をループするでしょう? –