3

iPhone と OpenAL には XCode 4.5 を使用しています。問題は、サウンドを再生した後、サウンド バッファを削除できないことですalSourcePlay().。ソースを再生しない場合、バッファは削除され、nemory は問題なく解放されます。

読み込み音:

alGenBuffers(1, &bufferID);

// Loading awaiting data blob into buffer.
alBufferData(bufferID, format, outData, size, freq);

// Getting source ID from OpenAL.
alGenSources(1, &sourceID);

// Attacing buffer to source.
alSourcei(sourceID, AL_BUFFER, bufferID);

//playing sound (if i comment this line, the problem dissapears)
alSourcePlay(soundId);

リリース音:

//detaching buffer
alSourcei(sourceID, AL_BUFFER, bufferID);
//deleting source
alDeleteSources(1, &sourceID);
//deleting buffer
alDeleteBuffers(1, &bufferID);

バッファを削除してもエラーは発生しませんが、メモリから解放されません。Instrumentsを使用してメモリを監視しています。

解決策を探し、OpenAL のドキュメントを読むのに 1 週​​間を費やしました。

OpenALの経験がある方、助けてください!

ありがとうございました!

4

3 に答える 3

1

サウンドをリリースするときのコールは次のようになります。

alSourcei(sourceID, AL_BUFFER, 0);

これは OpenAL Programmer's Guide によると次のとおりです。

http://connect.creativelabs.com/openal/Documentation/OpenAL_Programmers_Guide.pdf

于 2013-05-08T17:50:21.570 に答える
0

これがあなたに関連する情報であるかどうかはわかりませんが、同じ問題が発生したため、ソースを削除してから 1 秒後にバッファを削除することで解決しました。したがって、削除するときは、バッファーを辞書に保存し、いつ削除する必要があるかを示すタイムスタンプを付けてから、次の呼び出しでバッファーを削除します。

alDeleteBuffers(1, &bufferID);

タイムスタンプが渡されると、別の場所に移動します。この背後にある理論的根拠は、iOS OpenAL が別のスレッドで実行されており、ソースの削除を処理する時間を与える必要があるということです。

于 2014-06-04T16:24:13.917 に答える