0

一連のサウンドを事前に再生中にキューに入れることができる「ビートボックス」スタイルのサウンドエンジンを作成するにはどうすればよいでしょうか。ただし、これらのサウンドは、ギャップや一時的な中断なしに再生する必要があります。

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

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

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

これを実行し、alSourcePlayを呼び出した後、2つのクリップが連続して再生されているように見えますが、何も聞こえません(3つのオーディオファイルをロードし、alSourceQueueBuffersを使用してランダムにソースに追加しました。数回)。

また、ソースを更新したり、新しいサウンドを追加したり、再生済みのサウンドを削除してメモリをクリーンアップしたりするための最良の方法を知る必要があります。

4

2 に答える 2

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を使用しました。

于 2009-07-28T17:28:17.783 に答える
0

より簡単なオプションを見落としました。ソースにAL_LOOPINGプロパティを設定します。

alSourcei (myALSource, AL_LOOPING, AL_TRUE);
于 2009-07-28T17:52:28.950 に答える